user.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002
  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/user/roles", logic.SecurityCheck(true, http.HandlerFunc(listRoles))).Methods(http.MethodGet)
  37. r.HandleFunc("/api/v1/user/role", logic.SecurityCheck(true, http.HandlerFunc(getRole))).Methods(http.MethodGet)
  38. r.HandleFunc("/api/v1/user/role", logic.SecurityCheck(true, http.HandlerFunc(createRole))).Methods(http.MethodPost)
  39. r.HandleFunc("/api/v1/user/role", logic.SecurityCheck(true, http.HandlerFunc(updateRole))).Methods(http.MethodPut)
  40. r.HandleFunc("/api/v1/user/role", logic.SecurityCheck(true, http.HandlerFunc(deleteRole))).Methods(http.MethodDelete)
  41. // User Group Handlers
  42. r.HandleFunc("/api/v1/user/groups", logic.SecurityCheck(true, http.HandlerFunc(listUserGroups))).Methods(http.MethodGet)
  43. r.HandleFunc("/api/v1/user/group", logic.SecurityCheck(true, http.HandlerFunc(getUserGroup))).Methods(http.MethodGet)
  44. r.HandleFunc("/api/v1/user/group", logic.SecurityCheck(true, http.HandlerFunc(createUserGroup))).Methods(http.MethodPost)
  45. r.HandleFunc("/api/v1/user/group", logic.SecurityCheck(true, http.HandlerFunc(updateUserGroup))).Methods(http.MethodPut)
  46. r.HandleFunc("/api/v1/user/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(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.CreateRole(userRole)
  248. if err != nil {
  249. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  250. return
  251. }
  252. logic.ReturnSuccessResponseWithJson(w, r, userRole, "created user role")
  253. }
  254. // swagger:route PUT /api/v1/user/role user updateRole
  255. //
  256. // Update user role permission template.
  257. //
  258. // Schemes: https
  259. //
  260. // Security:
  261. // oauth
  262. //
  263. // Responses:
  264. // 200: userBodyResponse
  265. func updateRole(w http.ResponseWriter, r *http.Request) {
  266. var userRole models.UserRolePermissionTemplate
  267. err := json.NewDecoder(r.Body).Decode(&userRole)
  268. if err != nil {
  269. slog.Error("error decoding request body", "error",
  270. err.Error())
  271. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  272. return
  273. }
  274. err = logic.UpdateRole(userRole)
  275. if err != nil {
  276. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  277. return
  278. }
  279. logic.ReturnSuccessResponseWithJson(w, r, userRole, "updated user role")
  280. }
  281. // swagger:route DELETE /api/v1/user/role user deleteRole
  282. //
  283. // Delete user role permission template.
  284. //
  285. // Schemes: https
  286. //
  287. // Security:
  288. // oauth
  289. //
  290. // Responses:
  291. // 200: userBodyResponse
  292. func deleteRole(w http.ResponseWriter, r *http.Request) {
  293. var params = mux.Vars(r)
  294. rid := params["role_id"]
  295. if rid == "" {
  296. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("role is required"), "badrequest"))
  297. return
  298. }
  299. err := logic.DeleteRole(models.UserRole(rid))
  300. if err != nil {
  301. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  302. return
  303. }
  304. logic.ReturnSuccessResponseWithJson(w, r, nil, "created user role")
  305. }
  306. // swagger:route POST /api/users/adm/authenticate authenticate authenticateUser
  307. //
  308. // User authenticates using its password and retrieves a JWT for authorization.
  309. //
  310. // Schemes: https
  311. //
  312. // Security:
  313. // oauth
  314. //
  315. // Responses:
  316. // 200: successResponse
  317. func authenticateUser(response http.ResponseWriter, request *http.Request) {
  318. // Auth request consists of Mac Address and Password (from node that is authorizing
  319. // in case of Master, auth is ignored and mac is set to "mastermac"
  320. var authRequest models.UserAuthParams
  321. var errorResponse = models.ErrorResponse{
  322. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  323. }
  324. if !servercfg.IsBasicAuthEnabled() {
  325. logic.ReturnErrorResponse(response, request, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  326. return
  327. }
  328. decoder := json.NewDecoder(request.Body)
  329. decoderErr := decoder.Decode(&authRequest)
  330. defer request.Body.Close()
  331. if decoderErr != nil {
  332. logger.Log(0, "error decoding request body: ",
  333. decoderErr.Error())
  334. logic.ReturnErrorResponse(response, request, errorResponse)
  335. return
  336. }
  337. if val := request.Header.Get("From-Ui"); val == "true" {
  338. // request came from UI, if normal user block Login
  339. user, err := logic.GetUser(authRequest.UserName)
  340. if err != nil {
  341. logger.Log(0, authRequest.UserName, "user validation failed: ",
  342. err.Error())
  343. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "unauthorized"))
  344. return
  345. }
  346. if !(user.IsAdmin || user.IsSuperAdmin) {
  347. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("only admins can access dashboard"), "unauthorized"))
  348. return
  349. }
  350. }
  351. username := authRequest.UserName
  352. jwt, err := logic.VerifyAuthRequest(authRequest)
  353. if err != nil {
  354. logger.Log(0, username, "user validation failed: ",
  355. err.Error())
  356. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "badrequest"))
  357. return
  358. }
  359. if jwt == "" {
  360. // very unlikely that err is !nil and no jwt returned, but handle it anyways.
  361. logger.Log(0, username, "jwt token is empty")
  362. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("no token returned"), "internal"))
  363. return
  364. }
  365. var successResponse = models.SuccessResponse{
  366. Code: http.StatusOK,
  367. Message: "W1R3: Device " + username + " Authorized",
  368. Response: models.SuccessfulUserLoginResponse{
  369. AuthToken: jwt,
  370. UserName: username,
  371. },
  372. }
  373. // Send back the JWT
  374. successJSONResponse, jsonError := json.Marshal(successResponse)
  375. if jsonError != nil {
  376. logger.Log(0, username,
  377. "error marshalling resp: ", jsonError.Error())
  378. logic.ReturnErrorResponse(response, request, errorResponse)
  379. return
  380. }
  381. logger.Log(2, username, "was authenticated")
  382. response.Header().Set("Content-Type", "application/json")
  383. response.Write(successJSONResponse)
  384. go func() {
  385. if servercfg.IsPro && servercfg.GetRacAutoDisable() {
  386. // enable all associeated clients for the user
  387. clients, err := logic.GetAllExtClients()
  388. if err != nil {
  389. slog.Error("error getting clients: ", "error", err)
  390. return
  391. }
  392. for _, client := range clients {
  393. if client.OwnerID == username && !client.Enabled {
  394. slog.Info(fmt.Sprintf("enabling ext client %s for user %s due to RAC autodisabling feature", client.ClientID, client.OwnerID))
  395. if newClient, err := logic.ToggleExtClientConnectivity(&client, true); err != nil {
  396. slog.Error("error enabling ext client in RAC autodisable hook", "error", err)
  397. continue // dont return but try for other clients
  398. } else {
  399. // publish peer update to ingress gateway
  400. if ingressNode, err := logic.GetNodeByID(newClient.IngressGatewayID); err == nil {
  401. if err = mq.PublishPeerUpdate(false); err != nil {
  402. slog.Error("error updating ext clients on", "ingress", ingressNode.ID.String(), "err", err.Error())
  403. }
  404. }
  405. }
  406. }
  407. }
  408. }
  409. }()
  410. }
  411. // swagger:route GET /api/users/adm/hassuperadmin user hasSuperAdmin
  412. //
  413. // Checks whether the server has an admin.
  414. //
  415. // Schemes: https
  416. //
  417. // Security:
  418. // oauth
  419. //
  420. // Responses:
  421. // 200: hasAdmin
  422. func hasSuperAdmin(w http.ResponseWriter, r *http.Request) {
  423. w.Header().Set("Content-Type", "application/json")
  424. hasSuperAdmin, err := logic.HasSuperAdmin()
  425. if err != nil {
  426. logger.Log(0, "failed to check for admin: ", err.Error())
  427. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  428. return
  429. }
  430. json.NewEncoder(w).Encode(hasSuperAdmin)
  431. }
  432. // swagger:route GET /api/users/{username} user getUser
  433. //
  434. // Get an individual user.
  435. //
  436. // Schemes: https
  437. //
  438. // Security:
  439. // oauth
  440. //
  441. // Responses:
  442. // 200: userBodyResponse
  443. func getUser(w http.ResponseWriter, r *http.Request) {
  444. // set header.
  445. w.Header().Set("Content-Type", "application/json")
  446. var params = mux.Vars(r)
  447. usernameFetched := params["username"]
  448. user, err := logic.GetReturnUser(usernameFetched)
  449. if err != nil {
  450. logger.Log(0, usernameFetched, "failed to fetch user: ", err.Error())
  451. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  452. return
  453. }
  454. logger.Log(2, r.Header.Get("user"), "fetched user", usernameFetched)
  455. json.NewEncoder(w).Encode(user)
  456. }
  457. // swagger:route GET /api/users user getUsers
  458. //
  459. // Get all users.
  460. //
  461. // Schemes: https
  462. //
  463. // Security:
  464. // oauth
  465. //
  466. // Responses:
  467. // 200: userBodyResponse
  468. func getUsers(w http.ResponseWriter, r *http.Request) {
  469. // set header.
  470. w.Header().Set("Content-Type", "application/json")
  471. users, err := logic.GetUsers()
  472. if err != nil {
  473. logger.Log(0, "failed to fetch users: ", err.Error())
  474. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  475. return
  476. }
  477. logic.SortUsers(users[:])
  478. logger.Log(2, r.Header.Get("user"), "fetched users")
  479. json.NewEncoder(w).Encode(users)
  480. }
  481. // swagger:route POST /api/users/adm/createsuperadmin user createAdmin
  482. //
  483. // Make a user an admin.
  484. //
  485. // Schemes: https
  486. //
  487. // Security:
  488. // oauth
  489. //
  490. // Responses:
  491. // 200: userBodyResponse
  492. func createSuperAdmin(w http.ResponseWriter, r *http.Request) {
  493. w.Header().Set("Content-Type", "application/json")
  494. var u models.User
  495. err := json.NewDecoder(r.Body).Decode(&u)
  496. if err != nil {
  497. slog.Error("error decoding request body", "error", err.Error())
  498. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  499. return
  500. }
  501. if !servercfg.IsBasicAuthEnabled() {
  502. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  503. return
  504. }
  505. err = logic.CreateSuperAdmin(&u)
  506. if err != nil {
  507. slog.Error("failed to create admin", "error", err.Error())
  508. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  509. return
  510. }
  511. logger.Log(1, u.UserName, "was made a super admin")
  512. json.NewEncoder(w).Encode(logic.ToReturnUser(u))
  513. }
  514. // swagger:route POST /api/users/adm/transfersuperadmin user transferSuperAdmin
  515. //
  516. // Transfers superadmin role to an admin user.
  517. //
  518. // Schemes: https
  519. //
  520. // Security:
  521. // oauth
  522. //
  523. // Responses:
  524. // 200: userBodyResponse
  525. func transferSuperAdmin(w http.ResponseWriter, r *http.Request) {
  526. w.Header().Set("Content-Type", "application/json")
  527. caller, err := logic.GetUser(r.Header.Get("user"))
  528. if err != nil {
  529. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  530. }
  531. if !caller.IsSuperAdmin {
  532. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only superadmin can assign the superadmin role to another user"), "forbidden"))
  533. return
  534. }
  535. var params = mux.Vars(r)
  536. username := params["username"]
  537. u, err := logic.GetUser(username)
  538. if err != nil {
  539. slog.Error("error getting user", "user", u.UserName, "error", err.Error())
  540. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  541. return
  542. }
  543. if !u.IsAdmin {
  544. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only admins can be promoted to superadmin role"), "forbidden"))
  545. return
  546. }
  547. if !servercfg.IsBasicAuthEnabled() {
  548. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  549. return
  550. }
  551. u.IsSuperAdmin = true
  552. u.IsAdmin = false
  553. err = logic.UpsertUser(*u)
  554. if err != nil {
  555. slog.Error("error updating user to superadmin: ", "user", u.UserName, "error", err.Error())
  556. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  557. return
  558. }
  559. caller.IsSuperAdmin = false
  560. caller.IsAdmin = true
  561. err = logic.UpsertUser(*caller)
  562. if err != nil {
  563. slog.Error("error demoting user to admin: ", "user", caller.UserName, "error", err.Error())
  564. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  565. return
  566. }
  567. slog.Info("user was made a super admin", "user", u.UserName)
  568. json.NewEncoder(w).Encode(logic.ToReturnUser(*u))
  569. }
  570. // swagger:route POST /api/users/{username} user createUser
  571. //
  572. // Create a user.
  573. //
  574. // Schemes: https
  575. //
  576. // Security:
  577. // oauth
  578. //
  579. // Responses:
  580. // 200: userBodyResponse
  581. func createUser(w http.ResponseWriter, r *http.Request) {
  582. w.Header().Set("Content-Type", "application/json")
  583. caller, err := logic.GetUser(r.Header.Get("user"))
  584. if err != nil {
  585. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  586. return
  587. }
  588. var user models.User
  589. err = json.NewDecoder(r.Body).Decode(&user)
  590. if err != nil {
  591. logger.Log(0, user.UserName, "error decoding request body: ",
  592. err.Error())
  593. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  594. return
  595. }
  596. if !caller.IsSuperAdmin && user.IsAdmin {
  597. err = errors.New("only superadmin can create admin users")
  598. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  599. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  600. return
  601. }
  602. if user.IsSuperAdmin {
  603. err = errors.New("additional superadmins cannot be created")
  604. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  605. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  606. return
  607. }
  608. if !servercfg.IsPro && !user.IsAdmin {
  609. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("non-admins users can only be created on Pro version"), "forbidden"))
  610. return
  611. }
  612. err = logic.CreateUser(&user)
  613. if err != nil {
  614. slog.Error("error creating new user: ", "user", user.UserName, "error", err.Error())
  615. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  616. return
  617. }
  618. slog.Info("user was created", "username", user.UserName)
  619. json.NewEncoder(w).Encode(logic.ToReturnUser(user))
  620. }
  621. // swagger:route PUT /api/users/{username} user updateUser
  622. //
  623. // Update a user.
  624. //
  625. // Schemes: https
  626. //
  627. // Security:
  628. // oauth
  629. //
  630. // Responses:
  631. // 200: userBodyResponse
  632. func updateUser(w http.ResponseWriter, r *http.Request) {
  633. w.Header().Set("Content-Type", "application/json")
  634. var params = mux.Vars(r)
  635. // start here
  636. var caller *models.User
  637. var err error
  638. var ismaster bool
  639. if r.Header.Get("user") == logic.MasterUser {
  640. ismaster = true
  641. } else {
  642. caller, err = logic.GetUser(r.Header.Get("user"))
  643. if err != nil {
  644. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  645. }
  646. }
  647. username := params["username"]
  648. user, err := logic.GetUser(username)
  649. if err != nil {
  650. logger.Log(0, username,
  651. "failed to update user info: ", err.Error())
  652. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  653. return
  654. }
  655. var userchange models.User
  656. // we decode our body request params
  657. err = json.NewDecoder(r.Body).Decode(&userchange)
  658. if err != nil {
  659. slog.Error("failed to decode body", "error ", err.Error())
  660. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  661. return
  662. }
  663. if user.UserName != userchange.UserName {
  664. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user in param and request body not matching"), "badrequest"))
  665. return
  666. }
  667. selfUpdate := false
  668. if !ismaster && caller.UserName == user.UserName {
  669. selfUpdate = true
  670. }
  671. if !ismaster && !selfUpdate {
  672. if caller.IsAdmin && user.IsSuperAdmin {
  673. slog.Error("non-superadmin user", "caller", caller.UserName, "attempted to update superadmin user", username)
  674. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  675. return
  676. }
  677. if !caller.IsAdmin && !caller.IsSuperAdmin {
  678. slog.Error("operation not allowed", "caller", caller.UserName, "attempted to update user", username)
  679. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  680. return
  681. }
  682. if caller.IsAdmin && user.IsAdmin {
  683. slog.Error("admin user cannot update another admin", "caller", caller.UserName, "attempted to update admin user", username)
  684. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("admin user cannot update another admin"), "forbidden"))
  685. return
  686. }
  687. if caller.IsAdmin && userchange.IsAdmin {
  688. err = errors.New("admin user cannot update role of an another user to admin")
  689. slog.Error("failed to update user", "caller", caller.UserName, "attempted to update user", username, "error", err)
  690. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  691. return
  692. }
  693. }
  694. if !ismaster && selfUpdate {
  695. if user.IsAdmin != userchange.IsAdmin || user.IsSuperAdmin != userchange.IsSuperAdmin {
  696. slog.Error("user cannot change his own role", "caller", caller.UserName, "attempted to update user role", username)
  697. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user not allowed to self assign role"), "forbidden"))
  698. return
  699. }
  700. }
  701. if ismaster {
  702. if !user.IsSuperAdmin && userchange.IsSuperAdmin {
  703. slog.Error("operation not allowed", "caller", logic.MasterUser, "attempted to update user role to superadmin", username)
  704. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("attempted to update user role to superadmin"), "forbidden"))
  705. return
  706. }
  707. }
  708. if auth.IsOauthUser(user) == nil && userchange.Password != "" {
  709. err := fmt.Errorf("cannot update user's password for an oauth user %s", username)
  710. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  711. return
  712. }
  713. user, err = logic.UpdateUser(&userchange, user)
  714. if err != nil {
  715. logger.Log(0, username,
  716. "failed to update user info: ", err.Error())
  717. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  718. return
  719. }
  720. logger.Log(1, username, "was updated")
  721. json.NewEncoder(w).Encode(logic.ToReturnUser(*user))
  722. }
  723. // swagger:route DELETE /api/users/{username} user deleteUser
  724. //
  725. // Delete a user.
  726. //
  727. // Schemes: https
  728. //
  729. // Security:
  730. // oauth
  731. //
  732. // Responses:
  733. // 200: userBodyResponse
  734. func deleteUser(w http.ResponseWriter, r *http.Request) {
  735. // Set header
  736. w.Header().Set("Content-Type", "application/json")
  737. // get params
  738. var params = mux.Vars(r)
  739. caller, err := logic.GetUser(r.Header.Get("user"))
  740. if err != nil {
  741. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  742. }
  743. username := params["username"]
  744. user, err := logic.GetUser(username)
  745. if err != nil {
  746. logger.Log(0, username,
  747. "failed to update user info: ", err.Error())
  748. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  749. return
  750. }
  751. if user.IsSuperAdmin {
  752. slog.Error(
  753. "failed to delete user: ", "user", username, "error", "superadmin cannot be deleted")
  754. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("superadmin cannot be deleted"), "internal"))
  755. return
  756. }
  757. if !caller.IsSuperAdmin {
  758. if caller.IsAdmin && user.IsAdmin {
  759. slog.Error(
  760. "failed to delete user: ", "user", username, "error", "admin cannot delete another admin user, including oneself")
  761. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("admin cannot delete another admin user, including oneself"), "internal"))
  762. return
  763. }
  764. }
  765. success, err := logic.DeleteUser(username)
  766. if err != nil {
  767. logger.Log(0, username,
  768. "failed to delete user: ", err.Error())
  769. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  770. return
  771. } else if !success {
  772. err := errors.New("delete unsuccessful")
  773. logger.Log(0, username, err.Error())
  774. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  775. return
  776. }
  777. // check and delete extclient with this ownerID
  778. go func() {
  779. extclients, err := logic.GetAllExtClients()
  780. if err != nil {
  781. slog.Error("failed to get extclients", "error", err)
  782. return
  783. }
  784. for _, extclient := range extclients {
  785. if extclient.OwnerID == user.UserName {
  786. err = logic.DeleteExtClient(extclient.Network, extclient.ClientID)
  787. if err != nil {
  788. slog.Error("failed to delete extclient",
  789. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  790. }
  791. }
  792. }
  793. if servercfg.IsDNSMode() {
  794. logic.SetDNS()
  795. }
  796. }()
  797. logger.Log(1, username, "was deleted")
  798. json.NewEncoder(w).Encode(params["username"] + " deleted.")
  799. }
  800. // Called when vpn client dials in to start the auth flow and first stage is to get register URL itself
  801. func socketHandler(w http.ResponseWriter, r *http.Request) {
  802. // Upgrade our raw HTTP connection to a websocket based one
  803. conn, err := upgrader.Upgrade(w, r, nil)
  804. if err != nil {
  805. logger.Log(0, "error during connection upgrade for node sign-in:", err.Error())
  806. return
  807. }
  808. if conn == nil {
  809. logger.Log(0, "failed to establish web-socket connection during node sign-in")
  810. return
  811. }
  812. // Start handling the session
  813. go auth.SessionHandler(conn)
  814. }
  815. // swagger:route GET /api/users_pending user getPendingUsers
  816. //
  817. // Get all pending users.
  818. //
  819. // Schemes: https
  820. //
  821. // Security:
  822. // oauth
  823. //
  824. // Responses:
  825. // 200: userBodyResponse
  826. func getPendingUsers(w http.ResponseWriter, r *http.Request) {
  827. // set header.
  828. w.Header().Set("Content-Type", "application/json")
  829. users, err := logic.ListPendingUsers()
  830. if err != nil {
  831. logger.Log(0, "failed to fetch users: ", err.Error())
  832. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  833. return
  834. }
  835. logic.SortUsers(users[:])
  836. logger.Log(2, r.Header.Get("user"), "fetched pending users")
  837. json.NewEncoder(w).Encode(users)
  838. }
  839. // swagger:route POST /api/users_pending/user/{username} user approvePendingUser
  840. //
  841. // approve pending user.
  842. //
  843. // Schemes: https
  844. //
  845. // Security:
  846. // oauth
  847. //
  848. // Responses:
  849. // 200: userBodyResponse
  850. func approvePendingUser(w http.ResponseWriter, r *http.Request) {
  851. // set header.
  852. w.Header().Set("Content-Type", "application/json")
  853. var params = mux.Vars(r)
  854. username := params["username"]
  855. users, err := logic.ListPendingUsers()
  856. if err != nil {
  857. logger.Log(0, "failed to fetch users: ", err.Error())
  858. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  859. return
  860. }
  861. for _, user := range users {
  862. if user.UserName == username {
  863. var newPass, fetchErr = auth.FetchPassValue("")
  864. if fetchErr != nil {
  865. logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
  866. return
  867. }
  868. if err = logic.CreateUser(&models.User{
  869. UserName: user.UserName,
  870. Password: newPass,
  871. }); err != nil {
  872. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to create user: %s", err), "internal"))
  873. return
  874. }
  875. err = logic.DeletePendingUser(username)
  876. if err != nil {
  877. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  878. return
  879. }
  880. break
  881. }
  882. }
  883. logic.ReturnSuccessResponse(w, r, "approved "+username)
  884. }
  885. // swagger:route DELETE /api/users_pending/user/{username} user deletePendingUser
  886. //
  887. // delete pending user.
  888. //
  889. // Schemes: https
  890. //
  891. // Security:
  892. // oauth
  893. //
  894. // Responses:
  895. // 200: userBodyResponse
  896. func deletePendingUser(w http.ResponseWriter, r *http.Request) {
  897. // set header.
  898. w.Header().Set("Content-Type", "application/json")
  899. var params = mux.Vars(r)
  900. username := params["username"]
  901. users, err := logic.ListPendingUsers()
  902. if err != nil {
  903. logger.Log(0, "failed to fetch users: ", err.Error())
  904. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  905. return
  906. }
  907. for _, user := range users {
  908. if user.UserName == username {
  909. err = logic.DeletePendingUser(username)
  910. if err != nil {
  911. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  912. return
  913. }
  914. break
  915. }
  916. }
  917. logic.ReturnSuccessResponse(w, r, "deleted pending "+username)
  918. }
  919. // swagger:route DELETE /api/users_pending/{username}/pending user deleteAllPendingUsers
  920. //
  921. // delete all pending users.
  922. //
  923. // Schemes: https
  924. //
  925. // Security:
  926. // oauth
  927. //
  928. // Responses:
  929. // 200: userBodyResponse
  930. func deleteAllPendingUsers(w http.ResponseWriter, r *http.Request) {
  931. // set header.
  932. w.Header().Set("Content-Type", "application/json")
  933. err := database.DeleteAllRecords(database.PENDING_USERS_TABLE_NAME)
  934. if err != nil {
  935. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending users "+err.Error()), "internal"))
  936. return
  937. }
  938. logic.ReturnSuccessResponse(w, r, "cleared all pending users")
  939. }