diff --git a/pillar/__init__.py b/pillar/__init__.py index fc24a1ae..76f7c872 100644 --- a/pillar/__init__.py +++ b/pillar/__init__.py @@ -76,6 +76,7 @@ class PillarServer(Eve): 'protected', 'service', 'badger', 'svner', 'urler', } + self._user_roles_indexable: typing.Set[str] = {'demo', 'admin', 'subscriber'} self.app_root = os.path.abspath(app_root) self._load_flask_config() @@ -370,8 +371,16 @@ class PillarServer(Eve): """ for extension in self.pillar_extensions.values(): + indexed_but_not_defined = extension.user_roles_indexable - extension.user_roles + if indexed_but_not_defined: + raise ValueError('Extension %s has roles %s indexable but not in user_roles', + extension.name, indexed_but_not_defined) + self._user_roles.update(extension.user_roles) - self.log.info('Loaded %i user roles from extensions', len(self._user_roles)) + self._user_roles_indexable.update(extension.user_roles_indexable) + + self.log.info('Loaded %i user roles from extensions, %i of which are indexable', + len(self._user_roles), len(self._user_roles_indexable)) def register_static_file_endpoint(self, url_prefix, endpoint_name, static_folder): from pillar.web.staticfile import PillarStaticFile @@ -700,3 +709,7 @@ class PillarServer(Eve): @property def user_roles(self) -> typing.FrozenSet[str]: return frozenset(self._user_roles) + + @property + def user_roles_indexable(self) -> typing.FrozenSet[str]: + return frozenset(self._user_roles_indexable) diff --git a/pillar/api/utils/algolia.py b/pillar/api/utils/algolia.py index a8007496..25ccb337 100644 --- a/pillar/api/utils/algolia.py +++ b/pillar/api/utils/algolia.py @@ -1,14 +1,13 @@ import logging from bson import ObjectId -from flask import current_app +from pillar import current_app from pillar.api.file_storage import generate_link from . import skip_when_testing log = logging.getLogger(__name__) -INDEX_ALLOWED_USER_ROLES = {'admin', 'subscriber', 'demo', 'flamenco-user'} INDEX_ALLOWED_NODE_TYPES = {'asset', 'texture', 'group', 'hdri'} @@ -24,7 +23,7 @@ def algolia_index_user_save(user): return # Strip unneeded roles - index_roles = user_roles.intersection(INDEX_ALLOWED_USER_ROLES) + index_roles = user_roles.intersection(current_app.user_roles_indexable) # Create or update Algolia index for the user index_users.save_object({ diff --git a/pillar/extension.py b/pillar/extension.py index d709fe16..42767102 100644 --- a/pillar/extension.py +++ b/pillar/extension.py @@ -34,6 +34,7 @@ class PillarExtension(object, metaclass=abc.ABCMeta): # Set of user roles used/introduced by this extension. user_roles: typing.Set[str] = set() + user_roles_indexable: typing.Set[str] = set() @property @abc.abstractmethod