user_mgmt.go 7.4 KB

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