2
0

user_mgmt.go 38 KB

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