user.go 42 KB

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