user_mgmt.go 35 KB

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