user_mgmt.go 36 KB

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