# -*- coding: utf-8 -*-
"""
Each subuser has a set of permissions which specify what parts of the host system it is allowed to access.
"""
#external imports
import collections
import hashlib
#internal imports
from subuserlib.classes.userOwnedObject import UserOwnedObject
from subuserlib.classes.fileBackedObject import FileBackedObject
import subuserlib.permissions
[docs]class Permissions(collections.OrderedDict,UserOwnedObject,FileBackedObject):
def __init__(self,user,initialPermissions,writePath=None):
self.__writePath = writePath
UserOwnedObject.__init__(self,user)
collections.OrderedDict.__init__(self)
self.update(initialPermissions)
[docs] def getWritePath(self):
"""
Return the path to which the permissions object is to be saved.
"""
return self.__writePath
[docs] def getHash(self):
"""
Return the SHA512 hash of the given permissions.
"""
hasher = hashlib.sha512()
hasher.update(subuserlib.permissions.getJSONString(self).encode('utf-8'))
return hasher.hexdigest()
[docs] def applyChanges(self,permissionsToRemove,permissionsToAddOrChange):
for permission in permissionsToRemove:
self[permission] = subuserlib.permissions.defaults[permission]
for permission,value in permissionsToAddOrChange.items():
self[permission] = value
[docs] def save(self):
with self.getUser().getEndUser().get_file(self.__writePath,'w') as fd:
fd.write(subuserlib.permissions.getJSONString(self))
[docs] def describe(self):
def describePermissions(permissions):
for permission in permissions:
subPermissions = subuserlib.permissions.descriptions[permission](self[permission])
if not subPermissions:
continue
firstLine = " - " + permission + ":"
multiline = len(subPermissions) > 1
if multiline:
self.getUser().getRegistry().log(firstLine)
for subPermission in subPermissions:
self.getUser().getRegistry().log(" * "+subPermission)
else:
self.getUser().getRegistry().log(firstLine + " " + subPermissions[0])
def areAnyOfThesePermitted(permissions):
permitted = False
for permission in permissions:
if self[permission]:
permitted = True
return permitted
preludeDescriptions = sum([subuserlib.permissions.descriptions[permission](self[permission]) for permission in subuserlib.permissions.levels[0]["permissions"]],[])
for description in preludeDescriptions:
self.getUser().getRegistry().log(" "+description)
for level in subuserlib.permissions.levels[1:]:
if areAnyOfThesePermitted(level["permissions"]):
self.getUser().getRegistry().log(" "+level["description"])
describePermissions(level["permissions"])