user_mgmt.go 36 KB

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