user_mgmt.go 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "time"
  7. "github.com/google/uuid"
  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 := GetTagMapWithNodes()
  637. accessPolices := 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 !node.IsGw {
  670. continue
  671. }
  672. if user.PlatformRoleID == models.AdminRole || user.PlatformRoleID == models.SuperAdminRole {
  673. if ok, _ := IsUserAllowedToCommunicate(user.UserName, node); ok {
  674. gws[node.ID.String()] = node
  675. continue
  676. }
  677. } else {
  678. // check if user has network role assigned
  679. if roles, ok := user.NetworkRoles[models.NetworkID(node.Network)]; ok && len(roles) > 0 {
  680. if ok, _ := IsUserAllowedToCommunicate(user.UserName, node); ok {
  681. gws[node.ID.String()] = node
  682. continue
  683. }
  684. }
  685. if roles, ok := user.NetworkRoles[models.AllNetworks]; ok && len(roles) > 0 {
  686. if ok, _ := IsUserAllowedToCommunicate(user.UserName, node); ok {
  687. gws[node.ID.String()] = node
  688. continue
  689. }
  690. }
  691. for groupID := range user.UserGroups {
  692. userGrp, err := logic.GetUserGroup(groupID)
  693. if err == nil {
  694. if roles, ok := userGrp.NetworkRoles[models.NetworkID(node.Network)]; ok && len(roles) > 0 {
  695. if ok, _ := IsUserAllowedToCommunicate(user.UserName, node); ok {
  696. gws[node.ID.String()] = node
  697. break
  698. }
  699. }
  700. if roles, ok := userGrp.NetworkRoles[models.AllNetworks]; ok && len(roles) > 0 {
  701. if ok, _ := IsUserAllowedToCommunicate(user.UserName, node); ok {
  702. gws[node.ID.String()] = node
  703. break
  704. }
  705. }
  706. }
  707. }
  708. }
  709. }
  710. return
  711. }
  712. // GetUserNetworkRoles - get user network roles
  713. func GetUserNetworkRolesWithRemoteVPNAccess(user models.User) (gwAccess map[models.NetworkID]map[models.RsrcID]models.RsrcPermissionScope) {
  714. gwAccess = make(map[models.NetworkID]map[models.RsrcID]models.RsrcPermissionScope)
  715. platformRole, err := logic.GetRole(user.PlatformRoleID)
  716. if err != nil {
  717. return
  718. }
  719. if platformRole.FullAccess {
  720. gwAccess[models.NetworkID("*")] = make(map[models.RsrcID]models.RsrcPermissionScope)
  721. return
  722. }
  723. if _, ok := user.NetworkRoles[models.AllNetworks]; ok {
  724. gwAccess[models.NetworkID("*")] = make(map[models.RsrcID]models.RsrcPermissionScope)
  725. return
  726. }
  727. if len(user.UserGroups) > 0 {
  728. for gID := range user.UserGroups {
  729. userG, err := GetUserGroup(gID)
  730. if err != nil {
  731. continue
  732. }
  733. if _, ok := userG.NetworkRoles[models.AllNetworks]; ok {
  734. gwAccess[models.NetworkID("*")] = make(map[models.RsrcID]models.RsrcPermissionScope)
  735. return
  736. }
  737. for netID, roleMap := range userG.NetworkRoles {
  738. for roleID := range roleMap {
  739. role, err := logic.GetRole(roleID)
  740. if err == nil {
  741. if role.FullAccess {
  742. gwAccess[netID] = map[models.RsrcID]models.RsrcPermissionScope{
  743. models.AllRemoteAccessGwRsrcID: {
  744. Create: true,
  745. Read: true,
  746. Update: true,
  747. VPNaccess: true,
  748. Delete: true,
  749. },
  750. models.AllExtClientsRsrcID: {
  751. Create: true,
  752. Read: true,
  753. Update: true,
  754. Delete: true,
  755. },
  756. }
  757. break
  758. }
  759. if rsrcsMap, ok := role.NetworkLevelAccess[models.RemoteAccessGwRsrc]; ok {
  760. if permissions, ok := rsrcsMap[models.AllRemoteAccessGwRsrcID]; ok && permissions.VPNaccess {
  761. if len(gwAccess[netID]) == 0 {
  762. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  763. }
  764. gwAccess[netID][models.AllRemoteAccessGwRsrcID] = permissions
  765. break
  766. } else {
  767. for gwID, scope := range rsrcsMap {
  768. if scope.VPNaccess {
  769. if len(gwAccess[netID]) == 0 {
  770. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  771. }
  772. gwAccess[netID][gwID] = scope
  773. }
  774. }
  775. }
  776. }
  777. }
  778. }
  779. }
  780. }
  781. }
  782. for netID, roleMap := range user.NetworkRoles {
  783. for roleID := range roleMap {
  784. role, err := logic.GetRole(roleID)
  785. if err == nil {
  786. if role.FullAccess {
  787. gwAccess[netID] = map[models.RsrcID]models.RsrcPermissionScope{
  788. models.AllRemoteAccessGwRsrcID: {
  789. Create: true,
  790. Read: true,
  791. Update: true,
  792. VPNaccess: true,
  793. Delete: true,
  794. },
  795. models.AllExtClientsRsrcID: {
  796. Create: true,
  797. Read: true,
  798. Update: true,
  799. Delete: true,
  800. },
  801. }
  802. break
  803. }
  804. if rsrcsMap, ok := role.NetworkLevelAccess[models.RemoteAccessGwRsrc]; ok {
  805. if permissions, ok := rsrcsMap[models.AllRemoteAccessGwRsrcID]; ok && permissions.VPNaccess {
  806. if len(gwAccess[netID]) == 0 {
  807. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  808. }
  809. gwAccess[netID][models.AllRemoteAccessGwRsrcID] = permissions
  810. break
  811. } else {
  812. for gwID, scope := range rsrcsMap {
  813. if scope.VPNaccess {
  814. if len(gwAccess[netID]) == 0 {
  815. gwAccess[netID] = make(map[models.RsrcID]models.RsrcPermissionScope)
  816. }
  817. gwAccess[netID][gwID] = scope
  818. }
  819. }
  820. }
  821. }
  822. }
  823. }
  824. }
  825. return
  826. }
  827. func GetFilteredNodesByUserAccess(user models.User, nodes []models.Node) (filteredNodes []models.Node) {
  828. return filteredNodes
  829. }
  830. func FilterNetworksByRole(allnetworks []models.Network, user models.User) []models.Network {
  831. platformRole, err := logic.GetRole(user.PlatformRoleID)
  832. if err != nil {
  833. return []models.Network{}
  834. }
  835. if !platformRole.FullAccess {
  836. allNetworkRoles := make(map[models.NetworkID]struct{})
  837. if len(user.NetworkRoles) > 0 {
  838. for netID := range user.NetworkRoles {
  839. if netID == models.AllNetworks {
  840. return allnetworks
  841. }
  842. allNetworkRoles[netID] = struct{}{}
  843. }
  844. }
  845. if len(user.UserGroups) > 0 {
  846. for userGID := range user.UserGroups {
  847. userG, err := GetUserGroup(userGID)
  848. if err == nil {
  849. if len(userG.NetworkRoles) > 0 {
  850. for netID := range userG.NetworkRoles {
  851. if netID == models.AllNetworks {
  852. return allnetworks
  853. }
  854. allNetworkRoles[netID] = struct{}{}
  855. }
  856. }
  857. }
  858. }
  859. }
  860. filteredNetworks := []models.Network{}
  861. for _, networkI := range allnetworks {
  862. if _, ok := allNetworkRoles[models.NetworkID(networkI.NetID)]; ok {
  863. filteredNetworks = append(filteredNetworks, networkI)
  864. }
  865. }
  866. allnetworks = filteredNetworks
  867. }
  868. return allnetworks
  869. }
  870. func IsGroupsValid(groups map[models.UserGroupID]struct{}) error {
  871. for groupID := range groups {
  872. _, err := GetUserGroup(groupID)
  873. if err != nil {
  874. return fmt.Errorf("user group `%s` not found", groupID)
  875. }
  876. }
  877. return nil
  878. }
  879. func IsGroupValid(groupID models.UserGroupID) error {
  880. _, err := GetUserGroup(groupID)
  881. if err != nil {
  882. return fmt.Errorf("user group `%s` not found", groupID)
  883. }
  884. return nil
  885. }
  886. func IsNetworkRolesValid(networkRoles map[models.NetworkID]map[models.UserRoleID]struct{}) error {
  887. for netID, netRoles := range networkRoles {
  888. if netID != models.AllNetworks {
  889. _, err := logic.GetNetwork(netID.String())
  890. if err != nil {
  891. return fmt.Errorf("failed to fetch network %s ", netID)
  892. }
  893. }
  894. for netRoleID := range netRoles {
  895. role, err := logic.GetRole(netRoleID)
  896. if err != nil {
  897. return fmt.Errorf("failed to fetch role %s ", netRoleID)
  898. }
  899. if role.NetworkID == "" {
  900. return fmt.Errorf("cannot use platform as network role %s", netRoleID)
  901. }
  902. }
  903. }
  904. return nil
  905. }
  906. // PrepareOauthUserFromInvite - init oauth user before create
  907. func PrepareOauthUserFromInvite(in models.UserInvite) (models.User, error) {
  908. var newPass, fetchErr = logic.FetchPassValue("")
  909. if fetchErr != nil {
  910. return models.User{}, fetchErr
  911. }
  912. user := models.User{
  913. UserName: in.Email,
  914. Password: newPass,
  915. }
  916. user.UserGroups = in.UserGroups
  917. user.NetworkRoles = in.NetworkRoles
  918. user.PlatformRoleID = models.UserRoleID(in.PlatformRoleID)
  919. if user.PlatformRoleID == "" {
  920. user.PlatformRoleID = models.ServiceUser
  921. }
  922. return user, nil
  923. }
  924. func UpdatesUserGwAccessOnRoleUpdates(currNetworkAccess,
  925. changeNetworkAccess map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope, netID string) {
  926. networkChangeMap := make(map[models.RsrcID]models.RsrcPermissionScope)
  927. for rsrcType, RsrcPermsMap := range currNetworkAccess {
  928. if rsrcType != models.RemoteAccessGwRsrc {
  929. continue
  930. }
  931. if _, ok := changeNetworkAccess[rsrcType]; !ok {
  932. for rsrcID, scope := range RsrcPermsMap {
  933. networkChangeMap[rsrcID] = scope
  934. }
  935. } else {
  936. for rsrcID, scope := range RsrcPermsMap {
  937. if _, ok := changeNetworkAccess[rsrcType][rsrcID]; !ok {
  938. networkChangeMap[rsrcID] = scope
  939. }
  940. }
  941. }
  942. }
  943. extclients, err := logic.GetAllExtClients()
  944. if err != nil {
  945. slog.Error("failed to fetch extclients", "error", err)
  946. return
  947. }
  948. userMap, err := logic.GetUserMap()
  949. if err != nil {
  950. return
  951. }
  952. for _, extclient := range extclients {
  953. if extclient.Network != netID {
  954. continue
  955. }
  956. if _, ok := networkChangeMap[models.AllRemoteAccessGwRsrcID]; ok {
  957. if user, ok := userMap[extclient.OwnerID]; ok {
  958. if user.PlatformRoleID != models.ServiceUser {
  959. continue
  960. }
  961. err = logic.DeleteExtClientAndCleanup(extclient)
  962. if err != nil {
  963. slog.Error("failed to delete extclient",
  964. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  965. } else {
  966. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  967. slog.Error("error setting ext peers: " + err.Error())
  968. }
  969. }
  970. }
  971. continue
  972. }
  973. if _, ok := networkChangeMap[models.RsrcID(extclient.IngressGatewayID)]; ok {
  974. if user, ok := userMap[extclient.OwnerID]; ok {
  975. if user.PlatformRoleID != models.ServiceUser {
  976. continue
  977. }
  978. err = logic.DeleteExtClientAndCleanup(extclient)
  979. if err != nil {
  980. slog.Error("failed to delete extclient",
  981. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  982. } else {
  983. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  984. slog.Error("error setting ext peers: " + err.Error())
  985. }
  986. }
  987. }
  988. }
  989. }
  990. if servercfg.IsDNSMode() {
  991. logic.SetDNS()
  992. }
  993. }
  994. func UpdatesUserGwAccessOnGrpUpdates(currNetworkRoles, changeNetworkRoles map[models.NetworkID]map[models.UserRoleID]struct{}) {
  995. networkChangeMap := make(map[models.NetworkID]map[models.UserRoleID]struct{})
  996. for netID, networkUserRoles := range currNetworkRoles {
  997. if _, ok := changeNetworkRoles[netID]; !ok {
  998. for netRoleID := range networkUserRoles {
  999. if _, ok := networkChangeMap[netID]; !ok {
  1000. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  1001. }
  1002. networkChangeMap[netID][netRoleID] = struct{}{}
  1003. }
  1004. } else {
  1005. for netRoleID := range networkUserRoles {
  1006. if _, ok := changeNetworkRoles[netID][netRoleID]; !ok {
  1007. if _, ok := networkChangeMap[netID]; !ok {
  1008. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  1009. }
  1010. networkChangeMap[netID][netRoleID] = struct{}{}
  1011. }
  1012. }
  1013. }
  1014. }
  1015. extclients, err := logic.GetAllExtClients()
  1016. if err != nil {
  1017. slog.Error("failed to fetch extclients", "error", err)
  1018. return
  1019. }
  1020. userMap, err := logic.GetUserMap()
  1021. if err != nil {
  1022. return
  1023. }
  1024. for _, extclient := range extclients {
  1025. if _, ok := networkChangeMap[models.NetworkID(extclient.Network)]; ok {
  1026. if user, ok := userMap[extclient.OwnerID]; ok {
  1027. if user.PlatformRoleID != models.ServiceUser {
  1028. continue
  1029. }
  1030. err = logic.DeleteExtClientAndCleanup(extclient)
  1031. if err != nil {
  1032. slog.Error("failed to delete extclient",
  1033. "id", extclient.ClientID, "owner", user.UserName, "error", err)
  1034. } else {
  1035. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  1036. slog.Error("error setting ext peers: " + err.Error())
  1037. }
  1038. }
  1039. }
  1040. }
  1041. }
  1042. if servercfg.IsDNSMode() {
  1043. logic.SetDNS()
  1044. }
  1045. }
  1046. func UpdateUserGwAccess(currentUser, changeUser models.User) {
  1047. if changeUser.PlatformRoleID != models.ServiceUser {
  1048. return
  1049. }
  1050. networkChangeMap := make(map[models.NetworkID]map[models.UserRoleID]struct{})
  1051. for netID, networkUserRoles := range currentUser.NetworkRoles {
  1052. if _, ok := changeUser.NetworkRoles[netID]; !ok {
  1053. for netRoleID := range networkUserRoles {
  1054. if _, ok := networkChangeMap[netID]; !ok {
  1055. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  1056. }
  1057. networkChangeMap[netID][netRoleID] = struct{}{}
  1058. }
  1059. } else {
  1060. for netRoleID := range networkUserRoles {
  1061. if _, ok := changeUser.NetworkRoles[netID][netRoleID]; !ok {
  1062. if _, ok := networkChangeMap[netID]; !ok {
  1063. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  1064. }
  1065. networkChangeMap[netID][netRoleID] = struct{}{}
  1066. }
  1067. }
  1068. }
  1069. }
  1070. for gID := range currentUser.UserGroups {
  1071. if _, ok := changeUser.UserGroups[gID]; ok {
  1072. continue
  1073. }
  1074. userG, err := GetUserGroup(gID)
  1075. if err == nil {
  1076. for netID, networkUserRoles := range userG.NetworkRoles {
  1077. for netRoleID := range networkUserRoles {
  1078. if _, ok := networkChangeMap[netID]; !ok {
  1079. networkChangeMap[netID] = make(map[models.UserRoleID]struct{})
  1080. }
  1081. networkChangeMap[netID][netRoleID] = struct{}{}
  1082. }
  1083. }
  1084. }
  1085. }
  1086. if len(networkChangeMap) == 0 {
  1087. return
  1088. }
  1089. // TODO - cleanup gw access when role and groups are updated
  1090. //removedGwAccess
  1091. extclients, err := logic.GetAllExtClients()
  1092. if err != nil {
  1093. slog.Error("failed to fetch extclients", "error", err)
  1094. return
  1095. }
  1096. for _, extclient := range extclients {
  1097. if extclient.OwnerID == currentUser.UserName {
  1098. if _, ok := networkChangeMap[models.NetworkID(extclient.Network)]; ok {
  1099. err = logic.DeleteExtClientAndCleanup(extclient)
  1100. if err != nil {
  1101. slog.Error("failed to delete extclient",
  1102. "id", extclient.ClientID, "owner", changeUser.UserName, "error", err)
  1103. } else {
  1104. if err := mq.PublishDeletedClientPeerUpdate(&extclient); err != nil {
  1105. slog.Error("error setting ext peers: " + err.Error())
  1106. }
  1107. }
  1108. }
  1109. }
  1110. }
  1111. if servercfg.IsDNSMode() {
  1112. logic.SetDNS()
  1113. }
  1114. }
  1115. func CreateDefaultUserPolicies(netID models.NetworkID) {
  1116. if netID.String() == "" {
  1117. return
  1118. }
  1119. if !logic.IsAclExists(fmt.Sprintf("%s.%s", netID, "all-users")) {
  1120. defaultUserAcl := models.Acl{
  1121. ID: fmt.Sprintf("%s.%s", netID, "all-users"),
  1122. Default: true,
  1123. Name: "All Users",
  1124. MetaData: "This policy gives access to everything in the network for an user",
  1125. NetworkID: netID,
  1126. Proto: models.ALL,
  1127. ServiceType: models.Any,
  1128. Port: []string{},
  1129. RuleType: models.UserPolicy,
  1130. Src: []models.AclPolicyTag{
  1131. {
  1132. ID: models.UserAclID,
  1133. Value: "*",
  1134. },
  1135. },
  1136. Dst: []models.AclPolicyTag{{
  1137. ID: models.NodeTagID,
  1138. Value: "*",
  1139. }},
  1140. AllowedDirection: models.TrafficDirectionUni,
  1141. Enabled: true,
  1142. CreatedBy: "auto",
  1143. CreatedAt: time.Now().UTC(),
  1144. }
  1145. logic.InsertAcl(defaultUserAcl)
  1146. }
  1147. if !logic.IsAclExists(fmt.Sprintf("%s.%s-grp", netID, models.NetworkAdmin)) {
  1148. networkAdminGroupID := GetDefaultNetworkAdminGroupID(netID)
  1149. defaultUserAcl := models.Acl{
  1150. ID: fmt.Sprintf("%s.%s-grp", netID, models.NetworkAdmin),
  1151. Name: "Network Admin",
  1152. MetaData: "This Policy allows all network admins to communicate with all gateways",
  1153. Default: true,
  1154. ServiceType: models.Any,
  1155. NetworkID: netID,
  1156. Proto: models.ALL,
  1157. RuleType: models.UserPolicy,
  1158. Src: []models.AclPolicyTag{
  1159. {
  1160. ID: models.UserGroupAclID,
  1161. Value: globalNetworksAdminGroupID.String(),
  1162. },
  1163. {
  1164. ID: models.UserGroupAclID,
  1165. Value: networkAdminGroupID.String(),
  1166. },
  1167. },
  1168. Dst: []models.AclPolicyTag{
  1169. {
  1170. ID: models.NodeTagID,
  1171. Value: fmt.Sprintf("%s.%s", netID, models.GwTagName),
  1172. }},
  1173. AllowedDirection: models.TrafficDirectionUni,
  1174. Enabled: true,
  1175. CreatedBy: "auto",
  1176. CreatedAt: time.Now().UTC(),
  1177. }
  1178. logic.InsertAcl(defaultUserAcl)
  1179. }
  1180. if !logic.IsAclExists(fmt.Sprintf("%s.%s-grp", netID, models.NetworkUser)) {
  1181. networkUserGroupID := GetDefaultNetworkUserGroupID(netID)
  1182. defaultUserAcl := models.Acl{
  1183. ID: fmt.Sprintf("%s.%s-grp", netID, models.NetworkUser),
  1184. Name: "Network User",
  1185. MetaData: "This Policy allows all network users to communicate with all gateways",
  1186. Default: true,
  1187. ServiceType: models.Any,
  1188. NetworkID: netID,
  1189. Proto: models.ALL,
  1190. RuleType: models.UserPolicy,
  1191. Src: []models.AclPolicyTag{
  1192. {
  1193. ID: models.UserGroupAclID,
  1194. Value: globalNetworksUserGroupID.String(),
  1195. },
  1196. {
  1197. ID: models.UserGroupAclID,
  1198. Value: networkUserGroupID.String(),
  1199. },
  1200. },
  1201. Dst: []models.AclPolicyTag{
  1202. {
  1203. ID: models.NodeTagID,
  1204. Value: fmt.Sprintf("%s.%s", netID, models.GwTagName),
  1205. }},
  1206. AllowedDirection: models.TrafficDirectionUni,
  1207. Enabled: true,
  1208. CreatedBy: "auto",
  1209. CreatedAt: time.Now().UTC(),
  1210. }
  1211. logic.InsertAcl(defaultUserAcl)
  1212. }
  1213. }
  1214. func GetUserGroupsInNetwork(netID models.NetworkID) (networkGrps map[models.UserGroupID]models.UserGroup) {
  1215. groups, _ := ListUserGroups()
  1216. networkGrps = make(map[models.UserGroupID]models.UserGroup)
  1217. for _, grp := range groups {
  1218. if _, ok := grp.NetworkRoles[models.AllNetworks]; ok {
  1219. networkGrps[grp.ID] = grp
  1220. continue
  1221. }
  1222. if _, ok := grp.NetworkRoles[netID]; ok {
  1223. networkGrps[grp.ID] = grp
  1224. }
  1225. }
  1226. return
  1227. }
  1228. func AddGlobalNetRolesToAdmins(u *models.User) {
  1229. if u.PlatformRoleID != models.SuperAdminRole && u.PlatformRoleID != models.AdminRole {
  1230. return
  1231. }
  1232. if len(u.UserGroups) == 0 {
  1233. u.UserGroups = make(map[models.UserGroupID]struct{})
  1234. }
  1235. u.UserGroups[globalNetworksAdminGroupID] = struct{}{}
  1236. }
  1237. func GetUserGrpMap() map[models.UserGroupID]map[string]struct{} {
  1238. grpUsersMap := make(map[models.UserGroupID]map[string]struct{})
  1239. users, _ := logic.GetUsersDB()
  1240. for _, user := range users {
  1241. for gID := range user.UserGroups {
  1242. if grpUsers, ok := grpUsersMap[gID]; ok {
  1243. grpUsers[user.UserName] = struct{}{}
  1244. grpUsersMap[gID] = grpUsers
  1245. } else {
  1246. grpUsersMap[gID] = make(map[string]struct{})
  1247. grpUsersMap[gID][user.UserName] = struct{}{}
  1248. }
  1249. }
  1250. }
  1251. return grpUsersMap
  1252. }