user_mgmt.go 36 KB

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