user.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  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/logger"
  11. "github.com/gravitl/netmaker/logic"
  12. "github.com/gravitl/netmaker/models"
  13. "github.com/gravitl/netmaker/servercfg"
  14. )
  15. var (
  16. upgrader = websocket.Upgrader{}
  17. )
  18. func userHandlers(r *mux.Router) {
  19. r.HandleFunc("/api/users/adm/hasadmin", hasAdmin).Methods(http.MethodGet)
  20. r.HandleFunc("/api/users/adm/createadmin", createAdmin).Methods(http.MethodPost)
  21. r.HandleFunc("/api/users/adm/authenticate", authenticateUser).Methods(http.MethodPost)
  22. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(updateUser)))).Methods(http.MethodPut)
  23. r.HandleFunc("/api/users/networks/{username}", logic.SecurityCheck(true, http.HandlerFunc(updateUserNetworks))).Methods(http.MethodPut)
  24. r.HandleFunc("/api/users/{username}/adm", logic.SecurityCheck(true, http.HandlerFunc(updateUserAdm))).Methods(http.MethodPut)
  25. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(true, checkFreeTierLimits(users_l, http.HandlerFunc(createUser)))).Methods(http.MethodPost)
  26. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(true, http.HandlerFunc(deleteUser))).Methods(http.MethodDelete)
  27. r.HandleFunc("/api/users/{username}", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUser)))).Methods(http.MethodGet)
  28. r.HandleFunc("/api/users", logic.SecurityCheck(true, http.HandlerFunc(getUsers))).Methods(http.MethodGet)
  29. r.HandleFunc("/api/oauth/login", auth.HandleAuthLogin).Methods(http.MethodGet)
  30. r.HandleFunc("/api/oauth/callback", auth.HandleAuthCallback).Methods(http.MethodGet)
  31. r.HandleFunc("/api/oauth/node-handler", socketHandler)
  32. r.HandleFunc("/api/oauth/headless", auth.HandleHeadlessSSO)
  33. r.HandleFunc("/api/oauth/register/{regKey}", auth.RegisterNodeSSO).Methods(http.MethodGet)
  34. }
  35. // swagger:route POST /api/users/adm/authenticate user authenticateUser
  36. //
  37. // Node authenticates using its password and retrieves a JWT for authorization.
  38. //
  39. // Schemes: https
  40. //
  41. // Security:
  42. // oauth
  43. //
  44. // Responses:
  45. // 200: successResponse
  46. func authenticateUser(response http.ResponseWriter, request *http.Request) {
  47. // Auth request consists of Mac Address and Password (from node that is authorizing
  48. // in case of Master, auth is ignored and mac is set to "mastermac"
  49. var authRequest models.UserAuthParams
  50. var errorResponse = models.ErrorResponse{
  51. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  52. }
  53. if !servercfg.IsBasicAuthEnabled() {
  54. logic.ReturnErrorResponse(response, request, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  55. return
  56. }
  57. decoder := json.NewDecoder(request.Body)
  58. decoderErr := decoder.Decode(&authRequest)
  59. defer request.Body.Close()
  60. if decoderErr != nil {
  61. logger.Log(0, "error decoding request body: ",
  62. decoderErr.Error())
  63. logic.ReturnErrorResponse(response, request, errorResponse)
  64. return
  65. }
  66. username := authRequest.UserName
  67. jwt, err := logic.VerifyAuthRequest(authRequest)
  68. if err != nil {
  69. logger.Log(0, username, "user validation failed: ",
  70. err.Error())
  71. logic.ReturnErrorResponse(response, request, logic.FormatError(err, "badrequest"))
  72. return
  73. }
  74. if jwt == "" {
  75. // very unlikely that err is !nil and no jwt returned, but handle it anyways.
  76. logger.Log(0, username, "jwt token is empty")
  77. logic.ReturnErrorResponse(response, request, logic.FormatError(errors.New("no token returned"), "internal"))
  78. return
  79. }
  80. var successResponse = models.SuccessResponse{
  81. Code: http.StatusOK,
  82. Message: "W1R3: Device " + username + " Authorized",
  83. Response: models.SuccessfulUserLoginResponse{
  84. AuthToken: jwt,
  85. UserName: username,
  86. },
  87. }
  88. // Send back the JWT
  89. successJSONResponse, jsonError := json.Marshal(successResponse)
  90. if jsonError != nil {
  91. logger.Log(0, username,
  92. "error marshalling resp: ", err.Error())
  93. logic.ReturnErrorResponse(response, request, errorResponse)
  94. return
  95. }
  96. logger.Log(2, username, "was authenticated")
  97. response.Header().Set("Content-Type", "application/json")
  98. response.Write(successJSONResponse)
  99. }
  100. // swagger:route GET /api/users/adm/hasadmin user hasAdmin
  101. //
  102. // Checks whether the server has an admin.
  103. //
  104. // Schemes: https
  105. //
  106. // Security:
  107. // oauth
  108. //
  109. // Responses:
  110. // 200: successResponse
  111. func hasAdmin(w http.ResponseWriter, r *http.Request) {
  112. w.Header().Set("Content-Type", "application/json")
  113. hasadmin, err := logic.HasAdmin()
  114. if err != nil {
  115. logger.Log(0, "failed to check for admin: ", err.Error())
  116. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  117. return
  118. }
  119. json.NewEncoder(w).Encode(hasadmin)
  120. }
  121. // swagger:route GET /api/users/{username} user getUser
  122. //
  123. // Get an individual user.
  124. //
  125. // Schemes: https
  126. //
  127. // Security:
  128. // oauth
  129. //
  130. // Responses:
  131. // 200: userBodyResponse
  132. func getUser(w http.ResponseWriter, r *http.Request) {
  133. // set header.
  134. w.Header().Set("Content-Type", "application/json")
  135. var params = mux.Vars(r)
  136. usernameFetched := params["username"]
  137. user, err := logic.GetUser(usernameFetched)
  138. if err != nil {
  139. logger.Log(0, usernameFetched, "failed to fetch user: ", err.Error())
  140. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  141. return
  142. }
  143. logger.Log(2, r.Header.Get("user"), "fetched user", usernameFetched)
  144. json.NewEncoder(w).Encode(user)
  145. }
  146. // swagger:route GET /api/users user getUsers
  147. //
  148. // Get all users.
  149. //
  150. // Schemes: https
  151. //
  152. // Security:
  153. // oauth
  154. //
  155. // Responses:
  156. // 200: userBodyResponse
  157. func getUsers(w http.ResponseWriter, r *http.Request) {
  158. // set header.
  159. w.Header().Set("Content-Type", "application/json")
  160. users, err := logic.GetUsers()
  161. if err != nil {
  162. logger.Log(0, "failed to fetch users: ", err.Error())
  163. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  164. return
  165. }
  166. logic.SortUsers(users[:])
  167. logger.Log(2, r.Header.Get("user"), "fetched users")
  168. json.NewEncoder(w).Encode(users)
  169. }
  170. // swagger:route POST /api/users/adm/createadmin user createAdmin
  171. //
  172. // Make a user an admin.
  173. //
  174. // Schemes: https
  175. //
  176. // Security:
  177. // oauth
  178. //
  179. // Responses:
  180. // 200: userBodyResponse
  181. func createAdmin(w http.ResponseWriter, r *http.Request) {
  182. w.Header().Set("Content-Type", "application/json")
  183. var admin models.User
  184. err := json.NewDecoder(r.Body).Decode(&admin)
  185. if err != nil {
  186. logger.Log(0, admin.UserName, "error decoding request body: ",
  187. err.Error())
  188. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  189. return
  190. }
  191. if !servercfg.IsBasicAuthEnabled() {
  192. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("basic auth is disabled"), "badrequest"))
  193. return
  194. }
  195. err = logic.CreateAdmin(&admin)
  196. if err != nil {
  197. logger.Log(0, admin.UserName, "failed to create admin: ",
  198. err.Error())
  199. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  200. return
  201. }
  202. logger.Log(1, admin.UserName, "was made a new admin")
  203. json.NewEncoder(w).Encode(admin)
  204. }
  205. // swagger:route POST /api/users/{username} user createUser
  206. //
  207. // Create a user.
  208. //
  209. // Schemes: https
  210. //
  211. // Security:
  212. // oauth
  213. //
  214. // Responses:
  215. // 200: userBodyResponse
  216. func createUser(w http.ResponseWriter, r *http.Request) {
  217. w.Header().Set("Content-Type", "application/json")
  218. var user models.User
  219. err := json.NewDecoder(r.Body).Decode(&user)
  220. if err != nil {
  221. logger.Log(0, user.UserName, "error decoding request body: ",
  222. err.Error())
  223. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  224. return
  225. }
  226. err = logic.CreateUser(&user)
  227. if err != nil {
  228. logger.Log(0, user.UserName, "error creating new user: ",
  229. err.Error())
  230. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  231. return
  232. }
  233. logger.Log(1, user.UserName, "was created")
  234. json.NewEncoder(w).Encode(user)
  235. }
  236. // swagger:route PUT /api/users/networks/{username} user updateUserNetworks
  237. //
  238. // Updates the networks of the given user.
  239. //
  240. // Schemes: https
  241. //
  242. // Security:
  243. // oauth
  244. //
  245. // Responses:
  246. // 200: userBodyResponse
  247. func updateUserNetworks(w http.ResponseWriter, r *http.Request) {
  248. w.Header().Set("Content-Type", "application/json")
  249. var params = mux.Vars(r)
  250. // start here
  251. username := params["username"]
  252. user, err := logic.GetUser(username)
  253. if err != nil {
  254. logger.Log(0, username,
  255. "failed to update user networks: ", err.Error())
  256. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  257. return
  258. }
  259. var userchange models.User
  260. // we decode our body request params
  261. err = json.NewDecoder(r.Body).Decode(&userchange)
  262. if err != nil {
  263. logger.Log(0, username, "error decoding request body: ",
  264. err.Error())
  265. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  266. return
  267. }
  268. err = logic.UpdateUserNetworks(userchange.Networks, userchange.Groups, userchange.IsAdmin, &models.ReturnUser{
  269. Groups: user.Groups,
  270. IsAdmin: user.IsAdmin,
  271. Networks: user.Networks,
  272. UserName: user.UserName,
  273. })
  274. if err != nil {
  275. logger.Log(0, username,
  276. "failed to update user networks: ", err.Error())
  277. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  278. return
  279. }
  280. logger.Log(1, username, "status was updated")
  281. json.NewEncoder(w).Encode(user)
  282. }
  283. // swagger:route PUT /api/users/{username} user updateUser
  284. //
  285. // Update a user.
  286. //
  287. // Schemes: https
  288. //
  289. // Security:
  290. // oauth
  291. //
  292. // Responses:
  293. // 200: userBodyResponse
  294. func updateUser(w http.ResponseWriter, r *http.Request) {
  295. w.Header().Set("Content-Type", "application/json")
  296. var params = mux.Vars(r)
  297. // start here
  298. username := params["username"]
  299. user, err := logic.GetUser(username)
  300. if err != nil {
  301. logger.Log(0, username,
  302. "failed to update user info: ", err.Error())
  303. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  304. return
  305. }
  306. if auth.IsOauthUser(user) == nil {
  307. err := fmt.Errorf("cannot update user info for oauth user %s", username)
  308. logger.Log(0, err.Error())
  309. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  310. return
  311. }
  312. var userchange models.User
  313. // we decode our body request params
  314. err = json.NewDecoder(r.Body).Decode(&userchange)
  315. if err != nil {
  316. logger.Log(0, username, "error decoding request body: ",
  317. err.Error())
  318. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  319. return
  320. }
  321. userchange.Networks = nil
  322. user, err = logic.UpdateUser(&userchange, user)
  323. if err != nil {
  324. logger.Log(0, username,
  325. "failed to update user info: ", err.Error())
  326. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  327. return
  328. }
  329. logger.Log(1, username, "was updated")
  330. json.NewEncoder(w).Encode(user)
  331. }
  332. // swagger:route PUT /api/users/{username}/adm user updateUserAdm
  333. //
  334. // Updates the given admin user's info (as long as the user is an admin).
  335. //
  336. // Schemes: https
  337. //
  338. // Security:
  339. // oauth
  340. //
  341. // Responses:
  342. // 200: userBodyResponse
  343. func updateUserAdm(w http.ResponseWriter, r *http.Request) {
  344. w.Header().Set("Content-Type", "application/json")
  345. var params = mux.Vars(r)
  346. // start here
  347. username := params["username"]
  348. user, err := logic.GetUser(username)
  349. if err != nil {
  350. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  351. return
  352. }
  353. if auth.IsOauthUser(user) != nil {
  354. err := fmt.Errorf("cannot update user info for oauth user %s", username)
  355. logger.Log(0, err.Error())
  356. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "forbidden"))
  357. return
  358. }
  359. var userchange models.User
  360. // we decode our body request params
  361. err = json.NewDecoder(r.Body).Decode(&userchange)
  362. if err != nil {
  363. logger.Log(0, username, "error decoding request body: ",
  364. err.Error())
  365. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  366. return
  367. }
  368. if !user.IsAdmin {
  369. logger.Log(0, username, "not an admin user")
  370. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("not a admin user"), "badrequest"))
  371. }
  372. user, err = logic.UpdateUser(&userchange, user)
  373. if err != nil {
  374. logger.Log(0, username,
  375. "failed to update user (admin) info: ", err.Error())
  376. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  377. return
  378. }
  379. logger.Log(1, username, "was updated (admin)")
  380. json.NewEncoder(w).Encode(user)
  381. }
  382. // swagger:route DELETE /api/users/{username} user deleteUser
  383. //
  384. // Delete a user.
  385. //
  386. // Schemes: https
  387. //
  388. // Security:
  389. // oauth
  390. //
  391. // Responses:
  392. // 200: userBodyResponse
  393. func deleteUser(w http.ResponseWriter, r *http.Request) {
  394. // Set header
  395. w.Header().Set("Content-Type", "application/json")
  396. // get params
  397. var params = mux.Vars(r)
  398. username := params["username"]
  399. success, err := logic.DeleteUser(username)
  400. if err != nil {
  401. logger.Log(0, username,
  402. "failed to delete user: ", err.Error())
  403. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  404. return
  405. } else if !success {
  406. err := errors.New("delete unsuccessful")
  407. logger.Log(0, username, err.Error())
  408. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  409. return
  410. }
  411. logger.Log(1, username, "was deleted")
  412. json.NewEncoder(w).Encode(params["username"] + " deleted.")
  413. }
  414. // Called when vpn client dials in to start the auth flow and first stage is to get register URL itself
  415. func socketHandler(w http.ResponseWriter, r *http.Request) {
  416. // Upgrade our raw HTTP connection to a websocket based one
  417. conn, err := upgrader.Upgrade(w, r, nil)
  418. if err != nil {
  419. logger.Log(0, "error during connection upgrade for node sign-in:", err.Error())
  420. return
  421. }
  422. if conn == nil {
  423. logger.Log(0, "failed to establish web-socket connection during node sign-in")
  424. return
  425. }
  426. // Start handling the session
  427. // go auth.SessionHandler(conn)
  428. }