user.go 32 KB

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