2
0

user.go 26 KB

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