diff --git a/api/handlers/userhandler.py b/api/handlers/userhandler.py index 85adca4174d5926cffb356f903976c6145ef24b9..f4fad507b2a63b28d539b4d1beec6faf34fc2570 100644 --- a/api/handlers/userhandler.py +++ b/api/handlers/userhandler.py @@ -7,6 +7,7 @@ from .. import config from .. import validators from ..auth import userauth, always_ok, ROLES from ..dao import containerstorage +from ..dao import noop log = config.log @@ -52,7 +53,11 @@ class UserHandler(base.RequestHandler): self._init_storage() user = self._get_user(_id) permchecker = userauth.default(self, user) - result = permchecker(self.storage.exec_op)('DELETE', _id) + # Check for authZ before cleaning up user permissions + permchecker(noop)('DELETE', _id) + self._cleanup_user_permissions(user.get('_id')) + log.debug('2') + result = self.storage.exec_op('DELETE', _id) if result.deleted_count == 1: return {'deleted': result.deleted_count} else: @@ -98,6 +103,19 @@ class UserHandler(base.RequestHandler): def _init_storage(self): self.storage = containerstorage.ContainerStorage('users', use_object_id=False) + def _cleanup_user_permissions(self, uid): + try: + config.db.collections.delete_many({'curator': uid}) + config.db.groups.update_many({'roles._id': uid}, {'$pull': {'roles' : {'_id': uid}}}) + + query = {'permissions._id': uid} + update = {'$pull': {'permissions' : {'_id': uid}}} + config.db.projects.update_many(query, update) + config.db.sessions.update_many(query, update) + config.db.acquisitions.update_many(query, update) + except: + self.abort(500, 'Site-wide user permissions for {} were unabled to be removed'.format(uid)) + def avatar(self, uid): self._init_storage() self.resolve_avatar(uid, default=self.request.GET.get('default'))