user_mgmt.go 38 KB

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