user_mgmt.go 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "time"
  7. "github.com/gravitl/netmaker/database"
  8. "github.com/gravitl/netmaker/logger"
  9. "github.com/gravitl/netmaker/logic"
  10. "github.com/gravitl/netmaker/models"
  11. "github.com/gravitl/netmaker/mq"
  12. "github.com/gravitl/netmaker/servercfg"
  13. "golang.org/x/exp/slog"
  14. )
  15. var ServiceUserPermissionTemplate = models.UserRolePermissionTemplate{
  16. ID: models.ServiceUser,
  17. Default: true,
  18. FullAccess: false,
  19. DenyDashboardAccess: true,
  20. }
  21. var PlatformUserUserPermissionTemplate = models.UserRolePermissionTemplate{
  22. ID: models.PlatformUser,
  23. Default: true,
  24. FullAccess: false,
  25. }
  26. var NetworkAdminAllPermissionTemplate = models.UserRolePermissionTemplate{
  27. ID: models.UserRoleID(fmt.Sprintf("global-%s", models.NetworkAdmin)),
  28. Default: true,
  29. FullAccess: true,
  30. NetworkID: models.AllNetworks,
  31. }
  32. var NetworkUserAllPermissionTemplate = models.UserRolePermissionTemplate{
  33. ID: models.UserRoleID(fmt.Sprintf("global-%s", models.NetworkUser)),
  34. Default: true,
  35. FullAccess: false,
  36. NetworkID: models.AllNetworks,
  37. NetworkLevelAccess: map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope{
  38. models.RemoteAccessGwRsrc: {
  39. models.AllRemoteAccessGwRsrcID: models.RsrcPermissionScope{
  40. Read: true,
  41. VPNaccess: true,
  42. },
  43. },
  44. models.ExtClientsRsrc: {
  45. models.AllExtClientsRsrcID: models.RsrcPermissionScope{
  46. Read: true,
  47. Create: true,
  48. Update: true,
  49. Delete: true,
  50. SelfOnly: true,
  51. },
  52. },
  53. },
  54. }
  55. func UserRolesInit() {
  56. d, _ := json.Marshal(logic.SuperAdminPermissionTemplate)
  57. database.Insert(logic.SuperAdminPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  58. d, _ = json.Marshal(logic.AdminPermissionTemplate)
  59. database.Insert(logic.AdminPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  60. d, _ = json.Marshal(ServiceUserPermissionTemplate)
  61. database.Insert(ServiceUserPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  62. d, _ = json.Marshal(PlatformUserUserPermissionTemplate)
  63. database.Insert(PlatformUserUserPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  64. d, _ = json.Marshal(NetworkAdminAllPermissionTemplate)
  65. database.Insert(NetworkAdminAllPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  66. d, _ = json.Marshal(NetworkUserAllPermissionTemplate)
  67. database.Insert(NetworkUserAllPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  68. }
  69. func CreateDefaultNetworkRolesAndGroups(netID models.NetworkID) {
  70. if netID.String() == "" {
  71. return
  72. }
  73. var NetworkAdminPermissionTemplate = models.UserRolePermissionTemplate{
  74. ID: models.UserRoleID(fmt.Sprintf("%s-%s", netID, models.NetworkAdmin)),
  75. Default: true,
  76. NetworkID: netID,
  77. FullAccess: true,
  78. NetworkLevelAccess: make(map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope),
  79. }
  80. var NetworkUserPermissionTemplate = models.UserRolePermissionTemplate{
  81. ID: models.UserRoleID(fmt.Sprintf("%s-%s", netID, models.NetworkUser)),
  82. Default: true,
  83. FullAccess: false,
  84. NetworkID: netID,
  85. DenyDashboardAccess: false,
  86. NetworkLevelAccess: map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope{
  87. models.RemoteAccessGwRsrc: {
  88. models.AllRemoteAccessGwRsrcID: models.RsrcPermissionScope{
  89. Read: true,
  90. VPNaccess: true,
  91. },
  92. },
  93. models.ExtClientsRsrc: {
  94. models.AllExtClientsRsrcID: models.RsrcPermissionScope{
  95. Read: true,
  96. Create: true,
  97. Update: true,
  98. Delete: true,
  99. SelfOnly: true,
  100. },
  101. },
  102. },
  103. }
  104. d, _ := json.Marshal(NetworkAdminPermissionTemplate)
  105. database.Insert(NetworkAdminPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  106. d, _ = json.Marshal(NetworkUserPermissionTemplate)
  107. database.Insert(NetworkUserPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  108. // create default network groups
  109. var NetworkAdminGroup = models.UserGroup{
  110. ID: models.UserGroupID(fmt.Sprintf("%s-%s-grp", netID, models.NetworkAdmin)),
  111. NetworkRoles: map[models.NetworkID]map[models.UserRoleID]struct{}{
  112. netID: {
  113. models.UserRoleID(fmt.Sprintf("%s-%s", netID, models.NetworkAdmin)): {},
  114. },
  115. },
  116. MetaData: "The network group was automatically created by Netmaker.",
  117. }
  118. var NetworkUserGroup = models.UserGroup{
  119. ID: models.UserGroupID(fmt.Sprintf("%s-%s-grp", netID, models.NetworkUser)),
  120. NetworkRoles: map[models.NetworkID]map[models.UserRoleID]struct{}{
  121. netID: {
  122. models.UserRoleID(fmt.Sprintf("%s-%s", netID, models.NetworkUser)): {},
  123. },
  124. },
  125. MetaData: "The network group was automatically created by Netmaker.",
  126. }
  127. d, _ = json.Marshal(NetworkAdminGroup)
  128. database.Insert(NetworkAdminGroup.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
  129. d, _ = json.Marshal(NetworkUserGroup)
  130. database.Insert(NetworkUserGroup.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
  131. }
  132. func DeleteNetworkRoles(netID string) {
  133. users, err := logic.GetUsersDB()
  134. if err != nil {
  135. return
  136. }
  137. defaultUserGrp := fmt.Sprintf("%s-%s-grp", netID, models.NetworkUser)
  138. defaultAdminGrp := fmt.Sprintf("%s-%s-grp", netID, models.NetworkAdmin)
  139. for _, user := range users {
  140. var upsert bool
  141. if _, ok := user.NetworkRoles[models.NetworkID(netID)]; ok {
  142. delete(user.NetworkRoles, models.NetworkID(netID))
  143. upsert = true
  144. }
  145. if _, ok := user.UserGroups[models.UserGroupID(defaultUserGrp)]; ok {
  146. delete(user.UserGroups, models.UserGroupID(defaultUserGrp))
  147. upsert = true
  148. }
  149. if _, ok := user.UserGroups[models.UserGroupID(defaultAdminGrp)]; ok {
  150. delete(user.UserGroups, models.UserGroupID(defaultAdminGrp))
  151. upsert = true
  152. }
  153. if upsert {
  154. logic.UpsertUser(user)
  155. }
  156. }
  157. database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, defaultUserGrp)
  158. database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, defaultAdminGrp)
  159. userGs, _ := ListUserGroups()
  160. for _, userGI := range userGs {
  161. if _, ok := userGI.NetworkRoles[models.NetworkID(netID)]; ok {
  162. delete(userGI.NetworkRoles, models.NetworkID(netID))
  163. UpdateUserGroup(userGI)
  164. }
  165. }
  166. roles, _ := ListNetworkRoles()
  167. for _, role := range roles {
  168. if role.NetworkID.String() == netID {
  169. database.DeleteRecord(database.USER_PERMISSIONS_TABLE_NAME, role.ID.String())
  170. }
  171. }
  172. }
  173. // ListNetworkRoles - lists user network roles permission templates
  174. func ListNetworkRoles() ([]models.UserRolePermissionTemplate, error) {
  175. data, err := database.FetchRecords(database.USER_PERMISSIONS_TABLE_NAME)
  176. if err != nil && !database.IsEmptyRecord(err) {
  177. return []models.UserRolePermissionTemplate{}, err
  178. }
  179. userRoles := []models.UserRolePermissionTemplate{}
  180. for _, dataI := range data {
  181. userRole := models.UserRolePermissionTemplate{}
  182. err := json.Unmarshal([]byte(dataI), &userRole)
  183. if err != nil {
  184. continue
  185. }
  186. if userRole.NetworkID == "" {
  187. continue
  188. }
  189. userRoles = append(userRoles, userRole)
  190. }
  191. return userRoles, nil
  192. }
  193. func ValidateCreateRoleReq(userRole *models.UserRolePermissionTemplate) error {
  194. // check if role exists with this id
  195. _, err := logic.GetRole(userRole.ID)
  196. if err == nil {
  197. return fmt.Errorf("role with id `%s` exists already", userRole.ID.String())
  198. }
  199. if len(userRole.NetworkLevelAccess) > 0 {
  200. for rsrcType := range userRole.NetworkLevelAccess {
  201. if _, ok := models.RsrcTypeMap[rsrcType]; !ok {
  202. return errors.New("invalid rsrc type " + rsrcType.String())
  203. }
  204. if rsrcType == models.RemoteAccessGwRsrc {
  205. userRsrcPermissions := userRole.NetworkLevelAccess[models.RemoteAccessGwRsrc]
  206. var vpnAccess bool
  207. for _, scope := range userRsrcPermissions {
  208. if scope.VPNaccess {
  209. vpnAccess = true
  210. break
  211. }
  212. }
  213. if vpnAccess {
  214. userRole.NetworkLevelAccess[models.ExtClientsRsrc] = map[models.RsrcID]models.RsrcPermissionScope{
  215. models.AllExtClientsRsrcID: {
  216. Read: true,
  217. Create: true,
  218. Update: true,
  219. Delete: true,
  220. SelfOnly: true,
  221. },
  222. }
  223. }
  224. }
  225. }
  226. }
  227. if userRole.NetworkID == "" {
  228. return errors.New("only network roles are allowed to be created")
  229. }
  230. return nil
  231. }
  232. func ValidateUpdateRoleReq(userRole *models.UserRolePermissionTemplate) error {
  233. roleInDB, err := logic.GetRole(userRole.ID)
  234. if err != nil {
  235. return err
  236. }
  237. if roleInDB.NetworkID != userRole.NetworkID {
  238. return errors.New("network id mismatch")
  239. }
  240. if roleInDB.Default {
  241. return errors.New("cannot update default role")
  242. }
  243. if len(userRole.NetworkLevelAccess) > 0 {
  244. for rsrcType := range userRole.NetworkLevelAccess {
  245. if _, ok := models.RsrcTypeMap[rsrcType]; !ok {
  246. return errors.New("invalid rsrc type " + rsrcType.String())
  247. }
  248. if rsrcType == models.RemoteAccessGwRsrc {
  249. userRsrcPermissions := userRole.NetworkLevelAccess[models.RemoteAccessGwRsrc]
  250. var vpnAccess bool
  251. for _, scope := range userRsrcPermissions {
  252. if scope.VPNaccess {
  253. vpnAccess = true
  254. break
  255. }
  256. }
  257. if vpnAccess {
  258. userRole.NetworkLevelAccess[models.ExtClientsRsrc] = map[models.RsrcID]models.RsrcPermissionScope{
  259. models.AllExtClientsRsrcID: {
  260. Read: true,
  261. Create: true,
  262. Update: true,
  263. Delete: true,
  264. SelfOnly: true,
  265. },
  266. }
  267. }
  268. }
  269. }
  270. }
  271. return nil
  272. }
  273. // CreateRole - inserts new role into DB
  274. func CreateRole(r models.UserRolePermissionTemplate) error {
  275. // check if role already exists
  276. if r.ID.String() == "" {
  277. return errors.New("role id cannot be empty")
  278. }
  279. _, err := database.FetchRecord(database.USER_PERMISSIONS_TABLE_NAME, r.ID.String())
  280. if err == nil {
  281. return errors.New("role already exists")
  282. }
  283. d, err := json.Marshal(r)
  284. if err != nil {
  285. return err
  286. }
  287. return database.Insert(r.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  288. }
  289. // UpdateRole - updates role template
  290. func UpdateRole(r models.UserRolePermissionTemplate) error {
  291. if r.ID.String() == "" {
  292. return errors.New("role id cannot be empty")
  293. }
  294. _, err := database.FetchRecord(database.USER_PERMISSIONS_TABLE_NAME, r.ID.String())
  295. if err != nil {
  296. return err
  297. }
  298. d, err := json.Marshal(r)
  299. if err != nil {
  300. return err
  301. }
  302. return database.Insert(r.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  303. }
  304. // DeleteRole - deletes user role
  305. func DeleteRole(rid models.UserRoleID, force bool) error {
  306. if rid.String() == "" {
  307. return errors.New("role id cannot be empty")
  308. }
  309. users, err := logic.GetUsersDB()
  310. if err != nil {
  311. return err
  312. }
  313. role, err := logic.GetRole(rid)
  314. if err != nil {
  315. return err
  316. }
  317. if role.NetworkID == "" {
  318. return errors.New("cannot delete platform role")
  319. }
  320. // allow deletion of default network roles if network doesn't exist
  321. if role.NetworkID == models.AllNetworks {
  322. return errors.New("cannot delete default network role")
  323. }
  324. // check if network exists
  325. exists, _ := logic.NetworkExists(role.NetworkID.String())
  326. if role.Default {
  327. if exists && !force {
  328. return errors.New("cannot delete default role")
  329. }
  330. }
  331. for _, user := range users {
  332. for userG := range user.UserGroups {
  333. ug, err := GetUserGroup(userG)
  334. if err == nil {
  335. if role.NetworkID != "" {
  336. for netID, networkRoles := range ug.NetworkRoles {
  337. if _, ok := networkRoles[rid]; ok {
  338. delete(networkRoles, rid)
  339. ug.NetworkRoles[netID] = networkRoles
  340. UpdateUserGroup(ug)
  341. }
  342. }
  343. }
  344. }
  345. }
  346. if user.PlatformRoleID == rid {
  347. err = errors.New("active roles cannot be deleted.switch existing users to a new role before deleting")
  348. return err
  349. }
  350. if role.NetworkID != "" {
  351. for netID, networkRoles := range user.NetworkRoles {
  352. if _, ok := networkRoles[rid]; ok {
  353. delete(networkRoles, rid)
  354. user.NetworkRoles[netID] = networkRoles
  355. logic.UpsertUser(user)
  356. }
  357. }
  358. }
  359. }
  360. return database.DeleteRecord(database.USER_PERMISSIONS_TABLE_NAME, rid.String())
  361. }
  362. func ValidateCreateGroupReq(g models.UserGroup) error {
  363. // check if network roles are valid
  364. for _, roleMap := range g.NetworkRoles {
  365. for roleID := range roleMap {
  366. role, err := logic.GetRole(roleID)
  367. if err != nil {
  368. return fmt.Errorf("invalid network role %s", roleID)
  369. }
  370. if role.NetworkID == "" {
  371. return errors.New("platform role cannot be used as network role")
  372. }
  373. }
  374. }
  375. return nil
  376. }
  377. func ValidateUpdateGroupReq(g models.UserGroup) error {
  378. for networkID := range g.NetworkRoles {
  379. userRolesMap := g.NetworkRoles[networkID]
  380. for roleID := range userRolesMap {
  381. netRole, err := logic.GetRole(roleID)
  382. if err != nil {
  383. err = fmt.Errorf("invalid network role")
  384. return err
  385. }
  386. if netRole.NetworkID == "" {
  387. return errors.New("platform role cannot be used as network role")
  388. }
  389. }
  390. }
  391. return nil
  392. }
  393. // CreateUserGroup - creates new user group
  394. func CreateUserGroup(g models.UserGroup) error {
  395. // check if role already exists
  396. if g.ID == "" {
  397. return errors.New("group id cannot be empty")
  398. }
  399. _, err := database.FetchRecord(database.USER_GROUPS_TABLE_NAME, g.ID.String())
  400. if err == nil {
  401. return errors.New("group already exists")
  402. }
  403. d, err := json.Marshal(g)
  404. if err != nil {
  405. return err
  406. }
  407. return database.Insert(g.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
  408. }
  409. // GetUserGroup - fetches user group
  410. func GetUserGroup(gid models.UserGroupID) (models.UserGroup, error) {
  411. d, err := database.FetchRecord(database.USER_GROUPS_TABLE_NAME, gid.String())
  412. if err != nil {
  413. return models.UserGroup{}, err
  414. }
  415. var ug models.UserGroup
  416. err = json.Unmarshal([]byte(d), &ug)
  417. if err != nil {
  418. return ug, err
  419. }
  420. return ug, nil
  421. }
  422. // ListUserGroups - lists user groups
  423. func ListUserGroups() ([]models.UserGroup, error) {
  424. data, err := database.FetchRecords(database.USER_GROUPS_TABLE_NAME)
  425. if err != nil && !database.IsEmptyRecord(err) {
  426. return []models.UserGroup{}, err
  427. }
  428. userGroups := []models.UserGroup{}
  429. for _, dataI := range data {
  430. userGroup := models.UserGroup{}
  431. err := json.Unmarshal([]byte(dataI), &userGroup)
  432. if err != nil {
  433. continue
  434. }
  435. userGroups = append(userGroups, userGroup)
  436. }
  437. return userGroups, nil
  438. }
  439. // UpdateUserGroup - updates new user group
  440. func UpdateUserGroup(g models.UserGroup) error {
  441. // check if group exists
  442. if g.ID == "" {
  443. return errors.New("group id cannot be empty")
  444. }
  445. _, err := database.FetchRecord(database.USER_GROUPS_TABLE_NAME, g.ID.String())
  446. if err != nil {
  447. return err
  448. }
  449. d, err := json.Marshal(g)
  450. if err != nil {
  451. return err
  452. }
  453. return database.Insert(g.ID.String(), string(d), database.USER_GROUPS_TABLE_NAME)
  454. }
  455. // DeleteUserGroup - deletes user group
  456. func DeleteUserGroup(gid models.UserGroupID) error {
  457. users, err := logic.GetUsersDB()
  458. if err != nil {
  459. return err
  460. }
  461. for _, user := range users {
  462. delete(user.UserGroups, gid)
  463. logic.UpsertUser(user)
  464. }
  465. return database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, gid.String())
  466. }
  467. func HasNetworkRsrcScope(permissionTemplate models.UserRolePermissionTemplate, netid string, rsrcType models.RsrcType, rsrcID models.RsrcID, op string) bool {
  468. if permissionTemplate.FullAccess {
  469. return true
  470. }
  471. rsrcScope, ok := permissionTemplate.NetworkLevelAccess[rsrcType]
  472. if !ok {
  473. return false
  474. }
  475. _, ok = rsrcScope[rsrcID]
  476. return ok
  477. }
  478. func GetUserRAGNodesV1(user models.User) (gws map[string]models.Node) {
  479. gws = make(map[string]models.Node)
  480. tagNodesMap := logic.GetTagMapWithNodes()
  481. accessPolices := logic.ListUserPolicies(user)
  482. for _, policyI := range accessPolices {
  483. for _, dstI := range policyI.Dst {
  484. if dstI.Value == "*" {
  485. nodes, _ := logic.GetAllNodes()
  486. for _, node := range nodes {
  487. if node.IsIngressGateway {
  488. gws[node.ID.String()] = node
  489. }
  490. }
  491. return
  492. }
  493. if nodes, ok := tagNodesMap[models.TagID(dstI.Value)]; ok {
  494. for _, node := range nodes {
  495. if node.IsIngressGateway {
  496. gws[node.ID.String()] = node
  497. }
  498. }
  499. }
  500. }
  501. }
  502. return
  503. }
  504. func DoesUserHaveAccessToRAGNode(user models.User, node models.Node) bool {
  505. userGwAccessScope := GetUserNetworkRolesWithRemoteVPNAccess(user)
  506. logger.Log(3, fmt.Sprintf("User Gw Access Scope: %+v", userGwAccessScope))
  507. _, allNetAccess := userGwAccessScope["*"]
  508. if node.IsIngressGateway && !node.PendingDelete {
  509. if allNetAccess {
  510. return true
  511. } else {
  512. gwRsrcMap := userGwAccessScope[models.NetworkID(node.Network)]
  513. scope, ok := gwRsrcMap[models.AllRemoteAccessGwRsrcID]
  514. if !ok {
  515. if scope, ok = gwRsrcMap[models.RsrcID(node.ID.String())]; !ok {
  516. return false
  517. }
  518. }
  519. if scope.VPNaccess {
  520. return true
  521. }
  522. }
  523. }
  524. return false
  525. }
  526. func GetUserRAGNodes(user models.User) (gws map[string]models.Node) {
  527. gws = make(map[string]models.Node)
  528. userGwAccessScope := GetUserNetworkRolesWithRemoteVPNAccess(user)
  529. logger.Log(3, fmt.Sprintf("User Gw Access Scope: %+v", userGwAccessScope))
  530. _, allNetAccess := userGwAccessScope["*"]
  531. nodes, err := logic.GetAllNodes()
  532. if err != nil {
  533. return
  534. }
  535. for _, node := range nodes {
  536. if node.IsIngressGateway && !node.PendingDelete {
  537. if allNetAccess {
  538. gws[node.ID.String()] = node
  539. } else {
  540. gwRsrcMap := userGwAccessScope[models.NetworkID(node.Network)]
  541. scope, ok := gwRsrcMap[models.AllRemoteAccessGwRsrcID]
  542. if !ok {
  543. if scope, ok = gwRsrcMap[models.RsrcID(node.ID.String())]; !ok {
  544. continue
  545. }
  546. }
  547. if scope.VPNaccess {
  548. gws[node.ID.String()] = node
  549. }
  550. }
  551. }
  552. }
  553. return
  554. }
  555. // GetUserNetworkRoles - get user network roles
  556. func GetUserNetworkRolesWithRemoteVPNAccess(user models.User) (gwAccess map[models.NetworkID]map[models.RsrcID]models.RsrcPermissionScope) {
  557. gwAccess = make(map[models.NetworkID]map[models.RsrcID]models.RsrcPermissionScope)
  558. platformRole, err := logic.GetRole(user.PlatformRoleID)
  559. if err != nil {
  560. return
  561. }
  562. if platformRole.FullAccess {
  563. gwAccess[models.NetworkID("*")] = make(map[models.RsrcID]models.RsrcPermissionScope)
  564. return
  565. }
  566. if _, ok := user.NetworkRoles[models.AllNetworks]; ok {
  567. gwAccess[models.NetworkID("*")] = make(map[models.RsrcID]models.RsrcPermissionScope)
  568. }
  569. if len(user.UserGroups) > 0 {
  570. for gID := range user.UserGroups {
  571. userG, err := GetUserGroup(gID)
  572. if err != nil {
  573. continue
  574. }
  575. for netID, roleMap := range userG.NetworkRoles {
  576. for roleID := range roleMap {
  577. role, err := logic.GetRole(roleID)
  578. if err == nil {
  579. if role.FullAccess {
  580. gwAccess[netID] = map[models.RsrcID]models.RsrcPermissionScope{
  581. models.AllRemoteAccessGwRsrcID: {
  582. Create: true,
  583. Read: true,
  584. Update: true,
  585. VPNaccess: true,
  586. Delete: true,
  587. },
  588. models.AllExtClientsRsrcID: {
  589. Create: true,
  590. Read: true,
  591. Update: true,
  592. Delete: true,
  593. },
  594. }
  595. break
  596. }
  597. if rsrcsMap, ok := role.NetworkLevelAccess[models.RemoteAccessGwRsrc]; ok {
  598. if permissions, ok := rsrcsMap[models.AllRemoteAccessGwRsrcID]; ok && permissions.VPNaccess {
  599. if len(gwAccess[netID]) == 0 {
  600. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  601. }
  602. gwAccess[netID][models.AllRemoteAccessGwRsrcID] = permissions
  603. break
  604. } else {
  605. for gwID, scope := range rsrcsMap {
  606. if scope.VPNaccess {
  607. if len(gwAccess[netID]) == 0 {
  608. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  609. }
  610. gwAccess[netID][gwID] = scope
  611. }
  612. }
  613. }
  614. }
  615. }
  616. }
  617. }
  618. }
  619. }
  620. for netID, roleMap := range user.NetworkRoles {
  621. for roleID := range roleMap {
  622. role, err := logic.GetRole(roleID)
  623. if err == nil {
  624. if role.FullAccess {
  625. gwAccess[netID] = map[models.RsrcID]models.RsrcPermissionScope{
  626. models.AllRemoteAccessGwRsrcID: {
  627. Create: true,
  628. Read: true,
  629. Update: true,
  630. VPNaccess: true,
  631. Delete: true,
  632. },
  633. models.AllExtClientsRsrcID: {
  634. Create: true,
  635. Read: true,
  636. Update: true,
  637. Delete: true,
  638. },
  639. }
  640. break
  641. }
  642. if rsrcsMap, ok := role.NetworkLevelAccess[models.RemoteAccessGwRsrc]; ok {
  643. if permissions, ok := rsrcsMap[models.AllRemoteAccessGwRsrcID]; ok && permissions.VPNaccess {
  644. if len(gwAccess[netID]) == 0 {
  645. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  646. }
  647. gwAccess[netID][models.AllRemoteAccessGwRsrcID] = permissions
  648. break
  649. } else {
  650. for gwID, scope := range rsrcsMap {
  651. if scope.VPNaccess {
  652. if len(gwAccess[netID]) == 0 {
  653. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  654. }
  655. gwAccess[netID][gwID] = scope
  656. }
  657. }
  658. }
  659. }
  660. }
  661. }
  662. }
  663. return
  664. }
  665. func GetFilteredNodesByUserAccess(user models.User, nodes []models.Node) (filteredNodes []models.Node) {
  666. nodesMap := make(map[string]struct{})
  667. allNetworkRoles := make(map[models.UserRoleID]struct{})
  668. defer func() {
  669. filteredNodes = logic.AddStaticNodestoList(filteredNodes)
  670. }()
  671. if len(user.NetworkRoles) > 0 {
  672. for _, netRoles := range user.NetworkRoles {
  673. for netRoleI := range netRoles {
  674. allNetworkRoles[netRoleI] = struct{}{}
  675. }
  676. }
  677. }
  678. if _, ok := user.NetworkRoles[models.AllNetworks]; ok {
  679. filteredNodes = nodes
  680. return
  681. }
  682. if len(user.UserGroups) > 0 {
  683. for userGID := range user.UserGroups {
  684. userG, err := GetUserGroup(userGID)
  685. if err == nil {
  686. if len(userG.NetworkRoles) > 0 {
  687. if _, ok := userG.NetworkRoles[models.AllNetworks]; ok {
  688. filteredNodes = nodes
  689. return
  690. }
  691. for _, netRoles := range userG.NetworkRoles {
  692. for netRoleI := range netRoles {
  693. allNetworkRoles[netRoleI] = struct{}{}
  694. }
  695. }
  696. }
  697. }
  698. }
  699. }
  700. for networkRoleID := range allNetworkRoles {
  701. userPermTemplate, err := logic.GetRole(networkRoleID)
  702. if err != nil {
  703. continue
  704. }
  705. networkNodes := logic.GetNetworkNodesMemory(nodes, userPermTemplate.NetworkID.String())
  706. if userPermTemplate.FullAccess {
  707. for _, node := range networkNodes {
  708. if _, ok := nodesMap[node.ID.String()]; ok {
  709. continue
  710. }
  711. nodesMap[node.ID.String()] = struct{}{}
  712. filteredNodes = append(filteredNodes, node)
  713. }
  714. continue
  715. }
  716. if rsrcPerms, ok := userPermTemplate.NetworkLevelAccess[models.RemoteAccessGwRsrc]; ok {
  717. if _, ok := rsrcPerms[models.AllRemoteAccessGwRsrcID]; ok {
  718. for _, node := range networkNodes {
  719. if _, ok := nodesMap[node.ID.String()]; ok {
  720. continue
  721. }
  722. if node.IsIngressGateway {
  723. nodesMap[node.ID.String()] = struct{}{}
  724. filteredNodes = append(filteredNodes, node)
  725. }
  726. }
  727. } else {
  728. for gwID, scope := range rsrcPerms {
  729. if _, ok := nodesMap[gwID.String()]; ok {
  730. continue
  731. }
  732. if scope.Read {
  733. gwNode, err := logic.GetNodeByID(gwID.String())
  734. if err == nil && gwNode.IsIngressGateway {
  735. nodesMap[gwNode.ID.String()] = struct{}{}
  736. filteredNodes = append(filteredNodes, gwNode)
  737. }
  738. }
  739. }
  740. }
  741. }
  742. }
  743. return
  744. }
  745. func FilterNetworksByRole(allnetworks []models.Network, user models.User) []models.Network {
  746. platformRole, err := logic.GetRole(user.PlatformRoleID)
  747. if err != nil {
  748. return []models.Network{}
  749. }
  750. if !platformRole.FullAccess {
  751. allNetworkRoles := make(map[models.NetworkID]struct{})
  752. if len(user.NetworkRoles) > 0 {
  753. for netID := range user.NetworkRoles {
  754. if netID == models.AllNetworks {
  755. return allnetworks
  756. }
  757. allNetworkRoles[netID] = struct{}{}
  758. }
  759. }
  760. if len(user.UserGroups) > 0 {
  761. for userGID := range user.UserGroups {
  762. userG, err := GetUserGroup(userGID)
  763. if err == nil {
  764. if len(userG.NetworkRoles) > 0 {
  765. for netID := range userG.NetworkRoles {
  766. if netID == models.AllNetworks {
  767. return allnetworks
  768. }
  769. allNetworkRoles[netID] = struct{}{}
  770. }
  771. }
  772. }
  773. }
  774. }
  775. filteredNetworks := []models.Network{}
  776. for _, networkI := range allnetworks {
  777. if _, ok := allNetworkRoles[models.NetworkID(networkI.NetID)]; ok {
  778. filteredNetworks = append(filteredNetworks, networkI)
  779. }
  780. }
  781. allnetworks = filteredNetworks
  782. }
  783. return allnetworks
  784. }
  785. func IsGroupsValid(groups map[models.UserGroupID]struct{}) error {
  786. for groupID := range groups {
  787. _, err := GetUserGroup(groupID)
  788. if err != nil {
  789. return fmt.Errorf("user group `%s` not found", groupID)
  790. }
  791. }
  792. return nil
  793. }
  794. func IsGroupValid(groupID models.UserGroupID) error {
  795. _, err := GetUserGroup(groupID)
  796. if err != nil {
  797. return fmt.Errorf("user group `%s` not found", groupID)
  798. }
  799. return nil
  800. }
  801. func IsNetworkRolesValid(networkRoles map[models.NetworkID]map[models.UserRoleID]struct{}) error {
  802. for netID, netRoles := range networkRoles {
  803. if netID != models.AllNetworks {
  804. _, err := logic.GetNetwork(netID.String())
  805. if err != nil {
  806. return fmt.Errorf("failed to fetch network %s ", netID)
  807. }
  808. }
  809. for netRoleID := range netRoles {
  810. role, err := logic.GetRole(netRoleID)
  811. if err != nil {
  812. return fmt.Errorf("failed to fetch role %s ", netRoleID)
  813. }
  814. if role.NetworkID == "" {
  815. return fmt.Errorf("cannot use platform as network role %s", netRoleID)
  816. }
  817. }
  818. }
  819. return nil
  820. }
  821. // PrepareOauthUserFromInvite - init oauth user before create
  822. func PrepareOauthUserFromInvite(in models.UserInvite) (models.User, error) {
  823. var newPass, fetchErr = logic.FetchPassValue("")
  824. if fetchErr != nil {
  825. return models.User{}, fetchErr
  826. }
  827. user := models.User{
  828. UserName: in.Email,
  829. Password: newPass,
  830. }
  831. user.UserGroups = in.UserGroups
  832. user.NetworkRoles = in.NetworkRoles
  833. user.PlatformRoleID = models.UserRoleID(in.PlatformRoleID)
  834. if user.PlatformRoleID == "" {
  835. user.PlatformRoleID = models.ServiceUser
  836. }
  837. return user, nil
  838. }
  839. func UpdatesUserGwAccessOnRoleUpdates(currNetworkAccess,
  840. changeNetworkAccess map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope, netID string) {
  841. networkChangeMap := make(map[models.RsrcID]models.RsrcPermissionScope)
  842. for rsrcType, RsrcPermsMap := range currNetworkAccess {
  843. if rsrcType != models.RemoteAccessGwRsrc {
  844. continue
  845. }
  846. if _, ok := changeNetworkAccess[rsrcType]; !ok {
  847. for rsrcID, scope := range RsrcPermsMap {
  848. networkChangeMap[rsrcID] = scope
  849. }
  850. } else {
  851. for rsrcID, scope := range RsrcPermsMap {
  852. if _, ok := changeNetworkAccess[rsrcType][rsrcID]; !ok {
  853. networkChangeMap[rsrcID] = scope
  854. }
  855. }
  856. }
  857. }
  858. extclients, err := logic.GetAllExtClients()
  859. if err != nil {
  860. slog.Error("failed to fetch extclients", "error", err)
  861. return
  862. }
  863. userMap, err := logic.GetUserMap()
  864. if err != nil {
  865. return
  866. }
  867. for _, extclient := range extclients {
  868. if extclient.Network != netID {
  869. continue
  870. }
  871. if _, ok := networkChangeMap[models.AllRemoteAccessGwRsrcID]; ok {
  872. if user, ok := userMap[extclient.OwnerID]; ok {
  873. if user.PlatformRoleID != models.ServiceUser {
  874. continue
  875. }
  876. err = logic.DeleteExtClientAndCleanup(extclient)
  877. if err != nil {
  878. slog.Error("failed to delete extclient",
  879. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  880. } else {
  881. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  882. slog.Error("error setting ext peers: " + err.Error())
  883. }
  884. }
  885. }
  886. continue
  887. }
  888. if _, ok := networkChangeMap[models.RsrcID(extclient.IngressGatewayID)]; ok {
  889. if user, ok := userMap[extclient.OwnerID]; ok {
  890. if user.PlatformRoleID != models.ServiceUser {
  891. continue
  892. }
  893. err = logic.DeleteExtClientAndCleanup(extclient)
  894. if err != nil {
  895. slog.Error("failed to delete extclient",
  896. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  897. } else {
  898. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  899. slog.Error("error setting ext peers: " + err.Error())
  900. }
  901. }
  902. }
  903. }
  904. }
  905. if servercfg.IsDNSMode() {
  906. logic.SetDNS()
  907. }
  908. }
  909. func UpdatesUserGwAccessOnGrpUpdates(currNetworkRoles, changeNetworkRoles map[models.NetworkID]map[models.UserRoleID]struct{}) {
  910. networkChangeMap := make(map[models.NetworkID]map[models.UserRoleID]struct{})
  911. for netID, networkUserRoles := range currNetworkRoles {
  912. if _, ok := changeNetworkRoles[netID]; !ok {
  913. for netRoleID := range networkUserRoles {
  914. if _, ok := networkChangeMap[netID]; !ok {
  915. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  916. }
  917. networkChangeMap[netID][netRoleID] = struct{}{}
  918. }
  919. } else {
  920. for netRoleID := range networkUserRoles {
  921. if _, ok := changeNetworkRoles[netID][netRoleID]; !ok {
  922. if _, ok := networkChangeMap[netID]; !ok {
  923. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  924. }
  925. networkChangeMap[netID][netRoleID] = struct{}{}
  926. }
  927. }
  928. }
  929. }
  930. extclients, err := logic.GetAllExtClients()
  931. if err != nil {
  932. slog.Error("failed to fetch extclients", "error", err)
  933. return
  934. }
  935. userMap, err := logic.GetUserMap()
  936. if err != nil {
  937. return
  938. }
  939. for _, extclient := range extclients {
  940. if _, ok := networkChangeMap[models.NetworkID(extclient.Network)]; ok {
  941. if user, ok := userMap[extclient.OwnerID]; ok {
  942. if user.PlatformRoleID != models.ServiceUser {
  943. continue
  944. }
  945. err = logic.DeleteExtClientAndCleanup(extclient)
  946. if err != nil {
  947. slog.Error("failed to delete extclient",
  948. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  949. } else {
  950. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  951. slog.Error("error setting ext peers: " + err.Error())
  952. }
  953. }
  954. }
  955. }
  956. }
  957. if servercfg.IsDNSMode() {
  958. logic.SetDNS()
  959. }
  960. }
  961. func UpdateUserGwAccess(currentUser, changeUser models.User) {
  962. if changeUser.PlatformRoleID != models.ServiceUser {
  963. return
  964. }
  965. networkChangeMap := make(map[models.NetworkID]map[models.UserRoleID]struct{})
  966. for netID, networkUserRoles := range currentUser.NetworkRoles {
  967. if _, ok := changeUser.NetworkRoles[netID]; !ok {
  968. for netRoleID := range networkUserRoles {
  969. if _, ok := networkChangeMap[netID]; !ok {
  970. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  971. }
  972. networkChangeMap[netID][netRoleID] = struct{}{}
  973. }
  974. } else {
  975. for netRoleID := range networkUserRoles {
  976. if _, ok := changeUser.NetworkRoles[netID][netRoleID]; !ok {
  977. if _, ok := networkChangeMap[netID]; !ok {
  978. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  979. }
  980. networkChangeMap[netID][netRoleID] = struct{}{}
  981. }
  982. }
  983. }
  984. }
  985. for gID := range currentUser.UserGroups {
  986. if _, ok := changeUser.UserGroups[gID]; ok {
  987. continue
  988. }
  989. userG, err := GetUserGroup(gID)
  990. if err == nil {
  991. for netID, networkUserRoles := range userG.NetworkRoles {
  992. for netRoleID := range networkUserRoles {
  993. if _, ok := networkChangeMap[netID]; !ok {
  994. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  995. }
  996. networkChangeMap[netID][netRoleID] = struct{}{}
  997. }
  998. }
  999. }
  1000. }
  1001. if len(networkChangeMap) == 0 {
  1002. return
  1003. }
  1004. // TODO - cleanup gw access when role and groups are updated
  1005. //removedGwAccess
  1006. extclients, err := logic.GetAllExtClients()
  1007. if err != nil {
  1008. slog.Error("failed to fetch extclients", "error", err)
  1009. return
  1010. }
  1011. for _, extclient := range extclients {
  1012. if extclient.OwnerID == currentUser.UserName {
  1013. if _, ok := networkChangeMap[models.NetworkID(extclient.Network)]; ok {
  1014. err = logic.DeleteExtClientAndCleanup(extclient)
  1015. if err != nil {
  1016. slog.Error("failed to delete extclient",
  1017. "id", extclient.ClientID, "owner", changeUser.UserName, "error", err)
  1018. } else {
  1019. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  1020. slog.Error("error setting ext peers: " + err.Error())
  1021. }
  1022. }
  1023. }
  1024. }
  1025. }
  1026. if servercfg.IsDNSMode() {
  1027. logic.SetDNS()
  1028. }
  1029. }
  1030. func CreateDefaultUserPolicies(netID models.NetworkID) {
  1031. if netID.String() == "" {
  1032. return
  1033. }
  1034. if !logic.IsAclExists(models.AclID(fmt.Sprintf("%s.%s", netID, models.NetworkAdmin))) {
  1035. defaultUserAcl := models.Acl{
  1036. ID: models.AclID(fmt.Sprintf("%s.%s", netID, models.NetworkAdmin)),
  1037. Name: models.NetworkAdmin.String(),
  1038. Default: true,
  1039. NetworkID: netID,
  1040. RuleType: models.UserPolicy,
  1041. Src: []models.AclPolicyTag{
  1042. {
  1043. ID: models.UserRoleAclID,
  1044. Value: fmt.Sprintf("%s-%s", netID, models.NetworkAdmin),
  1045. }},
  1046. Dst: []models.AclPolicyTag{
  1047. {
  1048. ID: models.DeviceAclID,
  1049. Value: "*",
  1050. }},
  1051. AllowedDirection: models.TrafficDirectionUni,
  1052. Enabled: true,
  1053. CreatedBy: "auto",
  1054. CreatedAt: time.Now().UTC(),
  1055. }
  1056. logic.InsertAcl(defaultUserAcl)
  1057. }
  1058. if !logic.IsAclExists(models.AclID(fmt.Sprintf("%s.%s", netID, models.NetworkUser))) {
  1059. defaultUserAcl := models.Acl{
  1060. ID: models.AclID(fmt.Sprintf("%s.%s", netID, models.NetworkUser)),
  1061. Name: models.NetworkUser.String(),
  1062. Default: true,
  1063. NetworkID: netID,
  1064. RuleType: models.UserPolicy,
  1065. Src: []models.AclPolicyTag{
  1066. {
  1067. ID: models.UserRoleAclID,
  1068. Value: fmt.Sprintf("%s-%s", netID, models.NetworkUser),
  1069. }},
  1070. Dst: []models.AclPolicyTag{
  1071. {
  1072. ID: models.DeviceAclID,
  1073. Value: "*",
  1074. }},
  1075. AllowedDirection: models.TrafficDirectionUni,
  1076. Enabled: true,
  1077. CreatedBy: "auto",
  1078. CreatedAt: time.Now().UTC(),
  1079. }
  1080. logic.InsertAcl(defaultUserAcl)
  1081. }
  1082. if !logic.IsAclExists(models.AclID(fmt.Sprintf("%s.%s-grp", netID, models.NetworkAdmin))) {
  1083. defaultUserAcl := models.Acl{
  1084. ID: models.AclID(fmt.Sprintf("%s.%s-grp", netID, models.NetworkAdmin)),
  1085. Name: fmt.Sprintf("%s-grp", models.NetworkAdmin),
  1086. Default: true,
  1087. NetworkID: netID,
  1088. RuleType: models.UserPolicy,
  1089. Src: []models.AclPolicyTag{
  1090. {
  1091. ID: models.UserGroupAclID,
  1092. Value: fmt.Sprintf("%s-%s-grp", netID, models.NetworkAdmin),
  1093. }},
  1094. Dst: []models.AclPolicyTag{
  1095. {
  1096. ID: models.DeviceAclID,
  1097. Value: "*",
  1098. }},
  1099. AllowedDirection: models.TrafficDirectionUni,
  1100. Enabled: true,
  1101. CreatedBy: "auto",
  1102. CreatedAt: time.Now().UTC(),
  1103. }
  1104. logic.InsertAcl(defaultUserAcl)
  1105. }
  1106. if !logic.IsAclExists(models.AclID(fmt.Sprintf("%s.%s-grp", netID, models.NetworkUser))) {
  1107. defaultUserAcl := models.Acl{
  1108. ID: models.AclID(fmt.Sprintf("%s.%s-grp", netID, models.NetworkUser)),
  1109. Name: fmt.Sprintf("%s-grp", models.NetworkUser),
  1110. Default: true,
  1111. NetworkID: netID,
  1112. RuleType: models.UserPolicy,
  1113. Src: []models.AclPolicyTag{
  1114. {
  1115. ID: models.UserGroupAclID,
  1116. Value: fmt.Sprintf("%s-%s-grp", netID, models.NetworkUser),
  1117. }},
  1118. Dst: []models.AclPolicyTag{
  1119. {
  1120. ID: models.DeviceAclID,
  1121. Value: "*",
  1122. }},
  1123. AllowedDirection: models.TrafficDirectionUni,
  1124. Enabled: true,
  1125. CreatedBy: "auto",
  1126. CreatedAt: time.Now().UTC(),
  1127. }
  1128. logic.InsertAcl(defaultUserAcl)
  1129. }
  1130. }