user.go 40 KB

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