vpn_handlers.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "proxmox-router/internal/vpn"
  6. )
  7. func (s *Server) handleOverallVPNStatus(w http.ResponseWriter, r *http.Request) {
  8. status := s.vpnMgr.GetOverallStatus()
  9. writeJSON(w, http.StatusOK, status)
  10. }
  11. // ======================== PPPoE Multi-Instance Handlers ========================
  12. func (s *Server) handleListPPPoE(w http.ResponseWriter, r *http.Request) {
  13. list := s.vpnMgr.PPPoE.List()
  14. writeJSON(w, http.StatusOK, list)
  15. }
  16. func (s *Server) handleSavePPPoE(w http.ResponseWriter, r *http.Request) {
  17. var inst vpn.PPPoEInstance
  18. if err := json.NewDecoder(r.Body).Decode(&inst); err != nil {
  19. writeError(w, http.StatusBadRequest, "invalid request body")
  20. return
  21. }
  22. if err := s.vpnMgr.PPPoE.Save(inst); err != nil {
  23. writeError(w, http.StatusInternalServerError, err.Error())
  24. return
  25. }
  26. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": inst.Name})
  27. }
  28. func (s *Server) handleDeletePPPoE(w http.ResponseWriter, r *http.Request) {
  29. name := r.PathValue("name")
  30. if err := s.vpnMgr.PPPoE.Delete(name); err != nil {
  31. writeError(w, http.StatusInternalServerError, err.Error())
  32. return
  33. }
  34. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  35. }
  36. func (s *Server) handleSetPPPoEState(w http.ResponseWriter, r *http.Request) {
  37. name := r.PathValue("name")
  38. var req struct {
  39. Enabled bool `json:"enabled"`
  40. }
  41. _ = json.NewDecoder(r.Body).Decode(&req)
  42. if err := s.vpnMgr.PPPoE.SetEnabled(name, req.Enabled); err != nil {
  43. writeError(w, http.StatusInternalServerError, err.Error())
  44. return
  45. }
  46. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name, "enabled": req.Enabled})
  47. }
  48. func (s *Server) handleConnectPPPoE(w http.ResponseWriter, r *http.Request) {
  49. name := r.PathValue("name")
  50. if err := s.vpnMgr.PPPoE.Connect(name); err != nil {
  51. writeError(w, http.StatusInternalServerError, err.Error())
  52. return
  53. }
  54. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  55. }
  56. func (s *Server) handleDisconnectPPPoE(w http.ResponseWriter, r *http.Request) {
  57. name := r.PathValue("name")
  58. if err := s.vpnMgr.PPPoE.Disconnect(name); err != nil {
  59. writeError(w, http.StatusInternalServerError, err.Error())
  60. return
  61. }
  62. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  63. }
  64. // ======================== WireGuard Multi-Interface & Peer Handlers ========================
  65. func (s *Server) handleListWireGuardInterfaces(w http.ResponseWriter, r *http.Request) {
  66. ifaces := s.vpnMgr.WireGuard.ListInterfaces()
  67. writeJSON(w, http.StatusOK, ifaces)
  68. }
  69. func (s *Server) handleSaveWireGuardInterface(w http.ResponseWriter, r *http.Request) {
  70. var req vpn.SaveWireGuardInterfaceRequest
  71. if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
  72. writeError(w, http.StatusBadRequest, "invalid request body")
  73. return
  74. }
  75. if err := s.vpnMgr.WireGuard.SaveInterface(req); err != nil {
  76. writeError(w, http.StatusBadRequest, err.Error())
  77. return
  78. }
  79. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": req.Name})
  80. }
  81. func (s *Server) handleDeleteWireGuardInterface(w http.ResponseWriter, r *http.Request) {
  82. name := r.PathValue("name")
  83. if err := s.vpnMgr.WireGuard.DeleteInterface(name); err != nil {
  84. writeError(w, http.StatusInternalServerError, err.Error())
  85. return
  86. }
  87. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  88. }
  89. func (s *Server) handleSetWireGuardInterfaceState(w http.ResponseWriter, r *http.Request) {
  90. name := r.PathValue("name")
  91. var req struct {
  92. Enabled bool `json:"enabled"`
  93. }
  94. _ = json.NewDecoder(r.Body).Decode(&req)
  95. if err := s.vpnMgr.WireGuard.SetInterfaceEnabled(name, req.Enabled); err != nil {
  96. writeError(w, http.StatusInternalServerError, err.Error())
  97. return
  98. }
  99. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name, "enabled": req.Enabled})
  100. }
  101. func (s *Server) handleStartWireGuardInterface(w http.ResponseWriter, r *http.Request) {
  102. name := r.PathValue("name")
  103. if err := s.vpnMgr.WireGuard.StartInterface(name); err != nil {
  104. writeError(w, http.StatusInternalServerError, err.Error())
  105. return
  106. }
  107. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  108. }
  109. func (s *Server) handleStopWireGuardInterface(w http.ResponseWriter, r *http.Request) {
  110. name := r.PathValue("name")
  111. if err := s.vpnMgr.WireGuard.StopInterface(name); err != nil {
  112. writeError(w, http.StatusInternalServerError, err.Error())
  113. return
  114. }
  115. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  116. }
  117. func (s *Server) handleListWireGuardPeers(w http.ResponseWriter, r *http.Request) {
  118. ifaceFilter := r.URL.Query().Get("interface")
  119. peers := s.vpnMgr.WireGuard.ListPeers(ifaceFilter)
  120. writeJSON(w, http.StatusOK, peers)
  121. }
  122. func (s *Server) handleSaveWireGuardPeer(w http.ResponseWriter, r *http.Request) {
  123. var req vpn.SaveWireGuardPeerRequest
  124. if err := json.NewDecoder(r.Body).Decode(&req); err != nil || req.PublicKey == "" || req.Interface == "" {
  125. writeError(w, http.StatusBadRequest, "interface and public_key are required")
  126. return
  127. }
  128. if err := s.vpnMgr.WireGuard.SavePeer(req); err != nil {
  129. writeError(w, http.StatusBadRequest, err.Error())
  130. return
  131. }
  132. writeJSON(w, http.StatusOK, map[string]any{"success": true, "interface": req.Interface, "public_key": req.PublicKey})
  133. }
  134. func (s *Server) handleDeleteWireGuardPeer(w http.ResponseWriter, r *http.Request) {
  135. iface := r.PathValue("iface")
  136. pubkey := r.PathValue("pubkey")
  137. if iface == "" || pubkey == "" {
  138. iface = r.URL.Query().Get("interface")
  139. pubkey = r.URL.Query().Get("public_key")
  140. }
  141. if iface == "" || pubkey == "" {
  142. var body struct {
  143. Interface string `json:"interface"`
  144. PublicKey string `json:"public_key"`
  145. }
  146. _ = json.NewDecoder(r.Body).Decode(&body)
  147. if body.Interface != "" {
  148. iface = body.Interface
  149. }
  150. if body.PublicKey != "" {
  151. pubkey = body.PublicKey
  152. }
  153. }
  154. if iface == "" || pubkey == "" {
  155. writeError(w, http.StatusBadRequest, "interface and public_key are required")
  156. return
  157. }
  158. if err := s.vpnMgr.WireGuard.DeletePeer(iface, pubkey); err != nil {
  159. writeError(w, http.StatusInternalServerError, err.Error())
  160. return
  161. }
  162. writeJSON(w, http.StatusOK, map[string]any{"success": true, "interface": iface, "public_key": pubkey})
  163. }
  164. func (s *Server) handleSetWireGuardPeerState(w http.ResponseWriter, r *http.Request) {
  165. var req struct {
  166. Interface string `json:"interface"`
  167. PublicKey string `json:"public_key"`
  168. Enabled bool `json:"enabled"`
  169. }
  170. _ = json.NewDecoder(r.Body).Decode(&req)
  171. if req.Interface == "" {
  172. req.Interface = r.PathValue("iface")
  173. }
  174. if req.PublicKey == "" {
  175. req.PublicKey = r.PathValue("pubkey")
  176. }
  177. if req.Interface == "" || req.PublicKey == "" {
  178. writeError(w, http.StatusBadRequest, "interface and public_key are required")
  179. return
  180. }
  181. if err := s.vpnMgr.WireGuard.SetPeerEnabled(req.Interface, req.PublicKey, req.Enabled); err != nil {
  182. writeError(w, http.StatusBadRequest, err.Error())
  183. return
  184. }
  185. writeJSON(w, http.StatusOK, map[string]any{"success": true, "interface": req.Interface, "public_key": req.PublicKey, "enabled": req.Enabled})
  186. }
  187. func (s *Server) handleWireGuardGenKeys(w http.ResponseWriter, r *http.Request) {
  188. priv, pub, err := s.vpnMgr.WireGuard.GenerateKeyPair()
  189. if err != nil {
  190. writeError(w, http.StatusInternalServerError, err.Error())
  191. return
  192. }
  193. writeJSON(w, http.StatusOK, map[string]string{
  194. "private_key": priv,
  195. "public_key": pub,
  196. })
  197. }
  198. func (s *Server) handleWireGuardCalcPubKey(w http.ResponseWriter, r *http.Request) {
  199. var req struct {
  200. PrivateKey string `json:"private_key"`
  201. }
  202. if err := json.NewDecoder(r.Body).Decode(&req); err != nil || req.PrivateKey == "" {
  203. writeError(w, http.StatusBadRequest, "private_key is required")
  204. return
  205. }
  206. pub, err := s.vpnMgr.WireGuard.CalcPublicKey(req.PrivateKey)
  207. if err != nil {
  208. writeError(w, http.StatusBadRequest, err.Error())
  209. return
  210. }
  211. writeJSON(w, http.StatusOK, map[string]string{"public_key": pub})
  212. }
  213. // ======================== PPTP Multi-Instance Handlers ========================
  214. func (s *Server) handleListPPTP(w http.ResponseWriter, r *http.Request) {
  215. list := s.vpnMgr.PPTP.List()
  216. writeJSON(w, http.StatusOK, list)
  217. }
  218. func (s *Server) handleSavePPTP(w http.ResponseWriter, r *http.Request) {
  219. var inst vpn.PPTPInstance
  220. if err := json.NewDecoder(r.Body).Decode(&inst); err != nil {
  221. writeError(w, http.StatusBadRequest, "invalid request body")
  222. return
  223. }
  224. if err := s.vpnMgr.PPTP.Save(inst); err != nil {
  225. writeError(w, http.StatusInternalServerError, err.Error())
  226. return
  227. }
  228. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": inst.Name})
  229. }
  230. func (s *Server) handleDeletePPTP(w http.ResponseWriter, r *http.Request) {
  231. name := r.PathValue("name")
  232. if err := s.vpnMgr.PPTP.Delete(name); err != nil {
  233. writeError(w, http.StatusInternalServerError, err.Error())
  234. return
  235. }
  236. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  237. }
  238. func (s *Server) handleSetPPTPState(w http.ResponseWriter, r *http.Request) {
  239. name := r.PathValue("name")
  240. var req struct {
  241. Enabled bool `json:"enabled"`
  242. }
  243. _ = json.NewDecoder(r.Body).Decode(&req)
  244. if err := s.vpnMgr.PPTP.SetEnabled(name, req.Enabled); err != nil {
  245. writeError(w, http.StatusInternalServerError, err.Error())
  246. return
  247. }
  248. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name, "enabled": req.Enabled})
  249. }
  250. func (s *Server) handleConnectPPTP(w http.ResponseWriter, r *http.Request) {
  251. name := r.PathValue("name")
  252. if err := s.vpnMgr.PPTP.Connect(name); err != nil {
  253. writeError(w, http.StatusInternalServerError, err.Error())
  254. return
  255. }
  256. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  257. }
  258. func (s *Server) handleDisconnectPPTP(w http.ResponseWriter, r *http.Request) {
  259. name := r.PathValue("name")
  260. if err := s.vpnMgr.PPTP.Disconnect(name); err != nil {
  261. writeError(w, http.StatusInternalServerError, err.Error())
  262. return
  263. }
  264. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  265. }
  266. // ======================== L2TP Multi-Instance Handlers ========================
  267. func (s *Server) handleListL2TP(w http.ResponseWriter, r *http.Request) {
  268. list := s.vpnMgr.L2TP.List()
  269. writeJSON(w, http.StatusOK, list)
  270. }
  271. func (s *Server) handleSaveL2TP(w http.ResponseWriter, r *http.Request) {
  272. var inst vpn.L2TPInstance
  273. if err := json.NewDecoder(r.Body).Decode(&inst); err != nil {
  274. writeError(w, http.StatusBadRequest, "invalid request body")
  275. return
  276. }
  277. if err := s.vpnMgr.L2TP.Save(inst); err != nil {
  278. writeError(w, http.StatusInternalServerError, err.Error())
  279. return
  280. }
  281. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": inst.Name})
  282. }
  283. func (s *Server) handleDeleteL2TP(w http.ResponseWriter, r *http.Request) {
  284. name := r.PathValue("name")
  285. if err := s.vpnMgr.L2TP.Delete(name); err != nil {
  286. writeError(w, http.StatusInternalServerError, err.Error())
  287. return
  288. }
  289. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  290. }
  291. func (s *Server) handleSetL2TPState(w http.ResponseWriter, r *http.Request) {
  292. name := r.PathValue("name")
  293. var req struct {
  294. Enabled bool `json:"enabled"`
  295. }
  296. _ = json.NewDecoder(r.Body).Decode(&req)
  297. if err := s.vpnMgr.L2TP.SetEnabled(name, req.Enabled); err != nil {
  298. writeError(w, http.StatusInternalServerError, err.Error())
  299. return
  300. }
  301. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name, "enabled": req.Enabled})
  302. }
  303. func (s *Server) handleConnectL2TP(w http.ResponseWriter, r *http.Request) {
  304. name := r.PathValue("name")
  305. if err := s.vpnMgr.L2TP.Connect(name); err != nil {
  306. writeError(w, http.StatusInternalServerError, err.Error())
  307. return
  308. }
  309. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  310. }
  311. func (s *Server) handleDisconnectL2TP(w http.ResponseWriter, r *http.Request) {
  312. name := r.PathValue("name")
  313. if err := s.vpnMgr.L2TP.Disconnect(name); err != nil {
  314. writeError(w, http.StatusInternalServerError, err.Error())
  315. return
  316. }
  317. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  318. }
  319. // ======================== IPSec Multi-Tunnel Handlers ========================
  320. func (s *Server) handleListIPSec(w http.ResponseWriter, r *http.Request) {
  321. list := s.vpnMgr.IPSec.List()
  322. writeJSON(w, http.StatusOK, list)
  323. }
  324. func (s *Server) handleSaveIPSecTunnel(w http.ResponseWriter, r *http.Request) {
  325. var conn vpn.IPSecConnection
  326. if err := json.NewDecoder(r.Body).Decode(&conn); err != nil || conn.Name == "" {
  327. writeError(w, http.StatusBadRequest, "invalid request body")
  328. return
  329. }
  330. if err := s.vpnMgr.IPSec.SaveConnection(conn); err != nil {
  331. writeError(w, http.StatusInternalServerError, err.Error())
  332. return
  333. }
  334. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": conn.Name})
  335. }
  336. func (s *Server) handleDeleteIPSecTunnel(w http.ResponseWriter, r *http.Request) {
  337. name := r.PathValue("name")
  338. if err := s.vpnMgr.IPSec.DeleteConnection(name); err != nil {
  339. writeError(w, http.StatusInternalServerError, err.Error())
  340. return
  341. }
  342. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  343. }
  344. func (s *Server) handleSetIPSecState(w http.ResponseWriter, r *http.Request) {
  345. name := r.PathValue("name")
  346. var req struct {
  347. Enabled bool `json:"enabled"`
  348. }
  349. _ = json.NewDecoder(r.Body).Decode(&req)
  350. if err := s.vpnMgr.IPSec.SetEnabled(name, req.Enabled); err != nil {
  351. writeError(w, http.StatusInternalServerError, err.Error())
  352. return
  353. }
  354. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name, "enabled": req.Enabled})
  355. }
  356. func (s *Server) handleInitiateIPSecTunnel(w http.ResponseWriter, r *http.Request) {
  357. name := r.PathValue("name")
  358. if err := s.vpnMgr.IPSec.StartTunnel(name); err != nil {
  359. writeError(w, http.StatusInternalServerError, err.Error())
  360. return
  361. }
  362. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  363. }
  364. func (s *Server) handleTerminateIPSecTunnel(w http.ResponseWriter, r *http.Request) {
  365. name := r.PathValue("name")
  366. if err := s.vpnMgr.IPSec.StopTunnel(name); err != nil {
  367. writeError(w, http.StatusInternalServerError, err.Error())
  368. return
  369. }
  370. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  371. }
  372. // ======================== EoIP (Ethernet-over-IP) Handlers ========================
  373. func (s *Server) handleListEoIP(w http.ResponseWriter, r *http.Request) {
  374. list := s.vpnMgr.EoIP.List()
  375. writeJSON(w, http.StatusOK, list)
  376. }
  377. func (s *Server) handleSaveEoIP(w http.ResponseWriter, r *http.Request) {
  378. var inst vpn.EoIPInstance
  379. if err := json.NewDecoder(r.Body).Decode(&inst); err != nil {
  380. writeError(w, http.StatusBadRequest, "invalid request body")
  381. return
  382. }
  383. if err := s.vpnMgr.EoIP.Save(&inst); err != nil {
  384. writeError(w, http.StatusInternalServerError, err.Error())
  385. return
  386. }
  387. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": inst.ID, "name": inst.Name})
  388. }
  389. func (s *Server) handleDeleteEoIP(w http.ResponseWriter, r *http.Request) {
  390. id := r.PathValue("id")
  391. if err := s.vpnMgr.EoIP.Delete(id); err != nil {
  392. writeError(w, http.StatusInternalServerError, err.Error())
  393. return
  394. }
  395. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id})
  396. }
  397. func (s *Server) handleSetEoIPState(w http.ResponseWriter, r *http.Request) {
  398. id := r.PathValue("id")
  399. var req struct {
  400. Disabled bool `json:"disabled"`
  401. }
  402. _ = json.NewDecoder(r.Body).Decode(&req)
  403. if err := s.vpnMgr.EoIP.SetState(id, req.Disabled); err != nil {
  404. writeError(w, http.StatusInternalServerError, err.Error())
  405. return
  406. }
  407. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "disabled": req.Disabled})
  408. }
  409. // ======================== PPP Profiles Handlers ========================
  410. func (s *Server) handleListPPPProfiles(w http.ResponseWriter, r *http.Request) {
  411. list := s.vpnMgr.PPPServer.ListProfiles()
  412. writeJSON(w, http.StatusOK, list)
  413. }
  414. func (s *Server) handleSavePPPProfile(w http.ResponseWriter, r *http.Request) {
  415. var prof vpn.PPPProfile
  416. if err := json.NewDecoder(r.Body).Decode(&prof); err != nil {
  417. writeError(w, http.StatusBadRequest, "invalid request body")
  418. return
  419. }
  420. if err := s.vpnMgr.PPPServer.SaveProfile(&prof); err != nil {
  421. writeError(w, http.StatusInternalServerError, err.Error())
  422. return
  423. }
  424. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": prof.Name})
  425. }
  426. func (s *Server) handleDeletePPPProfile(w http.ResponseWriter, r *http.Request) {
  427. name := r.PathValue("name")
  428. if err := s.vpnMgr.PPPServer.DeleteProfile(name); err != nil {
  429. writeError(w, http.StatusInternalServerError, err.Error())
  430. return
  431. }
  432. writeJSON(w, http.StatusOK, map[string]any{"success": true, "name": name})
  433. }
  434. // ======================== PPP Secrets Handlers ========================
  435. func (s *Server) handleListPPPSecrets(w http.ResponseWriter, r *http.Request) {
  436. list := s.vpnMgr.PPPServer.ListSecrets()
  437. writeJSON(w, http.StatusOK, list)
  438. }
  439. func (s *Server) handleSavePPPSecret(w http.ResponseWriter, r *http.Request) {
  440. var sec vpn.PPPSecret
  441. if err := json.NewDecoder(r.Body).Decode(&sec); err != nil {
  442. writeError(w, http.StatusBadRequest, "invalid request body")
  443. return
  444. }
  445. if err := s.vpnMgr.PPPServer.SaveSecret(&sec); err != nil {
  446. writeError(w, http.StatusInternalServerError, err.Error())
  447. return
  448. }
  449. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": sec.ID, "name": sec.Name})
  450. }
  451. func (s *Server) handleSetPPPSecretState(w http.ResponseWriter, r *http.Request) {
  452. id := r.PathValue("id")
  453. var req struct {
  454. Disabled bool `json:"disabled"`
  455. }
  456. _ = json.NewDecoder(r.Body).Decode(&req)
  457. if err := s.vpnMgr.PPPServer.SetSecretState(id, req.Disabled); err != nil {
  458. writeError(w, http.StatusInternalServerError, err.Error())
  459. return
  460. }
  461. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "disabled": req.Disabled})
  462. }
  463. func (s *Server) handleDeletePPPSecret(w http.ResponseWriter, r *http.Request) {
  464. id := r.PathValue("id")
  465. if err := s.vpnMgr.PPPServer.DeleteSecret(id); err != nil {
  466. writeError(w, http.StatusInternalServerError, err.Error())
  467. return
  468. }
  469. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id})
  470. }
  471. // ======================== Active PPP Sessions Handlers ========================
  472. func (s *Server) handleListPPPSessions(w http.ResponseWriter, r *http.Request) {
  473. list := s.vpnMgr.PPPServer.ListActiveSessions()
  474. writeJSON(w, http.StatusOK, list)
  475. }
  476. func (s *Server) handleDisconnectPPPSession(w http.ResponseWriter, r *http.Request) {
  477. iface := r.PathValue("iface")
  478. if err := s.vpnMgr.PPPServer.DisconnectSession(iface); err != nil {
  479. writeError(w, http.StatusInternalServerError, err.Error())
  480. return
  481. }
  482. writeJSON(w, http.StatusOK, map[string]any{"success": true, "interface": iface})
  483. }
  484. // ======================== VPN Servers Configuration Handlers ========================
  485. func (s *Server) handleGetPPPoEServer(w http.ResponseWriter, r *http.Request) {
  486. cfg := s.vpnMgr.PPPServer.GetPPPoEServer()
  487. writeJSON(w, http.StatusOK, cfg)
  488. }
  489. func (s *Server) handleSetPPPoEServer(w http.ResponseWriter, r *http.Request) {
  490. var cfg vpn.PPPoEServerConfig
  491. if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil {
  492. writeError(w, http.StatusBadRequest, "invalid request body")
  493. return
  494. }
  495. if err := s.vpnMgr.PPPServer.SetPPPoEServer(cfg); err != nil {
  496. writeError(w, http.StatusInternalServerError, err.Error())
  497. return
  498. }
  499. writeJSON(w, http.StatusOK, map[string]any{"success": true})
  500. }
  501. func (s *Server) handleGetPPTPServer(w http.ResponseWriter, r *http.Request) {
  502. cfg := s.vpnMgr.PPPServer.GetPPTPServer()
  503. writeJSON(w, http.StatusOK, cfg)
  504. }
  505. func (s *Server) handleSetPPTPServer(w http.ResponseWriter, r *http.Request) {
  506. var cfg vpn.PPTPServerConfig
  507. if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil {
  508. writeError(w, http.StatusBadRequest, "invalid request body")
  509. return
  510. }
  511. if err := s.vpnMgr.PPPServer.SetPPTPServer(cfg); err != nil {
  512. writeError(w, http.StatusInternalServerError, err.Error())
  513. return
  514. }
  515. writeJSON(w, http.StatusOK, map[string]any{"success": true})
  516. }
  517. func (s *Server) handleGetL2TPServer(w http.ResponseWriter, r *http.Request) {
  518. cfg := s.vpnMgr.PPPServer.GetL2TPServer()
  519. writeJSON(w, http.StatusOK, cfg)
  520. }
  521. func (s *Server) handleSetL2TPServer(w http.ResponseWriter, r *http.Request) {
  522. var cfg vpn.L2TPServerConfig
  523. if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil {
  524. writeError(w, http.StatusBadRequest, "invalid request body")
  525. return
  526. }
  527. if err := s.vpnMgr.PPPServer.SetL2TPServer(cfg); err != nil {
  528. writeError(w, http.StatusInternalServerError, err.Error())
  529. return
  530. }
  531. writeJSON(w, http.StatusOK, map[string]any{"success": true})
  532. }
  533. func (s *Server) handleGetIPSecServer(w http.ResponseWriter, r *http.Request) {
  534. cfg := s.vpnMgr.PPPServer.GetIPSecServer()
  535. writeJSON(w, http.StatusOK, cfg)
  536. }
  537. func (s *Server) handleSetIPSecServer(w http.ResponseWriter, r *http.Request) {
  538. var cfg vpn.IPSecServerConfig
  539. if err := json.NewDecoder(r.Body).Decode(&cfg); err != nil {
  540. writeError(w, http.StatusBadRequest, "invalid request body")
  541. return
  542. }
  543. if err := s.vpnMgr.PPPServer.SetIPSecServer(cfg); err != nil {
  544. writeError(w, http.StatusInternalServerError, err.Error())
  545. return
  546. }
  547. writeJSON(w, http.StatusOK, map[string]any{"success": true})
  548. }
  549. // WireGuard Client Config Generator
  550. func (s *Server) handleGenerateWGClientConfig(w http.ResponseWriter, r *http.Request) {
  551. var req struct {
  552. Interface string `json:"interface"`
  553. Address string `json:"address"`
  554. PrivKey string `json:"private_key"`
  555. Endpoint string `json:"endpoint"`
  556. DNS string `json:"dns"`
  557. }
  558. if err := json.NewDecoder(r.Body).Decode(&req); err != nil || req.Interface == "" {
  559. writeError(w, http.StatusBadRequest, "interface is required")
  560. return
  561. }
  562. if req.PrivKey == "" {
  563. priv, _, err := s.vpnMgr.WireGuard.GenerateKeyPair()
  564. if err == nil {
  565. req.PrivKey = priv
  566. }
  567. }
  568. conf, err := s.vpnMgr.WireGuard.GenerateClientConfig(req.Interface, req.PrivKey, req.Address, req.Endpoint, req.DNS)
  569. if err != nil {
  570. writeError(w, http.StatusInternalServerError, err.Error())
  571. return
  572. }
  573. writeJSON(w, http.StatusOK, map[string]any{"success": true, "config": conf, "client_private_key": req.PrivKey})
  574. }