user.go 39 KB

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