user.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. package controller
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. "github.com/gorilla/mux"
  8. "github.com/gorilla/websocket"
  9. "github.com/gravitl/netmaker/auth"
  10. "github.com/gravitl/netmaker/database"
  11. "github.com/gravitl/netmaker/logger"
  12. "github.com/gravitl/netmaker/logic"
  13. "github.com/gravitl/netmaker/models"
  14. "github.com/gravitl/netmaker/mq"
  15. "github.com/gravitl/netmaker/servercfg"
  16. "golang.org/x/exp/slog"
  17. )
  18. var (
  19. upgrader = websocket.Upgrader{}
  20. )
  21. func userHandlers(r *mux.Router) {
  22. r.HandleFunc("/api/users/adm/hassuperadmin", hasSuperAdmin).Methods(http.MethodGet)
  23. r.HandleFunc("/api/users/adm/createsuperadmin", createSuperAdmin).Methods(http.MethodPost)
  24. r.HandleFunc("/api/users/adm/transfersuperadmin/{username}", logic.SecurityCheck(true, http.HandlerFunc(transferSuperAdmin))).Methods(http.MethodPost)
  25. r.HandleFunc("/api/users/adm/authenticate", authenticateUser).Methods(http.MethodPost)
  26. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(true, http.HandlerFunc(updateUser))).Methods(http.MethodPut)
  27. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(true, checkFreeTierLimits(limitChoiceUsers, http.HandlerFunc(createUser)))).Methods(http.MethodPost)
  28. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(true, http.HandlerFunc(deleteUser))).Methods(http.MethodDelete)
  29. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUser)))).Methods(http.MethodGet)
  30. r.HandleFunc("/api/users", logic.SecurityCheck(true, http.HandlerFunc(getUsers))).Methods(http.MethodGet)
  31. r.HandleFunc("/api/oauth/login", auth.HandleAuthLogin).Methods(http.MethodGet)
  32. r.HandleFunc("/api/oauth/callback", auth.HandleAuthCallback).Methods(http.MethodGet)
  33. r.HandleFunc("/api/oauth/headless", auth.HandleHeadlessSSO)
  34. r.HandleFunc("/api/oauth/register/{regKey}", auth.RegisterHostSSO).Methods(http.MethodGet)
  35. r.HandleFunc("/api/users_pending", logic.SecurityCheck(true, http.HandlerFunc(getPendingUsers))).Methods(http.MethodGet)
  36. r.HandleFunc("/api/users_pending", logic.SecurityCheck(true, http.HandlerFunc(deleteAllPendingUsers))).Methods(http.MethodDelete)
  37. r.HandleFunc("/api/users_pending/user/{username}", logic.SecurityCheck(true, http.HandlerFunc(deletePendingUser))).Methods(http.MethodDelete)
  38. r.HandleFunc("/api/users_pending/user/{username}", logic.SecurityCheck(true, http.HandlerFunc(approvePendingUser))).Methods(http.MethodPost)
  39. }
  40. // swagger:route POST /api/users/adm/authenticate authenticate authenticateUser
  41. //
  42. // User authenticates using its password and retrieves a JWT for authorization.
  43. //
  44. // Schemes: https
  45. //
  46. // Security:
  47. // oauth
  48. //
  49. // Responses:
  50. // 200: successResponse
  51. func authenticateUser(response http.ResponseWriter, request *http.Request) {
  52. // Auth request consists of Mac Address and Password (from node that is authorizing
  53. // in case of Master, auth is ignored and mac is set to "mastermac"
  54. var authRequest models.UserAuthParams
  55. var errorResponse = models.ErrorResponse{
  56. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  57. }
  58. if !servercfg.IsBasicAuthEnabled() {
  59. logic.ReturnErrorResponse(response, request, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  60. return
  61. }
  62. decoder := json.NewDecoder(request.Body)
  63. decoderErr := decoder.Decode(&authRequest)
  64. defer request.Body.Close()
  65. if decoderErr != nil {
  66. logger.Log(0, "error decoding request body: ",
  67. decoderErr.Error())
  68. logic.ReturnErrorResponse(response, request, errorResponse)
  69. return
  70. }
  71. if val := request.Header.Get("From-Ui"); val == "true" {
  72. // request came from UI, if normal user block Login
  73. user, err := logic.GetUser(authRequest.UserName)
  74. if err != nil {
  75. logger.Log(0, authRequest.UserName, "user validation failed: ",
  76. err.Error())
  77. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "unauthorized"))
  78. return
  79. }
  80. if !(user.IsAdmin || user.IsSuperAdmin) {
  81. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("only admins can access dashboard"), "unauthorized"))
  82. return
  83. }
  84. }
  85. username := authRequest.UserName
  86. jwt, err := logic.VerifyAuthRequest(authRequest)
  87. if err != nil {
  88. logger.Log(0, username, "user validation failed: ",
  89. err.Error())
  90. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "badrequest"))
  91. return
  92. }
  93. if jwt == "" {
  94. // very unlikely that err is !nil and no jwt returned, but handle it anyways.
  95. logger.Log(0, username, "jwt token is empty")
  96. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("no token returned"), "internal"))
  97. return
  98. }
  99. var successResponse = models.SuccessResponse{
  100. Code: http.StatusOK,
  101. Message: "W1R3: Device " + username + " Authorized",
  102. Response: models.SuccessfulUserLoginResponse{
  103. AuthToken: jwt,
  104. UserName: username,
  105. },
  106. }
  107. // Send back the JWT
  108. successJSONResponse, jsonError := json.Marshal(successResponse)
  109. if jsonError != nil {
  110. logger.Log(0, username,
  111. "error marshalling resp: ", err.Error())
  112. logic.ReturnErrorResponse(response, request, errorResponse)
  113. return
  114. }
  115. logger.Log(2, username, "was authenticated")
  116. response.Header().Set("Content-Type", "application/json")
  117. response.Write(successJSONResponse)
  118. go func() {
  119. if servercfg.IsPro && servercfg.GetRacAutoDisable() {
  120. // enable all associeated clients for the user
  121. clients, err := logic.GetAllExtClients()
  122. if err != nil {
  123. slog.Error("error getting clients: ", "error", err)
  124. return
  125. }
  126. for _, client := range clients {
  127. if client.OwnerID == username && !client.Enabled {
  128. slog.Info(fmt.Sprintf("enabling ext client %s for user %s due to RAC autodisabling feature", client.ClientID, client.OwnerID))
  129. if newClient, err := logic.ToggleExtClientConnectivity(&client, true); err != nil {
  130. slog.Error("error enabling ext client in RAC autodisable hook", "error", err)
  131. continue // dont return but try for other clients
  132. } else {
  133. // publish peer update to ingress gateway
  134. if ingressNode, err := logic.GetNodeByID(newClient.IngressGatewayID); err == nil {
  135. if err = mq.PublishPeerUpdate(false); err != nil {
  136. slog.Error("error updating ext clients on", "ingress", ingressNode.ID.String(), "err", err.Error())
  137. }
  138. }
  139. }
  140. }
  141. }
  142. }
  143. }()
  144. }
  145. // swagger:route GET /api/users/adm/hassuperadmin user hasSuperAdmin
  146. //
  147. // Checks whether the server has an admin.
  148. //
  149. // Schemes: https
  150. //
  151. // Security:
  152. // oauth
  153. //
  154. // Responses:
  155. // 200: hasAdmin
  156. func hasSuperAdmin(w http.ResponseWriter, r *http.Request) {
  157. w.Header().Set("Content-Type", "application/json")
  158. hasSuperAdmin, err := logic.HasSuperAdmin()
  159. if err != nil {
  160. logger.Log(0, "failed to check for admin: ", err.Error())
  161. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  162. return
  163. }
  164. json.NewEncoder(w).Encode(hasSuperAdmin)
  165. }
  166. // swagger:route GET /api/users/{username} user getUser
  167. //
  168. // Get an individual user.
  169. //
  170. // Schemes: https
  171. //
  172. // Security:
  173. // oauth
  174. //
  175. // Responses:
  176. // 200: userBodyResponse
  177. func getUser(w http.ResponseWriter, r *http.Request) {
  178. // set header.
  179. w.Header().Set("Content-Type", "application/json")
  180. var params = mux.Vars(r)
  181. usernameFetched := params["username"]
  182. user, err := logic.GetReturnUser(usernameFetched)
  183. if err != nil {
  184. logger.Log(0, usernameFetched, "failed to fetch user: ", err.Error())
  185. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  186. return
  187. }
  188. logger.Log(2, r.Header.Get("user"), "fetched user", usernameFetched)
  189. json.NewEncoder(w).Encode(user)
  190. }
  191. // swagger:route GET /api/users user getUsers
  192. //
  193. // Get all users.
  194. //
  195. // Schemes: https
  196. //
  197. // Security:
  198. // oauth
  199. //
  200. // Responses:
  201. // 200: userBodyResponse
  202. func getUsers(w http.ResponseWriter, r *http.Request) {
  203. // set header.
  204. w.Header().Set("Content-Type", "application/json")
  205. users, err := logic.GetUsers()
  206. if err != nil {
  207. logger.Log(0, "failed to fetch users: ", err.Error())
  208. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  209. return
  210. }
  211. logic.SortUsers(users[:])
  212. logger.Log(2, r.Header.Get("user"), "fetched users")
  213. json.NewEncoder(w).Encode(users)
  214. }
  215. // swagger:route POST /api/users/adm/createsuperadmin user createAdmin
  216. //
  217. // Make a user an admin.
  218. //
  219. // Schemes: https
  220. //
  221. // Security:
  222. // oauth
  223. //
  224. // Responses:
  225. // 200: userBodyResponse
  226. func createSuperAdmin(w http.ResponseWriter, r *http.Request) {
  227. w.Header().Set("Content-Type", "application/json")
  228. var u models.User
  229. err := json.NewDecoder(r.Body).Decode(&u)
  230. if err != nil {
  231. slog.Error("error decoding request body", "error", err.Error())
  232. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  233. return
  234. }
  235. if !servercfg.IsBasicAuthEnabled() {
  236. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  237. return
  238. }
  239. err = logic.CreateSuperAdmin(&u)
  240. if err != nil {
  241. slog.Error("failed to create admin", "error", err.Error())
  242. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  243. return
  244. }
  245. logger.Log(1, u.UserName, "was made a super admin")
  246. json.NewEncoder(w).Encode(logic.ToReturnUser(u))
  247. }
  248. // swagger:route POST /api/users/adm/transfersuperadmin user transferSuperAdmin
  249. //
  250. // Transfers superadmin role to an admin user.
  251. //
  252. // Schemes: https
  253. //
  254. // Security:
  255. // oauth
  256. //
  257. // Responses:
  258. // 200: userBodyResponse
  259. func transferSuperAdmin(w http.ResponseWriter, r *http.Request) {
  260. w.Header().Set("Content-Type", "application/json")
  261. caller, err := logic.GetUser(r.Header.Get("user"))
  262. if err != nil {
  263. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  264. }
  265. if !caller.IsSuperAdmin {
  266. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only superadmin can assign the superadmin role to another user"), "forbidden"))
  267. return
  268. }
  269. var params = mux.Vars(r)
  270. username := params["username"]
  271. u, err := logic.GetUser(username)
  272. if err != nil {
  273. slog.Error("error getting user", "user", u.UserName, "error", err.Error())
  274. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  275. return
  276. }
  277. if !u.IsAdmin {
  278. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only admins can be promoted to superadmin role"), "forbidden"))
  279. return
  280. }
  281. if !servercfg.IsBasicAuthEnabled() {
  282. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  283. return
  284. }
  285. u.IsSuperAdmin = true
  286. u.IsAdmin = false
  287. err = logic.UpsertUser(*u)
  288. if err != nil {
  289. slog.Error("error updating user to superadmin: ", "user", u.UserName, "error", err.Error())
  290. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  291. return
  292. }
  293. caller.IsSuperAdmin = false
  294. caller.IsAdmin = true
  295. err = logic.UpsertUser(*caller)
  296. if err != nil {
  297. slog.Error("error demoting user to admin: ", "user", caller.UserName, "error", err.Error())
  298. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  299. return
  300. }
  301. slog.Info("user was made a super admin", "user", u.UserName)
  302. json.NewEncoder(w).Encode(logic.ToReturnUser(*u))
  303. }
  304. // swagger:route POST /api/users/{username} user createUser
  305. //
  306. // Create a user.
  307. //
  308. // Schemes: https
  309. //
  310. // Security:
  311. // oauth
  312. //
  313. // Responses:
  314. // 200: userBodyResponse
  315. func createUser(w http.ResponseWriter, r *http.Request) {
  316. w.Header().Set("Content-Type", "application/json")
  317. caller, err := logic.GetUser(r.Header.Get("user"))
  318. if err != nil {
  319. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  320. return
  321. }
  322. var user models.User
  323. err = json.NewDecoder(r.Body).Decode(&user)
  324. if err != nil {
  325. logger.Log(0, user.UserName, "error decoding request body: ",
  326. err.Error())
  327. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  328. return
  329. }
  330. if !caller.IsSuperAdmin && user.IsAdmin {
  331. err = errors.New("only superadmin can create admin users")
  332. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  333. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  334. return
  335. }
  336. if user.IsSuperAdmin {
  337. err = errors.New("additional superadmins cannot be created")
  338. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  339. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  340. return
  341. }
  342. if !servercfg.IsPro && !user.IsAdmin {
  343. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("non-admins users can only be created on Pro version"), "forbidden"))
  344. return
  345. }
  346. err = logic.CreateUser(&user)
  347. if err != nil {
  348. slog.Error("error creating new user: ", "user", user.UserName, "error", err.Error())
  349. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  350. return
  351. }
  352. slog.Info("user was created", "username", user.UserName)
  353. json.NewEncoder(w).Encode(logic.ToReturnUser(user))
  354. }
  355. // swagger:route PUT /api/users/{username} user updateUser
  356. //
  357. // Update a user.
  358. //
  359. // Schemes: https
  360. //
  361. // Security:
  362. // oauth
  363. //
  364. // Responses:
  365. // 200: userBodyResponse
  366. func updateUser(w http.ResponseWriter, r *http.Request) {
  367. w.Header().Set("Content-Type", "application/json")
  368. var params = mux.Vars(r)
  369. // start here
  370. var caller *models.User
  371. var err error
  372. var ismaster bool
  373. if r.Header.Get("user") == logic.MasterUser {
  374. ismaster = true
  375. } else {
  376. caller, err = logic.GetUser(r.Header.Get("user"))
  377. if err != nil {
  378. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  379. }
  380. }
  381. username := params["username"]
  382. user, err := logic.GetUser(username)
  383. if err != nil {
  384. logger.Log(0, username,
  385. "failed to update user info: ", err.Error())
  386. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  387. return
  388. }
  389. var userchange models.User
  390. // we decode our body request params
  391. err = json.NewDecoder(r.Body).Decode(&userchange)
  392. if err != nil {
  393. slog.Error("failed to decode body", "error ", err.Error())
  394. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  395. return
  396. }
  397. if user.UserName != userchange.UserName {
  398. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user in param and request body not matching"), "badrequest"))
  399. return
  400. }
  401. selfUpdate := false
  402. if !ismaster && caller.UserName == user.UserName {
  403. selfUpdate = true
  404. }
  405. if !ismaster && !selfUpdate {
  406. if caller.IsAdmin && user.IsSuperAdmin {
  407. slog.Error("non-superadmin user", "caller", caller.UserName, "attempted to update superadmin user", username)
  408. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  409. return
  410. }
  411. if !caller.IsAdmin && !caller.IsSuperAdmin {
  412. slog.Error("operation not allowed", "caller", caller.UserName, "attempted to update user", username)
  413. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  414. return
  415. }
  416. if caller.IsAdmin && user.IsAdmin {
  417. slog.Error("admin user cannot update another admin", "caller", caller.UserName, "attempted to update admin user", username)
  418. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("admin user cannot update another admin"), "forbidden"))
  419. return
  420. }
  421. if caller.IsAdmin && userchange.IsAdmin {
  422. err = errors.New("admin user cannot update role of an another user to admin")
  423. slog.Error("failed to update user", "caller", caller.UserName, "attempted to update user", username, "error", err)
  424. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  425. return
  426. }
  427. }
  428. if !ismaster && selfUpdate {
  429. if user.IsAdmin != userchange.IsAdmin || user.IsSuperAdmin != userchange.IsSuperAdmin {
  430. slog.Error("user cannot change his own role", "caller", caller.UserName, "attempted to update user role", username)
  431. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user not allowed to self assign role"), "forbidden"))
  432. return
  433. }
  434. }
  435. if ismaster {
  436. if !user.IsSuperAdmin && userchange.IsSuperAdmin {
  437. slog.Error("operation not allowed", "caller", logic.MasterUser, "attempted to update user role to superadmin", username)
  438. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("attempted to update user role to superadmin"), "forbidden"))
  439. return
  440. }
  441. }
  442. if auth.IsOauthUser(user) == nil && userchange.Password != "" {
  443. err := fmt.Errorf("cannot update user's password for an oauth user %s", username)
  444. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  445. return
  446. }
  447. user, err = logic.UpdateUser(&userchange, user)
  448. if err != nil {
  449. logger.Log(0, username,
  450. "failed to update user info: ", err.Error())
  451. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  452. return
  453. }
  454. logger.Log(1, username, "was updated")
  455. json.NewEncoder(w).Encode(logic.ToReturnUser(*user))
  456. }
  457. // swagger:route DELETE /api/users/{username} user deleteUser
  458. //
  459. // Delete a user.
  460. //
  461. // Schemes: https
  462. //
  463. // Security:
  464. // oauth
  465. //
  466. // Responses:
  467. // 200: userBodyResponse
  468. func deleteUser(w http.ResponseWriter, r *http.Request) {
  469. // Set header
  470. w.Header().Set("Content-Type", "application/json")
  471. // get params
  472. var params = mux.Vars(r)
  473. caller, err := logic.GetUser(r.Header.Get("user"))
  474. if err != nil {
  475. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  476. }
  477. username := params["username"]
  478. user, err := logic.GetUser(username)
  479. if err != nil {
  480. logger.Log(0, username,
  481. "failed to update user info: ", err.Error())
  482. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  483. return
  484. }
  485. if user.IsSuperAdmin {
  486. slog.Error(
  487. "failed to delete user: ", "user", username, "error", "superadmin cannot be deleted")
  488. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("superadmin cannot be deleted"), "internal"))
  489. return
  490. }
  491. if !caller.IsSuperAdmin {
  492. if caller.IsAdmin && user.IsAdmin {
  493. slog.Error(
  494. "failed to delete user: ", "user", username, "error", "admin cannot delete another admin user, including oneself")
  495. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("admin cannot delete another admin user, including oneself"), "internal"))
  496. return
  497. }
  498. }
  499. success, err := logic.DeleteUser(username)
  500. if err != nil {
  501. logger.Log(0, username,
  502. "failed to delete user: ", err.Error())
  503. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  504. return
  505. } else if !success {
  506. err := errors.New("delete unsuccessful")
  507. logger.Log(0, username, err.Error())
  508. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  509. return
  510. }
  511. // check and delete extclient with this ownerID
  512. go func() {
  513. extclients, err := logic.GetAllExtClients()
  514. if err != nil {
  515. slog.Error("failed to get extclients", "error", err)
  516. return
  517. }
  518. for _, extclient := range extclients {
  519. if extclient.OwnerID == user.UserName {
  520. err = logic.DeleteExtClient(extclient.Network, extclient.ClientID)
  521. if err != nil {
  522. slog.Error("failed to delete extclient",
  523. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  524. }
  525. }
  526. }
  527. if servercfg.IsDNSMode() {
  528. logic.SetDNS()
  529. }
  530. }()
  531. logger.Log(1, username, "was deleted")
  532. json.NewEncoder(w).Encode(params["username"] + " deleted.")
  533. }
  534. // Called when vpn client dials in to start the auth flow and first stage is to get register URL itself
  535. func socketHandler(w http.ResponseWriter, r *http.Request) {
  536. // Upgrade our raw HTTP connection to a websocket based one
  537. conn, err := upgrader.Upgrade(w, r, nil)
  538. if err != nil {
  539. logger.Log(0, "error during connection upgrade for node sign-in:", err.Error())
  540. return
  541. }
  542. if conn == nil {
  543. logger.Log(0, "failed to establish web-socket connection during node sign-in")
  544. return
  545. }
  546. // Start handling the session
  547. go auth.SessionHandler(conn)
  548. }
  549. // swagger:route GET /api/users_pending user getPendingUsers
  550. //
  551. // Get all pending users.
  552. //
  553. // Schemes: https
  554. //
  555. // Security:
  556. // oauth
  557. //
  558. // Responses:
  559. // 200: userBodyResponse
  560. func getPendingUsers(w http.ResponseWriter, r *http.Request) {
  561. // set header.
  562. w.Header().Set("Content-Type", "application/json")
  563. users, err := logic.ListPendingUsers()
  564. if err != nil {
  565. logger.Log(0, "failed to fetch users: ", err.Error())
  566. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  567. return
  568. }
  569. logic.SortUsers(users[:])
  570. logger.Log(2, r.Header.Get("user"), "fetched pending users")
  571. json.NewEncoder(w).Encode(users)
  572. }
  573. // swagger:route POST /api/users_pending/user/{username} user approvePendingUser
  574. //
  575. // approve pending user.
  576. //
  577. // Schemes: https
  578. //
  579. // Security:
  580. // oauth
  581. //
  582. // Responses:
  583. // 200: userBodyResponse
  584. func approvePendingUser(w http.ResponseWriter, r *http.Request) {
  585. // set header.
  586. w.Header().Set("Content-Type", "application/json")
  587. var params = mux.Vars(r)
  588. username := params["username"]
  589. users, err := logic.ListPendingUsers()
  590. if err != nil {
  591. logger.Log(0, "failed to fetch users: ", err.Error())
  592. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  593. return
  594. }
  595. for _, user := range users {
  596. if user.UserName == username {
  597. var newPass, fetchErr = auth.FetchPassValue("")
  598. if fetchErr != nil {
  599. logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
  600. return
  601. }
  602. if err = logic.CreateUser(&models.User{
  603. UserName: user.UserName,
  604. Password: newPass,
  605. }); err != nil {
  606. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to create user: %s", err), "internal"))
  607. return
  608. }
  609. err = logic.DeletePendingUser(username)
  610. if err != nil {
  611. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  612. return
  613. }
  614. break
  615. }
  616. }
  617. logic.ReturnSuccessResponse(w, r, "approved "+username)
  618. }
  619. // swagger:route DELETE /api/users_pending/user/{username} user deletePendingUser
  620. //
  621. // delete pending user.
  622. //
  623. // Schemes: https
  624. //
  625. // Security:
  626. // oauth
  627. //
  628. // Responses:
  629. // 200: userBodyResponse
  630. func deletePendingUser(w http.ResponseWriter, r *http.Request) {
  631. // set header.
  632. w.Header().Set("Content-Type", "application/json")
  633. var params = mux.Vars(r)
  634. username := params["username"]
  635. users, err := logic.ListPendingUsers()
  636. if err != nil {
  637. logger.Log(0, "failed to fetch users: ", err.Error())
  638. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  639. return
  640. }
  641. for _, user := range users {
  642. if user.UserName == username {
  643. err = logic.DeletePendingUser(username)
  644. if err != nil {
  645. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  646. return
  647. }
  648. break
  649. }
  650. }
  651. logic.ReturnSuccessResponse(w, r, "deleted pending "+username)
  652. }
  653. // swagger:route DELETE /api/users_pending/{username}/pending user deleteAllPendingUsers
  654. //
  655. // delete all pending users.
  656. //
  657. // Schemes: https
  658. //
  659. // Security:
  660. // oauth
  661. //
  662. // Responses:
  663. // 200: userBodyResponse
  664. func deleteAllPendingUsers(w http.ResponseWriter, r *http.Request) {
  665. // set header.
  666. w.Header().Set("Content-Type", "application/json")
  667. err := database.DeleteAllRecords(database.PENDING_USERS_TABLE_NAME)
  668. if err != nil {
  669. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending users "+err.Error()), "internal"))
  670. return
  671. }
  672. logic.ReturnSuccessResponse(w, r, "cleared all pending users")
  673. }