Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

generators: fix AdmiAction permission check #106

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

egabancho
Copy link
Member

  • Checking permissions using action.value can lead to undesired situations, changing to use Permission.allow instead.

Example

from invenio_access.permissions import Permission
from invenio_access.utils import get_identity
from invenio_accounts.proxies import current_datastore
from invenio_users_resources.permissions import user_management_action
from invenio_records_permissions.generators import AdminAction

user = current_datastore.get_user_by_id(4)
identity = get_identity(user)
identity.provides
# {Need(method='id', value=4), Need(method='role', value='administration')}

admin_user = AdminAction(user_management_action)
admin_user.needs()
# [Need(method='action', value='administration-moderation')]

for need in identity.provides:
    if need.value == admin_user.action.value:
        print("Match!")
# Doesn't match

Permission(admin_user.action)
# <Permission needs={Need(method='role', value='administration'), Need(method='id', value=1), Need(method='role', value='admin')} excludes=set()>
Permission(admin_user.action).allows(identity)
# True

# Differnt user
user = current_datastore.get_user_by_id(2)
identity = get_identity(user)
identity.provides
# {Need(method='id', value=2)}

Permission(admin_user.action).allows(identity)
# False

Permission issue

If there is a group/role named as the action, administration-moderation, with no permissions associated with it. It will grant access.

user = current_datastore.get_user_by_id(2)
identity = get_identity(user)
identity.provides
#{Need(method='id', value=2), Need(method='role', value='administration-moderation')}

for need in identity.provides:
    if need.value == admin_user.action.value:
        print("Match!")
# Match!

* Checking permissions using `action.value` can lead to undesired
  situations, changing to use `Permission.allow` instead.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant