user.go 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  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(getRole))).Methods(http.MethodGet)
  38. r.HandleFunc("/api/v1/users/role", logic.SecurityCheck(true, http.HandlerFunc(createRole))).Methods(http.MethodPost)
  39. r.HandleFunc("/api/v1/users/role", logic.SecurityCheck(true, http.HandlerFunc(updateRole))).Methods(http.MethodPut)
  40. r.HandleFunc("/api/v1/users/role", logic.SecurityCheck(true, http.HandlerFunc(deleteRole))).Methods(http.MethodDelete)
  41. // User Group Handlers
  42. r.HandleFunc("/api/v1/users/groups", logic.SecurityCheck(true, http.HandlerFunc(listUserGroups))).Methods(http.MethodGet)
  43. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(getUserGroup))).Methods(http.MethodGet)
  44. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(createUserGroup))).Methods(http.MethodPost)
  45. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(updateUserGroup))).Methods(http.MethodPut)
  46. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(deleteUserGroup))).Methods(http.MethodDelete)
  47. // User Invite Handlers
  48. r.HandleFunc("/api/v1/users/invite", userInviteVerify).Methods(http.MethodGet)
  49. r.HandleFunc("/api/v1/users/invite-signup", userInviteSignUp).Methods(http.MethodPost)
  50. r.HandleFunc("/api/v1/users/invite", logic.SecurityCheck(true, http.HandlerFunc(inviteUsers))).Methods(http.MethodPost)
  51. r.HandleFunc("/api/v1/users/invites", logic.SecurityCheck(true, http.HandlerFunc(listUserInvites))).Methods(http.MethodGet)
  52. r.HandleFunc("/api/v1/users/invite", logic.SecurityCheck(true, http.HandlerFunc(deleteUserInvite))).Methods(http.MethodDelete)
  53. r.HandleFunc("/api/v1/users/invites", logic.SecurityCheck(true, http.HandlerFunc(deleteAllUserInvites))).Methods(http.MethodDelete)
  54. }
  55. // swagger:route GET /api/v1/user/groups user listUserGroups
  56. //
  57. // Get all user groups.
  58. //
  59. // Schemes: https
  60. //
  61. // Security:
  62. // oauth
  63. //
  64. // Responses:
  65. // 200: userBodyResponse
  66. func listUserGroups(w http.ResponseWriter, r *http.Request) {
  67. groups, err := logic.ListUserGroups()
  68. if err != nil {
  69. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  70. Code: http.StatusInternalServerError,
  71. Message: err.Error(),
  72. })
  73. return
  74. }
  75. logic.ReturnSuccessResponseWithJson(w, r, groups, "successfully fetched user groups")
  76. }
  77. // swagger:route GET /api/v1/user/group user getUserGroup
  78. //
  79. // Get user group.
  80. //
  81. // Schemes: https
  82. //
  83. // Security:
  84. // oauth
  85. //
  86. // Responses:
  87. // 200: userBodyResponse
  88. func getUserGroup(w http.ResponseWriter, r *http.Request) {
  89. var params = mux.Vars(r)
  90. gid := params["group_id"]
  91. if gid == "" {
  92. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("group id is required"), "badrequest"))
  93. return
  94. }
  95. group, err := logic.GetUserGroup(models.UserGroupID(gid))
  96. if err != nil {
  97. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  98. Code: http.StatusInternalServerError,
  99. Message: err.Error(),
  100. })
  101. return
  102. }
  103. logic.ReturnSuccessResponseWithJson(w, r, group, "successfully fetched user group")
  104. }
  105. // swagger:route POST /api/v1/user/group user createUserGroup
  106. //
  107. // Create user groups.
  108. //
  109. // Schemes: https
  110. //
  111. // Security:
  112. // oauth
  113. //
  114. // Responses:
  115. // 200: userBodyResponse
  116. func createUserGroup(w http.ResponseWriter, r *http.Request) {
  117. var userGroup models.UserGroup
  118. err := json.NewDecoder(r.Body).Decode(&userGroup)
  119. if err != nil {
  120. slog.Error("error decoding request body", "error",
  121. err.Error())
  122. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  123. return
  124. }
  125. err = logic.CreateUserGroup(userGroup)
  126. if err != nil {
  127. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  128. return
  129. }
  130. logic.ReturnSuccessResponseWithJson(w, r, userGroup, "created user group")
  131. }
  132. // swagger:route PUT /api/v1/user/group user updateUserGroup
  133. //
  134. // Update user group.
  135. //
  136. // Schemes: https
  137. //
  138. // Security:
  139. // oauth
  140. //
  141. // Responses:
  142. // 200: userBodyResponse
  143. func updateUserGroup(w http.ResponseWriter, r *http.Request) {
  144. var userGroup models.UserGroup
  145. err := json.NewDecoder(r.Body).Decode(&userGroup)
  146. if err != nil {
  147. slog.Error("error decoding request body", "error",
  148. err.Error())
  149. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  150. return
  151. }
  152. err = logic.UpdateUserGroup(userGroup)
  153. if err != nil {
  154. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  155. return
  156. }
  157. logic.ReturnSuccessResponseWithJson(w, r, userGroup, "updated user group")
  158. }
  159. // swagger:route DELETE /api/v1/user/group user deleteUserGroup
  160. //
  161. // delete user group.
  162. //
  163. // Schemes: https
  164. //
  165. // Security:
  166. // oauth
  167. //
  168. // Responses:
  169. // 200: userBodyResponse
  170. func deleteUserGroup(w http.ResponseWriter, r *http.Request) {
  171. var params = mux.Vars(r)
  172. gid := params["group_id"]
  173. if gid == "" {
  174. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("role is required"), "badrequest"))
  175. return
  176. }
  177. err := logic.DeleteUserGroup(models.UserGroupID(gid))
  178. if err != nil {
  179. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  180. return
  181. }
  182. logic.ReturnSuccessResponseWithJson(w, r, nil, "deleted user group")
  183. }
  184. // swagger:route GET /api/v1/user/roles user listRoles
  185. //
  186. // lists all user roles.
  187. //
  188. // Schemes: https
  189. //
  190. // Security:
  191. // oauth
  192. //
  193. // Responses:
  194. // 200: userBodyResponse
  195. func listRoles(w http.ResponseWriter, r *http.Request) {
  196. roles, err := logic.ListRoles()
  197. if err != nil {
  198. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  199. Code: http.StatusInternalServerError,
  200. Message: err.Error(),
  201. })
  202. return
  203. }
  204. logic.ReturnSuccessResponseWithJson(w, r, roles, "successfully fetched user roles permission templates")
  205. }
  206. // swagger:route GET /api/v1/user/role user getRole
  207. //
  208. // Get user role permission templates.
  209. //
  210. // Schemes: https
  211. //
  212. // Security:
  213. // oauth
  214. //
  215. // Responses:
  216. // 200: userBodyResponse
  217. func getRole(w http.ResponseWriter, r *http.Request) {
  218. var params = mux.Vars(r)
  219. rid := params["role_id"]
  220. if rid == "" {
  221. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("role is required"), "badrequest"))
  222. return
  223. }
  224. role, err := logic.GetRole(models.UserRole(rid))
  225. if err != nil {
  226. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  227. Code: http.StatusInternalServerError,
  228. Message: err.Error(),
  229. })
  230. return
  231. }
  232. logic.ReturnSuccessResponseWithJson(w, r, role, "successfully fetched user role permission templates")
  233. }
  234. // swagger:route POST /api/v1/user/role user createRole
  235. //
  236. // Create user role permission template.
  237. //
  238. // Schemes: https
  239. //
  240. // Security:
  241. // oauth
  242. //
  243. // Responses:
  244. // 200: userBodyResponse
  245. func createRole(w http.ResponseWriter, r *http.Request) {
  246. var userRole models.UserRolePermissionTemplate
  247. err := json.NewDecoder(r.Body).Decode(&userRole)
  248. if err != nil {
  249. slog.Error("error decoding request body", "error",
  250. err.Error())
  251. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  252. return
  253. }
  254. err = logic.ValidateCreateRoleReq(userRole)
  255. if err != nil {
  256. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  257. return
  258. }
  259. userRole.Default = false
  260. userRole.GlobalLevelAccess = make(map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope)
  261. err = logic.CreateRole(userRole)
  262. if err != nil {
  263. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  264. return
  265. }
  266. logic.ReturnSuccessResponseWithJson(w, r, userRole, "created user role")
  267. }
  268. // swagger:route PUT /api/v1/user/role user updateRole
  269. //
  270. // Update user role permission template.
  271. //
  272. // Schemes: https
  273. //
  274. // Security:
  275. // oauth
  276. //
  277. // Responses:
  278. // 200: userBodyResponse
  279. func updateRole(w http.ResponseWriter, r *http.Request) {
  280. var userRole models.UserRolePermissionTemplate
  281. err := json.NewDecoder(r.Body).Decode(&userRole)
  282. if err != nil {
  283. slog.Error("error decoding request body", "error",
  284. err.Error())
  285. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  286. return
  287. }
  288. err = logic.ValidateUpdateRoleReq(userRole)
  289. if err != nil {
  290. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  291. return
  292. }
  293. userRole.GlobalLevelAccess = make(map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope)
  294. err = logic.UpdateRole(userRole)
  295. if err != nil {
  296. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  297. return
  298. }
  299. logic.ReturnSuccessResponseWithJson(w, r, userRole, "updated user role")
  300. }
  301. // swagger:route DELETE /api/v1/user/role user deleteRole
  302. //
  303. // Delete user role permission template.
  304. //
  305. // Schemes: https
  306. //
  307. // Security:
  308. // oauth
  309. //
  310. // Responses:
  311. // 200: userBodyResponse
  312. func deleteRole(w http.ResponseWriter, r *http.Request) {
  313. var params = mux.Vars(r)
  314. rid := params["role_id"]
  315. if rid == "" {
  316. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("role is required"), "badrequest"))
  317. return
  318. }
  319. err := logic.DeleteRole(models.UserRole(rid))
  320. if err != nil {
  321. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  322. return
  323. }
  324. logic.ReturnSuccessResponseWithJson(w, r, nil, "created user role")
  325. }
  326. // swagger:route POST /api/users/adm/authenticate authenticate authenticateUser
  327. //
  328. // User authenticates using its password and retrieves a JWT for authorization.
  329. //
  330. // Schemes: https
  331. //
  332. // Security:
  333. // oauth
  334. //
  335. // Responses:
  336. // 200: successResponse
  337. func authenticateUser(response http.ResponseWriter, request *http.Request) {
  338. // Auth request consists of Mac Address and Password (from node that is authorizing
  339. // in case of Master, auth is ignored and mac is set to "mastermac"
  340. var authRequest models.UserAuthParams
  341. var errorResponse = models.ErrorResponse{
  342. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  343. }
  344. if !servercfg.IsBasicAuthEnabled() {
  345. logic.ReturnErrorResponse(response, request, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  346. return
  347. }
  348. decoder := json.NewDecoder(request.Body)
  349. decoderErr := decoder.Decode(&authRequest)
  350. defer request.Body.Close()
  351. if decoderErr != nil {
  352. logger.Log(0, "error decoding request body: ",
  353. decoderErr.Error())
  354. logic.ReturnErrorResponse(response, request, errorResponse)
  355. return
  356. }
  357. if val := request.Header.Get("From-Ui"); val == "true" {
  358. // request came from UI, if normal user block Login
  359. user, err := logic.GetUser(authRequest.UserName)
  360. if err != nil {
  361. logger.Log(0, authRequest.UserName, "user validation failed: ",
  362. err.Error())
  363. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "unauthorized"))
  364. return
  365. }
  366. role, err := logic.GetRole(user.PlatformRoleID)
  367. if err != nil {
  368. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("access denied to dashboard"), "unauthorized"))
  369. return
  370. }
  371. if role.DenyDashboardAccess {
  372. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("access denied to dashboard"), "unauthorized"))
  373. return
  374. }
  375. }
  376. username := authRequest.UserName
  377. jwt, err := logic.VerifyAuthRequest(authRequest)
  378. if err != nil {
  379. logger.Log(0, username, "user validation failed: ",
  380. err.Error())
  381. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "badrequest"))
  382. return
  383. }
  384. if jwt == "" {
  385. // very unlikely that err is !nil and no jwt returned, but handle it anyways.
  386. logger.Log(0, username, "jwt token is empty")
  387. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("no token returned"), "internal"))
  388. return
  389. }
  390. var successResponse = models.SuccessResponse{
  391. Code: http.StatusOK,
  392. Message: "W1R3: Device " + username + " Authorized",
  393. Response: models.SuccessfulUserLoginResponse{
  394. AuthToken: jwt,
  395. UserName: username,
  396. },
  397. }
  398. // Send back the JWT
  399. successJSONResponse, jsonError := json.Marshal(successResponse)
  400. if jsonError != nil {
  401. logger.Log(0, username,
  402. "error marshalling resp: ", jsonError.Error())
  403. logic.ReturnErrorResponse(response, request, errorResponse)
  404. return
  405. }
  406. logger.Log(2, username, "was authenticated")
  407. response.Header().Set("Content-Type", "application/json")
  408. response.Write(successJSONResponse)
  409. go func() {
  410. if servercfg.IsPro && servercfg.GetRacAutoDisable() {
  411. // enable all associeated clients for the user
  412. clients, err := logic.GetAllExtClients()
  413. if err != nil {
  414. slog.Error("error getting clients: ", "error", err)
  415. return
  416. }
  417. for _, client := range clients {
  418. if client.OwnerID == username && !client.Enabled {
  419. slog.Info(fmt.Sprintf("enabling ext client %s for user %s due to RAC autodisabling feature", client.ClientID, client.OwnerID))
  420. if newClient, err := logic.ToggleExtClientConnectivity(&client, true); err != nil {
  421. slog.Error("error enabling ext client in RAC autodisable hook", "error", err)
  422. continue // dont return but try for other clients
  423. } else {
  424. // publish peer update to ingress gateway
  425. if ingressNode, err := logic.GetNodeByID(newClient.IngressGatewayID); err == nil {
  426. if err = mq.PublishPeerUpdate(false); err != nil {
  427. slog.Error("error updating ext clients on", "ingress", ingressNode.ID.String(), "err", err.Error())
  428. }
  429. }
  430. }
  431. }
  432. }
  433. }
  434. }()
  435. }
  436. // swagger:route GET /api/users/adm/hassuperadmin user hasSuperAdmin
  437. //
  438. // Checks whether the server has an admin.
  439. //
  440. // Schemes: https
  441. //
  442. // Security:
  443. // oauth
  444. //
  445. // Responses:
  446. // 200: hasAdmin
  447. func hasSuperAdmin(w http.ResponseWriter, r *http.Request) {
  448. w.Header().Set("Content-Type", "application/json")
  449. hasSuperAdmin, err := logic.HasSuperAdmin()
  450. if err != nil {
  451. logger.Log(0, "failed to check for admin: ", err.Error())
  452. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  453. return
  454. }
  455. json.NewEncoder(w).Encode(hasSuperAdmin)
  456. }
  457. // swagger:route GET /api/users/{username} user getUser
  458. //
  459. // Get an individual user.
  460. //
  461. // Schemes: https
  462. //
  463. // Security:
  464. // oauth
  465. //
  466. // Responses:
  467. // 200: userBodyResponse
  468. func getUser(w http.ResponseWriter, r *http.Request) {
  469. // set header.
  470. w.Header().Set("Content-Type", "application/json")
  471. var params = mux.Vars(r)
  472. usernameFetched := params["username"]
  473. user, err := logic.GetReturnUser(usernameFetched)
  474. if err != nil {
  475. logger.Log(0, usernameFetched, "failed to fetch user: ", err.Error())
  476. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  477. return
  478. }
  479. logger.Log(2, r.Header.Get("user"), "fetched user", usernameFetched)
  480. json.NewEncoder(w).Encode(user)
  481. }
  482. // swagger:route GET /api/users user getUsers
  483. //
  484. // Get all users.
  485. //
  486. // Schemes: https
  487. //
  488. // Security:
  489. // oauth
  490. //
  491. // Responses:
  492. // 200: userBodyResponse
  493. func getUsers(w http.ResponseWriter, r *http.Request) {
  494. // set header.
  495. w.Header().Set("Content-Type", "application/json")
  496. users, err := logic.GetUsers()
  497. if err != nil {
  498. logger.Log(0, "failed to fetch users: ", err.Error())
  499. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  500. return
  501. }
  502. logic.SortUsers(users[:])
  503. logger.Log(2, r.Header.Get("user"), "fetched users")
  504. json.NewEncoder(w).Encode(users)
  505. }
  506. // swagger:route POST /api/users/adm/createsuperadmin user createAdmin
  507. //
  508. // Make a user an admin.
  509. //
  510. // Schemes: https
  511. //
  512. // Security:
  513. // oauth
  514. //
  515. // Responses:
  516. // 200: userBodyResponse
  517. func createSuperAdmin(w http.ResponseWriter, r *http.Request) {
  518. w.Header().Set("Content-Type", "application/json")
  519. var u models.User
  520. err := json.NewDecoder(r.Body).Decode(&u)
  521. if err != nil {
  522. slog.Error("error decoding request body", "error", err.Error())
  523. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  524. return
  525. }
  526. if !servercfg.IsBasicAuthEnabled() {
  527. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  528. return
  529. }
  530. err = logic.CreateSuperAdmin(&u)
  531. if err != nil {
  532. slog.Error("failed to create admin", "error", err.Error())
  533. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  534. return
  535. }
  536. logger.Log(1, u.UserName, "was made a super admin")
  537. json.NewEncoder(w).Encode(logic.ToReturnUser(u))
  538. }
  539. // swagger:route POST /api/users/adm/transfersuperadmin user transferSuperAdmin
  540. //
  541. // Transfers superadmin role to an admin user.
  542. //
  543. // Schemes: https
  544. //
  545. // Security:
  546. // oauth
  547. //
  548. // Responses:
  549. // 200: userBodyResponse
  550. func transferSuperAdmin(w http.ResponseWriter, r *http.Request) {
  551. w.Header().Set("Content-Type", "application/json")
  552. caller, err := logic.GetUser(r.Header.Get("user"))
  553. if err != nil {
  554. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  555. }
  556. if !caller.IsSuperAdmin {
  557. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only superadmin can assign the superadmin role to another user"), "forbidden"))
  558. return
  559. }
  560. var params = mux.Vars(r)
  561. username := params["username"]
  562. u, err := logic.GetUser(username)
  563. if err != nil {
  564. slog.Error("error getting user", "user", u.UserName, "error", err.Error())
  565. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  566. return
  567. }
  568. if !u.IsAdmin {
  569. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only admins can be promoted to superadmin role"), "forbidden"))
  570. return
  571. }
  572. if !servercfg.IsBasicAuthEnabled() {
  573. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  574. return
  575. }
  576. u.IsSuperAdmin = true
  577. u.IsAdmin = false
  578. err = logic.UpsertUser(*u)
  579. if err != nil {
  580. slog.Error("error updating user to superadmin: ", "user", u.UserName, "error", err.Error())
  581. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  582. return
  583. }
  584. caller.IsSuperAdmin = false
  585. caller.IsAdmin = true
  586. err = logic.UpsertUser(*caller)
  587. if err != nil {
  588. slog.Error("error demoting user to admin: ", "user", caller.UserName, "error", err.Error())
  589. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  590. return
  591. }
  592. slog.Info("user was made a super admin", "user", u.UserName)
  593. json.NewEncoder(w).Encode(logic.ToReturnUser(*u))
  594. }
  595. // swagger:route POST /api/users/{username} user createUser
  596. //
  597. // Create a user.
  598. //
  599. // Schemes: https
  600. //
  601. // Security:
  602. // oauth
  603. //
  604. // Responses:
  605. // 200: userBodyResponse
  606. func createUser(w http.ResponseWriter, r *http.Request) {
  607. w.Header().Set("Content-Type", "application/json")
  608. caller, err := logic.GetUser(r.Header.Get("user"))
  609. if err != nil {
  610. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  611. return
  612. }
  613. callerUserRole, err := logic.GetRole(caller.PlatformRoleID)
  614. if err != nil {
  615. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  616. return
  617. }
  618. var user models.User
  619. err = json.NewDecoder(r.Body).Decode(&user)
  620. if err != nil {
  621. logger.Log(0, user.UserName, "error decoding request body: ",
  622. err.Error())
  623. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  624. return
  625. }
  626. uniqueGroupsPlatformRole := make(map[models.UserRole]struct{})
  627. for groupID := range user.UserGroups {
  628. userG, err := logic.GetUserGroup(groupID)
  629. if err != nil {
  630. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  631. return
  632. }
  633. uniqueGroupsPlatformRole[userG.PlatformRole] = struct{}{}
  634. }
  635. if len(uniqueGroupsPlatformRole) > 1 {
  636. err = errors.New("only groups with same platform role can be assigned to an user")
  637. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  638. return
  639. }
  640. userRole, err := logic.GetRole(user.PlatformRoleID)
  641. if err != nil {
  642. err = errors.New("error fetching role " + user.PlatformRoleID.String() + " " + err.Error())
  643. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  644. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  645. return
  646. }
  647. if userRole.ID == models.SuperAdminRole {
  648. err = errors.New("additional superadmins cannot be created")
  649. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  650. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  651. return
  652. }
  653. if callerUserRole.ID != models.SuperAdminRole && user.IsAdmin {
  654. err = errors.New("only superadmin can create admin users")
  655. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  656. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  657. return
  658. }
  659. if !servercfg.IsPro && !user.IsAdmin {
  660. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("non-admins users can only be created on Pro version"), "forbidden"))
  661. return
  662. }
  663. if userRole.ID == models.AdminRole {
  664. user.IsAdmin = true
  665. }
  666. err = logic.CreateUser(&user)
  667. if err != nil {
  668. slog.Error("error creating new user: ", "user", user.UserName, "error", err.Error())
  669. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  670. return
  671. }
  672. logic.DeleteUserInvite(user.UserName)
  673. logic.DeletePendingUser(user.UserName)
  674. slog.Info("user was created", "username", user.UserName)
  675. json.NewEncoder(w).Encode(logic.ToReturnUser(user))
  676. }
  677. // swagger:route PUT /api/users/{username} user updateUser
  678. //
  679. // Update a user.
  680. //
  681. // Schemes: https
  682. //
  683. // Security:
  684. // oauth
  685. //
  686. // Responses:
  687. // 200: userBodyResponse
  688. func updateUser(w http.ResponseWriter, r *http.Request) {
  689. w.Header().Set("Content-Type", "application/json")
  690. var params = mux.Vars(r)
  691. // start here
  692. var caller *models.User
  693. var err error
  694. var ismaster bool
  695. if r.Header.Get("user") == logic.MasterUser {
  696. ismaster = true
  697. } else {
  698. caller, err = logic.GetUser(r.Header.Get("user"))
  699. if err != nil {
  700. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  701. }
  702. }
  703. username := params["username"]
  704. user, err := logic.GetUser(username)
  705. if err != nil {
  706. logger.Log(0, username,
  707. "failed to update user info: ", err.Error())
  708. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  709. return
  710. }
  711. var userchange models.User
  712. // we decode our body request params
  713. err = json.NewDecoder(r.Body).Decode(&userchange)
  714. if err != nil {
  715. slog.Error("failed to decode body", "error ", err.Error())
  716. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  717. return
  718. }
  719. if user.UserName != userchange.UserName {
  720. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user in param and request body not matching"), "badrequest"))
  721. return
  722. }
  723. selfUpdate := false
  724. if !ismaster && caller.UserName == user.UserName {
  725. selfUpdate = true
  726. }
  727. if !ismaster && !selfUpdate {
  728. if caller.IsAdmin && user.IsSuperAdmin {
  729. slog.Error("non-superadmin user", "caller", caller.UserName, "attempted to update superadmin user", username)
  730. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  731. return
  732. }
  733. if !caller.IsAdmin && !caller.IsSuperAdmin {
  734. slog.Error("operation not allowed", "caller", caller.UserName, "attempted to update user", username)
  735. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  736. return
  737. }
  738. if caller.IsAdmin && user.IsAdmin {
  739. slog.Error("admin user cannot update another admin", "caller", caller.UserName, "attempted to update admin user", username)
  740. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("admin user cannot update another admin"), "forbidden"))
  741. return
  742. }
  743. if caller.IsAdmin && userchange.IsAdmin {
  744. err = errors.New("admin user cannot update role of an another user to admin")
  745. slog.Error("failed to update user", "caller", caller.UserName, "attempted to update user", username, "error", err)
  746. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  747. return
  748. }
  749. }
  750. if !ismaster && selfUpdate {
  751. if user.IsAdmin != userchange.IsAdmin || user.IsSuperAdmin != userchange.IsSuperAdmin {
  752. slog.Error("user cannot change his own role", "caller", caller.UserName, "attempted to update user role", username)
  753. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user not allowed to self assign role"), "forbidden"))
  754. return
  755. }
  756. }
  757. if ismaster {
  758. if !user.IsSuperAdmin && userchange.IsSuperAdmin {
  759. slog.Error("operation not allowed", "caller", logic.MasterUser, "attempted to update user role to superadmin", username)
  760. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("attempted to update user role to superadmin"), "forbidden"))
  761. return
  762. }
  763. }
  764. if auth.IsOauthUser(user) == nil && userchange.Password != "" {
  765. err := fmt.Errorf("cannot update user's password for an oauth user %s", username)
  766. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  767. return
  768. }
  769. user, err = logic.UpdateUser(&userchange, user)
  770. if err != nil {
  771. logger.Log(0, username,
  772. "failed to update user info: ", err.Error())
  773. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  774. return
  775. }
  776. logger.Log(1, username, "was updated")
  777. json.NewEncoder(w).Encode(logic.ToReturnUser(*user))
  778. }
  779. // swagger:route DELETE /api/users/{username} user deleteUser
  780. //
  781. // Delete a user.
  782. //
  783. // Schemes: https
  784. //
  785. // Security:
  786. // oauth
  787. //
  788. // Responses:
  789. // 200: userBodyResponse
  790. func deleteUser(w http.ResponseWriter, r *http.Request) {
  791. // Set header
  792. w.Header().Set("Content-Type", "application/json")
  793. // get params
  794. var params = mux.Vars(r)
  795. caller, err := logic.GetUser(r.Header.Get("user"))
  796. if err != nil {
  797. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  798. }
  799. username := params["username"]
  800. user, err := logic.GetUser(username)
  801. if err != nil {
  802. logger.Log(0, username,
  803. "failed to update user info: ", err.Error())
  804. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  805. return
  806. }
  807. if user.IsSuperAdmin {
  808. slog.Error(
  809. "failed to delete user: ", "user", username, "error", "superadmin cannot be deleted")
  810. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("superadmin cannot be deleted"), "internal"))
  811. return
  812. }
  813. if !caller.IsSuperAdmin {
  814. if caller.IsAdmin && user.IsAdmin {
  815. slog.Error(
  816. "failed to delete user: ", "user", username, "error", "admin cannot delete another admin user, including oneself")
  817. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("admin cannot delete another admin user, including oneself"), "internal"))
  818. return
  819. }
  820. }
  821. success, err := logic.DeleteUser(username)
  822. if err != nil {
  823. logger.Log(0, username,
  824. "failed to delete user: ", err.Error())
  825. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  826. return
  827. } else if !success {
  828. err := errors.New("delete unsuccessful")
  829. logger.Log(0, username, err.Error())
  830. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  831. return
  832. }
  833. // check and delete extclient with this ownerID
  834. go func() {
  835. extclients, err := logic.GetAllExtClients()
  836. if err != nil {
  837. slog.Error("failed to get extclients", "error", err)
  838. return
  839. }
  840. for _, extclient := range extclients {
  841. if extclient.OwnerID == user.UserName {
  842. err = logic.DeleteExtClient(extclient.Network, extclient.ClientID)
  843. if err != nil {
  844. slog.Error("failed to delete extclient",
  845. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  846. }
  847. }
  848. }
  849. if servercfg.IsDNSMode() {
  850. logic.SetDNS()
  851. }
  852. }()
  853. logger.Log(1, username, "was deleted")
  854. json.NewEncoder(w).Encode(params["username"] + " deleted.")
  855. }
  856. // Called when vpn client dials in to start the auth flow and first stage is to get register URL itself
  857. func socketHandler(w http.ResponseWriter, r *http.Request) {
  858. // Upgrade our raw HTTP connection to a websocket based one
  859. conn, err := upgrader.Upgrade(w, r, nil)
  860. if err != nil {
  861. logger.Log(0, "error during connection upgrade for node sign-in:", err.Error())
  862. return
  863. }
  864. if conn == nil {
  865. logger.Log(0, "failed to establish web-socket connection during node sign-in")
  866. return
  867. }
  868. // Start handling the session
  869. go auth.SessionHandler(conn)
  870. }
  871. // swagger:route GET /api/users_pending user getPendingUsers
  872. //
  873. // Get all pending users.
  874. //
  875. // Schemes: https
  876. //
  877. // Security:
  878. // oauth
  879. //
  880. // Responses:
  881. // 200: userBodyResponse
  882. func getPendingUsers(w http.ResponseWriter, r *http.Request) {
  883. // set header.
  884. w.Header().Set("Content-Type", "application/json")
  885. users, err := logic.ListPendingUsers()
  886. if err != nil {
  887. logger.Log(0, "failed to fetch users: ", err.Error())
  888. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  889. return
  890. }
  891. logic.SortUsers(users[:])
  892. logger.Log(2, r.Header.Get("user"), "fetched pending users")
  893. json.NewEncoder(w).Encode(users)
  894. }
  895. // swagger:route POST /api/users_pending/user/{username} user approvePendingUser
  896. //
  897. // approve pending user.
  898. //
  899. // Schemes: https
  900. //
  901. // Security:
  902. // oauth
  903. //
  904. // Responses:
  905. // 200: userBodyResponse
  906. func approvePendingUser(w http.ResponseWriter, r *http.Request) {
  907. // set header.
  908. w.Header().Set("Content-Type", "application/json")
  909. var params = mux.Vars(r)
  910. username := params["username"]
  911. users, err := logic.ListPendingUsers()
  912. if err != nil {
  913. logger.Log(0, "failed to fetch users: ", err.Error())
  914. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  915. return
  916. }
  917. for _, user := range users {
  918. if user.UserName == username {
  919. var newPass, fetchErr = auth.FetchPassValue("")
  920. if fetchErr != nil {
  921. logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
  922. return
  923. }
  924. if err = logic.CreateUser(&models.User{
  925. UserName: user.UserName,
  926. Password: newPass,
  927. }); err != nil {
  928. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to create user: %s", err), "internal"))
  929. return
  930. }
  931. err = logic.DeletePendingUser(username)
  932. if err != nil {
  933. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  934. return
  935. }
  936. break
  937. }
  938. }
  939. logic.ReturnSuccessResponse(w, r, "approved "+username)
  940. }
  941. // swagger:route DELETE /api/users_pending/user/{username} user deletePendingUser
  942. //
  943. // delete pending user.
  944. //
  945. // Schemes: https
  946. //
  947. // Security:
  948. // oauth
  949. //
  950. // Responses:
  951. // 200: userBodyResponse
  952. func deletePendingUser(w http.ResponseWriter, r *http.Request) {
  953. // set header.
  954. w.Header().Set("Content-Type", "application/json")
  955. var params = mux.Vars(r)
  956. username := params["username"]
  957. users, err := logic.ListPendingUsers()
  958. if err != nil {
  959. logger.Log(0, "failed to fetch users: ", err.Error())
  960. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  961. return
  962. }
  963. for _, user := range users {
  964. if user.UserName == username {
  965. err = logic.DeletePendingUser(username)
  966. if err != nil {
  967. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  968. return
  969. }
  970. break
  971. }
  972. }
  973. logic.ReturnSuccessResponse(w, r, "deleted pending "+username)
  974. }
  975. // swagger:route DELETE /api/users_pending/{username}/pending user deleteAllPendingUsers
  976. //
  977. // delete all pending users.
  978. //
  979. // Schemes: https
  980. //
  981. // Security:
  982. // oauth
  983. //
  984. // Responses:
  985. // 200: userBodyResponse
  986. func deleteAllPendingUsers(w http.ResponseWriter, r *http.Request) {
  987. // set header.
  988. err := database.DeleteAllRecords(database.PENDING_USERS_TABLE_NAME)
  989. if err != nil {
  990. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending users "+err.Error()), "internal"))
  991. return
  992. }
  993. logic.ReturnSuccessResponse(w, r, "cleared all pending users")
  994. }
  995. // swagger:route POST /api/v1/users/invite-signup user userInviteSignUp
  996. //
  997. // user signup via invite.
  998. //
  999. // Schemes: https
  1000. //
  1001. // Responses:
  1002. // 200: ReturnSuccessResponse
  1003. func userInviteSignUp(w http.ResponseWriter, r *http.Request) {
  1004. var params = mux.Vars(r)
  1005. email := params["email"]
  1006. code := params["code"]
  1007. in, err := logic.GetUserInvite(email)
  1008. if err != nil {
  1009. logger.Log(0, "failed to fetch users: ", err.Error())
  1010. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1011. return
  1012. }
  1013. if code != in.InviteCode {
  1014. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("invalid invite code"), "badrequest"))
  1015. return
  1016. }
  1017. // check if user already exists
  1018. _, err = logic.GetUser(email)
  1019. if err == nil {
  1020. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user already exists"), "badrequest"))
  1021. return
  1022. }
  1023. var user models.User
  1024. err = json.NewDecoder(r.Body).Decode(&user)
  1025. if err != nil {
  1026. logger.Log(0, user.UserName, "error decoding request body: ",
  1027. err.Error())
  1028. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1029. return
  1030. }
  1031. if user.UserName != email {
  1032. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("username not matching with invite"), "badrequest"))
  1033. return
  1034. }
  1035. if user.Password == "" {
  1036. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("password cannot be empty"), "badrequest"))
  1037. return
  1038. }
  1039. for _, inviteGroupID := range in.Groups {
  1040. userG, err := logic.GetUserGroup(inviteGroupID)
  1041. if err != nil {
  1042. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("error fetching group id "+inviteGroupID.String()), "badrequest"))
  1043. return
  1044. }
  1045. user.PlatformRoleID = userG.PlatformRole
  1046. user.UserGroups[inviteGroupID] = struct{}{}
  1047. }
  1048. user.NetworkRoles = make(map[models.NetworkID]map[models.UserRole]struct{})
  1049. user.IsSuperAdmin = false
  1050. err = logic.CreateUser(&user)
  1051. if err != nil {
  1052. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1053. return
  1054. }
  1055. // delete invite
  1056. logic.DeleteUserInvite(email)
  1057. logic.DeletePendingUser(email)
  1058. logic.ReturnSuccessResponse(w, r, "created user successfully "+email)
  1059. }
  1060. // swagger:route GET /api/v1/users/invite user userInviteVerify
  1061. //
  1062. // verfies user invite.
  1063. //
  1064. // Schemes: https
  1065. //
  1066. // Responses:
  1067. // 200: ReturnSuccessResponse
  1068. func userInviteVerify(w http.ResponseWriter, r *http.Request) {
  1069. var params = mux.Vars(r)
  1070. email := params["email"]
  1071. code := params["code"]
  1072. err := logic.ValidateAndApproveUserInvite(email, code)
  1073. if err != nil {
  1074. logger.Log(0, "failed to fetch users: ", err.Error())
  1075. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1076. return
  1077. }
  1078. logic.ReturnSuccessResponse(w, r, "invite is valid")
  1079. }
  1080. // swagger:route POST /api/v1/users/invite user inviteUsers
  1081. //
  1082. // invite users.
  1083. //
  1084. // Schemes: https
  1085. //
  1086. // Security:
  1087. // oauth
  1088. //
  1089. // Responses:
  1090. // 200: userBodyResponse
  1091. func inviteUsers(w http.ResponseWriter, r *http.Request) {
  1092. var inviteReq models.InviteUsersReq
  1093. err := json.NewDecoder(r.Body).Decode(&inviteReq)
  1094. if err != nil {
  1095. slog.Error("error decoding request body", "error",
  1096. err.Error())
  1097. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1098. return
  1099. }
  1100. //validate Req
  1101. uniqueGroupsPlatformRole := make(map[models.UserRole]struct{})
  1102. for _, groupID := range inviteReq.Groups {
  1103. userG, err := logic.GetUserGroup(groupID)
  1104. if err != nil {
  1105. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1106. return
  1107. }
  1108. uniqueGroupsPlatformRole[userG.PlatformRole] = struct{}{}
  1109. }
  1110. if len(uniqueGroupsPlatformRole) > 1 {
  1111. err = errors.New("only groups with same platform role can be assigned to an user")
  1112. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1113. return
  1114. }
  1115. for _, inviteeEmail := range inviteReq.UserEmails {
  1116. // check if user with email exists, then ignore
  1117. _, err := logic.GetUser(inviteeEmail)
  1118. if err == nil {
  1119. // user exists already, so ignore
  1120. continue
  1121. }
  1122. invite := models.UserInvite{
  1123. Email: inviteeEmail,
  1124. Groups: inviteReq.Groups,
  1125. InviteCode: logic.RandomString(8),
  1126. }
  1127. err = logic.InsertUserInvite(invite)
  1128. if err != nil {
  1129. slog.Error("failed to insert invite for user", "email", invite.Email, "error", err)
  1130. }
  1131. // notify user with magic link
  1132. go logic.SendInviteEmail(invite)
  1133. }
  1134. }
  1135. // swagger:route GET /api/v1/users/invites user listUserInvites
  1136. //
  1137. // lists all pending invited users.
  1138. //
  1139. // Schemes: https
  1140. //
  1141. // Security:
  1142. // oauth
  1143. //
  1144. // Responses:
  1145. // 200: ReturnSuccessResponseWithJson
  1146. func listUserInvites(w http.ResponseWriter, r *http.Request) {
  1147. usersInvites, err := logic.ListUserInvites()
  1148. if err != nil {
  1149. logger.Log(0, "failed to fetch users: ", err.Error())
  1150. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1151. return
  1152. }
  1153. logic.ReturnSuccessResponseWithJson(w, r, usersInvites, "fetched pending user invites")
  1154. }
  1155. // swagger:route DELETE /api/v1/users/invite user deleteUserInvite
  1156. //
  1157. // delete pending invite.
  1158. //
  1159. // Schemes: https
  1160. //
  1161. // Security:
  1162. // oauth
  1163. //
  1164. // Responses:
  1165. // 200: ReturnSuccessResponse
  1166. func deleteUserInvite(w http.ResponseWriter, r *http.Request) {
  1167. var params = mux.Vars(r)
  1168. username := params["invitee_email"]
  1169. err := logic.DeleteUserInvite(username)
  1170. if err != nil {
  1171. logger.Log(0, "failed to delete user invite: ", username, err.Error())
  1172. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1173. return
  1174. }
  1175. logic.ReturnSuccessResponse(w, r, "deleted user invite")
  1176. }
  1177. // swagger:route DELETE /api/v1/users/invites user deleteAllUserInvites
  1178. //
  1179. // deletes all pending invites.
  1180. //
  1181. // Schemes: https
  1182. //
  1183. // Security:
  1184. // oauth
  1185. //
  1186. // Responses:
  1187. // 200: ReturnSuccessResponse
  1188. func deleteAllUserInvites(w http.ResponseWriter, r *http.Request) {
  1189. err := database.DeleteAllRecords(database.USER_INVITES_TABLE_NAME)
  1190. if err != nil {
  1191. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending user invites "+err.Error()), "internal"))
  1192. return
  1193. }
  1194. logic.ReturnSuccessResponse(w, r, "cleared all pending user invites")
  1195. }