123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- package permission
- import (
- "encoding/json"
- "errors"
- "log"
- "strings"
- db "imuslab.com/arozos/mod/database"
- fs "imuslab.com/arozos/mod/filesystem"
- storage "imuslab.com/arozos/mod/storage"
- "imuslab.com/arozos/mod/utils"
- )
- type PermissionGroup struct {
- Name string
- IsAdmin bool
- DefaultInterfaceModule string
- DefaultStorageQuota int64
- AccessibleModules []string
- StoragePool *storage.StoragePool
- parent *PermissionHandler
- }
- type PermissionHandler struct {
- database *db.Database
- PermissionGroups []*PermissionGroup
- }
- func NewPermissionHandler(database *db.Database) (*PermissionHandler, error) {
- //Create the permission table if it is not exists
- err := database.NewTable("permission")
- if err != nil {
- return &PermissionHandler{}, err
- }
- //Check if administrator permission group exists. If not, create one
- if !database.KeyExists("permission", "group/administrator") {
- database.Write("permission", "group/administrator", "[\"*\"]")
- database.Write("permission", "isadmin/administrator", "true")
- database.Write("permission", "quota/administrator", int64(-1))
- }
- return &PermissionHandler{
- database: database,
- PermissionGroups: []*PermissionGroup{},
- }, nil
- }
- func (h *PermissionHandler) GroupExists(groupName string) bool {
- exists := false
- for _, gp := range h.PermissionGroups {
- if strings.ToLower(groupName) == strings.ToLower(gp.Name) {
- exists = true
- }
- }
- return exists
- }
- func (h *PermissionHandler) LoadPermissionGroupsFromDatabase() error {
- entries, err := h.database.ListTable("permission")
- if err != nil {
- return err
- }
- results := []*PermissionGroup{}
- for _, keypairs := range entries {
- if strings.Contains(string(keypairs[0]), "group/") {
- groupname := strings.Split(string(keypairs[0]), "/")[1]
- groupPermission := []string{}
- originalJSONString := ""
- json.Unmarshal(keypairs[1], &originalJSONString)
- err := json.Unmarshal([]byte(originalJSONString), &groupPermission)
- if err != nil {
- log.Println(err)
- }
- //IsAdmin
- isAdmin := "false"
- h.database.Read("permission", "isadmin/"+groupname, &isAdmin)
- //DefaultStorageQuota
- defaultStorageQuota := int64(0)
- h.database.Read("permission", "quota/"+groupname, &defaultStorageQuota)
- //Get the default interface module
- interfaceModule := "Desktop"
- h.database.Read("permission", "interfaceModule/"+groupname, &interfaceModule)
- results = append(results, &PermissionGroup{
- Name: groupname,
- IsAdmin: (isAdmin == "true"),
- DefaultInterfaceModule: interfaceModule,
- AccessibleModules: groupPermission,
- DefaultStorageQuota: defaultStorageQuota,
- StoragePool: &storage.StoragePool{},
- parent: h,
- })
- }
- }
- h.PermissionGroups = results
- return nil
- }
- //Get the user permission groups
- func (h *PermissionHandler) GetUsersPermissionGroup(username string) ([]*PermissionGroup, error) {
- //Get user permission group name from database
- targetUserGroup := []string{}
- err := h.database.Read("auth", "group/"+username, &targetUserGroup)
- if err != nil {
- return []*PermissionGroup{}, err
- }
- //Parse the results
- permissionGroupNames := targetUserGroup
- //Look for all the avaible permission groups
- results := []*PermissionGroup{}
- for _, gp := range h.PermissionGroups {
- if utils.StringInArray(permissionGroupNames, gp.Name) {
- //Change the pointer to a new varable to it won't get overwritten by the range function
- newPointer := gp
- results = append(results, newPointer)
- }
- }
- return results, nil
- }
- func (h *PermissionHandler) UpdatePermissionGroup(name string, isadmin bool, storageQuota int64, moduleNames []string, interfaceModule string) error {
- if !h.GroupExists(name) {
- return errors.New("Permission group not exists or not loaded")
- }
- //Group exists. Update the values
- for _, thisPG := range h.PermissionGroups {
- if thisPG.Name == name {
- //Update the permission group values in memeory
- thisPG.IsAdmin = isadmin
- thisPG.DefaultStorageQuota = storageQuota
- thisPG.AccessibleModules = moduleNames
- thisPG.DefaultInterfaceModule = interfaceModule
- break
- }
- }
- //Write it to database
- isAdminString := "false"
- if isadmin {
- isAdminString = "true"
- }
- moduleJson, _ := json.Marshal(moduleNames)
- //Update the database values
- h.database.Write("permission", "group/"+name, string(moduleJson))
- h.database.Write("permission", "isadmin/"+name, isAdminString)
- h.database.Write("permission", "quota/"+name, storageQuota)
- h.database.Write("permission", "interfaceModule/"+name, interfaceModule)
- return nil
- }
- func (h *PermissionHandler) NewPermissionGroup(name string, isadmin bool, storageQuota int64, moduleNames []string, interfaceModule string) *PermissionGroup {
- //Create a new storage pool for this permission group
- newPool, err := storage.NewStoragePool([]*fs.FileSystemHandler{}, name)
- if err != nil {
- newPool = &storage.StoragePool{}
- }
- //Create a new permission group
- newGroup := PermissionGroup{
- Name: name,
- IsAdmin: isadmin,
- AccessibleModules: moduleNames,
- DefaultInterfaceModule: interfaceModule,
- DefaultStorageQuota: storageQuota,
- StoragePool: newPool,
- parent: h,
- }
- //Write it to database
- isAdminString := "false"
- if isadmin {
- isAdminString = "true"
- }
- moduleJson, _ := json.Marshal(moduleNames)
- h.database.Write("permission", "group/"+name, string(moduleJson))
- h.database.Write("permission", "isadmin/"+name, isAdminString)
- h.database.Write("permission", "quota/"+name, storageQuota)
- h.database.Write("permission", "interfaceModule/"+name, interfaceModule)
- h.PermissionGroups = append(h.PermissionGroups, &newGroup)
- //Return the newly created group
- return &newGroup
- }
- func (h *PermissionHandler) GetPermissionGroupByNameList(namelist []string) []*PermissionGroup {
- results := []*PermissionGroup{}
- for _, gp := range h.PermissionGroups {
- if utils.StringInArray(namelist, gp.Name) {
- thisPointer := gp
- results = append(results, thisPointer)
- }
- }
- return results
- }
- func (h *PermissionHandler) GetPermissionGroupByName(name string) *PermissionGroup {
- for _, gp := range h.PermissionGroups {
- if name == gp.Name {
- return gp
- }
- }
- return nil
- }
|