user.go 41 KB

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