user.go 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302
  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. }
  637. if len(uniqueGroupsPlatformRole) > 1 {
  638. err = errors.New("only groups with same platform role can be assigned to an user")
  639. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  640. return
  641. }
  642. userRole, err := logic.GetRole(user.PlatformRoleID)
  643. if err != nil {
  644. err = errors.New("error fetching role " + user.PlatformRoleID.String() + " " + err.Error())
  645. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  646. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  647. return
  648. }
  649. if userRole.ID == models.SuperAdminRole {
  650. err = errors.New("additional superadmins cannot be created")
  651. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  652. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  653. return
  654. }
  655. if caller.PlatformRoleID != models.SuperAdminRole && user.PlatformRoleID == models.AdminRole {
  656. err = errors.New("only superadmin can create admin users")
  657. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  658. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  659. return
  660. }
  661. if !servercfg.IsPro && user.PlatformRoleID != models.AdminRole {
  662. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("non-admins users can only be created on Pro version"), "forbidden"))
  663. return
  664. }
  665. err = logic.CreateUser(&user)
  666. if err != nil {
  667. slog.Error("error creating new user: ", "user", user.UserName, "error", err.Error())
  668. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  669. return
  670. }
  671. logic.DeleteUserInvite(user.UserName)
  672. logic.DeletePendingUser(user.UserName)
  673. slog.Info("user was created", "username", user.UserName)
  674. json.NewEncoder(w).Encode(logic.ToReturnUser(user))
  675. }
  676. // swagger:route PUT /api/users/{username} user updateUser
  677. //
  678. // Update a user.
  679. //
  680. // Schemes: https
  681. //
  682. // Security:
  683. // oauth
  684. //
  685. // Responses:
  686. // 200: userBodyResponse
  687. func updateUser(w http.ResponseWriter, r *http.Request) {
  688. w.Header().Set("Content-Type", "application/json")
  689. var params = mux.Vars(r)
  690. // start here
  691. var caller *models.User
  692. var err error
  693. var ismaster bool
  694. if r.Header.Get("user") == logic.MasterUser {
  695. ismaster = true
  696. } else {
  697. caller, err = logic.GetUser(r.Header.Get("user"))
  698. if err != nil {
  699. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  700. }
  701. }
  702. username := params["username"]
  703. user, err := logic.GetUser(username)
  704. if err != nil {
  705. logger.Log(0, username,
  706. "failed to update user info: ", err.Error())
  707. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  708. return
  709. }
  710. var userchange models.User
  711. // we decode our body request params
  712. err = json.NewDecoder(r.Body).Decode(&userchange)
  713. if err != nil {
  714. slog.Error("failed to decode body", "error ", err.Error())
  715. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  716. return
  717. }
  718. if user.UserName != userchange.UserName {
  719. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user in param and request body not matching"), "badrequest"))
  720. return
  721. }
  722. selfUpdate := false
  723. if !ismaster && caller.UserName == user.UserName {
  724. selfUpdate = true
  725. }
  726. if !ismaster && !selfUpdate {
  727. if caller.PlatformRoleID == models.AdminRole && user.PlatformRoleID == models.SuperAdminRole {
  728. slog.Error("non-superadmin user", "caller", caller.UserName, "attempted to update superadmin user", username)
  729. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  730. return
  731. }
  732. if caller.PlatformRoleID != models.AdminRole && caller.PlatformRoleID != models.SuperAdminRole {
  733. slog.Error("operation not allowed", "caller", caller.UserName, "attempted to update user", username)
  734. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  735. return
  736. }
  737. if caller.PlatformRoleID == models.AdminRole && user.PlatformRoleID == models.AdminRole {
  738. slog.Error("admin user cannot update another admin", "caller", caller.UserName, "attempted to update admin user", username)
  739. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("admin user cannot update another admin"), "forbidden"))
  740. return
  741. }
  742. if caller.PlatformRoleID == models.AdminRole && userchange.PlatformRoleID == models.AdminRole {
  743. err = errors.New("admin user cannot update role of an another user to admin")
  744. slog.Error("failed to update user", "caller", caller.UserName, "attempted to update user", username, "error", err)
  745. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  746. return
  747. }
  748. }
  749. if !ismaster && selfUpdate {
  750. if user.PlatformRoleID != userchange.PlatformRoleID {
  751. slog.Error("user cannot change his own role", "caller", caller.UserName, "attempted to update user role", username)
  752. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user not allowed to self assign role"), "forbidden"))
  753. return
  754. }
  755. }
  756. if ismaster {
  757. if user.PlatformRoleID != models.SuperAdminRole && userchange.PlatformRoleID == models.SuperAdminRole {
  758. slog.Error("operation not allowed", "caller", logic.MasterUser, "attempted to update user role to superadmin", username)
  759. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("attempted to update user role to superadmin"), "forbidden"))
  760. return
  761. }
  762. }
  763. if auth.IsOauthUser(user) == nil && userchange.Password != "" {
  764. err := fmt.Errorf("cannot update user's password for an oauth user %s", username)
  765. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  766. return
  767. }
  768. user, err = logic.UpdateUser(&userchange, user)
  769. if err != nil {
  770. logger.Log(0, username,
  771. "failed to update user info: ", err.Error())
  772. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  773. return
  774. }
  775. logger.Log(1, username, "was updated")
  776. json.NewEncoder(w).Encode(logic.ToReturnUser(*user))
  777. }
  778. // swagger:route DELETE /api/users/{username} user deleteUser
  779. //
  780. // Delete a user.
  781. //
  782. // Schemes: https
  783. //
  784. // Security:
  785. // oauth
  786. //
  787. // Responses:
  788. // 200: userBodyResponse
  789. func deleteUser(w http.ResponseWriter, r *http.Request) {
  790. // Set header
  791. w.Header().Set("Content-Type", "application/json")
  792. // get params
  793. var params = mux.Vars(r)
  794. caller, err := logic.GetUser(r.Header.Get("user"))
  795. if err != nil {
  796. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  797. }
  798. callerUserRole, err := logic.GetRole(caller.PlatformRoleID)
  799. if err != nil {
  800. slog.Error("failed to get role ", "role", callerUserRole.ID, "error", err)
  801. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  802. return
  803. }
  804. username := params["username"]
  805. user, err := logic.GetUser(username)
  806. if err != nil {
  807. logger.Log(0, username,
  808. "failed to update user info: ", err.Error())
  809. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  810. return
  811. }
  812. userRole, err := logic.GetRole(user.PlatformRoleID)
  813. if err != nil {
  814. slog.Error("failed to get role ", "role", userRole.ID, "error", err)
  815. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  816. return
  817. }
  818. if userRole.ID == models.SuperAdminRole {
  819. slog.Error(
  820. "failed to delete user: ", "user", username, "error", "superadmin cannot be deleted")
  821. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("superadmin cannot be deleted"), "internal"))
  822. return
  823. }
  824. if callerUserRole.ID != models.SuperAdminRole {
  825. if callerUserRole.ID == models.AdminRole && userRole.ID == models.AdminRole {
  826. slog.Error(
  827. "failed to delete user: ", "user", username, "error", "admin cannot delete another admin user, including oneself")
  828. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("admin cannot delete another admin user, including oneself"), "internal"))
  829. return
  830. }
  831. }
  832. success, err := logic.DeleteUser(username)
  833. if err != nil {
  834. logger.Log(0, username,
  835. "failed to delete user: ", err.Error())
  836. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  837. return
  838. } else if !success {
  839. err := errors.New("delete unsuccessful")
  840. logger.Log(0, username, err.Error())
  841. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  842. return
  843. }
  844. // check and delete extclient with this ownerID
  845. go func() {
  846. extclients, err := logic.GetAllExtClients()
  847. if err != nil {
  848. slog.Error("failed to get extclients", "error", err)
  849. return
  850. }
  851. for _, extclient := range extclients {
  852. if extclient.OwnerID == user.UserName {
  853. err = logic.DeleteExtClient(extclient.Network, extclient.ClientID)
  854. if err != nil {
  855. slog.Error("failed to delete extclient",
  856. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  857. }
  858. }
  859. }
  860. if servercfg.IsDNSMode() {
  861. logic.SetDNS()
  862. }
  863. }()
  864. logger.Log(1, username, "was deleted")
  865. json.NewEncoder(w).Encode(params["username"] + " deleted.")
  866. }
  867. // Called when vpn client dials in to start the auth flow and first stage is to get register URL itself
  868. func socketHandler(w http.ResponseWriter, r *http.Request) {
  869. // Upgrade our raw HTTP connection to a websocket based one
  870. conn, err := upgrader.Upgrade(w, r, nil)
  871. if err != nil {
  872. logger.Log(0, "error during connection upgrade for node sign-in:", err.Error())
  873. return
  874. }
  875. if conn == nil {
  876. logger.Log(0, "failed to establish web-socket connection during node sign-in")
  877. return
  878. }
  879. // Start handling the session
  880. go auth.SessionHandler(conn)
  881. }
  882. // swagger:route GET /api/users_pending user getPendingUsers
  883. //
  884. // Get all pending users.
  885. //
  886. // Schemes: https
  887. //
  888. // Security:
  889. // oauth
  890. //
  891. // Responses:
  892. // 200: userBodyResponse
  893. func getPendingUsers(w http.ResponseWriter, r *http.Request) {
  894. // set header.
  895. w.Header().Set("Content-Type", "application/json")
  896. users, err := logic.ListPendingUsers()
  897. if err != nil {
  898. logger.Log(0, "failed to fetch users: ", err.Error())
  899. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  900. return
  901. }
  902. logic.SortUsers(users[:])
  903. logger.Log(2, r.Header.Get("user"), "fetched pending users")
  904. json.NewEncoder(w).Encode(users)
  905. }
  906. // swagger:route POST /api/users_pending/user/{username} user approvePendingUser
  907. //
  908. // approve pending user.
  909. //
  910. // Schemes: https
  911. //
  912. // Security:
  913. // oauth
  914. //
  915. // Responses:
  916. // 200: userBodyResponse
  917. func approvePendingUser(w http.ResponseWriter, r *http.Request) {
  918. // set header.
  919. w.Header().Set("Content-Type", "application/json")
  920. var params = mux.Vars(r)
  921. username := params["username"]
  922. users, err := logic.ListPendingUsers()
  923. if err != nil {
  924. logger.Log(0, "failed to fetch users: ", err.Error())
  925. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  926. return
  927. }
  928. for _, user := range users {
  929. if user.UserName == username {
  930. var newPass, fetchErr = auth.FetchPassValue("")
  931. if fetchErr != nil {
  932. logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
  933. return
  934. }
  935. if err = logic.CreateUser(&models.User{
  936. UserName: user.UserName,
  937. Password: newPass,
  938. }); err != nil {
  939. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to create user: %s", err), "internal"))
  940. return
  941. }
  942. err = logic.DeletePendingUser(username)
  943. if err != nil {
  944. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  945. return
  946. }
  947. break
  948. }
  949. }
  950. logic.ReturnSuccessResponse(w, r, "approved "+username)
  951. }
  952. // swagger:route DELETE /api/users_pending/user/{username} user deletePendingUser
  953. //
  954. // delete pending user.
  955. //
  956. // Schemes: https
  957. //
  958. // Security:
  959. // oauth
  960. //
  961. // Responses:
  962. // 200: userBodyResponse
  963. func deletePendingUser(w http.ResponseWriter, r *http.Request) {
  964. // set header.
  965. w.Header().Set("Content-Type", "application/json")
  966. var params = mux.Vars(r)
  967. username := params["username"]
  968. users, err := logic.ListPendingUsers()
  969. if err != nil {
  970. logger.Log(0, "failed to fetch users: ", err.Error())
  971. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  972. return
  973. }
  974. for _, user := range users {
  975. if user.UserName == username {
  976. err = logic.DeletePendingUser(username)
  977. if err != nil {
  978. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  979. return
  980. }
  981. break
  982. }
  983. }
  984. logic.ReturnSuccessResponse(w, r, "deleted pending "+username)
  985. }
  986. // swagger:route DELETE /api/users_pending/{username}/pending user deleteAllPendingUsers
  987. //
  988. // delete all pending users.
  989. //
  990. // Schemes: https
  991. //
  992. // Security:
  993. // oauth
  994. //
  995. // Responses:
  996. // 200: userBodyResponse
  997. func deleteAllPendingUsers(w http.ResponseWriter, r *http.Request) {
  998. // set header.
  999. err := database.DeleteAllRecords(database.PENDING_USERS_TABLE_NAME)
  1000. if err != nil {
  1001. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending users "+err.Error()), "internal"))
  1002. return
  1003. }
  1004. logic.ReturnSuccessResponse(w, r, "cleared all pending users")
  1005. }
  1006. // swagger:route POST /api/v1/users/invite-signup user userInviteSignUp
  1007. //
  1008. // user signup via invite.
  1009. //
  1010. // Schemes: https
  1011. //
  1012. // Responses:
  1013. // 200: ReturnSuccessResponse
  1014. func userInviteSignUp(w http.ResponseWriter, r *http.Request) {
  1015. email, _ := url.QueryUnescape(r.URL.Query().Get("email"))
  1016. code, _ := url.QueryUnescape(r.URL.Query().Get("code"))
  1017. in, err := logic.GetUserInvite(email)
  1018. if err != nil {
  1019. logger.Log(0, "failed to fetch users: ", err.Error())
  1020. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1021. return
  1022. }
  1023. if code != in.InviteCode {
  1024. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("invalid invite code"), "badrequest"))
  1025. return
  1026. }
  1027. // check if user already exists
  1028. _, err = logic.GetUser(email)
  1029. if err == nil {
  1030. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user already exists"), "badrequest"))
  1031. return
  1032. }
  1033. var user models.User
  1034. err = json.NewDecoder(r.Body).Decode(&user)
  1035. if err != nil {
  1036. logger.Log(0, user.UserName, "error decoding request body: ",
  1037. err.Error())
  1038. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1039. return
  1040. }
  1041. if user.UserName != email {
  1042. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("username not matching with invite"), "badrequest"))
  1043. return
  1044. }
  1045. if user.Password == "" {
  1046. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("password cannot be empty"), "badrequest"))
  1047. return
  1048. }
  1049. for _, inviteGroupID := range in.Groups {
  1050. userG, err := logic.GetUserGroup(inviteGroupID)
  1051. if err != nil {
  1052. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("error fetching group id "+inviteGroupID.String()), "badrequest"))
  1053. return
  1054. }
  1055. user.PlatformRoleID = userG.PlatformRole
  1056. user.UserGroups[inviteGroupID] = struct{}{}
  1057. }
  1058. if user.PlatformRoleID == "" {
  1059. user.PlatformRoleID = models.ServiceUser
  1060. }
  1061. user.NetworkRoles = make(map[models.NetworkID]map[models.UserRole]struct{})
  1062. err = logic.CreateUser(&user)
  1063. if err != nil {
  1064. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1065. return
  1066. }
  1067. // delete invite
  1068. logic.DeleteUserInvite(email)
  1069. logic.DeletePendingUser(email)
  1070. logic.ReturnSuccessResponse(w, r, "created user successfully "+email)
  1071. }
  1072. // swagger:route GET /api/v1/users/invite user userInviteVerify
  1073. //
  1074. // verfies user invite.
  1075. //
  1076. // Schemes: https
  1077. //
  1078. // Responses:
  1079. // 200: ReturnSuccessResponse
  1080. func userInviteVerify(w http.ResponseWriter, r *http.Request) {
  1081. email, _ := url.QueryUnescape(r.URL.Query().Get("email"))
  1082. code, _ := url.QueryUnescape(r.URL.Query().Get("code"))
  1083. err := logic.ValidateAndApproveUserInvite(email, code)
  1084. if err != nil {
  1085. logger.Log(0, "failed to fetch users: ", err.Error())
  1086. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1087. return
  1088. }
  1089. logic.ReturnSuccessResponse(w, r, "invite is valid")
  1090. }
  1091. // swagger:route POST /api/v1/users/invite user inviteUsers
  1092. //
  1093. // invite users.
  1094. //
  1095. // Schemes: https
  1096. //
  1097. // Security:
  1098. // oauth
  1099. //
  1100. // Responses:
  1101. // 200: userBodyResponse
  1102. func inviteUsers(w http.ResponseWriter, r *http.Request) {
  1103. var inviteReq models.InviteUsersReq
  1104. err := json.NewDecoder(r.Body).Decode(&inviteReq)
  1105. if err != nil {
  1106. slog.Error("error decoding request body", "error",
  1107. err.Error())
  1108. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1109. return
  1110. }
  1111. //validate Req
  1112. uniqueGroupsPlatformRole := make(map[models.UserRole]struct{})
  1113. for _, groupID := range inviteReq.Groups {
  1114. userG, err := logic.GetUserGroup(groupID)
  1115. if err != nil {
  1116. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1117. return
  1118. }
  1119. uniqueGroupsPlatformRole[userG.PlatformRole] = struct{}{}
  1120. }
  1121. if len(uniqueGroupsPlatformRole) > 1 {
  1122. err = errors.New("only groups with same platform role can be assigned to an user")
  1123. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1124. return
  1125. }
  1126. for _, inviteeEmail := range inviteReq.UserEmails {
  1127. // check if user with email exists, then ignore
  1128. _, err := logic.GetUser(inviteeEmail)
  1129. if err == nil {
  1130. // user exists already, so ignore
  1131. continue
  1132. }
  1133. invite := models.UserInvite{
  1134. Email: inviteeEmail,
  1135. Groups: inviteReq.Groups,
  1136. InviteCode: logic.RandomString(8),
  1137. }
  1138. err = logic.InsertUserInvite(invite)
  1139. if err != nil {
  1140. slog.Error("failed to insert invite for user", "email", invite.Email, "error", err)
  1141. }
  1142. // notify user with magic link
  1143. go func(invite models.UserInvite) {
  1144. // Set E-Mail body. You can set plain text or html with text/html
  1145. u, err := url.Parse(fmt.Sprintf("%s/invite?email=%s&code=%s",
  1146. servercfg.GetFrontendURL(), url.QueryEscape(invite.Email), url.QueryEscape(invite.InviteCode)))
  1147. if err != nil {
  1148. slog.Error("failed to parse to invite url", "error", err)
  1149. return
  1150. }
  1151. e := email.UserInvitedMail{
  1152. BodyBuilder: &email.EmailBodyBuilderWithH1HeadlineAndImage{},
  1153. InviteURL: u.String(),
  1154. }
  1155. n := email.Notification{
  1156. RecipientMail: invite.Email,
  1157. }
  1158. err = email.GetClient().SendEmail(context.Background(), n, e)
  1159. if err != nil {
  1160. slog.Error("failed to send email invite", "user", invite.Email, "error", err)
  1161. }
  1162. }(invite)
  1163. }
  1164. }
  1165. // swagger:route GET /api/v1/users/invites user listUserInvites
  1166. //
  1167. // lists all pending invited users.
  1168. //
  1169. // Schemes: https
  1170. //
  1171. // Security:
  1172. // oauth
  1173. //
  1174. // Responses:
  1175. // 200: ReturnSuccessResponseWithJson
  1176. func listUserInvites(w http.ResponseWriter, r *http.Request) {
  1177. usersInvites, err := logic.ListUserInvites()
  1178. if err != nil {
  1179. logger.Log(0, "failed to fetch users: ", err.Error())
  1180. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1181. return
  1182. }
  1183. logic.ReturnSuccessResponseWithJson(w, r, usersInvites, "fetched pending user invites")
  1184. }
  1185. // swagger:route DELETE /api/v1/users/invite user deleteUserInvite
  1186. //
  1187. // delete pending invite.
  1188. //
  1189. // Schemes: https
  1190. //
  1191. // Security:
  1192. // oauth
  1193. //
  1194. // Responses:
  1195. // 200: ReturnSuccessResponse
  1196. func deleteUserInvite(w http.ResponseWriter, r *http.Request) {
  1197. var params = mux.Vars(r)
  1198. username := params["invitee_email"]
  1199. err := logic.DeleteUserInvite(username)
  1200. if err != nil {
  1201. logger.Log(0, "failed to delete user invite: ", username, err.Error())
  1202. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1203. return
  1204. }
  1205. logic.ReturnSuccessResponse(w, r, "deleted user invite")
  1206. }
  1207. // swagger:route DELETE /api/v1/users/invites user deleteAllUserInvites
  1208. //
  1209. // deletes all pending invites.
  1210. //
  1211. // Schemes: https
  1212. //
  1213. // Security:
  1214. // oauth
  1215. //
  1216. // Responses:
  1217. // 200: ReturnSuccessResponse
  1218. func deleteAllUserInvites(w http.ResponseWriter, r *http.Request) {
  1219. err := database.DeleteAllRecords(database.USER_INVITES_TABLE_NAME)
  1220. if err != nil {
  1221. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending user invites "+err.Error()), "internal"))
  1222. return
  1223. }
  1224. logic.ReturnSuccessResponse(w, r, "cleared all pending user invites")
  1225. }