user_mgmt.go 7.7 KB

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