user.go 41 KB

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