users.go 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310
  1. package controllers
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "net/http"
  8. "net/url"
  9. "github.com/gorilla/mux"
  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. proAuth "github.com/gravitl/netmaker/pro/auth"
  16. "github.com/gravitl/netmaker/pro/email"
  17. proLogic "github.com/gravitl/netmaker/pro/logic"
  18. "github.com/gravitl/netmaker/servercfg"
  19. "golang.org/x/exp/slog"
  20. )
  21. func UserHandlers(r *mux.Router) {
  22. r.HandleFunc("/api/oauth/login", proAuth.HandleAuthLogin).Methods(http.MethodGet)
  23. r.HandleFunc("/api/oauth/callback", proAuth.HandleAuthCallback).Methods(http.MethodGet)
  24. r.HandleFunc("/api/oauth/headless", proAuth.HandleHeadlessSSO)
  25. r.HandleFunc("/api/oauth/register/{regKey}", proAuth.RegisterHostSSO).Methods(http.MethodGet)
  26. // User Role Handlers
  27. r.HandleFunc("/api/v1/users/roles", logic.SecurityCheck(true, http.HandlerFunc(listRoles))).Methods(http.MethodGet)
  28. r.HandleFunc("/api/v1/users/role", logic.SecurityCheck(true, http.HandlerFunc(getRole))).Methods(http.MethodGet)
  29. r.HandleFunc("/api/v1/users/role", logic.SecurityCheck(true, http.HandlerFunc(createRole))).Methods(http.MethodPost)
  30. r.HandleFunc("/api/v1/users/role", logic.SecurityCheck(true, http.HandlerFunc(updateRole))).Methods(http.MethodPut)
  31. r.HandleFunc("/api/v1/users/role", logic.SecurityCheck(true, http.HandlerFunc(deleteRole))).Methods(http.MethodDelete)
  32. // User Group Handlers
  33. r.HandleFunc("/api/v1/users/groups", logic.SecurityCheck(true, http.HandlerFunc(listUserGroups))).Methods(http.MethodGet)
  34. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(getUserGroup))).Methods(http.MethodGet)
  35. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(createUserGroup))).Methods(http.MethodPost)
  36. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(updateUserGroup))).Methods(http.MethodPut)
  37. r.HandleFunc("/api/v1/users/group", logic.SecurityCheck(true, http.HandlerFunc(deleteUserGroup))).Methods(http.MethodDelete)
  38. // User Invite Handlers
  39. r.HandleFunc("/api/v1/users/invite", userInviteVerify).Methods(http.MethodGet)
  40. r.HandleFunc("/api/v1/users/invite-signup", userInviteSignUp).Methods(http.MethodPost)
  41. r.HandleFunc("/api/v1/users/invite", logic.SecurityCheck(true, http.HandlerFunc(inviteUsers))).Methods(http.MethodPost)
  42. r.HandleFunc("/api/v1/users/invites", logic.SecurityCheck(true, http.HandlerFunc(listUserInvites))).Methods(http.MethodGet)
  43. r.HandleFunc("/api/v1/users/invite", logic.SecurityCheck(true, http.HandlerFunc(deleteUserInvite))).Methods(http.MethodDelete)
  44. r.HandleFunc("/api/v1/users/invites", logic.SecurityCheck(true, http.HandlerFunc(deleteAllUserInvites))).Methods(http.MethodDelete)
  45. r.HandleFunc("/api/users_pending", logic.SecurityCheck(true, http.HandlerFunc(getPendingUsers))).Methods(http.MethodGet)
  46. r.HandleFunc("/api/users_pending", logic.SecurityCheck(true, http.HandlerFunc(deleteAllPendingUsers))).Methods(http.MethodDelete)
  47. r.HandleFunc("/api/users_pending/user/{username}", logic.SecurityCheck(true, http.HandlerFunc(deletePendingUser))).Methods(http.MethodDelete)
  48. r.HandleFunc("/api/users_pending/user/{username}", logic.SecurityCheck(true, http.HandlerFunc(approvePendingUser))).Methods(http.MethodPost)
  49. r.HandleFunc("/api/users/{username}/remote_access_gw/{remote_access_gateway_id}", logic.SecurityCheck(true, http.HandlerFunc(attachUserToRemoteAccessGw))).Methods(http.MethodPost)
  50. r.HandleFunc("/api/users/{username}/remote_access_gw/{remote_access_gateway_id}", logic.SecurityCheck(true, http.HandlerFunc(removeUserFromRemoteAccessGW))).Methods(http.MethodDelete)
  51. r.HandleFunc("/api/users/{username}/remote_access_gw", logic.SecurityCheck(false, logic.ContinueIfUserMatch(http.HandlerFunc(getUserRemoteAccessGwsV1)))).Methods(http.MethodGet)
  52. r.HandleFunc("/api/users/ingress/{ingress_id}", logic.SecurityCheck(true, http.HandlerFunc(ingressGatewayUsers))).Methods(http.MethodGet)
  53. }
  54. // swagger:route POST /api/v1/users/invite-signup user userInviteSignUp
  55. //
  56. // user signup via invite.
  57. //
  58. // Schemes: https
  59. //
  60. // Responses:
  61. // 200: ReturnSuccessResponse
  62. func userInviteSignUp(w http.ResponseWriter, r *http.Request) {
  63. email, _ := url.QueryUnescape(r.URL.Query().Get("email"))
  64. code, _ := url.QueryUnescape(r.URL.Query().Get("invite_code"))
  65. in, err := logic.GetUserInvite(email)
  66. if err != nil {
  67. logger.Log(0, "failed to fetch users: ", err.Error())
  68. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  69. return
  70. }
  71. if code != in.InviteCode {
  72. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("invalid invite code"), "badrequest"))
  73. return
  74. }
  75. // check if user already exists
  76. _, err = logic.GetUser(email)
  77. if err == nil {
  78. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("user already exists"), "badrequest"))
  79. return
  80. }
  81. var user models.User
  82. err = json.NewDecoder(r.Body).Decode(&user)
  83. if err != nil {
  84. logger.Log(0, user.UserName, "error decoding request body: ",
  85. err.Error())
  86. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  87. return
  88. }
  89. if user.UserName != email {
  90. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("username not matching with invite"), "badrequest"))
  91. return
  92. }
  93. if user.Password == "" {
  94. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("password cannot be empty"), "badrequest"))
  95. return
  96. }
  97. user.UserGroups = in.UserGroups
  98. user.PlatformRoleID = models.UserRoleID(in.PlatformRoleID)
  99. if user.PlatformRoleID == "" {
  100. user.PlatformRoleID = models.ServiceUser
  101. }
  102. user.NetworkRoles = in.NetworkRoles
  103. err = logic.CreateUser(&user)
  104. if err != nil {
  105. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  106. return
  107. }
  108. // delete invite
  109. logic.DeleteUserInvite(email)
  110. logic.DeletePendingUser(email)
  111. w.Header().Set("Access-Control-Allow-Origin", "*")
  112. logic.ReturnSuccessResponse(w, r, "created user successfully "+email)
  113. }
  114. // swagger:route GET /api/v1/users/invite user userInviteVerify
  115. //
  116. // verfies user invite.
  117. //
  118. // Schemes: https
  119. //
  120. // Responses:
  121. // 200: ReturnSuccessResponse
  122. func userInviteVerify(w http.ResponseWriter, r *http.Request) {
  123. email, _ := url.QueryUnescape(r.URL.Query().Get("email"))
  124. code, _ := url.QueryUnescape(r.URL.Query().Get("invite_code"))
  125. err := logic.ValidateAndApproveUserInvite(email, code)
  126. if err != nil {
  127. logger.Log(0, "failed to fetch users: ", err.Error())
  128. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  129. return
  130. }
  131. logic.ReturnSuccessResponse(w, r, "invite is valid")
  132. }
  133. // swagger:route POST /api/v1/users/invite user inviteUsers
  134. //
  135. // invite users.
  136. //
  137. // Schemes: https
  138. //
  139. // Security:
  140. // oauth
  141. //
  142. // Responses:
  143. // 200: userBodyResponse
  144. func inviteUsers(w http.ResponseWriter, r *http.Request) {
  145. var inviteReq models.InviteUsersReq
  146. err := json.NewDecoder(r.Body).Decode(&inviteReq)
  147. if err != nil {
  148. slog.Error("error decoding request body", "error",
  149. err.Error())
  150. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  151. return
  152. }
  153. callerUserName := r.Header.Get("user")
  154. caller, err := logic.GetUser(callerUserName)
  155. if err != nil {
  156. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "notfound"))
  157. return
  158. }
  159. if inviteReq.PlatformRoleID == models.SuperAdminRole.String() {
  160. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("super admin cannot be invited"), "badrequest"))
  161. return
  162. }
  163. if (inviteReq.PlatformRoleID == models.AdminRole.String() ||
  164. inviteReq.PlatformRoleID == models.SuperAdminRole.String()) && caller.PlatformRoleID != models.SuperAdminRole {
  165. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("only superadmin can invite admin users"), "forbidden"))
  166. return
  167. }
  168. //validate Req
  169. err = proLogic.IsGroupsValid(inviteReq.UserGroups)
  170. if err != nil {
  171. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  172. return
  173. }
  174. err = proLogic.IsNetworkRolesValid(inviteReq.NetworkRoles)
  175. if err != nil {
  176. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  177. return
  178. }
  179. // check platform role
  180. _, err = logic.GetRole(models.UserRoleID(inviteReq.PlatformRoleID))
  181. if err != nil {
  182. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  183. return
  184. }
  185. for _, inviteeEmail := range inviteReq.UserEmails {
  186. // check if user with email exists, then ignore
  187. _, err := logic.GetUser(inviteeEmail)
  188. if err == nil {
  189. // user exists already, so ignore
  190. continue
  191. }
  192. invite := models.UserInvite{
  193. Email: inviteeEmail,
  194. PlatformRoleID: inviteReq.PlatformRoleID,
  195. UserGroups: inviteReq.UserGroups,
  196. NetworkRoles: inviteReq.NetworkRoles,
  197. InviteCode: logic.RandomString(8),
  198. }
  199. u, err := url.Parse(fmt.Sprintf("%s/invite?email=%s&invite_code=%s",
  200. servercfg.GetFrontendURL(), url.QueryEscape(invite.Email), url.QueryEscape(invite.InviteCode)))
  201. if err != nil {
  202. slog.Error("failed to parse to invite url", "error", err)
  203. return
  204. }
  205. if servercfg.DeployedByOperator() {
  206. u, err = url.Parse(fmt.Sprintf("%s/invite?tenant_id=%s&email=%s&invite_code=%s",
  207. proLogic.GetAccountsHost(), url.QueryEscape(servercfg.GetNetmakerTenantID()), url.QueryEscape(invite.Email), url.QueryEscape(invite.InviteCode)))
  208. if err != nil {
  209. slog.Error("failed to parse to invite url", "error", err)
  210. return
  211. }
  212. }
  213. invite.InviteURL = u.String()
  214. err = logic.InsertUserInvite(invite)
  215. if err != nil {
  216. slog.Error("failed to insert invite for user", "email", invite.Email, "error", err)
  217. }
  218. // notify user with magic link
  219. go func(invite models.UserInvite) {
  220. // Set E-Mail body. You can set plain text or html with text/html
  221. e := email.UserInvitedMail{
  222. BodyBuilder: &email.EmailBodyBuilderWithH1HeadlineAndImage{},
  223. InviteURL: invite.InviteURL,
  224. }
  225. n := email.Notification{
  226. RecipientMail: invite.Email,
  227. }
  228. err = email.GetClient().SendEmail(context.Background(), n, e)
  229. if err != nil {
  230. slog.Error("failed to send email invite", "user", invite.Email, "error", err)
  231. }
  232. }(invite)
  233. }
  234. }
  235. // swagger:route GET /api/v1/users/invites user listUserInvites
  236. //
  237. // lists all pending invited users.
  238. //
  239. // Schemes: https
  240. //
  241. // Security:
  242. // oauth
  243. //
  244. // Responses:
  245. // 200: ReturnSuccessResponseWithJson
  246. func listUserInvites(w http.ResponseWriter, r *http.Request) {
  247. usersInvites, err := logic.ListUserInvites()
  248. if err != nil {
  249. logger.Log(0, "failed to fetch users: ", err.Error())
  250. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  251. return
  252. }
  253. logic.ReturnSuccessResponseWithJson(w, r, usersInvites, "fetched pending user invites")
  254. }
  255. // swagger:route DELETE /api/v1/users/invite user deleteUserInvite
  256. //
  257. // delete pending invite.
  258. //
  259. // Schemes: https
  260. //
  261. // Security:
  262. // oauth
  263. //
  264. // Responses:
  265. // 200: ReturnSuccessResponse
  266. func deleteUserInvite(w http.ResponseWriter, r *http.Request) {
  267. email, _ := url.QueryUnescape(r.URL.Query().Get("invitee_email"))
  268. err := logic.DeleteUserInvite(email)
  269. if err != nil {
  270. logger.Log(0, "failed to delete user invite: ", email, err.Error())
  271. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  272. return
  273. }
  274. logic.ReturnSuccessResponse(w, r, "deleted user invite")
  275. }
  276. // swagger:route DELETE /api/v1/users/invites user deleteAllUserInvites
  277. //
  278. // deletes all pending invites.
  279. //
  280. // Schemes: https
  281. //
  282. // Security:
  283. // oauth
  284. //
  285. // Responses:
  286. // 200: ReturnSuccessResponse
  287. func deleteAllUserInvites(w http.ResponseWriter, r *http.Request) {
  288. err := database.DeleteAllRecords(database.USER_INVITES_TABLE_NAME)
  289. if err != nil {
  290. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending user invites "+err.Error()), "internal"))
  291. return
  292. }
  293. logic.ReturnSuccessResponse(w, r, "cleared all pending user invites")
  294. }
  295. // swagger:route GET /api/v1/user/groups user listUserGroups
  296. //
  297. // Get all user groups.
  298. //
  299. // Schemes: https
  300. //
  301. // Security:
  302. // oauth
  303. //
  304. // Responses:
  305. // 200: userBodyResponse
  306. func listUserGroups(w http.ResponseWriter, r *http.Request) {
  307. groups, err := proLogic.ListUserGroups()
  308. if err != nil {
  309. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  310. Code: http.StatusInternalServerError,
  311. Message: err.Error(),
  312. })
  313. return
  314. }
  315. logic.ReturnSuccessResponseWithJson(w, r, groups, "successfully fetched user groups")
  316. }
  317. // swagger:route GET /api/v1/user/group user getUserGroup
  318. //
  319. // Get user group.
  320. //
  321. // Schemes: https
  322. //
  323. // Security:
  324. // oauth
  325. //
  326. // Responses:
  327. // 200: userBodyResponse
  328. func getUserGroup(w http.ResponseWriter, r *http.Request) {
  329. gid, _ := url.QueryUnescape(r.URL.Query().Get("group_id"))
  330. if gid == "" {
  331. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("group id is required"), "badrequest"))
  332. return
  333. }
  334. group, err := proLogic.GetUserGroup(models.UserGroupID(gid))
  335. if err != nil {
  336. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  337. Code: http.StatusInternalServerError,
  338. Message: err.Error(),
  339. })
  340. return
  341. }
  342. logic.ReturnSuccessResponseWithJson(w, r, group, "successfully fetched user group")
  343. }
  344. // swagger:route POST /api/v1/user/group user createUserGroup
  345. //
  346. // Create user groups.
  347. //
  348. // Schemes: https
  349. //
  350. // Security:
  351. // oauth
  352. //
  353. // Responses:
  354. // 200: userBodyResponse
  355. func createUserGroup(w http.ResponseWriter, r *http.Request) {
  356. var userGroupReq models.CreateGroupReq
  357. err := json.NewDecoder(r.Body).Decode(&userGroupReq)
  358. if err != nil {
  359. slog.Error("error decoding request body", "error",
  360. err.Error())
  361. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  362. return
  363. }
  364. err = proLogic.ValidateCreateGroupReq(userGroupReq.Group)
  365. if err != nil {
  366. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  367. return
  368. }
  369. err = proLogic.CreateUserGroup(userGroupReq.Group)
  370. if err != nil {
  371. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  372. return
  373. }
  374. for _, userID := range userGroupReq.Members {
  375. user, err := logic.GetUser(userID)
  376. if err != nil {
  377. continue
  378. }
  379. if len(user.UserGroups) == 0 {
  380. user.UserGroups = make(map[models.UserGroupID]struct{})
  381. }
  382. user.UserGroups[userGroupReq.Group.ID] = struct{}{}
  383. logic.UpsertUser(*user)
  384. }
  385. logic.ReturnSuccessResponseWithJson(w, r, userGroupReq.Group, "created user group")
  386. }
  387. // swagger:route PUT /api/v1/user/group user updateUserGroup
  388. //
  389. // Update user group.
  390. //
  391. // Schemes: https
  392. //
  393. // Security:
  394. // oauth
  395. //
  396. // Responses:
  397. // 200: userBodyResponse
  398. func updateUserGroup(w http.ResponseWriter, r *http.Request) {
  399. var userGroup models.UserGroup
  400. err := json.NewDecoder(r.Body).Decode(&userGroup)
  401. if err != nil {
  402. slog.Error("error decoding request body", "error",
  403. err.Error())
  404. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  405. return
  406. }
  407. err = proLogic.ValidateUpdateGroupReq(userGroup)
  408. if err != nil {
  409. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  410. return
  411. }
  412. err = proLogic.UpdateUserGroup(userGroup)
  413. if err != nil {
  414. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  415. return
  416. }
  417. logic.ReturnSuccessResponseWithJson(w, r, userGroup, "updated user group")
  418. }
  419. // swagger:route DELETE /api/v1/user/group user deleteUserGroup
  420. //
  421. // delete user group.
  422. //
  423. // Schemes: https
  424. //
  425. // Security:
  426. // oauth
  427. //
  428. // Responses:
  429. // 200: userBodyResponse
  430. func deleteUserGroup(w http.ResponseWriter, r *http.Request) {
  431. gid, _ := url.QueryUnescape(r.URL.Query().Get("group_id"))
  432. if gid == "" {
  433. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("role is required"), "badrequest"))
  434. return
  435. }
  436. err := proLogic.DeleteUserGroup(models.UserGroupID(gid))
  437. if err != nil {
  438. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  439. return
  440. }
  441. logic.ReturnSuccessResponseWithJson(w, r, nil, "deleted user group")
  442. }
  443. // swagger:route GET /api/v1/user/roles user listRoles
  444. //
  445. // lists all user roles.
  446. //
  447. // Schemes: https
  448. //
  449. // Security:
  450. // oauth
  451. //
  452. // Responses:
  453. // 200: userBodyResponse
  454. func listRoles(w http.ResponseWriter, r *http.Request) {
  455. platform, _ := url.QueryUnescape(r.URL.Query().Get("platform"))
  456. var roles []models.UserRolePermissionTemplate
  457. var err error
  458. if platform == "true" {
  459. roles, err = proLogic.ListPlatformRoles()
  460. } else {
  461. roles, err = proLogic.ListNetworkRoles()
  462. }
  463. if err != nil {
  464. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  465. Code: http.StatusInternalServerError,
  466. Message: err.Error(),
  467. })
  468. return
  469. }
  470. logic.ReturnSuccessResponseWithJson(w, r, roles, "successfully fetched user roles permission templates")
  471. }
  472. // swagger:route GET /api/v1/user/role user getRole
  473. //
  474. // Get user role permission templates.
  475. //
  476. // Schemes: https
  477. //
  478. // Security:
  479. // oauth
  480. //
  481. // Responses:
  482. // 200: userBodyResponse
  483. func getRole(w http.ResponseWriter, r *http.Request) {
  484. rid, _ := url.QueryUnescape(r.URL.Query().Get("role_id"))
  485. if rid == "" {
  486. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("role is required"), "badrequest"))
  487. return
  488. }
  489. role, err := logic.GetRole(models.UserRoleID(rid))
  490. if err != nil {
  491. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  492. Code: http.StatusInternalServerError,
  493. Message: err.Error(),
  494. })
  495. return
  496. }
  497. logic.ReturnSuccessResponseWithJson(w, r, role, "successfully fetched user role permission templates")
  498. }
  499. // swagger:route POST /api/v1/user/role user createRole
  500. //
  501. // Create user role permission template.
  502. //
  503. // Schemes: https
  504. //
  505. // Security:
  506. // oauth
  507. //
  508. // Responses:
  509. // 200: userBodyResponse
  510. func createRole(w http.ResponseWriter, r *http.Request) {
  511. var userRole models.UserRolePermissionTemplate
  512. err := json.NewDecoder(r.Body).Decode(&userRole)
  513. if err != nil {
  514. slog.Error("error decoding request body", "error",
  515. err.Error())
  516. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  517. return
  518. }
  519. err = proLogic.ValidateCreateRoleReq(&userRole)
  520. if err != nil {
  521. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  522. return
  523. }
  524. userRole.Default = false
  525. userRole.GlobalLevelAccess = make(map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope)
  526. err = proLogic.CreateRole(userRole)
  527. if err != nil {
  528. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  529. return
  530. }
  531. logic.ReturnSuccessResponseWithJson(w, r, userRole, "created user role")
  532. }
  533. // swagger:route PUT /api/v1/user/role user updateRole
  534. //
  535. // Update user role permission template.
  536. //
  537. // Schemes: https
  538. //
  539. // Security:
  540. // oauth
  541. //
  542. // Responses:
  543. // 200: userBodyResponse
  544. func updateRole(w http.ResponseWriter, r *http.Request) {
  545. var userRole models.UserRolePermissionTemplate
  546. err := json.NewDecoder(r.Body).Decode(&userRole)
  547. if err != nil {
  548. slog.Error("error decoding request body", "error",
  549. err.Error())
  550. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  551. return
  552. }
  553. err = proLogic.ValidateUpdateRoleReq(&userRole)
  554. if err != nil {
  555. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  556. return
  557. }
  558. userRole.GlobalLevelAccess = make(map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope)
  559. err = proLogic.UpdateRole(userRole)
  560. if err != nil {
  561. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  562. return
  563. }
  564. logic.ReturnSuccessResponseWithJson(w, r, userRole, "updated user role")
  565. }
  566. // swagger:route DELETE /api/v1/user/role user deleteRole
  567. //
  568. // Delete user role permission template.
  569. //
  570. // Schemes: https
  571. //
  572. // Security:
  573. // oauth
  574. //
  575. // Responses:
  576. // 200: userBodyResponse
  577. func deleteRole(w http.ResponseWriter, r *http.Request) {
  578. rid, _ := url.QueryUnescape(r.URL.Query().Get("role_id"))
  579. if rid == "" {
  580. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("role is required"), "badrequest"))
  581. return
  582. }
  583. err := proLogic.DeleteRole(models.UserRoleID(rid), false)
  584. if err != nil {
  585. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  586. return
  587. }
  588. logic.ReturnSuccessResponseWithJson(w, r, nil, "created user role")
  589. }
  590. // @Summary Attach user to a remote access gateway
  591. // @Router /api/users/{username}/remote_access_gw/{remote_access_gateway_id} [post]
  592. // @Tags PRO
  593. // @Accept json
  594. // @Produce json
  595. // @Param username path string true "Username"
  596. // @Param remote_access_gateway_id path string true "Remote Access Gateway ID"
  597. // @Success 200 {object} models.ReturnUser
  598. // @Failure 400 {object} models.ErrorResponse
  599. // @Failure 500 {object} models.ErrorResponse
  600. func attachUserToRemoteAccessGw(w http.ResponseWriter, r *http.Request) {
  601. // set header.
  602. w.Header().Set("Content-Type", "application/json")
  603. var params = mux.Vars(r)
  604. username := params["username"]
  605. remoteGwID := params["remote_access_gateway_id"]
  606. if username == "" || remoteGwID == "" {
  607. logic.ReturnErrorResponse(
  608. w,
  609. r,
  610. logic.FormatError(
  611. errors.New("required params `username` and `remote_access_gateway_id`"),
  612. "badrequest",
  613. ),
  614. )
  615. return
  616. }
  617. user, err := logic.GetUser(username)
  618. if err != nil {
  619. slog.Error("failed to fetch user: ", "username", username, "error", err.Error())
  620. logic.ReturnErrorResponse(
  621. w,
  622. r,
  623. logic.FormatError(
  624. fmt.Errorf("failed to fetch user %s, error: %v", username, err),
  625. "badrequest",
  626. ),
  627. )
  628. return
  629. }
  630. if user.PlatformRoleID == models.AdminRole || user.PlatformRoleID == models.SuperAdminRole {
  631. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("superadmins/admins have access to all gateways"), "badrequest"))
  632. return
  633. }
  634. node, err := logic.GetNodeByID(remoteGwID)
  635. if err != nil {
  636. slog.Error("failed to fetch gateway node", "nodeID", remoteGwID, "error", err)
  637. logic.ReturnErrorResponse(
  638. w,
  639. r,
  640. logic.FormatError(
  641. fmt.Errorf("failed to fetch remote access gateway node, error: %v", err),
  642. "badrequest",
  643. ),
  644. )
  645. return
  646. }
  647. if !node.IsIngressGateway {
  648. logic.ReturnErrorResponse(
  649. w,
  650. r,
  651. logic.FormatError(fmt.Errorf("node is not a remote access gateway"), "badrequest"),
  652. )
  653. return
  654. }
  655. if user.RemoteGwIDs == nil {
  656. user.RemoteGwIDs = make(map[string]struct{})
  657. }
  658. user.RemoteGwIDs[node.ID.String()] = struct{}{}
  659. err = logic.UpsertUser(*user)
  660. if err != nil {
  661. slog.Error("failed to update user's gateways", "user", username, "error", err)
  662. logic.ReturnErrorResponse(
  663. w,
  664. r,
  665. logic.FormatError(
  666. fmt.Errorf("failed to fetch remote access gateway node,error: %v", err),
  667. "badrequest",
  668. ),
  669. )
  670. return
  671. }
  672. json.NewEncoder(w).Encode(logic.ToReturnUser(*user))
  673. }
  674. // @Summary Remove user from a remote access gateway
  675. // @Router /api/users/{username}/remote_access_gw/{remote_access_gateway_id} [delete]
  676. // @Tags PRO
  677. // @Accept json
  678. // @Produce json
  679. // @Param username path string true "Username"
  680. // @Param remote_access_gateway_id path string true "Remote Access Gateway ID"
  681. // @Success 200 {object} models.ReturnUser
  682. // @Failure 400 {object} models.ErrorResponse
  683. // @Failure 500 {object} models.ErrorResponse
  684. func removeUserFromRemoteAccessGW(w http.ResponseWriter, r *http.Request) {
  685. // set header.
  686. w.Header().Set("Content-Type", "application/json")
  687. var params = mux.Vars(r)
  688. username := params["username"]
  689. remoteGwID := params["remote_access_gateway_id"]
  690. if username == "" || remoteGwID == "" {
  691. logic.ReturnErrorResponse(
  692. w,
  693. r,
  694. logic.FormatError(
  695. errors.New("required params `username` and `remote_access_gateway_id`"),
  696. "badrequest",
  697. ),
  698. )
  699. return
  700. }
  701. user, err := logic.GetUser(username)
  702. if err != nil {
  703. logger.Log(0, username, "failed to fetch user: ", err.Error())
  704. logic.ReturnErrorResponse(
  705. w,
  706. r,
  707. logic.FormatError(
  708. fmt.Errorf("failed to fetch user %s, error: %v", username, err),
  709. "badrequest",
  710. ),
  711. )
  712. return
  713. }
  714. delete(user.RemoteGwIDs, remoteGwID)
  715. go func(user models.User, remoteGwID string) {
  716. extclients, err := logic.GetAllExtClients()
  717. if err != nil {
  718. slog.Error("failed to fetch extclients", "error", err)
  719. return
  720. }
  721. for _, extclient := range extclients {
  722. if extclient.OwnerID == user.UserName && remoteGwID == extclient.IngressGatewayID {
  723. err = logic.DeleteExtClientAndCleanup(extclient)
  724. if err != nil {
  725. slog.Error("failed to delete extclient",
  726. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  727. } else {
  728. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  729. slog.Error("error setting ext peers: " + err.Error())
  730. }
  731. }
  732. }
  733. }
  734. if servercfg.IsDNSMode() {
  735. logic.SetDNS()
  736. }
  737. }(*user, remoteGwID)
  738. err = logic.UpsertUser(*user)
  739. if err != nil {
  740. slog.Error("failed to update user gateways", "user", username, "error", err)
  741. logic.ReturnErrorResponse(
  742. w,
  743. r,
  744. logic.FormatError(
  745. errors.New("failed to fetch remote access gaetway node "+err.Error()),
  746. "badrequest",
  747. ),
  748. )
  749. return
  750. }
  751. json.NewEncoder(w).Encode(logic.ToReturnUser(*user))
  752. }
  753. func getUserRemoteAccessGwsV1(w http.ResponseWriter, r *http.Request) {
  754. // set header.
  755. w.Header().Set("Content-Type", "application/json")
  756. logger.Log(0, "------------> 1. getUserRemoteAccessGwsV1")
  757. var params = mux.Vars(r)
  758. username := params["username"]
  759. if username == "" {
  760. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("required params username"), "badrequest"))
  761. return
  762. }
  763. logger.Log(0, "------------> 2. getUserRemoteAccessGwsV1")
  764. user, err := logic.GetUser(username)
  765. if err != nil {
  766. logger.Log(0, username, "failed to fetch user: ", err.Error())
  767. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to fetch user %s, error: %v", username, err), "badrequest"))
  768. return
  769. }
  770. logger.Log(0, "------------> 3. getUserRemoteAccessGwsV1")
  771. remoteAccessClientID := r.URL.Query().Get("remote_access_clientid")
  772. var req models.UserRemoteGwsReq
  773. if remoteAccessClientID == "" {
  774. err := json.NewDecoder(r.Body).Decode(&req)
  775. if err != nil {
  776. slog.Error("error decoding request body: ", "error", err)
  777. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  778. return
  779. }
  780. }
  781. logger.Log(0, "------------> 4. getUserRemoteAccessGwsV1")
  782. reqFromMobile := r.URL.Query().Get("from_mobile") == "true"
  783. if req.RemoteAccessClientID == "" && remoteAccessClientID == "" {
  784. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("remote access client id cannot be empty"), "badrequest"))
  785. return
  786. }
  787. if req.RemoteAccessClientID == "" {
  788. req.RemoteAccessClientID = remoteAccessClientID
  789. }
  790. userGws := make(map[string][]models.UserRemoteGws)
  791. logger.Log(0, "------------> 5. getUserRemoteAccessGwsV1")
  792. allextClients, err := logic.GetAllExtClients()
  793. if err != nil {
  794. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  795. return
  796. }
  797. logger.Log(0, "------------> 6. getUserRemoteAccessGwsV1")
  798. userGwNodes := proLogic.GetUserRAGNodes(*user)
  799. logger.Log(0, fmt.Sprintf("1. User Gw Nodes: %+v", userGwNodes))
  800. for _, extClient := range allextClients {
  801. node, ok := userGwNodes[extClient.IngressGatewayID]
  802. if !ok {
  803. continue
  804. }
  805. if extClient.RemoteAccessClientID == req.RemoteAccessClientID && extClient.OwnerID == username {
  806. host, err := logic.GetHost(node.HostID.String())
  807. if err != nil {
  808. continue
  809. }
  810. network, err := logic.GetNetwork(node.Network)
  811. if err != nil {
  812. slog.Error("failed to get node network", "error", err)
  813. }
  814. gws := userGws[node.Network]
  815. extClient.AllowedIPs = logic.GetExtclientAllowedIPs(extClient)
  816. gws = append(gws, models.UserRemoteGws{
  817. GwID: node.ID.String(),
  818. GWName: host.Name,
  819. Network: node.Network,
  820. GwClient: extClient,
  821. Connected: true,
  822. IsInternetGateway: node.IsInternetGateway,
  823. GwPeerPublicKey: host.PublicKey.String(),
  824. GwListenPort: logic.GetPeerListenPort(host),
  825. Metadata: node.Metadata,
  826. AllowedEndpoints: getAllowedRagEndpoints(&node, host),
  827. NetworkAddresses: []string{network.AddressRange, network.AddressRange6},
  828. })
  829. userGws[node.Network] = gws
  830. delete(userGwNodes, node.ID.String())
  831. }
  832. }
  833. logger.Log(0, fmt.Sprintf("2. User Gw Nodes: %+v", userGwNodes))
  834. // add remaining gw nodes to resp
  835. for gwID := range userGwNodes {
  836. logger.Log(0, "RAG ---> 1")
  837. node, err := logic.GetNodeByID(gwID)
  838. if err != nil {
  839. continue
  840. }
  841. if !node.IsIngressGateway {
  842. continue
  843. }
  844. if node.PendingDelete {
  845. continue
  846. }
  847. logger.Log(0, "RAG ---> 2")
  848. host, err := logic.GetHost(node.HostID.String())
  849. if err != nil {
  850. continue
  851. }
  852. network, err := logic.GetNetwork(node.Network)
  853. if err != nil {
  854. slog.Error("failed to get node network", "error", err)
  855. }
  856. logger.Log(0, "RAG ---> 3")
  857. gws := userGws[node.Network]
  858. gws = append(gws, models.UserRemoteGws{
  859. GwID: node.ID.String(),
  860. GWName: host.Name,
  861. Network: node.Network,
  862. IsInternetGateway: node.IsInternetGateway,
  863. GwPeerPublicKey: host.PublicKey.String(),
  864. GwListenPort: logic.GetPeerListenPort(host),
  865. Metadata: node.Metadata,
  866. AllowedEndpoints: getAllowedRagEndpoints(&node, host),
  867. NetworkAddresses: []string{network.AddressRange, network.AddressRange6},
  868. })
  869. userGws[node.Network] = gws
  870. }
  871. if reqFromMobile {
  872. // send resp in array format
  873. userGwsArr := []models.UserRemoteGws{}
  874. for _, userGwI := range userGws {
  875. userGwsArr = append(userGwsArr, userGwI...)
  876. }
  877. logic.ReturnSuccessResponseWithJson(w, r, userGwsArr, "fetched gateways for user"+username)
  878. return
  879. }
  880. slog.Debug("returned user gws", "user", username, "gws", userGws)
  881. w.WriteHeader(http.StatusOK)
  882. json.NewEncoder(w).Encode(userGws)
  883. }
  884. // swagger:route GET "/api/users/{username}/remote_access_gw" nodes getUserRemoteAccessGws
  885. //
  886. // Get an individual node.
  887. //
  888. // Schemes: https
  889. //
  890. // Security:
  891. // oauth
  892. //
  893. // Responses:
  894. // 200: nodeResponse
  895. func getUserRemoteAccessGws(w http.ResponseWriter, r *http.Request) {
  896. // set header.
  897. w.Header().Set("Content-Type", "application/json")
  898. var params = mux.Vars(r)
  899. username := params["username"]
  900. if username == "" {
  901. logic.ReturnErrorResponse(
  902. w,
  903. r,
  904. logic.FormatError(errors.New("required params username"), "badrequest"),
  905. )
  906. return
  907. }
  908. remoteAccessClientID := r.URL.Query().Get("remote_access_clientid")
  909. var req models.UserRemoteGwsReq
  910. if remoteAccessClientID == "" {
  911. err := json.NewDecoder(r.Body).Decode(&req)
  912. if err != nil {
  913. slog.Error("error decoding request body: ", "error", err)
  914. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  915. return
  916. }
  917. }
  918. reqFromMobile := r.URL.Query().Get("from_mobile") == "true"
  919. if req.RemoteAccessClientID == "" && remoteAccessClientID == "" {
  920. logic.ReturnErrorResponse(
  921. w,
  922. r,
  923. logic.FormatError(errors.New("remote access client id cannot be empty"), "badrequest"),
  924. )
  925. return
  926. }
  927. if req.RemoteAccessClientID == "" {
  928. req.RemoteAccessClientID = remoteAccessClientID
  929. }
  930. userGws := make(map[string][]models.UserRemoteGws)
  931. user, err := logic.GetUser(username)
  932. if err != nil {
  933. logger.Log(0, username, "failed to fetch user: ", err.Error())
  934. logic.ReturnErrorResponse(
  935. w,
  936. r,
  937. logic.FormatError(
  938. fmt.Errorf("failed to fetch user %s, error: %v", username, err),
  939. "badrequest",
  940. ),
  941. )
  942. return
  943. }
  944. allextClients, err := logic.GetAllExtClients()
  945. if err != nil {
  946. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  947. return
  948. }
  949. processedAdminNodeIds := make(map[string]struct{})
  950. for _, extClient := range allextClients {
  951. if extClient.RemoteAccessClientID == req.RemoteAccessClientID &&
  952. extClient.OwnerID == username {
  953. node, err := logic.GetNodeByID(extClient.IngressGatewayID)
  954. if err != nil {
  955. continue
  956. }
  957. if node.PendingDelete {
  958. continue
  959. }
  960. if !node.IsIngressGateway {
  961. continue
  962. }
  963. host, err := logic.GetHost(node.HostID.String())
  964. if err != nil {
  965. continue
  966. }
  967. network, err := logic.GetNetwork(node.Network)
  968. if err != nil {
  969. slog.Error("failed to get node network", "error", err)
  970. }
  971. if _, ok := user.RemoteGwIDs[node.ID.String()]; (user.PlatformRoleID != models.AdminRole && user.PlatformRoleID != models.SuperAdminRole) && ok {
  972. gws := userGws[node.Network]
  973. extClient.AllowedIPs = logic.GetExtclientAllowedIPs(extClient)
  974. gws = append(gws, models.UserRemoteGws{
  975. GwID: node.ID.String(),
  976. GWName: host.Name,
  977. Network: node.Network,
  978. GwClient: extClient,
  979. Connected: true,
  980. IsInternetGateway: node.IsInternetGateway,
  981. GwPeerPublicKey: host.PublicKey.String(),
  982. GwListenPort: logic.GetPeerListenPort(host),
  983. Metadata: node.Metadata,
  984. AllowedEndpoints: getAllowedRagEndpoints(&node, host),
  985. NetworkAddresses: []string{network.AddressRange, network.AddressRange6},
  986. })
  987. userGws[node.Network] = gws
  988. delete(user.RemoteGwIDs, node.ID.String())
  989. } else {
  990. gws := userGws[node.Network]
  991. extClient.AllowedIPs = logic.GetExtclientAllowedIPs(extClient)
  992. gws = append(gws, models.UserRemoteGws{
  993. GwID: node.ID.String(),
  994. GWName: host.Name,
  995. Network: node.Network,
  996. GwClient: extClient,
  997. Connected: true,
  998. IsInternetGateway: node.IsInternetGateway,
  999. GwPeerPublicKey: host.PublicKey.String(),
  1000. GwListenPort: logic.GetPeerListenPort(host),
  1001. Metadata: node.Metadata,
  1002. AllowedEndpoints: getAllowedRagEndpoints(&node, host),
  1003. NetworkAddresses: []string{network.AddressRange, network.AddressRange6},
  1004. })
  1005. userGws[node.Network] = gws
  1006. processedAdminNodeIds[node.ID.String()] = struct{}{}
  1007. }
  1008. }
  1009. }
  1010. // add remaining gw nodes to resp
  1011. if user.PlatformRoleID != models.AdminRole && user.PlatformRoleID != models.SuperAdminRole {
  1012. for gwID := range user.RemoteGwIDs {
  1013. node, err := logic.GetNodeByID(gwID)
  1014. if err != nil {
  1015. continue
  1016. }
  1017. if !node.IsIngressGateway {
  1018. continue
  1019. }
  1020. if node.PendingDelete {
  1021. continue
  1022. }
  1023. host, err := logic.GetHost(node.HostID.String())
  1024. if err != nil {
  1025. continue
  1026. }
  1027. network, err := logic.GetNetwork(node.Network)
  1028. if err != nil {
  1029. slog.Error("failed to get node network", "error", err)
  1030. }
  1031. gws := userGws[node.Network]
  1032. gws = append(gws, models.UserRemoteGws{
  1033. GwID: node.ID.String(),
  1034. GWName: host.Name,
  1035. Network: node.Network,
  1036. IsInternetGateway: node.IsInternetGateway,
  1037. GwPeerPublicKey: host.PublicKey.String(),
  1038. GwListenPort: logic.GetPeerListenPort(host),
  1039. Metadata: node.Metadata,
  1040. AllowedEndpoints: getAllowedRagEndpoints(&node, host),
  1041. NetworkAddresses: []string{network.AddressRange, network.AddressRange6},
  1042. })
  1043. userGws[node.Network] = gws
  1044. }
  1045. } else {
  1046. allNodes, err := logic.GetAllNodes()
  1047. if err != nil {
  1048. slog.Error("failed to fetch all nodes", "error", err)
  1049. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1050. return
  1051. }
  1052. for _, node := range allNodes {
  1053. _, ok := processedAdminNodeIds[node.ID.String()]
  1054. if node.IsIngressGateway && !node.PendingDelete && !ok {
  1055. host, err := logic.GetHost(node.HostID.String())
  1056. if err != nil {
  1057. slog.Error("failed to fetch host", "error", err)
  1058. continue
  1059. }
  1060. network, err := logic.GetNetwork(node.Network)
  1061. if err != nil {
  1062. slog.Error("failed to get node network", "error", err)
  1063. }
  1064. gws := userGws[node.Network]
  1065. gws = append(gws, models.UserRemoteGws{
  1066. GwID: node.ID.String(),
  1067. GWName: host.Name,
  1068. Network: node.Network,
  1069. IsInternetGateway: node.IsInternetGateway,
  1070. GwPeerPublicKey: host.PublicKey.String(),
  1071. GwListenPort: logic.GetPeerListenPort(host),
  1072. Metadata: node.Metadata,
  1073. AllowedEndpoints: getAllowedRagEndpoints(&node, host),
  1074. NetworkAddresses: []string{network.AddressRange, network.AddressRange6},
  1075. })
  1076. userGws[node.Network] = gws
  1077. }
  1078. }
  1079. }
  1080. if reqFromMobile {
  1081. // send resp in array format
  1082. userGwsArr := []models.UserRemoteGws{}
  1083. for _, userGwI := range userGws {
  1084. userGwsArr = append(userGwsArr, userGwI...)
  1085. }
  1086. logic.ReturnSuccessResponseWithJson(w, r, userGwsArr, "fetched gateways for user"+username)
  1087. return
  1088. }
  1089. slog.Debug("returned user gws", "user", username, "gws", userGws)
  1090. w.WriteHeader(http.StatusOK)
  1091. json.NewEncoder(w).Encode(userGws)
  1092. }
  1093. // @Summary List users attached to an remote access gateway
  1094. // @Router /api/nodes/{network}/{nodeid}/ingress/users [get]
  1095. // @Tags PRO
  1096. // @Accept json
  1097. // @Produce json
  1098. // @Param ingress_id path string true "Ingress Gateway ID"
  1099. // @Success 200 {array} models.IngressGwUsers
  1100. // @Failure 400 {object} models.ErrorResponse
  1101. // @Failure 500 {object} models.ErrorResponse
  1102. func ingressGatewayUsers(w http.ResponseWriter, r *http.Request) {
  1103. w.Header().Set("Content-Type", "application/json")
  1104. var params = mux.Vars(r)
  1105. ingressID := params["ingress_id"]
  1106. node, err := logic.GetNodeByID(ingressID)
  1107. if err != nil {
  1108. slog.Error("failed to get ingress node", "error", err)
  1109. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  1110. return
  1111. }
  1112. gwUsers, err := logic.GetIngressGwUsers(node)
  1113. if err != nil {
  1114. slog.Error(
  1115. "failed to get users on ingress gateway",
  1116. "nodeid",
  1117. ingressID,
  1118. "network",
  1119. node.Network,
  1120. "user",
  1121. r.Header.Get("user"),
  1122. "error",
  1123. err,
  1124. )
  1125. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1126. return
  1127. }
  1128. w.WriteHeader(http.StatusOK)
  1129. json.NewEncoder(w).Encode(gwUsers)
  1130. }
  1131. func getAllowedRagEndpoints(ragNode *models.Node, ragHost *models.Host) []string {
  1132. endpoints := []string{}
  1133. if len(ragHost.EndpointIP) > 0 {
  1134. endpoints = append(endpoints, ragHost.EndpointIP.String())
  1135. }
  1136. if len(ragHost.EndpointIPv6) > 0 {
  1137. endpoints = append(endpoints, ragHost.EndpointIPv6.String())
  1138. }
  1139. if servercfg.IsPro {
  1140. for _, ip := range ragNode.AdditionalRagIps {
  1141. endpoints = append(endpoints, ip.String())
  1142. }
  1143. }
  1144. return endpoints
  1145. }
  1146. // @Summary Get all pending users
  1147. // @Router /api/users_pending [get]
  1148. // @Tags Users
  1149. // @Success 200 {array} models.User
  1150. // @Failure 500 {object} models.ErrorResponse
  1151. func getPendingUsers(w http.ResponseWriter, r *http.Request) {
  1152. // set header.
  1153. w.Header().Set("Content-Type", "application/json")
  1154. users, err := logic.ListPendingUsers()
  1155. if err != nil {
  1156. logger.Log(0, "failed to fetch users: ", err.Error())
  1157. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1158. return
  1159. }
  1160. logic.SortUsers(users[:])
  1161. logger.Log(2, r.Header.Get("user"), "fetched pending users")
  1162. json.NewEncoder(w).Encode(users)
  1163. }
  1164. // @Summary Approve a pending user
  1165. // @Router /api/users_pending/user/{username} [post]
  1166. // @Tags Users
  1167. // @Param username path string true "Username of the pending user to approve"
  1168. // @Success 200 {string} string
  1169. // @Failure 500 {object} models.ErrorResponse
  1170. func approvePendingUser(w http.ResponseWriter, r *http.Request) {
  1171. // set header.
  1172. w.Header().Set("Content-Type", "application/json")
  1173. var params = mux.Vars(r)
  1174. username := params["username"]
  1175. users, err := logic.ListPendingUsers()
  1176. if err != nil {
  1177. logger.Log(0, "failed to fetch users: ", err.Error())
  1178. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1179. return
  1180. }
  1181. for _, user := range users {
  1182. if user.UserName == username {
  1183. var newPass, fetchErr = logic.FetchPassValue("")
  1184. if fetchErr != nil {
  1185. logic.ReturnErrorResponse(w, r, logic.FormatError(fetchErr, "internal"))
  1186. return
  1187. }
  1188. if err = logic.CreateUser(&models.User{
  1189. UserName: user.UserName,
  1190. Password: newPass,
  1191. PlatformRoleID: models.ServiceUser,
  1192. }); err != nil {
  1193. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to create user: %s", err), "internal"))
  1194. return
  1195. }
  1196. err = logic.DeletePendingUser(username)
  1197. if err != nil {
  1198. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  1199. return
  1200. }
  1201. break
  1202. }
  1203. }
  1204. logic.ReturnSuccessResponse(w, r, "approved "+username)
  1205. }
  1206. // @Summary Delete a pending user
  1207. // @Router /api/users_pending/user/{username} [delete]
  1208. // @Tags Users
  1209. // @Param username path string true "Username of the pending user to delete"
  1210. // @Success 200 {string} string
  1211. // @Failure 500 {object} models.ErrorResponse
  1212. func deletePendingUser(w http.ResponseWriter, r *http.Request) {
  1213. // set header.
  1214. w.Header().Set("Content-Type", "application/json")
  1215. var params = mux.Vars(r)
  1216. username := params["username"]
  1217. users, err := logic.ListPendingUsers()
  1218. if err != nil {
  1219. logger.Log(0, "failed to fetch users: ", err.Error())
  1220. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  1221. return
  1222. }
  1223. for _, user := range users {
  1224. if user.UserName == username {
  1225. err = logic.DeletePendingUser(username)
  1226. if err != nil {
  1227. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete pending user: %s", err), "internal"))
  1228. return
  1229. }
  1230. break
  1231. }
  1232. }
  1233. logic.ReturnSuccessResponse(w, r, "deleted pending "+username)
  1234. }
  1235. // @Summary Delete all pending users
  1236. // @Router /api/users_pending [delete]
  1237. // @Tags Users
  1238. // @Success 200 {string} string
  1239. // @Failure 500 {object} models.ErrorResponse
  1240. func deleteAllPendingUsers(w http.ResponseWriter, r *http.Request) {
  1241. // set header.
  1242. err := database.DeleteAllRecords(database.PENDING_USERS_TABLE_NAME)
  1243. if err != nil {
  1244. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("failed to delete all pending users "+err.Error()), "internal"))
  1245. return
  1246. }
  1247. logic.ReturnSuccessResponse(w, r, "cleared all pending users")
  1248. }