user.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  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. }
  36. // swagger:route POST /api/users/adm/authenticate authenticate authenticateUser
  37. //
  38. // User authenticates using its password and retrieves a JWT for authorization.
  39. //
  40. // Schemes: https
  41. //
  42. // Security:
  43. // oauth
  44. //
  45. // Responses:
  46. // 200: successResponse
  47. func authenticateUser(response http.ResponseWriter, request *http.Request) {
  48. // Auth request consists of Mac Address and Password (from node that is authorizing
  49. // in case of Master, auth is ignored and mac is set to "mastermac"
  50. var authRequest models.UserAuthParams
  51. var errorResponse = models.ErrorResponse{
  52. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  53. }
  54. if !servercfg.IsBasicAuthEnabled() {
  55. logic.ReturnErrorResponse(response, request, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  56. return
  57. }
  58. decoder := json.NewDecoder(request.Body)
  59. decoderErr := decoder.Decode(&authRequest)
  60. defer request.Body.Close()
  61. if decoderErr != nil {
  62. logger.Log(0, "error decoding request body: ",
  63. decoderErr.Error())
  64. logic.ReturnErrorResponse(response, request, errorResponse)
  65. return
  66. }
  67. if val := request.Header.Get("From-Ui"); val == "true" {
  68. // request came from UI, if normal user block Login
  69. user, err := logic.GetUser(authRequest.UserName)
  70. if err != nil {
  71. logger.Log(0, authRequest.UserName, "user validation failed: ",
  72. err.Error())
  73. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "unauthorized"))
  74. return
  75. }
  76. if !(user.IsAdmin || user.IsSuperAdmin) {
  77. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("only admins can access dashboard"), "unauthorized"))
  78. return
  79. }
  80. }
  81. username := authRequest.UserName
  82. jwt, err := logic.VerifyAuthRequest(authRequest)
  83. if err != nil {
  84. logger.Log(0, username, "user validation failed: ",
  85. err.Error())
  86. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "badrequest"))
  87. return
  88. }
  89. if jwt == "" {
  90. // very unlikely that err is !nil and no jwt returned, but handle it anyways.
  91. logger.Log(0, username, "jwt token is empty")
  92. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("no token returned"), "internal"))
  93. return
  94. }
  95. var successResponse = models.SuccessResponse{
  96. Code: http.StatusOK,
  97. Message: "W1R3: Device " + username + " Authorized",
  98. Response: models.SuccessfulUserLoginResponse{
  99. AuthToken: jwt,
  100. UserName: username,
  101. },
  102. }
  103. // Send back the JWT
  104. successJSONResponse, jsonError := json.Marshal(successResponse)
  105. if jsonError != nil {
  106. logger.Log(0, username,
  107. "error marshalling resp: ", jsonError.Error())
  108. logic.ReturnErrorResponse(response, request, errorResponse)
  109. return
  110. }
  111. logger.Log(2, username, "was authenticated")
  112. response.Header().Set("Content-Type", "application/json")
  113. response.Write(successJSONResponse)
  114. go func() {
  115. if servercfg.IsPro && servercfg.GetRacAutoDisable() {
  116. // enable all associeated clients for the user
  117. clients, err := logic.GetAllExtClients()
  118. if err != nil {
  119. slog.Error("error getting clients: ", "error", err)
  120. return
  121. }
  122. for _, client := range clients {
  123. if client.OwnerID == username && !client.Enabled {
  124. slog.Info(fmt.Sprintf("enabling ext client %s for user %s due to RAC autodisabling feature", client.ClientID, client.OwnerID))
  125. if newClient, err := logic.ToggleExtClientConnectivity(&client, true); err != nil {
  126. slog.Error("error enabling ext client in RAC autodisable hook", "error", err)
  127. continue // dont return but try for other clients
  128. } else {
  129. // publish peer update to ingress gateway
  130. if ingressNode, err := logic.GetNodeByID(newClient.IngressGatewayID); err == nil {
  131. if err = mq.PublishPeerUpdate(false); err != nil {
  132. slog.Error("error updating ext clients on", "ingress", ingressNode.ID.String(), "err", err.Error())
  133. }
  134. }
  135. }
  136. }
  137. }
  138. }
  139. }()
  140. }
  141. // swagger:route GET /api/users/adm/hassuperadmin user hasSuperAdmin
  142. //
  143. // Checks whether the server has an admin.
  144. //
  145. // Schemes: https
  146. //
  147. // Security:
  148. // oauth
  149. //
  150. // Responses:
  151. // 200: hasAdmin
  152. func hasSuperAdmin(w http.ResponseWriter, r *http.Request) {
  153. w.Header().Set("Content-Type", "application/json")
  154. hasSuperAdmin, err := logic.HasSuperAdmin()
  155. if err != nil {
  156. logger.Log(0, "failed to check for admin: ", err.Error())
  157. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  158. return
  159. }
  160. json.NewEncoder(w).Encode(hasSuperAdmin)
  161. }
  162. // swagger:route GET /api/users/{username} user getUser
  163. //
  164. // Get an individual user.
  165. //
  166. // Schemes: https
  167. //
  168. // Security:
  169. // oauth
  170. //
  171. // Responses:
  172. // 200: userBodyResponse
  173. func getUser(w http.ResponseWriter, r *http.Request) {
  174. // set header.
  175. w.Header().Set("Content-Type", "application/json")
  176. var params = mux.Vars(r)
  177. usernameFetched := params["username"]
  178. user, err := logic.GetReturnUser(usernameFetched)
  179. if err != nil {
  180. logger.Log(0, usernameFetched, "failed to fetch user: ", err.Error())
  181. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  182. return
  183. }
  184. logger.Log(2, r.Header.Get("user"), "fetched user", usernameFetched)
  185. json.NewEncoder(w).Encode(user)
  186. }
  187. // swagger:route GET /api/users user getUsers
  188. //
  189. // Get all users.
  190. //
  191. // Schemes: https
  192. //
  193. // Security:
  194. // oauth
  195. //
  196. // Responses:
  197. // 200: userBodyResponse
  198. func getUsers(w http.ResponseWriter, r *http.Request) {
  199. // set header.
  200. w.Header().Set("Content-Type", "application/json")
  201. users, err := logic.GetUsers()
  202. if err != nil {
  203. logger.Log(0, "failed to fetch users: ", err.Error())
  204. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  205. return
  206. }
  207. logic.SortUsers(users[:])
  208. logger.Log(2, r.Header.Get("user"), "fetched users")
  209. json.NewEncoder(w).Encode(users)
  210. }
  211. // swagger:route POST /api/users/adm/createsuperadmin user createAdmin
  212. //
  213. // Make a user an admin.
  214. //
  215. // Schemes: https
  216. //
  217. // Security:
  218. // oauth
  219. //
  220. // Responses:
  221. // 200: userBodyResponse
  222. func createSuperAdmin(w http.ResponseWriter, r *http.Request) {
  223. w.Header().Set("Content-Type", "application/json")
  224. var u models.User
  225. err := json.NewDecoder(r.Body).Decode(&u)
  226. if err != nil {
  227. slog.Error("error decoding request body", "error", err.Error())
  228. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  229. return
  230. }
  231. if !servercfg.IsBasicAuthEnabled() {
  232. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  233. return
  234. }
  235. err = logic.CreateSuperAdmin(&u)
  236. if err != nil {
  237. slog.Error("failed to create admin", "error", err.Error())
  238. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  239. return
  240. }
  241. logger.Log(1, u.UserName, "was made a super admin")
  242. json.NewEncoder(w).Encode(logic.ToReturnUser(u))
  243. }
  244. // swagger:route POST /api/users/adm/transfersuperadmin user transferSuperAdmin
  245. //
  246. // Transfers superadmin role to an admin user.
  247. //
  248. // Schemes: https
  249. //
  250. // Security:
  251. // oauth
  252. //
  253. // Responses:
  254. // 200: userBodyResponse
  255. func transferSuperAdmin(w http.ResponseWriter, r *http.Request) {
  256. w.Header().Set("Content-Type", "application/json")
  257. caller, err := logic.GetUser(r.Header.Get("user"))
  258. if err != nil {
  259. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  260. }
  261. if !caller.IsSuperAdmin {
  262. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only superadmin can assign the superadmin role to another user"), "forbidden"))
  263. return
  264. }
  265. var params = mux.Vars(r)
  266. username := params["username"]
  267. u, err := logic.GetUser(username)
  268. if err != nil {
  269. slog.Error("error getting user", "user", u.UserName, "error", err.Error())
  270. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  271. return
  272. }
  273. if !u.IsAdmin {
  274. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only admins can be promoted to superadmin role"), "forbidden"))
  275. return
  276. }
  277. if !servercfg.IsBasicAuthEnabled() {
  278. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  279. return
  280. }
  281. u.IsSuperAdmin = true
  282. u.IsAdmin = false
  283. err = logic.UpsertUser(*u)
  284. if err != nil {
  285. slog.Error("error updating user to superadmin: ", "user", u.UserName, "error", err.Error())
  286. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  287. return
  288. }
  289. caller.IsSuperAdmin = false
  290. caller.IsAdmin = true
  291. err = logic.UpsertUser(*caller)
  292. if err != nil {
  293. slog.Error("error demoting user to admin: ", "user", caller.UserName, "error", err.Error())
  294. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  295. return
  296. }
  297. slog.Info("user was made a super admin", "user", u.UserName)
  298. json.NewEncoder(w).Encode(logic.ToReturnUser(*u))
  299. }
  300. // swagger:route POST /api/users/{username} user createUser
  301. //
  302. // Create a user.
  303. //
  304. // Schemes: https
  305. //
  306. // Security:
  307. // oauth
  308. //
  309. // Responses:
  310. // 200: userBodyResponse
  311. func createUser(w http.ResponseWriter, r *http.Request) {
  312. w.Header().Set("Content-Type", "application/json")
  313. caller, err := logic.GetUser(r.Header.Get("user"))
  314. if err != nil {
  315. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  316. return
  317. }
  318. var user models.User
  319. err = json.NewDecoder(r.Body).Decode(&user)
  320. if err != nil {
  321. logger.Log(0, user.UserName, "error decoding request body: ",
  322. err.Error())
  323. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  324. return
  325. }
  326. if !caller.IsSuperAdmin && user.IsAdmin {
  327. err = errors.New("only superadmin can create admin users")
  328. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  329. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  330. return
  331. }
  332. if user.IsSuperAdmin {
  333. err = errors.New("additional superadmins cannot be created")
  334. slog.Error("error creating new user: ", "user", user.UserName, "error", err)
  335. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  336. return
  337. }
  338. if !servercfg.IsPro && !user.IsAdmin {
  339. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("non-admins users can only be created on Pro version"), "forbidden"))
  340. return
  341. }
  342. err = logic.CreateUser(&user)
  343. if err != nil {
  344. slog.Error("error creating new user: ", "user", user.UserName, "error", err.Error())
  345. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  346. return
  347. }
  348. slog.Info("user was created", "username", user.UserName)
  349. json.NewEncoder(w).Encode(logic.ToReturnUser(user))
  350. }
  351. // swagger:route PUT /api/users/{username} user updateUser
  352. //
  353. // Update a user.
  354. //
  355. // Schemes: https
  356. //
  357. // Security:
  358. // oauth
  359. //
  360. // Responses:
  361. // 200: userBodyResponse
  362. func updateUser(w http.ResponseWriter, r *http.Request) {
  363. w.Header().Set("Content-Type", "application/json")
  364. var params = mux.Vars(r)
  365. // start here
  366. var caller *models.User
  367. var err error
  368. var ismaster bool
  369. if r.Header.Get("user") == logic.MasterUser {
  370. ismaster = true
  371. } else {
  372. caller, err = logic.GetUser(r.Header.Get("user"))
  373. if err != nil {
  374. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  375. }
  376. }
  377. username := params["username"]
  378. user, err := logic.GetUser(username)
  379. if err != nil {
  380. logger.Log(0, username,
  381. "failed to update user info: ", err.Error())
  382. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  383. return
  384. }
  385. var userchange models.User
  386. // we decode our body request params
  387. err = json.NewDecoder(r.Body).Decode(&userchange)
  388. if err != nil {
  389. slog.Error("failed to decode body", "error ", err.Error())
  390. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  391. return
  392. }
  393. if user.UserName != userchange.UserName {
  394. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user in param and request body not matching"), "badrequest"))
  395. return
  396. }
  397. selfUpdate := false
  398. if !ismaster && caller.UserName == user.UserName {
  399. selfUpdate = true
  400. }
  401. if !ismaster && !selfUpdate {
  402. if caller.IsAdmin && user.IsSuperAdmin {
  403. slog.Error("non-superadmin user", "caller", caller.UserName, "attempted to update superadmin user", username)
  404. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  405. return
  406. }
  407. if !caller.IsAdmin && !caller.IsSuperAdmin {
  408. slog.Error("operation not allowed", "caller", caller.UserName, "attempted to update user", username)
  409. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("cannot update superadmin user"), "forbidden"))
  410. return
  411. }
  412. if caller.IsAdmin && user.IsAdmin {
  413. slog.Error("admin user cannot update another admin", "caller", caller.UserName, "attempted to update admin user", username)
  414. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("admin user cannot update another admin"), "forbidden"))
  415. return
  416. }
  417. if caller.IsAdmin && userchange.IsAdmin {
  418. err = errors.New("admin user cannot update role of an another user to admin")
  419. slog.Error("failed to update user", "caller", caller.UserName, "attempted to update user", username, "error", err)
  420. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  421. return
  422. }
  423. }
  424. if !ismaster && selfUpdate {
  425. if user.IsAdmin != userchange.IsAdmin || user.IsSuperAdmin != userchange.IsSuperAdmin {
  426. slog.Error("user cannot change his own role", "caller", caller.UserName, "attempted to update user role", username)
  427. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user not allowed to self assign role"), "forbidden"))
  428. return
  429. }
  430. }
  431. if ismaster {
  432. if !user.IsSuperAdmin && userchange.IsSuperAdmin {
  433. slog.Error("operation not allowed", "caller", logic.MasterUser, "attempted to update user role to superadmin", username)
  434. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("attempted to update user role to superadmin"), "forbidden"))
  435. return
  436. }
  437. }
  438. if auth.IsOauthUser(user) == nil && userchange.Password != "" {
  439. err := fmt.Errorf("cannot update user's password for an oauth user %s", username)
  440. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  441. return
  442. }
  443. user, err = logic.UpdateUser(&userchange, user)
  444. if err != nil {
  445. logger.Log(0, username,
  446. "failed to update user info: ", err.Error())
  447. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  448. return
  449. }
  450. logger.Log(1, username, "was updated")
  451. json.NewEncoder(w).Encode(logic.ToReturnUser(*user))
  452. }
  453. // swagger:route DELETE /api/users/{username} user deleteUser
  454. //
  455. // Delete a user.
  456. //
  457. // Schemes: https
  458. //
  459. // Security:
  460. // oauth
  461. //
  462. // Responses:
  463. // 200: userBodyResponse
  464. func deleteUser(w http.ResponseWriter, r *http.Request) {
  465. // Set header
  466. w.Header().Set("Content-Type", "application/json")
  467. // get params
  468. var params = mux.Vars(r)
  469. caller, err := logic.GetUser(r.Header.Get("user"))
  470. if err != nil {
  471. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  472. }
  473. username := params["username"]
  474. user, err := logic.GetUser(username)
  475. if err != nil {
  476. logger.Log(0, username,
  477. "failed to update user info: ", err.Error())
  478. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  479. return
  480. }
  481. if user.IsSuperAdmin {
  482. slog.Error(
  483. "failed to delete user: ", "user", username, "error", "superadmin cannot be deleted")
  484. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("superadmin cannot be deleted"), "internal"))
  485. return
  486. }
  487. if !caller.IsSuperAdmin {
  488. if caller.IsAdmin && user.IsAdmin {
  489. slog.Error(
  490. "failed to delete user: ", "user", username, "error", "admin cannot delete another admin user, including oneself")
  491. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("admin cannot delete another admin user, including oneself"), "internal"))
  492. return
  493. }
  494. }
  495. success, err := logic.DeleteUser(username)
  496. if err != nil {
  497. logger.Log(0, username,
  498. "failed to delete user: ", err.Error())
  499. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  500. return
  501. } else if !success {
  502. err := errors.New("delete unsuccessful")
  503. logger.Log(0, username, err.Error())
  504. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  505. return
  506. }
  507. // check and delete extclient with this ownerID
  508. go func() {
  509. extclients, err := logic.GetAllExtClients()
  510. if err != nil {
  511. slog.Error("failed to get extclients", "error", err)
  512. return
  513. }
  514. for _, extclient := range extclients {
  515. if extclient.OwnerID == user.UserName {
  516. err = logic.DeleteExtClient(extclient.Network, extclient.ClientID)
  517. if err != nil {
  518. slog.Error("failed to delete extclient",
  519. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  520. }
  521. }
  522. }
  523. if servercfg.IsDNSMode() {
  524. logic.SetDNS()
  525. }
  526. }()
  527. logger.Log(1, username, "was deleted")
  528. json.NewEncoder(w).Encode(params["username"] + " deleted.")
  529. }
  530. // Called when vpn client dials in to start the auth flow and first stage is to get register URL itself
  531. func socketHandler(w http.ResponseWriter, r *http.Request) {
  532. // Upgrade our raw HTTP connection to a websocket based one
  533. conn, err := upgrader.Upgrade(w, r, nil)
  534. if err != nil {
  535. logger.Log(0, "error during connection upgrade for node sign-in:", err.Error())
  536. return
  537. }
  538. if conn == nil {
  539. logger.Log(0, "failed to establish web-socket connection during node sign-in")
  540. return
  541. }
  542. // Start handling the session
  543. go auth.SessionHandler(conn)
  544. }
  545. // swagger:route GET /api/users_pending user getPendingUsers
  546. //
  547. // Get all pending users.
  548. //
  549. // Schemes: https
  550. //
  551. // Security:
  552. // oauth
  553. //
  554. // Responses:
  555. // 200: userBodyResponse
  556. func getPendingUsers(w http.ResponseWriter, r *http.Request) {
  557. // set header.
  558. w.Header().Set("Content-Type", "application/json")
  559. users, err := logic.ListPendingUsers()
  560. if err != nil {
  561. logger.Log(0, "failed to fetch users: ", err.Error())
  562. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  563. return
  564. }
  565. logic.SortUsers(users[:])
  566. logger.Log(2, r.Header.Get("user"), "fetched pending users")
  567. json.NewEncoder(w).Encode(users)
  568. }
  569. // swagger:route POST /api/users_pending/user/{username} user approvePendingUser
  570. //
  571. // approve pending user.
  572. //
  573. // Schemes: https
  574. //
  575. // Security:
  576. // oauth
  577. //
  578. // Responses:
  579. // 200: userBodyResponse
  580. func approvePendingUser(w http.ResponseWriter, r *http.Request) {
  581. // set header.
  582. w.Header().Set("Content-Type", "application/json")
  583. var params = mux.Vars(r)
  584. username := params["username"]
  585. users, err := logic.ListPendingUsers()
  586. if err != nil {
  587. logger.Log(0, "failed to fetch users: ", err.Error())
  588. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  589. return
  590. }
  591. for _, user := range users {
  592. if user.UserName == username {
  593. var newPass, fetchErr = auth.FetchPassValue("")
  594. if fetchErr != nil {
  595. logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
  596. return
  597. }
  598. if err = logic.CreateUser(&models.User{
  599. UserName: user.UserName,
  600. Password: newPass,
  601. }); err != nil {
  602. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to create user: %s", err), "internal"))
  603. return
  604. }
  605. err = logic.DeletePendingUser(username)
  606. if err != nil {
  607. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  608. return
  609. }
  610. break
  611. }
  612. }
  613. logic.ReturnSuccessResponse(w, r, "approved "+username)
  614. }
  615. // swagger:route DELETE /api/users_pending/user/{username} user deletePendingUser
  616. //
  617. // delete pending user.
  618. //
  619. // Schemes: https
  620. //
  621. // Security:
  622. // oauth
  623. //
  624. // Responses:
  625. // 200: userBodyResponse
  626. func deletePendingUser(w http.ResponseWriter, r *http.Request) {
  627. // set header.
  628. w.Header().Set("Content-Type", "application/json")
  629. var params = mux.Vars(r)
  630. username := params["username"]
  631. users, err := logic.ListPendingUsers()
  632. if err != nil {
  633. logger.Log(0, "failed to fetch users: ", err.Error())
  634. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  635. return
  636. }
  637. for _, user := range users {
  638. if user.UserName == username {
  639. err = logic.DeletePendingUser(username)
  640. if err != nil {
  641. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  642. return
  643. }
  644. break
  645. }
  646. }
  647. logic.ReturnSuccessResponse(w, r, "deleted pending "+username)
  648. }
  649. // swagger:route DELETE /api/users_pending/{username}/pending user deleteAllPendingUsers
  650. //
  651. // delete all pending users.
  652. //
  653. // Schemes: https
  654. //
  655. // Security:
  656. // oauth
  657. //
  658. // Responses:
  659. // 200: userBodyResponse
  660. func deleteAllPendingUsers(w http.ResponseWriter, r *http.Request) {
  661. // set header.
  662. w.Header().Set("Content-Type", "application/json")
  663. err := database.DeleteAllRecords(database.PENDING_USERS_TABLE_NAME)
  664. if err != nil {
  665. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending users "+err.Error()), "internal"))
  666. return
  667. }
  668. logic.ReturnSuccessResponse(w, r, "cleared all pending users")
  669. }