user.go 41 KB

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