user.go 23 KB

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