user_mgmt.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package logic
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/gravitl/netmaker/database"
  6. "github.com/gravitl/netmaker/models"
  7. )
  8. // Pre-Define Permission Templates for default Roles
  9. var SuperAdminPermissionTemplate = models.UserRolePermissionTemplate{
  10. ID: models.SuperAdminRole,
  11. Default: true,
  12. FullAccess: true,
  13. }
  14. var AdminPermissionTemplate = models.UserRolePermissionTemplate{
  15. ID: models.AdminRole,
  16. Default: true,
  17. FullAccess: true,
  18. }
  19. var NetworkAdminPermissionTemplate = models.UserRolePermissionTemplate{
  20. ID: models.NetworkAdmin,
  21. Default: true,
  22. IsNetworkRole: true,
  23. FullAccess: true,
  24. NetworkLevelAccess: make(map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope),
  25. }
  26. var NetworkUserPermissionTemplate = models.UserRolePermissionTemplate{
  27. ID: models.NetworkUser,
  28. Default: true,
  29. FullAccess: false,
  30. DenyDashboardAccess: true,
  31. NetworkLevelAccess: make(map[models.RsrcType]map[models.RsrcID]models.RsrcPermissionScope),
  32. }
  33. func UserRolesInit() {
  34. d, _ := json.Marshal(SuperAdminPermissionTemplate)
  35. database.Insert(SuperAdminPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  36. d, _ = json.Marshal(AdminPermissionTemplate)
  37. database.Insert(AdminPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  38. d, _ = json.Marshal(NetworkAdminPermissionTemplate)
  39. database.Insert(NetworkAdminPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  40. d, _ = json.Marshal(NetworkUserPermissionTemplate)
  41. database.Insert(NetworkUserPermissionTemplate.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  42. }
  43. // ListRoles - lists user roles permission templates
  44. func ListRoles() ([]models.UserRolePermissionTemplate, error) {
  45. data, err := database.FetchRecords(database.USER_PERMISSIONS_TABLE_NAME)
  46. if err != nil {
  47. return []models.UserRolePermissionTemplate{}, err
  48. }
  49. userRoles := []models.UserRolePermissionTemplate{}
  50. for _, dataI := range data {
  51. userRole := models.UserRolePermissionTemplate{}
  52. err := json.Unmarshal([]byte(dataI), &userRole)
  53. if err != nil {
  54. continue
  55. }
  56. userRoles = append(userRoles, userRole)
  57. }
  58. return userRoles, nil
  59. }
  60. // CreateRole - inserts new role into DB
  61. func CreateRole(r models.UserRolePermissionTemplate) error {
  62. // check if role already exists
  63. if r.ID.String() == "" {
  64. return errors.New("role id cannot be empty")
  65. }
  66. _, err := database.FetchRecord(database.USER_PERMISSIONS_TABLE_NAME, r.ID.String())
  67. if err == nil {
  68. return errors.New("role already exists")
  69. }
  70. d, err := json.Marshal(r)
  71. if err != nil {
  72. return err
  73. }
  74. return database.Insert(r.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  75. }
  76. // GetRole - fetches role template by id
  77. func GetRole(roleID string) (models.UserRolePermissionTemplate, error) {
  78. // check if role already exists
  79. data, err := database.FetchRecord(database.USER_PERMISSIONS_TABLE_NAME, roleID)
  80. if err != nil {
  81. return models.UserRolePermissionTemplate{}, errors.New("role already exists")
  82. }
  83. ur := models.UserRolePermissionTemplate{}
  84. err = json.Unmarshal([]byte(data), &ur)
  85. if err != nil {
  86. return ur, err
  87. }
  88. return ur, nil
  89. }
  90. // UpdateRole - updates role template
  91. func UpdateRole(r models.UserRolePermissionTemplate) error {
  92. if r.ID.String() == "" {
  93. return errors.New("role id cannot be empty")
  94. }
  95. _, err := database.FetchRecord(database.USER_PERMISSIONS_TABLE_NAME, r.ID.String())
  96. if err != nil {
  97. return err
  98. }
  99. d, err := json.Marshal(r)
  100. if err != nil {
  101. return err
  102. }
  103. return database.Insert(r.ID.String(), string(d), database.USER_PERMISSIONS_TABLE_NAME)
  104. }
  105. // DeleteRole - deletes user role
  106. func DeleteRole(rid models.UserRole) error {
  107. if rid.String() == "" {
  108. return errors.New("role id cannot be empty")
  109. }
  110. users, err := GetUsersDB()
  111. if err != nil {
  112. return err
  113. }
  114. for _, user := range users {
  115. if user.UserGroup != "" {
  116. ug, err := GetUserGroup(user.UserGroup)
  117. if err == nil {
  118. for _, networkRole := range ug.NetworkRoles {
  119. if networkRole == rid {
  120. err = errors.New("role cannot be deleted as active user groups are using this role")
  121. return err
  122. }
  123. }
  124. }
  125. }
  126. if user.PlatformRoleID == rid {
  127. err = errors.New("active roles cannot be deleted.switch existing users to a new role before deleting")
  128. return err
  129. }
  130. for _, networkRole := range user.NetworkRoles {
  131. if networkRole == rid {
  132. err = errors.New("active roles cannot be deleted.switch existing users to a new role before deleting")
  133. return err
  134. }
  135. }
  136. }
  137. return database.DeleteRecord(database.USER_PERMISSIONS_TABLE_NAME, rid.String())
  138. }
  139. // CreateUserGroup - creates new user group
  140. func CreateUserGroup(g models.UserGroup) error {
  141. // check if role already exists
  142. if g.ID == "" {
  143. return errors.New("group id cannot be empty")
  144. }
  145. _, err := database.FetchRecord(database.USER_GROUPS_TABLE_NAME, g.ID)
  146. if err == nil {
  147. return errors.New("group already exists")
  148. }
  149. d, err := json.Marshal(g)
  150. if err != nil {
  151. return err
  152. }
  153. return database.Insert(g.ID, string(d), database.USER_GROUPS_TABLE_NAME)
  154. }
  155. // GetUserGroup - fetches user group
  156. func GetUserGroup(gid models.UserGroupID) (models.UserGroup, error) {
  157. d, err := database.FetchRecord(database.USER_GROUPS_TABLE_NAME, gid.String())
  158. if err == nil {
  159. return models.UserGroup{}, err
  160. }
  161. var ug models.UserGroup
  162. err = json.Unmarshal([]byte(d), &ug)
  163. if err != nil {
  164. return ug, err
  165. }
  166. return ug, nil
  167. }
  168. // ListUserGroups - lists user groups
  169. func ListUserGroups() ([]models.UserGroup, error) {
  170. data, err := database.FetchRecords(database.USER_GROUPS_TABLE_NAME)
  171. if err != nil {
  172. return []models.UserGroup{}, err
  173. }
  174. userGroups := []models.UserGroup{}
  175. for _, dataI := range data {
  176. userGroup := models.UserGroup{}
  177. err := json.Unmarshal([]byte(dataI), &userGroup)
  178. if err != nil {
  179. continue
  180. }
  181. userGroups = append(userGroups, userGroup)
  182. }
  183. return userGroups, nil
  184. }
  185. // UpdateUserGroup - updates new user group
  186. func UpdateUserGroup(g models.UserGroup) error {
  187. // check if group exists
  188. if g.ID == "" {
  189. return errors.New("group id cannot be empty")
  190. }
  191. _, err := database.FetchRecord(database.USER_GROUPS_TABLE_NAME, g.ID)
  192. if err != nil {
  193. return err
  194. }
  195. d, err := json.Marshal(g)
  196. if err != nil {
  197. return err
  198. }
  199. return database.Insert(g.ID, string(d), database.USER_GROUPS_TABLE_NAME)
  200. }
  201. // DeleteUserGroup - deletes user group
  202. func DeleteUserGroup(gid models.UserGroupID) error {
  203. users, err := GetUsersDB()
  204. if err != nil {
  205. return err
  206. }
  207. for _, user := range users {
  208. if user.UserGroup == gid {
  209. err = errors.New("role cannot be deleted as active user groups are using this role")
  210. return err
  211. }
  212. }
  213. return database.DeleteRecord(database.USER_GROUPS_TABLE_NAME, gid.String())
  214. }
  215. func HasNetworkRsrcScope(permissionTemplate models.UserRolePermissionTemplate, netid string, rsrcType models.RsrcType, rsrcID models.RsrcID, op string) bool {
  216. if permissionTemplate.FullAccess {
  217. return true
  218. }
  219. rsrcScope, ok := permissionTemplate.NetworkLevelAccess[rsrcType]
  220. if !ok {
  221. return false
  222. }
  223. _, ok = rsrcScope[rsrcID]
  224. return ok
  225. }