user.go 41 KB

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