diff --git a/.copyright.tmpl b/.copyright.tmpl new file mode 100644 index 0000000..b9159cb --- /dev/null +++ b/.copyright.tmpl @@ -0,0 +1,5 @@ +Copyright (C) 2024 CESNET z.s.p.o. + +oarepo-oidc-einfra is free software; you can redistribute it and/or +modify it under the terms of the MIT License; see LICENSE file for more +details. diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..07b2805 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2023 CESNET. +# +# CESNET-OpenID-Remote is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. + +root = true + +[*] +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +charset = utf-8 + +# Python files +[*.py] +indent_size = 4 +# isort plugin configuration +known_first_party = cesnet_openid_remote +multi_line_output = 2 +default_section = THIRDPARTY +skip = .eggs + +# RST files (used by sphinx) +[*.rst] +indent_size = 4 + +# CSS, HTML, JS, JSON, YML +[*.{css,html,js,json,yml}] +indent_size = 2 + +# Matches the exact files either package.json or .github/workflows/*.yml +[{package.json,.github/workflows/*.yml}] +indent_size = 2 + +# Dockerfile +[Dockerfile] +indent_size = 4 diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..639dbbf --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,91 @@ +name: Build and test + +on: + workflow_call: + inputs: + oarepo: + description: OARepo version (11, 12, ...) + required: true + default: "12" + type: string + +env: + OAREPO_VERSION: ${{ inputs.oarepo }} + +jobs: + build: + runs-on: ubuntu-latest + services: + postgres: + image: postgres + env: + POSTGRES_PASSWORD: postgres + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 + + steps: + - name: Show oarepo version + run: | + echo "OAREPO_VERSION: >>>$OAREPO_VERSION<<< >>>${{ inputs.oarepo }}<<<" + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: "3.12" + - name: Cache pip + uses: actions/cache@v3 + with: + # This path is specific to Ubuntu + path: ~/.cache/pip + # Look to see if there is a cache hit for the corresponding requirements file + key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + ${{ runner.os }}- + + - name: Configure sysctl limits + run: | + sudo swapoff -a + sudo sysctl -w vm.swappiness=1 + sudo sysctl -w fs.file-max=262144 + sudo sysctl -w vm.max_map_count=262144 + + - name: Runs Opensearch + uses: ankane/setup-opensearch@v1 + with: + plugins: analysis-icu + + - name: Start Redis + uses: supercharge/redis-github-action@1.7.0 + with: + redis-version: ${{ matrix.redis-version }} + + - name: Run tests + run: | + ./run-tests.sh + + + - name: Build package to publish + run: | + .venv/bin/python setup.py sdist bdist_wheel + + - name: Freeze packages + run: | + .venv/bin/pip freeze > requirements.txt + + - name: Archive production artifacts + uses: actions/upload-artifact@v3 + with: + name: dist + path: dist + + - name: Archive production artifacts + uses: actions/upload-artifact@v3 + with: + name: requirements.txt + path: requirements.txt diff --git a/.github/workflows/manual.yaml b/.github/workflows/manual.yaml new file mode 100644 index 0000000..841c158 --- /dev/null +++ b/.github/workflows/manual.yaml @@ -0,0 +1,15 @@ +name: Dispatch + +on: + workflow_dispatch: + inputs: + oarepo: + description: OARepo version (11, 12, ...) + required: true + default: 12 + +jobs: + build: + uses: ./.github/workflows/build.yaml + with: + oarepo: ${{ github.event.inputs.oarepo }} diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml new file mode 100644 index 0000000..8d647e7 --- /dev/null +++ b/.github/workflows/push.yaml @@ -0,0 +1,37 @@ +name: Build, test and publish + +on: push + +permissions: + id-token: write + contents: read + +jobs: + + build12: + uses: ./.github/workflows/build.yaml + with: + oarepo: "12" + + publish: + runs-on: ubuntu-latest + needs: build12 + steps: + - name: Use built artifacts + uses: actions/download-artifact@v3 + with: + name: dist + path: dist + + - name: List files + run: | + ls -la + ls -la dist + + - name: Publish package + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@release/v1 + with: + skip_existing: true + user: __token__ + password: ${{ secrets.PYPI_PASSWORD }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ad56fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,68 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# Idea software family +.idea/ + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover + +# Translations +*.mo + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Vim swapfiles +.*.sw? +.venv/ +.env + +.DS_Store + +.perun_passwd diff --git a/AUTHORS.rst b/AUTHORS.rst new file mode 100644 index 0000000..47de277 --- /dev/null +++ b/AUTHORS.rst @@ -0,0 +1,14 @@ +.. + Copyright (C) 2023 CESNET. + + CESNET-OpenID-Remote is free software; you can redistribute it and/or + modify it under the terms of the MIT License; see LICENSE file for more + details. + +Authors +======= + +CESNET OIDC Auth backend for OARepo + +- Miroslav Bauer +- Juraj Trappl diff --git a/CHANGES.rst b/CHANGES.rst new file mode 100644 index 0000000..353ddb4 --- /dev/null +++ b/CHANGES.rst @@ -0,0 +1,13 @@ +.. + Copyright (C) 2023 CESNET. + + CESNET-OpenID-Remote is free software; you can redistribute it and/or + modify it under the terms of the MIT License; see LICENSE file for more + details. + +Changes +======= + +Version 0.1.0 (released TBD) + +- Initial public release. diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst new file mode 100644 index 0000000..00c3aef --- /dev/null +++ b/CONTRIBUTING.rst @@ -0,0 +1,118 @@ +Contributing +============ + +Contributions are welcome, and they are greatly appreciated! Every +little bit helps, and credit will always be given. + +Types of Contributions +---------------------- + +Report Bugs +~~~~~~~~~~~ + +Report bugs at https://github.com/oarepo/cesnet-openid-remote/issues. + +If you are reporting a bug, please include: + +* Your operating system name and version. +* Any details about your local setup that might be helpful in troubleshooting. +* Detailed steps to reproduce the bug. + +Fix Bugs +~~~~~~~~ + +Look through the GitHub issues for bugs. Anything tagged with "bug" +is open to whoever wants to implement it. + +Implement Features +~~~~~~~~~~~~~~~~~~ + +Look through the GitHub issues for features. Anything tagged with "feature" +is open to whoever wants to implement it. + +Write Documentation +~~~~~~~~~~~~~~~~~~~ + +CESNET-OpenID-Remote could always use more documentation, whether as part of the +official CESNET-OpenID-Remote docs, in docstrings, or even on the web in blog posts, +articles, and such. + +Submit Feedback +~~~~~~~~~~~~~~~ + +The best way to send feedback is to file an issue at +https://github.com/oarepo/cesnet-openid-remote/issues. + +If you are proposing a feature: + +* Explain in detail how it would work. +* Keep the scope as narrow as possible, to make it easier to implement. +* Remember that this is a volunteer-driven project, and that contributions + are welcome :) + +Get Started! +------------ + +Ready to contribute? Here's how to set up `cesnet-openid-remote` for local development. + +1. Fork the `oarepo/cesnet-openid-remote` repo on GitHub. +2. Clone your fork locally: + + .. code-block:: console + + $ git clone git@github.com:your_name_here/cesnet-openid-remote.git + +3. Install your local copy into a virtualenv. Assuming you have + virtualenvwrapper installed, this is how you set up your fork for local + development: + + .. code-block:: console + + $ mkvirtualenv cesnet-openid-remote + $ cd cesnet-openid-remote/ + $ pip install -e .[all] + +4. Create a branch for local development: + + .. code-block:: console + + $ git checkout -b name-of-your-bugfix-or-feature + + Now you can make your changes locally. + +5. When you're done making changes, check that your changes pass tests: + + .. code-block:: console + + $ ./run-tests.sh + + The tests will provide you with test coverage and also check PEP8 + (code style), PEP257 (documentation), flake8 as well as build the Sphinx + documentation and run doctests. + +6. Commit your changes and push your branch to GitHub: + + .. code-block:: console + + $ git add . + $ git commit -s + -m "component: title without verbs" + -m "* NEW Adds your new feature." + -m "* FIX Fixes an existing issue." + -m "* BETTER Improves and existing feature." + -m "* Changes something that should not be visible in release notes." + $ git push origin name-of-your-bugfix-or-feature + +7. Submit a pull request through the GitHub website. + +Pull Request Guidelines +----------------------- + +Before you submit a pull request, check that it meets these guidelines: + +1. The pull request should include tests and must not decrease test coverage. +2. If the pull request adds functionality, the docs should be updated. Put + your new functionality into a function with a docstring. +3. The pull request should work for Python 3.6, 3.7, 3.8 and 3.9. Check + https://github.com/inveniosoftware/oarepo/cesnet-openid-remote/actions?query=event%3Apull_request + and make sure that the tests pass for all supported Python versions. diff --git a/INSTALL.rst b/INSTALL.rst new file mode 100644 index 0000000..610ea7a --- /dev/null +++ b/INSTALL.rst @@ -0,0 +1,8 @@ +Installation +============ + +oarepo-oidc-einfra is on PyPI so all you need is: + +.. code-block:: console + + $ pip install oarepo-oidc-einfra diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..4664035 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) 2023 CESNET. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..dff6aec --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2023 CESNET. +# +# CESNET-OpenID-Remote is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. + +# TODO: Generate this manifest file by running the following commands: +# (please sort the lines in this file after running below commands) +# +# git init +# git add -A +# pip install -e .[all] +# check-manifest -u + +include .dockerignore +include .editorconfig +include .tx/config +prune docs/_build +recursive-include .github/workflows *.yml +recursive-include cesnet_openid_remote/translations *.po *.pot *.mo +include *.rst +include *.sh +include *.txt +include LICENSE +include pytest.ini +recursive-exclude example *.py +recursive-exclude example *.sh +recursive-exclude tests *.json +recursive-exclude examples *.db +recursive-exclude examples *.sh +include *.yml +recursive-include cesnet_openid_remote *.py +recursive-exclude tests * +recursive-exclude examples * +recursive-exclude .github * + +recursive-exclude docs * diff --git a/README.md b/README.md new file mode 100644 index 0000000..16854a6 --- /dev/null +++ b/README.md @@ -0,0 +1,95 @@ +# E-infra authentication and authorization module for InvenioRDM + +This remote backend adds support for Czech e-infra AAI solution - login.e-infra.cz +allowing all members of czech academic community can use their home institution +credentials to log in. + +## Installation + +Add the module to your repository's pyproject.toml: + +``` toml + +dependencies = [ + "oarepo-oidc-einfra>=1.0.0", + # ... +] +``` + +## Configuration + +1. Register a new application with e-infra OIDC Provider at + https://spadmin.e-infra.cz/. When registering the application + ensure that the *Redirect URI* points to `https://:5000/oauth/authorized/e-infra/` + + +![General parameters](docs/settings1.png) + + +![OIDC parameters](docs/settings2.png) + +In OIDC parameters, you need to set at least the following scopes: +- openid +- profile +- email +- eduperson_entitlement +- isCesnetEligibleLastSeen +- organization + + +![Perun-specific parameters](docs/settings3.png) + + +2. Grab the *Client ID* and *Client Secret* after registering the application + and add them to your ENVIRONMENT variables: +```python +INVENIO_EINFRA_CONSUMER_KEY=*Client ID* +INVENIO_EINFRA_CONSUMER_SECRET=*Client Secret* +``` +3. Add the remote application to the site's `invenio.cfg`: + +```python +from oarepo_oidc_einfra import EINFRA_LOGIN_APP + +OAUTHCLIENT_REMOTE_APPS = { + "e-infra": EINFRA_LOGIN_APP +} +``` + +4. Add the e-infra public key to your invenio.cfg or environment variables: +```python +EINFRA_RSA_KEY=b'-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmho5h/lz6USUUazQaVT3\nPHloIk/Ljs2vZl/RAaitkXDx6aqpl1kGpS44eYJOaer4oWc6/QNaMtynvlSlnkuW\nrG765adNKT9sgAWSrPb81xkojsQabrSNv4nIOWUQi0Tjh0WxXQmbV+bMxkVaElhd\nHNFzUfHv+XqI8Hkc82mIGtyeMQn+VAuZbYkVXnjyCwwa9RmPOSH+O4N4epDXKk1V\nK9dUxf/rEYbjMNZGDva30do0mrBkU8W3O1mDVJSSgHn4ejKdGNYMm0JKPAgCWyPW\nJDoL092ctPCFlUMBBZ/OP3omvgnw0GaWZXxqSqaSvxFJkqCHqLMwpxmWTTAgEvAb\nnwIDAQAB\n-----END PUBLIC KEY-----\n' +``` + +5. Add the VO, communities group, api url and others to your invenio.cfg or environment variables: + +```python + +EINFRA_SERVICE_USERNAME = "username" +"""Username of the service in the E-INFRA Perun.""" + +EINFRA_SERVICE_PASSWORD = "password" +"""Password of the service in the E-INFRA Perun.""" + +EINFRA_SERVICE_ID = 0 +"""Internal ID of the service (whose username and password are above) in the E-INFRA Perun.""" + +EINFRA_REPOSITORY_VO_ID = 0 +"""Internal ID of the VO in the E-INFRA Perun that represents the repository.""" + +EINFRA_COMMUNITIES_GROUP_ID = 0 +"""Internal ID of the group in the E-INFRA Perun that represents the communities.""" + +EINFRA_REPOSITORY_FACILITY_ID = 0 +"""Internal ID of the facility in the E-INFRA Perun that represents the repository.""" + +EINFRA_CAPABILITIES_ATTRIBUTE_ID = 0 +"""Internal ID of the attribute in the E-INFRA Perun that represents the capabilities.""" + +EINFRA_SYNC_SERVICE_ID = 0 +"""Internal ID of the service in the E-INFRA Perun that is responsible for synchronization +(creating and pushing dumps with resources and users).""" + +``` + +6. Start the server and go to the login page https://127.0.0.1:5000/login/ diff --git a/docs/jwk2pem.py b/docs/jwk2pem.py new file mode 100644 index 0000000..4319a64 --- /dev/null +++ b/docs/jwk2pem.py @@ -0,0 +1,19 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""A helper code to convert JWK (retrieved from oidc) to PEM format.""" +import jwcrypto.jwk + +key_dict = { + "e": "AQAB", + "kty": "RSA", + "n": "mho5h_lz6USUUazQaVT3PHloIk_Ljs2vZl_RAaitkXDx6aqpl1kGpS44eYJOaer4oWc6_QNaMtynvlSlnkuWrG765adNKT9sgAWSrPb81xkojsQabrSNv4nIOWUQi0Tjh0WxXQmbV-bMxkVaElhdHNFzUfHv-XqI8Hkc82mIGtyeMQn-VAuZbYkVXnjyCwwa9RmPOSH-O4N4epDXKk1VK9dUxf_rEYbjMNZGDva30do0mrBkU8W3O1mDVJSSgHn4ejKdGNYMm0JKPAgCWyPWJDoL092ctPCFlUMBBZ_OP3omvgnw0GaWZXxqSqaSvxFJkqCHqLMwpxmWTTAgEvAbnw", +} + +key = jwcrypto.jwk.JWK(**key_dict) +pem = key.export_to_pem(False, False) +print(pem) diff --git a/docs/settings1.png b/docs/settings1.png new file mode 100644 index 0000000..0de8240 Binary files /dev/null and b/docs/settings1.png differ diff --git a/docs/settings2.png b/docs/settings2.png new file mode 100644 index 0000000..56cc015 Binary files /dev/null and b/docs/settings2.png differ diff --git a/docs/settings3.png b/docs/settings3.png new file mode 100644 index 0000000..ac6e913 Binary files /dev/null and b/docs/settings3.png differ diff --git a/format.sh b/format.sh new file mode 100755 index 0000000..affce0b --- /dev/null +++ b/format.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +files="$( (git status --short| grep '^?' | cut -d\ -f2- && git ls-files ) | egrep ".*[.]py" | sort -u )" + +black --target-version py310 "$files" +autoflake -r --in-place --remove-all-unused-imports "$files" +isort "$files" --profile black + +python -m licenseheaders -t .copyright.tmpl -cy -f "$files" diff --git a/oarepo_oidc_einfra/__init__.py b/oarepo_oidc_einfra/__init__.py new file mode 100644 index 0000000..6165cab --- /dev/null +++ b/oarepo_oidc_einfra/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# + +"""E-INFRA OIDC Auth backend for OARepo""" + +from .remote import EINFRA_LOGIN_APP + +__all__ = ("EINFRA_LOGIN_APP",) diff --git a/oarepo_oidc_einfra/communities.py b/oarepo_oidc_einfra/communities.py new file mode 100644 index 0000000..e6cb02d --- /dev/null +++ b/oarepo_oidc_einfra/communities.py @@ -0,0 +1,139 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""Helper functions for working with communities.""" +from collections import namedtuple +from functools import cached_property +from typing import Dict, Set + +from flask import current_app +from invenio_access.permissions import system_identity +from invenio_accounts.models import User +from invenio_communities.communities.records.api import Community +from invenio_communities.members.records.models import MemberModel +from invenio_communities.proxies import current_communities +from invenio_db import db +from marshmallow import ValidationError +from sqlalchemy import select + +CommunityRole = namedtuple("CommunityRole", ["community_id", "role"]) +"""A named tuple representing a community and a role.""" + + +class CommunitySupport: + """A support class for working with communities and their members.""" + + def __init__(self): + pass + + @cached_property + def slug_to_id(self) -> Dict[str, str]: + """ + Returns a mapping of community slugs to their ids. + """ + return { + row[1]: str(row[0]) + for row in db.session.execute( + select(Community.model_cls.id, Community.model_cls.slug) + ) + } + + @cached_property + def all_community_roles(self) -> Set[CommunityRole]: + """ + Returns a set of all community roles (pair of community id, role name) known to the repository. + + :return: a set of all community roles known to the repository + """ + repository_comunity_roles = set() + community_roles = self.role_names + + for community in Community.model_cls.query.all(): + for role in community_roles: + repository_comunity_roles.add(CommunityRole(community.id, role)) + return repository_comunity_roles + + @cached_property + def role_names(self) -> Set[str]: + """ + Returns a set of all known community role names, as configured inside the invenio.cfg + :return: a set of all known community role names + """ + return {role["name"] for role in current_app.config["COMMUNITIES_ROLES"]} + + @classmethod + def set_user_community_membership( + cls, user: User, new_community_roles: Set[CommunityRole] + ) -> None: + """Set user membership based on the new community roles. + + The previous community roles, not present in new_community_roles, are removed. + """ + current_community_roles = cls.get_user_community_membership(user) + + for community_id, role in new_community_roles - current_community_roles: + cls._add_user_community_membership(community_id, role, user) + + community_ids = { + r.community_id for r in current_community_roles - new_community_roles + } + for community_id in community_ids: + try: + cls._remove_user_community_membership(community_id, user) + except ValidationError as e: + # This is a case when the user is the last member of a community - in this case he can not be removed + current_app.logger.error( + f"Failed to remove user {user.id} from community {community_id}: {e}" + ) + + @classmethod + def get_user_community_membership(cls, user) -> Set[CommunityRole]: + """Get user's actual community roles. + + :param user: User object + """ + ret = set() + for row in db.session.execute( + select([MemberModel.community_id, MemberModel.role]).where( + MemberModel.user_id == user.id + ) + ): + ret.add(CommunityRole(row.community_id, row.role)) + + return ret + + @classmethod + def _add_user_community_membership( + cls, community_id: str, community_role: str, user: User + ) -> None: + """ + Add user to a community with a given role. + + :param community_id: id of the community + :param community_role: community role + :param user: user object + :return: A membership result item from service + """ + data = { + "role": community_role, + "members": [{"type": "user", "id": str(user.id)}], + } + return current_communities.service.members.add( + system_identity, community_id, data + ) + + @classmethod + def _remove_user_community_membership(cls, community_id, user) -> None: + """ + Remove user from a community with a given role. + + :param community_id: id of the community + :param user: user object + :return: + """ + data = {"members": [{"type": "user", "id": str(user.id)}]} + current_communities.service.members.delete(system_identity, community_id, data) diff --git a/oarepo_oidc_einfra/config.py b/oarepo_oidc_einfra/config.py new file mode 100644 index 0000000..479d1ce --- /dev/null +++ b/oarepo_oidc_einfra/config.py @@ -0,0 +1,54 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# + +EINFRA_COMMUNITY_SYNCHRONIZATION = True +"""Synchronize community to E-Infra Perun when community is created.""" + +EINFRA_ENTITLEMENT_NAMESPACES = ["geant"] +"""URN prefix for capabilities that can represent community roles.""" + +EINFRA_ENTITLEMENT_COMMUNITIES_GROUP_PARTS = [["cesnet.cz", "res", "communities"]] +"""Parts of the entitlement URN name that represent communities.""" + +EINFRA_DUMP_DATA_URL = "s3://einfra-dump-bucket" +"""A place where the e-infra dump data will be stored when uploaded.""" + +EINFRA_API_URL = "https://perun-api.e-infra.cz" +"""URL of the E-INFRA Perun API.""" + +EINFRA_RSA_KEY = b"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmho5h/lz6USUUazQaVT3\nPHloIk/Ljs2vZl/RAaitkXDx6aqpl1kGpS44eYJOaer4oWc6/QNaMtynvlSlnkuW\nrG765adNKT9sgAWSrPb81xkojsQabrSNv4nIOWUQi0Tjh0WxXQmbV+bMxkVaElhd\nHNFzUfHv+XqI8Hkc82mIGtyeMQn+VAuZbYkVXnjyCwwa9RmPOSH+O4N4epDXKk1V\nK9dUxf/rEYbjMNZGDva30do0mrBkU8W3O1mDVJSSgHn4ejKdGNYMm0JKPAgCWyPW\nJDoL092ctPCFlUMBBZ/OP3omvgnw0GaWZXxqSqaSvxFJkqCHqLMwpxmWTTAgEvAb\nnwIDAQAB\n-----END PUBLIC KEY-----\n" +"""Public RSA key for verifying the OIDC token signature.""" + +# +# At least the following should be sent in your invenio.cfg +# + +# EINFRA_SERVICE_USERNAME = "username" +# """Username of the service in the E-INFRA Perun.""" + +# EINFRA_SERVICE_PASSWORD = "password" +# """Password of the service in the E-INFRA Perun.""" + +# EINFRA_SERVICE_ID = 0 +# """Internal ID of the service (whose username and password are above) in the E-INFRA Perun.""" + +# EINFRA_REPOSITORY_VO_ID = 0 +# """Internal ID of the VO in the E-INFRA Perun that represents the repository.""" + +# EINFRA_COMMUNITIES_GROUP_ID = 0 +# """Internal ID of the group in the E-INFRA Perun that represents the communities.""" + +# EINFRA_REPOSITORY_FACILITY_ID = 0 +# """Internal ID of the facility in the E-INFRA Perun that represents the repository.""" + +# EINFRA_CAPABILITIES_ATTRIBUTE_ID = 0 +# """Internal ID of the attribute in the E-INFRA Perun that represents the capabilities.""" + +# EINFRA_SYNC_SERVICE_ID = 0 +# """Internal ID of the service in the E-INFRA Perun that is responsible for synchronization +# (creating and pushing dumps with resources and users).""" diff --git a/oarepo_oidc_einfra/ext.py b/oarepo_oidc_einfra/ext.py new file mode 100644 index 0000000..67a438a --- /dev/null +++ b/oarepo_oidc_einfra/ext.py @@ -0,0 +1,62 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""A flask extension for E-INFRA OIDC authentication.""" + +from flask import current_app +from invenio_communities.communities.services.components import \ + DefaultCommunityComponents + +from oarepo_oidc_einfra.perun import PerunLowLevelAPI +from oarepo_oidc_einfra.services.components.aai_communities import CommunityAAIComponent + + +class EInfraOIDCApp: + def __init__(self, app=None): + """Creates the extension.""" + if app: + self.init_app(app) + + def init_app(self, app): + """Adds the extension to the app and loads initial configuration.""" + app.extensions["einfra-oidc"] = self + self.init_config(app) + + def init_config(self, app): + """Loads the default configuration.""" + + self.register_sync_component_to_community_service(app) + + # sets the default configuration values + from . import config + + for k in dir(config): + if k.startswith("EINFRA_"): + app.config.setdefault(k, getattr(config, k)) + + def register_sync_component_to_community_service(self, app): + """Registers a component to the community service. + + This component is responsible for synchronizing the community to the E-INFRA Perun. + """ + communities_components = app.config.get("COMMUNITIES_SERVICE_COMPONENTS", None) + if isinstance(communities_components, list): + communities_components.append(CommunityAAIComponent) + elif not communities_components: + app.config["COMMUNITIES_SERVICE_COMPONENTS"] = [ + CommunityAAIComponent, + *DefaultCommunityComponents, + ] + + def perun_api(self): + + return PerunLowLevelAPI( + base_url=current_app.config["EINFRA_API_URL"], + service_id=current_app.config["EINFRA_SERVICE_ID"], + service_username=current_app.config["EINFRA_SERVICE_USERNAME"], + service_password=current_app.config["EINFRA_SERVICE_PASSWORD"], + ) diff --git a/oarepo_oidc_einfra/mutex.py b/oarepo_oidc_einfra/mutex.py new file mode 100644 index 0000000..a1b6aa4 --- /dev/null +++ b/oarepo_oidc_einfra/mutex.py @@ -0,0 +1,111 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +""" +An implementation of a mutex over the cache. Note: if you have multiple redis caches, +you need to implement a distributed lock instead of this simple implementation to have +a mutex that works in all cases of disaster scenarios. +""" +import functools +import secrets +import threading +import time +from random import random + +from invenio_cache import current_cache + + +class CacheMutex: + """ + A simple mutex implementation using the cache. + + Because propagation from master cache server to slaves might be asynchronous and + messages might be lost in case when master responds before the slave is updated, + this mutex is not reliable in case of a disaster. + + To be able to handle these cases, you would need connection both to the master and + slaves and implement a distributed lock such as Redlock algorithm for redis. + """ + + def __init__(self, key, timeout=3600, tries=10, wait_time=120): + """Creates the mutex. + + :param key: The key inside cache where the mutex data are stored. + :param timeout: The mutex will be released automatically after this time. + :param tries: The number of tries to acquire the lock if it is locked. + :param wait_time: The time to wait between the tries. + + Usage: + + with CacheMutex("my-mutex-key"): + # do something that needs to be protected by the mutex + """ + self.key = key + self.value = secrets.token_hex(32) + self.timeout = timeout + self.tries = tries + self.wait_time = wait_time + + def __enter__(self): + """Acquires the mutex.""" + for k in range(self.tries): + if current_cache.cache.add(self.key, self.value, timeout=self.timeout): + # sanity check + if current_cache.cache.get(self.key) != self.value: + continue + return + # add random to desynchronize + time.sleep(self.wait_time * 0.9 + self.wait_time * 0.1 * random()) + raise ValueError( + f"Could not acquire mutex for {self.tries} times, " + f"waiting {self.wait_time} seconds each time" + ) + + def __exit__(self, exc_type, exc_value, traceback): + """Releases the mutex.""" + if current_cache.cache.get(self.key) == self.value: + current_cache.cache.delete(self.key) + + +mutex_thread_local = threading.local() +"""make the mutex below reentrant within the same thread""" + + +def mutex(key, timeout=3600, tries=10, wait_time=120): + """ + A decorator that creates a mutex for a function. + + :param key: The key inside cache where the mutex data are stored. + :param timeout: The mutex will be released automatically after this time. + :param tries: The number of tries to acquire the lock if it is locked. + :param wait_time: The time to wait between the tries. + + Within the same thread, the mutex with the same key is re-entrant. + + Usage: + + @mutex("my-mutex-key") + def my_function(): + # do something that needs to be protected by the mutex + """ + + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(mutex_thread_local, key): + setattr(mutex_thread_local, key, True) + try: + with CacheMutex(key, timeout, tries, wait_time): + return func(*args, **kwargs) + finally: + delattr(mutex_thread_local, key) + else: + return func(*args, **kwargs) + + return wrapper + + return decorator diff --git a/oarepo_oidc_einfra/perun/__init__.py b/oarepo_oidc_einfra/perun/__init__.py new file mode 100644 index 0000000..c2558fd --- /dev/null +++ b/oarepo_oidc_einfra/perun/__init__.py @@ -0,0 +1,19 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""Perun API, dump and OIDC utilities.""" + +from .api import DoesNotExist, PerunLowLevelAPI +from .dump import PerunDumpData +from .oidc import get_communities_from_userinfo_token + +__all__ = ( + "PerunLowLevelAPI", + "DoesNotExist", + "get_communities_from_userinfo_token", + "PerunDumpData", +) diff --git a/oarepo_oidc_einfra/perun/api.py b/oarepo_oidc_einfra/perun/api.py new file mode 100644 index 0000000..0305d9a --- /dev/null +++ b/oarepo_oidc_einfra/perun/api.py @@ -0,0 +1,340 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +import logging + +import requests +from requests.auth import HTTPBasicAuth + +log = logging.getLogger("perun") + + +class DoesNotExist(Exception): + """Exception raised when a resource does not exist.""" + + +class PerunLowLevelAPI: + """ + Low-level API for Perun targeted at the operations needed by E-INFRA OIDC extension. + + Note: Perun does not follow RESTful principles and the API is thus not resource-oriented, + but rather manager-oriented and spills out implementation details. This class provides + a thin wrapper around the Perun API. + + Note: All ids are internal Perun ids, not UUIDs or other external identifiers. + """ + + def __init__(self, base_url, service_id, service_username, service_password): + """ + Initialize the API with the base URL and the service credentials. + + :param base_url: URL of Perun server + :param service_id: the id of the service that manages stuff + :param service_username: the username of the service that manages stuff + :param service_password: the password of the service that manages stuff + """ + self._base_url = base_url + self._service_id = service_id + self._auth = HTTPBasicAuth(service_username, service_password) + + def _perun_call(self, manager, method, payload): + """Low-level call to Perun API with error handling. + + :param manager: the manager to call + :param method: the method to call + :param payload: the json payload to send + """ + resp = requests.post( + f"{self._base_url}/krb/rpc/json/{manager}/{method}", + auth=self._auth, + json=payload, + ) + + if resp.status_code == 404: + raise DoesNotExist(f"Not found returned for method {method} and {payload}") + + if ( + resp.status_code == 400 + and resp.json().get("name") == "ResourceNotExistsException" + ): + raise DoesNotExist(f"Not found returned for method {method} and {payload}") + + if resp.status_code < 200 or resp.status_code >= 300: + raise Exception(f"Perun call failed: {resp.text}") + return resp.json() + + def create_group(self, *, name, description, parent_group_id, check_existing=True): + """ + Create a new group in Perun and set the service as its admin + + :param name: Name of the group + :param description: Description of the group + :param parent_group_id: ID of the parent group + :param check_existing: If True, check if the group already exists and do not create it + :return: (group: json, group_created: bool, admin_created: bool) + """ + # check if the group already exists and if not, create it + + group_created = False + admin_created = False + + if check_existing: + group = self.get_group_by_name(name, parent_group_id) + else: + group = None + + if not group: + log.info("Creating group %s within parent %s", name, parent_group_id) + + # Create a new group in Perun + group = self._perun_call( + "groupsManager", + "createGroup", + { + "name": name, + "description": description, + "parentGroup": parent_group_id, + }, + ) + group_created = True + log.info( + "Group %s within parent %s created, id %s", + name, + parent_group_id, + group["id"], + ) + + # check if the group has the service as an admin and if not, add it + # if inheritance works, do not duplicate the admin here + admins = self._perun_call( + "groupsManager", "getAdmins", {"group": group["id"], "onlyDirectAdmins": 0} + ) + for admin in admins: + if admin["id"] == self._service_id: + break + else: + log.info( + "Adding service %s as admin to group %s", self._service_id, group["id"] + ) + self._perun_call( + "groupsManager", + "addAdmin", + {"group": group["id"], "user": self._service_id}, + ) + admin_created = True + + return (group, group_created, admin_created) + + def get_group_by_name(self, name, parent_group_id): + """ + Get a group by name within a parent group. + + :param name: name of the group + :param parent_group_id: ID of the parent group + :return: group or None if not found + """ + groups = self._perun_call( + "groupsManager", "getAllSubGroups", {"group": parent_group_id} + ) + for group in groups: + if group["shortName"] == name: + return group + return None + + def create_resource_with_group_and_capabilities( + self, + *, + vo_id, + facility_id, + group_id, + name, + description, + capability_attr_id, + capabilities, + perun_sync_service_id, + check_existing=True, + ): + """ + Create a new resource in Perun and assign the group to it. + + :param vo_id: id of the virtual organization in within the resource is created + :param facility_id: id of the facility for which the resource is created. The service have facility manager rights + :param group_id: id of the group to be assigned to the resource + :param name: name of the resource + :param description: description of the resource + :param capability_attr_id: id of the attribute that holds the capabilities + :param capabilities: a list of capabilities to be set + :param perun_sync_service_id: id of the service that is used to export the e-infra dump + :param check_existing: if True, check if the resource already exists and do not create it + + :return: (resource: json, resource_created: bool) + """ + assert isinstance(capabilities, list), "Capabilities must be a list" + + resource, resource_created = self.create_resource( + vo_id, facility_id, name, description, check_existing + ) + + resource_id = resource["id"] + + self.assign_group_to_resource(resource_id, group_id) + + self.set_resource_capabilities(resource_id, capability_attr_id, capabilities) + + self.attach_service_to_resource(resource_id, perun_sync_service_id) + + return resource, resource_created + + def create_resource( + self, vo_id, facility_id, name, description, check_existing=True + ): + """ + Create a new resource in Perun, optionally checking if a resource with the same name already exists. + + :param vo_id: id of the virtual organization in within the resource is created + :param facility_id: id of the facility for which the resource is created + :param name: name of the resource + :param description: description of the resource + :param check_existing: if True, check if the resource already exists and do not create it + + :return: (resource: json, resource_created: bool) + """ + if check_existing: + resource = self.get_resource_by_name(vo_id, facility_id, name) + else: + resource = None + resource_created = False + if not resource: + log.info( + "Creating resource %s in facility %s and vo %s", + name, + facility_id, + vo_id, + ) + resource = self._perun_call( + "resourcesManager", + "createResource", + { + "vo": vo_id, + "facility": facility_id, + "name": name, + "description": description, + }, + ) + resource_created = True + log.info( + "Resource %s created in facility %s and vo %s, id %s", + name, + facility_id, + vo_id, + resource["id"], + ) + return resource, resource_created + + def assign_group_to_resource(self, resource_id, group_id): + """ + Assign a group to a resource. + + :param resource_id: id of the resource + :param group_id: id of the group to be assigned + """ + groups = self._perun_call( + "resourcesManager", + "getAssignedGroups", + { + "resource": resource_id, + }, + ) + for grp in groups: + if grp["id"] == group_id: + break + else: + log.info("Assigning group %s to resource %s", group_id, resource_id) + self._perun_call( + "resourcesManager", + "assignGroupToResource", + {"resource": resource_id, "group": group_id}, + ) + log.info("Group %s assigned to resource %s", group_id, resource_id) + + def set_resource_capabilities(self, resource_id, capability_attr_id, capabilities): + """ + Set capabilities to a resource. + + :param resource_id: id of the resource + :param capability_attr_id: internal id of the attribute that holds the capabilities + :param capabilities: list of capabilities to be set + """ + + # check if the resource has the capability and if not, add it + attr = self._perun_call( + "attributesManager", + "getAttribute", + {"resource": resource_id, "attributeId": capability_attr_id}, + ) + value = attr["value"] or [] + if not (set(value) >= set(capabilities)): + log.info( + "Setting capabilities %s to resource %s", capabilities, resource_id + ) + attr["value"] = list(set(value) | set(capabilities)) + self._perun_call( + "attributesManager", + "setAttribute", + {"resource": resource_id, "attribute": attr}, + ) + log.info("Capabilities %s set to resource %s", capabilities, resource_id) + + def attach_service_to_resource(self, resource_id, service_id): + """ + Attach a service to a resource. + + :param resource_id: id of the resource + :param service_id: id of the service to be attached + :return: + """ + # assign sync service to the resource + services = self._perun_call( + "resourcesManager", "getAssignedServices", {"resource": resource_id} + ) + for service in services: + if service["id"] == service_id: + break + else: + log.info( + "Assigning service %s to resource %s", + service_id, + resource_id, + ) + self._perun_call( + "resourcesManager", + "assignService", + {"resource": resource_id, "service": service_id}, + ) + log.info( + "Service %s assigned to resource %s", + service_id, + resource_id, + ) + + def get_resource_by_name(self, vo_id, facility_id, name): + """ + Get a resource by name. + + :param vo_id: id of the virtual organization + :param facility_id: id of the facility for which a resource is created + :param name: name of the resource + :return: resource or None if not found + """ + try: + return self._perun_call( + "resourcesManager", + "getResourceByName", + {"vo": vo_id, "facility": facility_id, "name": name}, + ) + except DoesNotExist: + return None diff --git a/oarepo_oidc_einfra/perun/dump.py b/oarepo_oidc_einfra/perun/dump.py new file mode 100644 index 0000000..a6f2f29 --- /dev/null +++ b/oarepo_oidc_einfra/perun/dump.py @@ -0,0 +1,138 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +import logging +from collections import defaultdict, namedtuple +from functools import cached_property +from typing import Any, Dict, Iterable, List, Set + +from oarepo_oidc_einfra.communities import CommunityRole + +log = logging.getLogger("perun.dump_data") + + +AAIUser = namedtuple( + "AAIUser", ["einfra_id", "email", "full_name", "organization", "roles"] +) + + +class PerunDumpData: + """ + Provides access to the data from the PERUN dump. + """ + + def __init__( + self, + dump_data: Any, + community_slug_to_id: Dict[str, str], + community_role_names: Set[str], + ): + """ + Creates an instance of the data + + :param dump_data: The data from the PERUN dump (json) + :param community_slug_to_id: Mapping of community slugs to their ids (str of uuid) + :param community_role_names: a set of known community role names + """ + self.dump_data = dump_data + self.slug_to_id = community_slug_to_id + self.community_role_names = community_role_names + + @cached_property + def aai_community_roles(self) -> Set[CommunityRole]: + """ + Returns all community roles (pairs of community id, role name) from the dump. + :return: set of community roles known to perun + """ + aai_community_roles = set() + for resource_community_roles in self.resource_to_community_roles.values(): + aai_community_roles.update(resource_community_roles) + return aai_community_roles + + @cached_property + def resource_to_community_roles(self) -> Dict[str, List[CommunityRole]]: + """ + Returns a mapping of resource id to community roles. + + :return: for each Perun resource, mapping to associated community roles + """ + resources = defaultdict(list) + for r_id, r in self.dump_data["resources"].items(): + # data look like + # "0003a30a-5512-4ff1-ae1c-b13372041459" : { + # "attributes" : { + # "urn:perun:resource:attribute-def:def:capabilities" : [ + # "res:communities:abc:role:members" + # ] + # } + # }, + capabilities = r.get("attributes", {}).get( + "urn:perun:resource:attribute-def:def:capabilities", [] + ) + for capability in capabilities: + parts = capability.split(":") + if ( + len(parts) == 5 + and parts[0] == "res" + and parts[1] == "communities" + and parts[3] == "role" + ): + community_slug = parts[2] + role = parts[4] + if community_slug not in self.slug_to_id: + log.error( + f"Community from PERUN {community_slug} not found in the repository" + ) + continue + if role not in self.community_role_names: + log.error(f"Role from PERUN {role} not found in the repository") + continue + community_role = (self.slug_to_id[community_slug], role) + resources[r_id].append(community_role) + + return resources + + def users(self) -> Iterable[AAIUser]: + """ + Returns all users from the dump. + + :return: iterable of AAIUser + """ + for u in self.dump_data["users"].values(): + einfra_id = u["attributes"].get( + "urn:perun:user:attribute-def:virt:login-namespace:einfraid-persistent" + ) + full_name = u["attributes"].get( + "urn:perun:user:attribute-def:core:displayName" + ) + organization = u["attributes"].get( + "urn:perun:user:attribute-def:def:organization" + ) + email = u["attributes"].get( + "urn:perun:user:attribute-def:def:preferredMail" + ) + yield AAIUser( + einfra_id=einfra_id, + email=email, + full_name=full_name, + organization=organization, + roles=self._get_roles_for_resources(u.get("allowed_resources", {})), + ) + + def _get_roles_for_resources( + self, allowed_resources: Iterable[str] + ) -> Set[CommunityRole]: + """ + Returns community roles for an iterable of allowed resources. + + :param allowed_resources: iterable of resource ids + :return: a set of associated community roles + """ + aai_communities = set() + for resource in allowed_resources: + aai_communities.update(self.resource_to_community_roles.get(resource, [])) + return aai_communities diff --git a/oarepo_oidc_einfra/perun/oidc.py b/oarepo_oidc_einfra/perun/oidc.py new file mode 100644 index 0000000..0b9cbde --- /dev/null +++ b/oarepo_oidc_einfra/perun/oidc.py @@ -0,0 +1,80 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""OIDC utilities.""" +from typing import Dict, Set + +from flask import current_app +from invenio_accounts.models import UserIdentity +from invenio_db import db +from sqlalchemy import select +from urnparse import URN8141, InvalidURNFormatError + +from ..communities import CommunityRole, CommunitySupport + + +def get_communities_from_userinfo_token(userinfo_token) -> Set[CommunityRole]: + """ + Extracts communities and roles from userinfo token. + + :param userinfo_token: userinfo token from perun/oidc server + :return: a set of community roles associated with the user + """ + slug_to_id = CommunitySupport().slug_to_id + + community_roles = CommunitySupport().role_names + + # Entitlement looks like: + # 1 = {str} 'urn:geant:cesnet.cz:res:communities:cuni:role:curator#perun.cesnet.cz' + entitlements = userinfo_token.get("eduperson_entitlement", []) + aai_groups = set() + for entitlement in entitlements: + try: + urn = URN8141.from_string(entitlement) + except InvalidURNFormatError: + # not a valid URN, skipping + continue + if ( + urn.namespace_id.value + not in current_app.config["EINFRA_ENTITLEMENT_NAMESPACES"] + ): + continue + for group_parts in current_app.config[ + "EINFRA_ENTITLEMENT_COMMUNITIES_GROUP_PARTS" + ]: + if urn.specific_string.parts[: len(group_parts)] == group_parts and len( + urn.specific_string.parts + ) > len(group_parts): + parts = urn.specific_string.parts[len(group_parts) :] + if ( + len(parts) == 3 + and parts[0] in slug_to_id + and parts[2] in community_roles + ): + aai_groups.add((slug_to_id[parts[0]], parts[2])) + return aai_groups + + +def einfra_to_local_users_map() -> Dict[str, int]: + """ + Returns a mapping of e-infra id to user id for local users, that have e-infra identity + and logged at least once with it. + + :return: a mapping of e-infra id to user id + """ + local_users = {} + rows = db.session.execute( + select(UserIdentity.id, UserIdentity.id_user).where( + UserIdentity.method == "e-infra" + ) + ) + for row in rows: + einfra_id = row[0] + user_id = row[1] + if einfra_id: + local_users[einfra_id] = user_id + return local_users diff --git a/oarepo_oidc_einfra/proxies.py b/oarepo_oidc_einfra/proxies.py new file mode 100644 index 0000000..11b8097 --- /dev/null +++ b/oarepo_oidc_einfra/proxies.py @@ -0,0 +1,14 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""Helper proxy to the state object.""" + +from flask import current_app +from werkzeug.local import LocalProxy + +current_einfra_oidc = LocalProxy(lambda: current_app.extensions["einfra-oidc"]) +"""Helper proxy to get the current einfra oidc.""" diff --git a/oarepo_oidc_einfra/remote.py b/oarepo_oidc_einfra/remote.py new file mode 100644 index 0000000..3046686 --- /dev/null +++ b/oarepo_oidc_einfra/remote.py @@ -0,0 +1,275 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# + +import datetime + +import jwt +from invenio_accounts.models import User, UserIdentity +from invenio_db import db +from invenio_oauthclient import current_oauthclient +from invenio_oauthclient.contrib.settings import OAuthSettingsHelper +from invenio_oauthclient.handlers.token import token_getter +from invenio_oauthclient.oauth import oauth_get_user +from invenio_oauthclient.signals import account_info_received + + +class EInfraOAuthSettingsHelper(OAuthSettingsHelper): + """E-Infra OIDC Remote Auth backend for NRP.""" + + def __init__( + self, + *, + title="E-Infra AAI", + description="E-Infra authentication and authorization service.", + base_url="https://login.e-infra.cz/oidc/", + app_key="EINFRA", + icon=None, + access_token_url=None, + authorize_url=None, + access_token_method="POST", + request_token_params=None, + request_token_url=None, + precedence_mask=None, + signup_options=None, + logout_url=None, + **kwargs, + ): + + request_token_params = request_token_params or { + "scope": " ".join( + [ + "openid", + "profile", + "email", + "eduperson_entitlement", + "isCesnetEligibleLastSeen", + "organization", + ] + ) + } + + access_token_url = access_token_url or f"{base_url}token" + authorize_url = authorize_url or f"{base_url}authorize" + content_type = "application/json" + + super().__init__( + title=title, + description=description, + base_url=base_url, + app_key=app_key, + icon=icon, + access_token_url=access_token_url, + authorize_url=authorize_url, + access_token_method=access_token_method, + request_token_params=request_token_params, + request_token_url=request_token_url, + precedence_mask=precedence_mask, + signup_options=signup_options, + logout_url=logout_url, + content_type=content_type, + **kwargs, + ) + + self._handlers = dict( + authorized_handler="invenio_oauthclient.handlers:authorized_signup_handler", + signup_handler=dict( + info="oarepo_oidc_einfra.remote:account_info", + info_serializer="oarepo_oidc_einfra.remote:account_info_serializer", + setup="oarepo_oidc_einfra.remote:account_setup", + view="invenio_oauthclient.handlers:signup_handler", + ), + ) + + self._rest_handlers = dict( + authorized_handler="invenio_oauthclient.handlers.rest:authorized_signup_handler", + signup_handler=dict( + info="oarepo_oidc_einfra.remote:account_info", + info_serializer="oarepo_oidc_einfra.remote:account_info_serializer", + setup="oarepo_oidc_einfra.remote:account_setup", + view="invenio_oauthclient.handlers.rest:signup_handler", + ), + response_handler="invenio_oauthclient.handlers.rest:default_remote_response_handler", + authorized_redirect_url="/", + signup_redirect_url="/", + error_redirect_url="/", + ) + + def get_handlers(self): + """Return CESNET auth handlers.""" + return self._handlers + + def get_rest_handlers(self): + """Return CESNET auth REST handlers.""" + return self._rest_handlers + + +_cesnet_app = EInfraOAuthSettingsHelper() + +""" +CESNET OpenID remote app. +""" +EINFRA_LOGIN_APP = _cesnet_app.remote_app + + +def account_info_serializer(remote, resp): + """ + Serialize the account info response object. + + :param remote: The remote application. + :param resp: The response of the `authorized` endpoint. + + :returns: A dictionary with serialized user information. + """ + decoded_token = jwt.decode( + resp["id_token"], + options={"verify_signature": True}, + key=remote.rsa_key, + audience=remote.consumer_key, + algorithms=["RS256"], + ) + + return { + "external_id": decoded_token["sub"], + "external_method": remote.name, + "user": { + "email": decoded_token.get("email"), + "profile": { + "full_name": decoded_token.get("name"), + }, + }, + } + + +def account_info(remote, resp): + """ + Retrieve remote account information used to find local user. + + It returns a dictionary with the following structure: + { + 'external_id': 'sub', + 'external_method': 'perun', + 'user': { + 'email': 'Email address', + 'profile': { + 'full_name': 'Full Name', + }, + } + } + :param remote: The remote application. + :param resp: The response of the `authorized` endpoint. + + :returns: A dictionary with the user information. + """ + handlers = current_oauthclient.signup_handlers[remote.name] + handler_resp = handlers["info_serializer"](resp) + + return handler_resp + + +def account_setup(remote, token, resp): + """ + Perform additional setup after user have been logged in. + + :param remote: The remote application. + :param token: The token value. + :param resp: The response. + """ + decoded_token = jwt.decode( + resp["id_token"], + options={"verify_signature": True}, + algorithms=["RS256"], + key=remote.rsa_key, + audience=remote.consumer_key, + ) + + with db.session.begin_nested(): + token.remote_account.extra_data = { + "full_name": decoded_token["name"], + } + + user = token.remote_account.user + + # Create user <-> external id link. + + # If there is no user identity for this user and group, create it + ui = UserIdentity.query.filter_by( + user=user, method="e-infra", id=decoded_token["sub"] + ).one_or_none() + if not ui: + UserIdentity.create(user, "e-infra", decoded_token["sub"]) + + +# During overlay initialization. +@account_info_received.connect +def autocreate_user(remote, token=None, response=None, account_info=None): + assert account_info is not None + + email = account_info["user"]["email"].lower() + id, method = account_info["external_id"], account_info["external_method"] + user_profile = { + "affiliations": "", + "full_name": account_info["user"]["profile"]["full_name"], + } + + user_identity = UserIdentity.query.filter_by(id=id, method=method).one_or_none() + if not user_identity: + user = User.query.filter(User.email == email).one_or_none() + if not user: + user = User(email=email, active=True, user_profile=user_profile) + + """ + Workaround note: + + When we create a user, we need to set 'confirmed_at' property, + because contrary to the default security settings (False), + the config variable SECURITY_CONFIRMABLE is set to True. + Without setting 'confirmed_at' to some value, it is impossible to log in. + """ + user.confirmed_at = datetime.datetime.now() + + with db.session.begin_nested(): + db.session.add(user) + db.session.commit() + + with db.session.begin_nested(): + UserIdentity.create(user=user, method=method, external_id=id) + db.session.commit() + + else: + assert user_identity.user is not None + + user_identity.user.email = email + user_identity.user.user_profile = user_profile + + with db.session.begin_nested(): + db.session.add(user_identity.user) + db.session.commit() + + +def account_info_link_perun_groups(remote, *, account_info, **kwargs): + # make the import local to avoud circular imports + from oarepo_oidc_einfra.communities import CommunitySupport + from oarepo_oidc_einfra.perun import get_communities_from_userinfo_token + + user = oauth_get_user( + remote.consumer_key, + account_info=account_info, + access_token=token_getter(remote)[0], + ) + + if user is None: + return + + userinfo_token = remote.get(remote.base_url + "userinfo").data + aai_community_roles = get_communities_from_userinfo_token(userinfo_token) + + CommunitySupport.set_user_community_membership(user, aai_community_roles) + + +account_info_received.connect(account_info_link_perun_groups) diff --git a/oarepo_oidc_einfra/resources.py b/oarepo_oidc_einfra/resources.py new file mode 100644 index 0000000..e62aa02 --- /dev/null +++ b/oarepo_oidc_einfra/resources.py @@ -0,0 +1,84 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# + +"""REST resources.""" +from datetime import datetime + +from flask import current_app, g, request +from flask_resources import Resource, ResourceConfig, route +from invenio_access import Permission, action_factory +from invenio_files_rest.storage import PyFSFileStorage +from invenio_records_resources.services.errors import PermissionDeniedError + +from oarepo_oidc_einfra.tasks import update_from_perun_dump + +upload_dump_action = action_factory("upload-oidc-einfra-dump") + + +class OIDCEInfraResourceConfig(ResourceConfig): + """Configuration for the REST API.""" + + blueprint_name = "oarepo_oidc_einfra" + """Blueprint name.""" + + url_prefix = "/oidc-einfra" + """URL prefix for the resource, will be at /api/oidc-einfra.""" + + routes = {"upload-dump": "/dumps/upload"} + """Routes for the resource.""" + + +class OIDCEInfraResource(Resource): + """REST API for the EInfra OIDC.""" + + def __init__(self, config=None): + """Initialize the resource.""" + super(OIDCEInfraResource, self).__init__( + config=config or OIDCEInfraResourceConfig() + ) + + def create_url_rules(self): + """Create URL rules for the resource.""" + routes = self.config.routes + return [ + route("POST", routes["upload-dump"], self.upload_dump), + ] + + def upload_dump(self): + """Upload a dump of the EInfra data. + + The dump will be uploaded to the configured location (EINFRA_DUMP_DATA_URL inside config) + and then processed by a celery synchronization task. + + The caller must have the permission to upload the dump (upload-oidc-einfra-dump action + that can be assigned via invenio access commandline tool). + """ + if not Permission(upload_dump_action).allows(g.identity): + raise PermissionDeniedError() + + if request.headers.get("Content-Type") != "application/json": + return { + "status": "error", + "message": "Content-Type must be application/json", + }, 400 + + dump_url = current_app.config["EINFRA_DUMP_DATA_URL"] + now = datetime.utcnow().strftime("%Y-%m-%d-%H-%M-%S") + dump_path = f"{dump_url}/{now}.json" + + location = PyFSFileStorage(dump_path) # handles both filesystem and s3 + with location.open(mode="wb") as f: + f.write(request.data) + + update_from_perun_dump.delay(dump_path) + return {"status": "ok"}, 201 + + +def create_rest_blueprint(app): + """Create a blueprint for the REST API.""" + return OIDCEInfraResource().as_blueprint() diff --git a/oarepo_oidc_einfra/services/__init__.py b/oarepo_oidc_einfra/services/__init__.py new file mode 100644 index 0000000..7e5dde0 --- /dev/null +++ b/oarepo_oidc_einfra/services/__init__.py @@ -0,0 +1,8 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""Community service components.""" diff --git a/oarepo_oidc_einfra/services/components/__init__.py b/oarepo_oidc_einfra/services/components/__init__.py new file mode 100644 index 0000000..7e5dde0 --- /dev/null +++ b/oarepo_oidc_einfra/services/components/__init__.py @@ -0,0 +1,8 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""Community service components.""" diff --git a/oarepo_oidc_einfra/services/components/aai_communities.py b/oarepo_oidc_einfra/services/components/aai_communities.py new file mode 100644 index 0000000..d9661ef --- /dev/null +++ b/oarepo_oidc_einfra/services/components/aai_communities.py @@ -0,0 +1,54 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +"""AAI (perun) communities mapping""" + +import re + +from flask import current_app +from invenio_records_resources.services.records.components.base import ServiceComponent +from invenio_records_resources.services.uow import Operation + + +class PropagateToAAIOp(Operation): + """Operation to propagate community to AAI in a background process.""" + + def __init__(self, community): + self.community = community + + def on_post_commit(self, uow): + from oarepo_oidc_einfra.tasks import synchronize_community_to_perun + + synchronize_community_to_perun.delay(self.community.id) + + +class CommunityAAIComponent(ServiceComponent): + """Community AAI component that propagates the community to Perun.""" + + def create(self, identity, record=None, data=None, **kwargs): + """Create handler.""" + # propagate the community to AAI + if "slug" not in data: + raise ValueError("Missing slug in community data") + if not re.match("^[a-z0-9-]+$", data["slug"]): + raise ValueError( + "Invalid slug, only lowercase letters, numbers and hyphens are allowed" + ) + + if current_app.config["EINFRA_COMMUNITY_SYNCHRONIZATION"]: + self.uow.register(PropagateToAAIOp(record)) + + def update(self, identity, record=None, data=None, **kwargs): + """Update handler.""" + if record.slug != data["slug"]: + raise ValueError( + "Cannot change the slug of the community as it is used in AAI" + ) + + def delete(self, identity, record=None, **kwargs): + """Delete handler.""" + raise NotImplementedError("Delete is not supported at the time being") diff --git a/oarepo_oidc_einfra/tasks.py b/oarepo_oidc_einfra/tasks.py new file mode 100644 index 0000000..947d75f --- /dev/null +++ b/oarepo_oidc_einfra/tasks.py @@ -0,0 +1,215 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +""" +Background tasks. +""" +import json +import logging +from typing import List, Tuple + +from celery import shared_task +from flask import current_app +from invenio_accounts.models import User +from invenio_communities.communities.records.api import Community +from invenio_db import db +from invenio_files_rest.storage import PyFSFileStorage + +from oarepo_oidc_einfra.communities import CommunitySupport +from oarepo_oidc_einfra.mutex import mutex +from oarepo_oidc_einfra.perun.dump import PerunDumpData +from oarepo_oidc_einfra.perun.oidc import einfra_to_local_users_map +from oarepo_oidc_einfra.proxies import current_einfra_oidc + +log = logging.getLogger("PerunSynchronizationTask") + + +@shared_task +@mutex("EINFRA_SYNC_MUTEX") +def synchronize_community_to_perun(community_id) -> None: + """ + Synchronizes community into Perun groups and resources. + The call is idempotent, if the perun mapping already exists, + it is left untouched. + + :param community_id: id of the community + + Structure inside Perun + + groups: + EINFRA_COMMUNITIES_GROUP_ID + +-- Community {slug} + +-- Role {role_name} of {slug} + +-- Role {role_name} of {slug} ... + + resources: + EINFRA_REPOSITORY_FACILITY_ID + +-- Community:{slug} - capab. res:communities:{slug}, assigned community group + +-- Community:{slug}:{role_name} - capab. res:communities:{slug}:role:{role_name}, assigned role group + """ + community = Community.pid.resolve(community_id) + slug = community.slug + roles = current_app.config["COMMUNITIES_ROLES"] + + api = current_einfra_oidc.perun_api() + + group, resource = map_community_or_role( + api, + parent_id=current_app.config["EINFRA_COMMUNITIES_GROUP_ID"], + name=f"Community {slug}", + description=community.metadata["description"] or f"Group for community {slug}", + resource_name=f"Community:{slug}", + resource_description=f"Resource for community {slug}", + resource_capabilities=[f"res:communities:{slug}"], + ) + + parent_id = group["id"] + + # for each role, generate group & resource for the role + for role in roles: + role_name = role["name"] + map_community_or_role( + api, + name=f"Role {role_name} of {slug}", + description=f"Group for role {role_name} of community {slug}", + parent_id=parent_id, + resource_name=f"Community:{slug}:{role_name}", + resource_description=f"Resource for community {slug} and role {role_name}", + resource_capabilities=[f"res:communities:{slug}:role:{role_name}"], + ) + + +def map_community_or_role( + api, + *, + parent_id, + name, + description, + resource_name, + resource_description, + resource_capabilities, +): + """ + Map a single community or community role, adds synchronization service so that we get + the resource in the dump from perun. + + :param api: perun api + :param parent_id: parent group + :param name: name of the group representing the community/role + :param description: description of the group + :param resource_name: name of the resource + :param resource_description: description of the resource + :param resource_capabilities: resource capabilities + :return: (group json, resource json) + """ + # generate group for community + group, group_created, admin_added = api.create_group( + name=name, description=description, parent_group_id=parent_id + ) + + # add the synchronization resource + resource, resource_created = api.create_resource_with_group_and_capabilities( + vo_id=current_app.config["EINFRA_REPOSITORY_VO_ID"], + facility_id=current_app.config["EINFRA_REPOSITORY_FACILITY_ID"], + group_id=group["id"], + name=resource_name, + description=resource_description, + capability_attr_id=current_app.config["EINFRA_CAPABILITIES_ATTRIBUTE_ID"], + capabilities=resource_capabilities, + perun_sync_service_id=current_app.config["EINFRA_SYNC_SERVICE_ID"], + ) + return group, resource + + +@shared_task +def synchronize_all_communities_to_perun(): + """ + Checks and repairs community mapping within perun + """ + for community_model in Community.model_cls.query.all(): + synchronize_community_to_perun(str(community_model.id)) + + +@shared_task +@mutex("EINFRA_SYNC_MUTEX") +def update_from_perun_dump(dump_url, fix_communities_in_perun=True): + """ + Updates user communities from perun dump and checks for local communities + not propagated to perun yet (and propagates them) + + :param dump_url: url with the dump + :param fix_communities_in_perun if some local communities were not propagated to perun, propagate them + """ + location = PyFSFileStorage(dump_url) + with location.open() as f: + data = json.load(f) + + community_support = CommunitySupport() + dump = PerunDumpData( + data, community_support.slug_to_id, community_support.role_names + ) + + if fix_communities_in_perun: + synchronize_communities_to_perun( + community_support.all_community_roles, dump.aai_community_roles + ) + + synchronize_users_from_perun(dump, community_support) + + +def synchronize_communities_to_perun(repository_community_roles, aai_community_roles): + resource_community_roles: List[Tuple[str, str]] + + if repository_community_roles - aai_community_roles: + log.info( + "Some community roles are not mapped " + f"to any resource: {repository_community_roles - aai_community_roles}" + ) + unsynchronized_communities = { + cr.community_id for cr in repository_community_roles - aai_community_roles + } + for community_id in unsynchronized_communities: + synchronize_community_to_perun.delay(community_id) + + +def synchronize_users_from_perun(dump, community_support): + local_users_by_einfra = einfra_to_local_users_map() + for aai_user in dump.users(): + local_user_id = local_users_by_einfra.pop(aai_user.einfra_id, None) + # do not create new users proactively, we can do it on the first login + if not local_user_id: + continue + + user = User.query.filter_by(id=local_user_id).one() + + update_user_metadata( + user, aai_user.full_name, aai_user.email, aai_user.organization + ) + community_support.set_user_community_membership(user, aai_user.roles) + # for users that are not in the dump anymore, remove all communities + for local_user_id in local_users_by_einfra.values(): + user = User.query.filter_by(id=local_user_id).one() + community_support.set_user_community_membership(user, set()) + + +def update_user_metadata(user, full_name, email, organization): + save = False + user_profile = user.user_profile + if full_name != user.user_profile.get("full_name"): + user_profile["full_name"] = full_name + save = True + if organization != user.user_profile.get("affiliations"): + user_profile["affiliations"] = organization + save = True + email = email.lower() + if email != user.email: + user.email = email + save = True + if save: + user.user_profile = {**user_profile} + db.session.add(user) + db.session.commit() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..8289f07 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build_system] +requires = ["setuptools", "wheel", "babel>2.8"] +build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/run-tests.sh b/run-tests.sh new file mode 100755 index 0000000..86829b9 --- /dev/null +++ b/run-tests.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +PYTHON=python3 + +set -e + +OAREPO_VERSION="${OAREPO_VERSION:-12}" + +VENV=".venv" + +if test -d $VENV ; then + rm -rf $VENV +fi + +$PYTHON -m venv $VENV +source $VENV/bin/activate + +pip install -U setuptools pip wheel +pip install "oarepo[tests]==${OAREPO_VERSION}.*" +pip install -e '.[tests]' + +pytest tests diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..6938d24 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,54 @@ +[metadata] +name = oarepo-oidc-einfra +version = 1.0.0 +description = E-infra OIDC Auth backend for OARepo +authors = Miroslav Bauer , Juraj Trappl , Miroslav Simek +readme = README.md +long_description = file:README.md +long_description_content_type = text/markdown +url = https://github.com/oarepo/oidc-einfra +project_urls = + Source = https://github.com/oarepo/oarepo-oidc-einfra + +packages = find: +include_package_data = True + +[options] +python = >=3.10 +install_requires = + oarepo-communities + ; remove the oarepo-requests and oarepo-global-search dependency when bug BE-436 and BE-437 are fixed + oarepo-requests + oarepo-global-search + oarepo-workflows + urnparse + + +[options.package_data] +* = *.json, *.rst, *.md, *.json5, *.jinja2, *.po, *.mo, *.pot, *.js, *.jsx, *.less, *.jinja + +[options.packages.find] +exclude = + tests + tests.* + +[options.extras_require] +devs = + check-manifest + black + isort + autoflake + licenseheaders +tests = + pytest-invenio + responses + +[options.entry_points] +invenio_base.apps = + oarepo_oidc_einfra = oarepo_oidc_einfra.ext:EInfraOIDCApp +invenio_base.api_apps = + oarepo_oidc_einfra = oarepo_oidc_einfra.ext:EInfraOIDCApp +invenio_access.actions = + upload_dump.actions = oarepo_oidc_einfra.resources:upload_dump_action +invenio_base.api_blueprints = + oarepo_oidc_einfra = oarepo_oidc_einfra.resources:create_rest_blueprint diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..99f81d3 --- /dev/null +++ b/setup.py @@ -0,0 +1,10 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +from setuptools import setup + +setup() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..4f563a3 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,7 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..d6e7a8c --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,224 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +import contextlib +import json +import logging +import os +import shutil +import sys +from pathlib import Path + +import pytest +import yaml + +from oarepo_oidc_einfra.perun import PerunLowLevelAPI + +logging.basicConfig(level=logging.INFO) +opensearch_logger = logging.getLogger("opensearch") +opensearch_logger.setLevel(logging.ERROR) + + +@pytest.fixture(scope="module") +def create_app(instance_path, entry_points): + """Application factory fixture.""" + from invenio_app.factory import create_app + + return create_app + + +@pytest.fixture(scope="module") +def app_config(app_config): + app_config["CELERY_TASK_ALWAYS_EAGER"] = True + app_config["CELERY_TASK_EAGER_PROPAGATES"] = True + + # do not automatically run community synchronization in tests + app_config["EINFRA_COMMUNITY_SYNCHRONIZATION"] = False + app_config["EINFRA_API_URL"] = "https://perun-api.e-infra.cz" + app_config["COMMUNITIES_ROLES"] = [ + dict( + name="curator", + title="Curator", + description="Can curate records.", + can_manage=True, + is_owner=True, + can_manage_roles=["member"], + ), + dict( + name="member", + title="Member", + description="Community member with read permissions.", + ), + ] + + password_path = Path(__file__).parent.parent / ".perun_passwd" + if password_path.exists(): + app_config["EINFRA_SERVICE_PASSWORD"] = password_path.read_text().strip() + else: + app_config["EINFRA_SERVICE_PASSWORD"] = "dummy" + + app_config["EINFRA_SERVICE_ID"] = 144994 + app_config["EINFRA_SERVICE_USERNAME"] = "nrp-fa-devrepo" + app_config["EINFRA_COMMUNITIES_GROUP_ID"] = 15393 + app_config["EINFRA_REPOSITORY_VO_ID"] = 4003 + app_config["EINFRA_REPOSITORY_FACILITY_ID"] = 4662 + app_config["EINFRA_CAPABILITIES_ATTRIBUTE_ID"] = 3585 + app_config["EINFRA_SYNC_SERVICE_ID"] = 1023 + app_config["EINFRA_RSA_KEY"] = ( + b"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmho5h/lz6USUUazQaVT3\nPHloIk/Ljs2vZl/RAaitkXDx6aqpl1kGpS44eYJOaer4oWc6/QNaMtynvlSlnkuW\nrG765adNKT9sgAWSrPb81xkojsQabrSNv4nIOWUQi0Tjh0WxXQmbV+bMxkVaElhd\nHNFzUfHv+XqI8Hkc82mIGtyeMQn+VAuZbYkVXnjyCwwa9RmPOSH+O4N4epDXKk1V\nK9dUxf/rEYbjMNZGDva30do0mrBkU8W3O1mDVJSSgHn4ejKdGNYMm0JKPAgCWyPW\nJDoL092ctPCFlUMBBZ/OP3omvgnw0GaWZXxqSqaSvxFJkqCHqLMwpxmWTTAgEvAb\nnwIDAQAB\n-----END PUBLIC KEY-----\n" + ) + app_config["EINFRA_DUMP_DATA_URL"] = "/tmp" + + from oarepo_oidc_einfra import EINFRA_LOGIN_APP + + app_config["OAUTHCLIENT_REMOTE_APPS"] = {"e-infra": EINFRA_LOGIN_APP} + + app_config["JSONSCHEMAS_HOST"] = "localhost" + app_config["RECORDS_REFRESOLVER_CLS"] = ( + "invenio_records.resolver.InvenioRefResolver" + ) + app_config["RECORDS_REFRESOLVER_STORE"] = ( + "invenio_jsonschemas.proxies.current_refresolver_store" + ) + app_config["RATELIMIT_AUTHENTICATED_USER"] = "200 per second" + app_config["SEARCH_HOSTS"] = [ + { + "host": os.environ.get("OPENSEARCH_HOST", "localhost"), + "port": os.environ.get("OPENSEARCH_PORT", "9200"), + } + ] + # disable redis cache + app_config["CACHE_TYPE"] = "SimpleCache" # Flask-Caching related configs + app_config["CACHE_DEFAULT_TIMEOUT"] = 300 + app_config["FILES_REST_STORAGE_CLASS_LIST"] = { + "L": "Local", + "F": "Fetch", + "R": "Remote", + } + app_config["FILES_REST_DEFAULT_STORAGE_CLASS"] = "L" + + app_config["APP_THEME"] = ["oarepo", "semantic-ui"] + + app_config["SERVER_NAME"] = "127.0.0.1:5000" + + app_config["EINFRA_CONSUMER_KEY"] = os.environ.get("INVENIO_EINFRA_CONSUMER_KEY") + app_config["EINFRA_CONSUMER_SECRET"] = os.environ.get( + "INVENIO_EINFRA_CONSUMER_SECRET" + ) + + return app_config + + +@pytest.fixture(scope="module", autouse=True) +def location(location): + return location + + +@pytest.fixture() +def perun_api_url(app): + return app.config["EINFRA_API_URL"] + + +@pytest.fixture() +def perun_service_id(app): + return app.config["EINFRA_SERVICE_ID"] + + +@pytest.fixture() +def perun_service_username(app): + return app.config["EINFRA_SERVICE_USERNAME"] + + +@pytest.fixture() +def perun_service_password(app): + return app.config["EINFRA_SERVICE_PASSWORD"] + + +@pytest.fixture() +def perun_sync_service_id(app): + return app.config["EINFRA_SYNC_SERVICE_ID"] + + +@pytest.fixture() +def test_vo_id(app): + return app.config["EINFRA_REPOSITORY_VO_ID"] + + +@pytest.fixture() +def test_facility_id(app): + return app.config["EINFRA_REPOSITORY_FACILITY_ID"] + + +@pytest.fixture() +def test_capabilities_attribute_id(app): + return app.config["EINFRA_CAPABILITIES_ATTRIBUTE_ID"] + + +@pytest.fixture() +def test_repo_communities_id(app): + return app.config["EINFRA_COMMUNITIES_GROUP_ID"] + + +@pytest.fixture() +def low_level_perun_api( + perun_api_url, perun_service_id, perun_service_username, perun_service_password +): + return PerunLowLevelAPI( + base_url=perun_api_url, + service_id=perun_service_id, + service_username=perun_service_username, + service_password=perun_service_password, + ) + + +@pytest.fixture() +def smart_record(perun_api_url, low_level_perun_api): + import responses + from responses._recorder import Recorder + + @contextlib.contextmanager + def smart_record(fname): + file_path = Path(__file__).parent / "request_data" / fname + if not file_path.exists(): + with Recorder() as recorder: + yield False + recorder.dump_to_file( + file_path=file_path, registered=recorder.get_registry().registered + ) + else: + print("Using recorded data") + low_level_perun_api._auth = ( + None # reset the auth just to make sure we use the recorded data + ) + with responses.RequestsMock() as rsps: + rsps._add_from_file(file_path=file_path) + yield True + + return smart_record + + +@pytest.fixture(scope="function") +def test_group_id(): + with ( + Path(__file__).parent / "request_data" / "test_create_group.yaml" + ).open() as f: + data = yaml.safe_load(f) + payload = json.loads(data["responses"][1]["response"]["body"]) + return payload["id"] + + +@pytest.fixture() +def test_ui_pages(app): + python_path = Path(sys.executable) + invenio_instance_path = python_path.parent.parent / "var" / "instance" + manifest_path = invenio_instance_path / "static" / "dist" + manifest_path.mkdir(parents=True, exist_ok=True) + shutil.copy( + Path(__file__).parent / "manifest.json", manifest_path / "manifest.json" + ) + + app.jinja_loader.searchpath.append(str(Path(__file__).parent / "templates")) diff --git a/tests/dump_data/1.json b/tests/dump_data/1.json new file mode 100644 index 0000000..5e2e4da --- /dev/null +++ b/tests/dump_data/1.json @@ -0,0 +1,38 @@ +{ + "metadata" : { + "facility" : { + "attributes" : {}, + "destinations" : [ + "perun_exports@accback.du.cesnet.cz:922" + ], + "facilityName" : "nrp_devel", + "facilityUuid" : "8d901e8e-5e9a-4fd6-841e-a67a4423d691" + }, + "version" : "3.0.1" + }, + "resources" : { + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:testing_nrp_devel" + ] + } + } + }, + "users" : { + "20a47687-e2db-4a4e-b98a-1c2b7fd72594" : { + "allowed_resources" : { + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : {} + } + }, + "attributes" : { + "urn:perun:user:attribute-def:core:displayName" : "Miroslav Šimek", + "urn:perun:user:attribute-def:def:organization" : "CESNET, z. s. p. o.", + "urn:perun:user:attribute-def:def:preferredMail" : "Miroslav.Simek@cesnet.cz", + "urn:perun:user:attribute-def:virt:login-namespace:einfraid-persistent" : "12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz" + } + } + } +} + diff --git a/tests/dump_data/2.json b/tests/dump_data/2.json new file mode 100644 index 0000000..a28e3b7 --- /dev/null +++ b/tests/dump_data/2.json @@ -0,0 +1,53 @@ +{ + "metadata" : { + "facility" : { + "attributes" : {}, + "destinations" : [ + "perun_exports@accback.du.cesnet.cz:922" + ], + "facilityName" : "nrp_devel", + "facilityUuid" : "8d901e8e-5e9a-4fd6-841e-a67a4423d691" + }, + "version" : "3.0.1" + }, + "resources" : { + "0003a30a-5512-4ff1-ae1c-b13372041459" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:communities:abc:members" + ] + } + }, + "2077a18f-13d1-4d00-9908-aeeef28e7a56" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [] + } + }, + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:testing_nrp_devel" + ] + } + } + }, + "users" : { + "20a47687-e2db-4a4e-b98a-1c2b7fd72594" : { + "allowed_resources" : { + "2077a18f-13d1-4d00-9908-aeeef28e7a56" : { + "attributes" : {} + }, + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : {} + } + }, + "attributes" : { + "urn:perun:user:attribute-def:core:displayName" : "Miroslav Šimek", + "urn:perun:user:attribute-def:def:organization" : "CESNET, z. s. p. o.", + "urn:perun:user:attribute-def:def:preferredMail" : "Miroslav.Simek@cesnet.cz", + "urn:perun:user:attribute-def:virt:login-namespace:einfraid-persistent" : "12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz" + } + } + } +} + diff --git a/tests/dump_data/3.json b/tests/dump_data/3.json new file mode 100644 index 0000000..55cd616 --- /dev/null +++ b/tests/dump_data/3.json @@ -0,0 +1,87 @@ +{ + "metadata" : { + "facility" : { + "attributes" : {}, + "destinations" : [ + "perun_exports@accback.du.cesnet.cz:922" + ], + "facilityName" : "nrp_devel", + "facilityUuid" : "8d901e8e-5e9a-4fd6-841e-a67a4423d691" + }, + "version" : "3.0.1" + }, + "resources" : { + "0003a30a-5512-4ff1-ae1c-b13372041459" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:communities:abc:members" + ] + } + }, + "2077a18f-13d1-4d00-9908-aeeef28e7a56" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [] + } + }, + "4c09431a-bb4d-4b9d-9abc-224166165d42" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:communities:AAA" + ] + } + }, + "b5e649a9-913f-49a3-abd5-b31adc85c01d" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:communities:cuni" + ] + } + }, + "c3342a80-8c86-420f-948d-f943c1584aa1" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:communities:cuni:role:curator" + ] + } + }, + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:testing_nrp_devel" + ] + } + }, + "f7dedca0-1302-401d-8328-cbdee1180202" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:communities:cuni:role:member" + ] + } + } + }, + "users" : { + "20a47687-e2db-4a4e-b98a-1c2b7fd72594" : { + "allowed_resources" : { + "2077a18f-13d1-4d00-9908-aeeef28e7a56" : { + "attributes" : {} + }, + "b5e649a9-913f-49a3-abd5-b31adc85c01d" : { + "attributes" : {} + }, + "c3342a80-8c86-420f-948d-f943c1584aa1" : { + "attributes" : {} + }, + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : {} + } + }, + "attributes" : { + "urn:perun:user:attribute-def:core:displayName" : "Miroslav Šimek", + "urn:perun:user:attribute-def:def:organization" : "CESNET, z. s. p. o.", + "urn:perun:user:attribute-def:def:preferredMail" : "Miroslav.Simek@cesnet.cz", + "urn:perun:user:attribute-def:virt:login-namespace:einfraid-persistent" : "12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz" + } + } + } +} + diff --git a/tests/dump_data/4.json b/tests/dump_data/4.json new file mode 100644 index 0000000..a28e3b7 --- /dev/null +++ b/tests/dump_data/4.json @@ -0,0 +1,53 @@ +{ + "metadata" : { + "facility" : { + "attributes" : {}, + "destinations" : [ + "perun_exports@accback.du.cesnet.cz:922" + ], + "facilityName" : "nrp_devel", + "facilityUuid" : "8d901e8e-5e9a-4fd6-841e-a67a4423d691" + }, + "version" : "3.0.1" + }, + "resources" : { + "0003a30a-5512-4ff1-ae1c-b13372041459" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:communities:abc:members" + ] + } + }, + "2077a18f-13d1-4d00-9908-aeeef28e7a56" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [] + } + }, + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:testing_nrp_devel" + ] + } + } + }, + "users" : { + "20a47687-e2db-4a4e-b98a-1c2b7fd72594" : { + "allowed_resources" : { + "2077a18f-13d1-4d00-9908-aeeef28e7a56" : { + "attributes" : {} + }, + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : {} + } + }, + "attributes" : { + "urn:perun:user:attribute-def:core:displayName" : "Miroslav Šimek", + "urn:perun:user:attribute-def:def:organization" : "CESNET, z. s. p. o.", + "urn:perun:user:attribute-def:def:preferredMail" : "Miroslav.Simek@cesnet.cz", + "urn:perun:user:attribute-def:virt:login-namespace:einfraid-persistent" : "12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz" + } + } + } +} + diff --git a/tests/dump_data/5.json b/tests/dump_data/5.json new file mode 100644 index 0000000..c06aef5 --- /dev/null +++ b/tests/dump_data/5.json @@ -0,0 +1,24 @@ +{ + "metadata" : { + "facility" : { + "attributes" : {}, + "destinations" : [ + "perun_exports@accback.du.cesnet.cz:922" + ], + "facilityName" : "nrp_devel", + "facilityUuid" : "8d901e8e-5e9a-4fd6-841e-a67a4423d691" + }, + "version" : "3.0.1" + }, + "resources" : { + "e22b54ff-d1c6-4c66-a838-652dc655dc91" : { + "attributes" : { + "urn:perun:resource:attribute-def:def:capabilities" : [ + "res:testing_nrp_devel" + ] + } + } + }, + "users" : {} +} + diff --git a/tests/manifest.json b/tests/manifest.json new file mode 100644 index 0000000..0dfa22a --- /dev/null +++ b/tests/manifest.json @@ -0,0 +1,1319 @@ +{ + "status": "done", + "assets": { + "css/bottom_css.1b2e27b61142106979cc.css": { + "name": "css/bottom_css.1b2e27b61142106979cc.css", + "path": "/invenio/instance/static/dist/css/bottom_css.1b2e27b61142106979cc.css", + "publicPath": "/static/dist/css/bottom_css.1b2e27b61142106979cc.css" + }, + "css/bottom_css.78b33add02920b2d01b2.css": { + "name": "css/bottom_css.78b33add02920b2d01b2.css", + "path": "/invenio/instance/static/dist/css/bottom_css.78b33add02920b2d01b2.css", + "publicPath": "/static/dist/css/bottom_css.78b33add02920b2d01b2.css" + }, + "css/oarepo_vocabularies_ui_components.22a6dcb4ec850142e289.css": { + "name": "css/oarepo_vocabularies_ui_components.22a6dcb4ec850142e289.css", + "path": "/invenio/instance/static/dist/css/oarepo_vocabularies_ui_components.22a6dcb4ec850142e289.css", + "publicPath": "/static/dist/css/oarepo_vocabularies_ui_components.22a6dcb4ec850142e289.css" + }, + "css/oarepo_vocabularies_ui_components.fabb3796f93735eab713.css": { + "name": "css/oarepo_vocabularies_ui_components.fabb3796f93735eab713.css", + "path": "/invenio/instance/static/dist/css/oarepo_vocabularies_ui_components.fabb3796f93735eab713.css", + "publicPath": "/static/dist/css/oarepo_vocabularies_ui_components.fabb3796f93735eab713.css" + }, + "css/pdfjs_css.7523441f07ec785e6f0f.css": { + "name": "css/pdfjs_css.7523441f07ec785e6f0f.css", + "path": "/invenio/instance/static/dist/css/pdfjs_css.7523441f07ec785e6f0f.css", + "publicPath": "/static/dist/css/pdfjs_css.7523441f07ec785e6f0f.css" + }, + "css/pdfjs_css.e429d7a8c3723c7764b2.css": { + "name": "css/pdfjs_css.e429d7a8c3723c7764b2.css", + "path": "/invenio/instance/static/dist/css/pdfjs_css.e429d7a8c3723c7764b2.css", + "publicPath": "/static/dist/css/pdfjs_css.e429d7a8c3723c7764b2.css" + }, + "css/prism_css.c5d8ec75707893898080.css": { + "name": "css/prism_css.c5d8ec75707893898080.css", + "path": "/invenio/instance/static/dist/css/prism_css.c5d8ec75707893898080.css", + "publicPath": "/static/dist/css/prism_css.c5d8ec75707893898080.css" + }, + "css/prism_css.d26348f46347b7751296.css": { + "name": "css/prism_css.d26348f46347b7751296.css", + "path": "/invenio/instance/static/dist/css/prism_css.d26348f46347b7751296.css", + "publicPath": "/static/dist/css/prism_css.d26348f46347b7751296.css" + }, + "css/simple_image_css.22066ba3f533514193c2.css": { + "name": "css/simple_image_css.22066ba3f533514193c2.css", + "path": "/invenio/instance/static/dist/css/simple_image_css.22066ba3f533514193c2.css", + "publicPath": "/static/dist/css/simple_image_css.22066ba3f533514193c2.css" + }, + "css/simple_image_css.290dcaa3fef4f2b83552.css": { + "name": "css/simple_image_css.290dcaa3fef4f2b83552.css", + "path": "/invenio/instance/static/dist/css/simple_image_css.290dcaa3fef4f2b83552.css", + "publicPath": "/static/dist/css/simple_image_css.290dcaa3fef4f2b83552.css" + }, + "css/theme-admin.11e5c170f835c367813e.css": { + "name": "css/theme-admin.11e5c170f835c367813e.css", + "path": "/invenio/instance/static/dist/css/theme-admin.11e5c170f835c367813e.css", + "publicPath": "/static/dist/css/theme-admin.11e5c170f835c367813e.css" + }, + "css/theme-admin.a683b9f46174f3bed424.css": { + "name": "css/theme-admin.a683b9f46174f3bed424.css", + "path": "/invenio/instance/static/dist/css/theme-admin.a683b9f46174f3bed424.css", + "publicPath": "/static/dist/css/theme-admin.a683b9f46174f3bed424.css" + }, + "css/vendors~previewer_theme~theme.30d3a0d0ab545555a252.css": { + "name": "css/vendors~previewer_theme~theme.30d3a0d0ab545555a252.css", + "path": "/invenio/instance/static/dist/css/vendors~previewer_theme~theme.30d3a0d0ab545555a252.css", + "publicPath": "/static/dist/css/vendors~previewer_theme~theme.30d3a0d0ab545555a252.css" + }, + "css/vendors~previewer_theme~theme.96782c7b6e34f730c329.css": { + "name": "css/vendors~previewer_theme~theme.96782c7b6e34f730c329.css", + "path": "/invenio/instance/static/dist/css/vendors~previewer_theme~theme.96782c7b6e34f730c329.css", + "publicPath": "/static/dist/css/vendors~previewer_theme~theme.96782c7b6e34f730c329.css" + }, + "css/zip_css.020009a67c87b6f0496f.css": { + "name": "css/zip_css.020009a67c87b6f0496f.css", + "path": "/invenio/instance/static/dist/css/zip_css.020009a67c87b6f0496f.css", + "publicPath": "/static/dist/css/zip_css.020009a67c87b6f0496f.css" + }, + "css/zip_css.3d4504b43b600f573196.css": { + "name": "css/zip_css.3d4504b43b600f573196.css", + "path": "/invenio/instance/static/dist/css/zip_css.3d4504b43b600f573196.css", + "publicPath": "/static/dist/css/zip_css.3d4504b43b600f573196.css" + }, + "fonts/brand-icons.278156e.woff2": { + "name": "fonts/brand-icons.278156e.woff2", + "path": "/invenio/instance/static/dist/fonts/brand-icons.278156e.woff2", + "publicPath": "/static/dist/fonts/brand-icons.278156e.woff2" + }, + "fonts/brand-icons.65a2fb6.ttf": { + "name": "fonts/brand-icons.65a2fb6.ttf", + "path": "/invenio/instance/static/dist/fonts/brand-icons.65a2fb6.ttf", + "publicPath": "/static/dist/fonts/brand-icons.65a2fb6.ttf" + }, + "fonts/brand-icons.cac87dc.woff": { + "name": "fonts/brand-icons.cac87dc.woff", + "path": "/invenio/instance/static/dist/fonts/brand-icons.cac87dc.woff", + "publicPath": "/static/dist/fonts/brand-icons.cac87dc.woff" + }, + "fonts/brand-icons.d68fa3e.eot": { + "name": "fonts/brand-icons.d68fa3e.eot", + "path": "/invenio/instance/static/dist/fonts/brand-icons.d68fa3e.eot", + "publicPath": "/static/dist/fonts/brand-icons.d68fa3e.eot" + }, + "fonts/icons.38c6d8b.woff2": { + "name": "fonts/icons.38c6d8b.woff2", + "path": "/invenio/instance/static/dist/fonts/icons.38c6d8b.woff2", + "publicPath": "/static/dist/fonts/icons.38c6d8b.woff2" + }, + "fonts/icons.425399f.woff": { + "name": "fonts/icons.425399f.woff", + "path": "/invenio/instance/static/dist/fonts/icons.425399f.woff", + "publicPath": "/static/dist/fonts/icons.425399f.woff" + }, + "fonts/icons.a01e3f2.eot": { + "name": "fonts/icons.a01e3f2.eot", + "path": "/invenio/instance/static/dist/fonts/icons.a01e3f2.eot", + "publicPath": "/static/dist/fonts/icons.a01e3f2.eot" + }, + "fonts/icons.c656b8c.ttf": { + "name": "fonts/icons.c656b8c.ttf", + "path": "/invenio/instance/static/dist/fonts/icons.c656b8c.ttf", + "publicPath": "/static/dist/fonts/icons.c656b8c.ttf" + }, + "fonts/Lato-Bold.21b3848.woff2": { + "name": "fonts/Lato-Bold.21b3848.woff2", + "path": "/invenio/instance/static/dist/fonts/Lato-Bold.21b3848.woff2", + "publicPath": "/static/dist/fonts/Lato-Bold.21b3848.woff2" + }, + "fonts/Lato-Bold.825d6d7.eot": { + "name": "fonts/Lato-Bold.825d6d7.eot", + "path": "/invenio/instance/static/dist/fonts/Lato-Bold.825d6d7.eot", + "publicPath": "/static/dist/fonts/Lato-Bold.825d6d7.eot" + }, + "fonts/Lato-Bold.89b6180.woff": { + "name": "fonts/Lato-Bold.89b6180.woff", + "path": "/invenio/instance/static/dist/fonts/Lato-Bold.89b6180.woff", + "publicPath": "/static/dist/fonts/Lato-Bold.89b6180.woff" + }, + "fonts/Lato-Bold.8acc961.ttf": { + "name": "fonts/Lato-Bold.8acc961.ttf", + "path": "/invenio/instance/static/dist/fonts/Lato-Bold.8acc961.ttf", + "publicPath": "/static/dist/fonts/Lato-Bold.8acc961.ttf" + }, + "fonts/Lato-BoldItalic.3e6b998.woff": { + "name": "fonts/Lato-BoldItalic.3e6b998.woff", + "path": "/invenio/instance/static/dist/fonts/Lato-BoldItalic.3e6b998.woff", + "publicPath": "/static/dist/fonts/Lato-BoldItalic.3e6b998.woff" + }, + "fonts/Lato-BoldItalic.50fe8d1.ttf": { + "name": "fonts/Lato-BoldItalic.50fe8d1.ttf", + "path": "/invenio/instance/static/dist/fonts/Lato-BoldItalic.50fe8d1.ttf", + "publicPath": "/static/dist/fonts/Lato-BoldItalic.50fe8d1.ttf" + }, + "fonts/Lato-BoldItalic.add7906.eot": { + "name": "fonts/Lato-BoldItalic.add7906.eot", + "path": "/invenio/instance/static/dist/fonts/Lato-BoldItalic.add7906.eot", + "publicPath": "/static/dist/fonts/Lato-BoldItalic.add7906.eot" + }, + "fonts/Lato-BoldItalic.e48918f.woff2": { + "name": "fonts/Lato-BoldItalic.e48918f.woff2", + "path": "/invenio/instance/static/dist/fonts/Lato-BoldItalic.e48918f.woff2", + "publicPath": "/static/dist/fonts/Lato-BoldItalic.e48918f.woff2" + }, + "fonts/Lato-Italic.2269469.ttf": { + "name": "fonts/Lato-Italic.2269469.ttf", + "path": "/invenio/instance/static/dist/fonts/Lato-Italic.2269469.ttf", + "publicPath": "/static/dist/fonts/Lato-Italic.2269469.ttf" + }, + "fonts/Lato-Italic.2f91a4b.eot": { + "name": "fonts/Lato-Italic.2f91a4b.eot", + "path": "/invenio/instance/static/dist/fonts/Lato-Italic.2f91a4b.eot", + "publicPath": "/static/dist/fonts/Lato-Italic.2f91a4b.eot" + }, + "fonts/Lato-Italic.62a9c83.woff": { + "name": "fonts/Lato-Italic.62a9c83.woff", + "path": "/invenio/instance/static/dist/fonts/Lato-Italic.62a9c83.woff", + "publicPath": "/static/dist/fonts/Lato-Italic.62a9c83.woff" + }, + "fonts/Lato-Italic.bb5de40.woff2": { + "name": "fonts/Lato-Italic.bb5de40.woff2", + "path": "/invenio/instance/static/dist/fonts/Lato-Italic.bb5de40.woff2", + "publicPath": "/static/dist/fonts/Lato-Italic.bb5de40.woff2" + }, + "fonts/Lato-Regular.19df47b.eot": { + "name": "fonts/Lato-Regular.19df47b.eot", + "path": "/invenio/instance/static/dist/fonts/Lato-Regular.19df47b.eot", + "publicPath": "/static/dist/fonts/Lato-Regular.19df47b.eot" + }, + "fonts/Lato-Regular.1d2ca94.woff": { + "name": "fonts/Lato-Regular.1d2ca94.woff", + "path": "/invenio/instance/static/dist/fonts/Lato-Regular.1d2ca94.woff", + "publicPath": "/static/dist/fonts/Lato-Regular.1d2ca94.woff" + }, + "fonts/Lato-Regular.75614cf.woff2": { + "name": "fonts/Lato-Regular.75614cf.woff2", + "path": "/invenio/instance/static/dist/fonts/Lato-Regular.75614cf.woff2", + "publicPath": "/static/dist/fonts/Lato-Regular.75614cf.woff2" + }, + "fonts/Lato-Regular.bb14dc8.ttf": { + "name": "fonts/Lato-Regular.bb14dc8.ttf", + "path": "/invenio/instance/static/dist/fonts/Lato-Regular.bb14dc8.ttf", + "publicPath": "/static/dist/fonts/Lato-Regular.bb14dc8.ttf" + }, + "fonts/outline-icons.5367103.ttf": { + "name": "fonts/outline-icons.5367103.ttf", + "path": "/invenio/instance/static/dist/fonts/outline-icons.5367103.ttf", + "publicPath": "/static/dist/fonts/outline-icons.5367103.ttf" + }, + "fonts/outline-icons.687a499.woff2": { + "name": "fonts/outline-icons.687a499.woff2", + "path": "/invenio/instance/static/dist/fonts/outline-icons.687a499.woff2", + "publicPath": "/static/dist/fonts/outline-icons.687a499.woff2" + }, + "fonts/outline-icons.752905f.eot": { + "name": "fonts/outline-icons.752905f.eot", + "path": "/invenio/instance/static/dist/fonts/outline-icons.752905f.eot", + "publicPath": "/static/dist/fonts/outline-icons.752905f.eot" + }, + "fonts/outline-icons.ddae9b1.woff": { + "name": "fonts/outline-icons.ddae9b1.woff", + "path": "/invenio/instance/static/dist/fonts/outline-icons.ddae9b1.woff", + "publicPath": "/static/dist/fonts/outline-icons.ddae9b1.woff" + }, + "img/brand-icons.6729d29.svg": { + "name": "img/brand-icons.6729d29.svg", + "path": "/invenio/instance/static/dist/img/brand-icons.6729d29.svg", + "publicPath": "/static/dist/img/brand-icons.6729d29.svg" + }, + "img/flags.99f63ae.png": { + "name": "img/flags.99f63ae.png", + "path": "/invenio/instance/static/dist/img/flags.99f63ae.png", + "publicPath": "/static/dist/img/flags.99f63ae.png" + }, + "img/icons.62d9dae.svg": { + "name": "img/icons.62d9dae.svg", + "path": "/invenio/instance/static/dist/img/icons.62d9dae.svg", + "publicPath": "/static/dist/img/icons.62d9dae.svg" + }, + "img/outline-icons.9c4845b.svg": { + "name": "img/outline-icons.9c4845b.svg", + "path": "/invenio/instance/static/dist/img/outline-icons.9c4845b.svg", + "publicPath": "/static/dist/img/outline-icons.9c4845b.svg" + }, + "js/0.f0b23abc5a3b7894b82c.js": { + "name": "js/0.f0b23abc5a3b7894b82c.js", + "path": "/invenio/instance/static/dist/js/0.f0b23abc5a3b7894b82c.js", + "publicPath": "/static/dist/js/0.f0b23abc5a3b7894b82c.js" + }, + "js/adminlte.42a924dd510a5e51b979.js": { + "name": "js/adminlte.42a924dd510a5e51b979.js", + "path": "/invenio/instance/static/dist/js/adminlte.42a924dd510a5e51b979.js", + "publicPath": "/static/dist/js/adminlte.42a924dd510a5e51b979.js" + }, + "js/adminlte.b8dba7c95ea7a702e056.js": { + "name": "js/adminlte.b8dba7c95ea7a702e056.js", + "path": "/invenio/instance/static/dist/js/adminlte.b8dba7c95ea7a702e056.js", + "publicPath": "/static/dist/js/adminlte.b8dba7c95ea7a702e056.js" + }, + "js/base-admin-theme.469b511face6ed650f82.js": { + "name": "js/base-admin-theme.469b511face6ed650f82.js", + "path": "/invenio/instance/static/dist/js/base-admin-theme.469b511face6ed650f82.js", + "publicPath": "/static/dist/js/base-admin-theme.469b511face6ed650f82.js" + }, + "js/base-admin-theme.4b122d5ea696062f654a.js": { + "name": "js/base-admin-theme.4b122d5ea696062f654a.js", + "path": "/invenio/instance/static/dist/js/base-admin-theme.4b122d5ea696062f654a.js", + "publicPath": "/static/dist/js/base-admin-theme.4b122d5ea696062f654a.js" + }, + "js/base.109e805b66010b3ac6f2.js": { + "name": "js/base.109e805b66010b3ac6f2.js", + "path": "/invenio/instance/static/dist/js/base.109e805b66010b3ac6f2.js", + "publicPath": "/static/dist/js/base.109e805b66010b3ac6f2.js" + }, + "js/base.9d47e96f9fb3514286ce.js": { + "name": "js/base.9d47e96f9fb3514286ce.js", + "path": "/invenio/instance/static/dist/js/base.9d47e96f9fb3514286ce.js", + "publicPath": "/static/dist/js/base.9d47e96f9fb3514286ce.js" + }, + "js/bottom_css.559c8ab2c8dd00a6888e.js": { + "name": "js/bottom_css.559c8ab2c8dd00a6888e.js", + "path": "/invenio/instance/static/dist/js/bottom_css.559c8ab2c8dd00a6888e.js", + "publicPath": "/static/dist/js/bottom_css.559c8ab2c8dd00a6888e.js" + }, + "js/bottom_css.c7def77184aad651320f.js": { + "name": "js/bottom_css.c7def77184aad651320f.js", + "path": "/invenio/instance/static/dist/js/bottom_css.c7def77184aad651320f.js", + "publicPath": "/static/dist/js/bottom_css.c7def77184aad651320f.js" + }, + "js/bottom_js.28a4660195d304e6d53e.js": { + "name": "js/bottom_js.28a4660195d304e6d53e.js", + "path": "/invenio/instance/static/dist/js/bottom_js.28a4660195d304e6d53e.js", + "publicPath": "/static/dist/js/bottom_js.28a4660195d304e6d53e.js" + }, + "js/bottom_js.a408d1a120e9055464ac.js": { + "name": "js/bottom_js.a408d1a120e9055464ac.js", + "path": "/invenio/instance/static/dist/js/bottom_js.a408d1a120e9055464ac.js", + "publicPath": "/static/dist/js/bottom_js.a408d1a120e9055464ac.js" + }, + "js/d3_csv.75e5c9e5269671473b80.js": { + "name": "js/d3_csv.75e5c9e5269671473b80.js", + "path": "/invenio/instance/static/dist/js/d3_csv.75e5c9e5269671473b80.js", + "publicPath": "/static/dist/js/d3_csv.75e5c9e5269671473b80.js" + }, + "js/d3_csv.f7e63bb90faea4725332.js": { + "name": "js/d3_csv.f7e63bb90faea4725332.js", + "path": "/invenio/instance/static/dist/js/d3_csv.f7e63bb90faea4725332.js", + "publicPath": "/static/dist/js/d3_csv.f7e63bb90faea4725332.js" + }, + "js/fullscreen_js.e3bb6fe1bc026c6bcc0a.js": { + "name": "js/fullscreen_js.e3bb6fe1bc026c6bcc0a.js", + "path": "/invenio/instance/static/dist/js/fullscreen_js.e3bb6fe1bc026c6bcc0a.js", + "publicPath": "/static/dist/js/fullscreen_js.e3bb6fe1bc026c6bcc0a.js" + }, + "js/i18n_app.0c4c0993bdaa6a4fa94e.js": { + "name": "js/i18n_app.0c4c0993bdaa6a4fa94e.js", + "path": "/invenio/instance/static/dist/js/i18n_app.0c4c0993bdaa6a4fa94e.js", + "publicPath": "/static/dist/js/i18n_app.0c4c0993bdaa6a4fa94e.js" + }, + "js/i18n_app.f9a16803dd05400bd0f2.js": { + "name": "js/i18n_app.f9a16803dd05400bd0f2.js", + "path": "/invenio/instance/static/dist/js/i18n_app.f9a16803dd05400bd0f2.js", + "publicPath": "/static/dist/js/i18n_app.f9a16803dd05400bd0f2.js" + }, + "js/invenio_search_ui_app.3a229e7520cb83507459.js": { + "name": "js/invenio_search_ui_app.3a229e7520cb83507459.js", + "path": "/invenio/instance/static/dist/js/invenio_search_ui_app.3a229e7520cb83507459.js", + "publicPath": "/static/dist/js/invenio_search_ui_app.3a229e7520cb83507459.js" + }, + "js/invenio-administration-create.12b08625af77e0c1e5d2.js": { + "name": "js/invenio-administration-create.12b08625af77e0c1e5d2.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-create.12b08625af77e0c1e5d2.js", + "publicPath": "/static/dist/js/invenio-administration-create.12b08625af77e0c1e5d2.js" + }, + "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js": { + "name": "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "publicPath": "/static/dist/js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js" + }, + "js/invenio-administration-details.4d65c7f63cebb416f887.js": { + "name": "js/invenio-administration-details.4d65c7f63cebb416f887.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-details.4d65c7f63cebb416f887.js", + "publicPath": "/static/dist/js/invenio-administration-details.4d65c7f63cebb416f887.js" + }, + "js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js": { + "name": "js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js", + "publicPath": "/static/dist/js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js" + }, + "js/invenio-administration-details~invenio-communities-admin-featured~invenio-communities-admin-search.746e78604f6b773c1a1d.js": { + "name": "js/invenio-administration-details~invenio-communities-admin-featured~invenio-communities-admin-search.746e78604f6b773c1a1d.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-details~invenio-communities-admin-featured~invenio-communities-admin-search.746e78604f6b773c1a1d.js", + "publicPath": "/static/dist/js/invenio-administration-details~invenio-communities-admin-featured~invenio-communities-admin-search.746e78604f6b773c1a1d.js" + }, + "js/invenio-administration-edit.e004ee5710fb8d22b10d.js": { + "name": "js/invenio-administration-edit.e004ee5710fb8d22b10d.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-edit.e004ee5710fb8d22b10d.js", + "publicPath": "/static/dist/js/invenio-administration-edit.e004ee5710fb8d22b10d.js" + }, + "js/invenio-administration-search.abe875852d9b3340742a.js": { + "name": "js/invenio-administration-search.abe875852d9b3340742a.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-search.abe875852d9b3340742a.js", + "publicPath": "/static/dist/js/invenio-administration-search.abe875852d9b3340742a.js" + }, + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search.8bd20d7547e718fd150c.js": { + "name": "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search.8bd20d7547e718fd150c.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search.8bd20d7547e718fd150c.js", + "publicPath": "/static/dist/js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search.8bd20d7547e718fd150c.js" + }, + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js": { + "name": "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "path": "/invenio/instance/static/dist/js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "publicPath": "/static/dist/js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js" + }, + "js/invenio-communities-admin-featured.b3183bafa1129ccee058.js": { + "name": "js/invenio-communities-admin-featured.b3183bafa1129ccee058.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-admin-featured.b3183bafa1129ccee058.js", + "publicPath": "/static/dist/js/invenio-communities-admin-featured.b3183bafa1129ccee058.js" + }, + "js/invenio-communities-admin-featured~invenio-communities-admin-search.34e33317cc55856bdd80.js": { + "name": "js/invenio-communities-admin-featured~invenio-communities-admin-search.34e33317cc55856bdd80.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-admin-featured~invenio-communities-admin-search.34e33317cc55856bdd80.js", + "publicPath": "/static/dist/js/invenio-communities-admin-featured~invenio-communities-admin-search.34e33317cc55856bdd80.js" + }, + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js": { + "name": "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "publicPath": "/static/dist/js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js" + }, + "js/invenio-communities-admin-search.a861c1c50417e54b78f8.js": { + "name": "js/invenio-communities-admin-search.a861c1c50417e54b78f8.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-admin-search.a861c1c50417e54b78f8.js", + "publicPath": "/static/dist/js/invenio-communities-admin-search.a861c1c50417e54b78f8.js" + }, + "js/invenio-communities-carousel.37197bcd4b7ff52118a5.js": { + "name": "js/invenio-communities-carousel.37197bcd4b7ff52118a5.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-carousel.37197bcd4b7ff52118a5.js", + "publicPath": "/static/dist/js/invenio-communities-carousel.37197bcd4b7ff52118a5.js" + }, + "js/invenio-communities-details-search.c911e2f28076f1b5fa96.js": { + "name": "js/invenio-communities-details-search.c911e2f28076f1b5fa96.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-details-search.c911e2f28076f1b5fa96.js", + "publicPath": "/static/dist/js/invenio-communities-details-search.c911e2f28076f1b5fa96.js" + }, + "js/invenio-communities-featured.856d2ee24ba69bcc5fb1.js": { + "name": "js/invenio-communities-featured.856d2ee24ba69bcc5fb1.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-featured.856d2ee24ba69bcc5fb1.js", + "publicPath": "/static/dist/js/invenio-communities-featured.856d2ee24ba69bcc5fb1.js" + }, + "js/invenio-communities-frontpage.757287079172672a7b02.js": { + "name": "js/invenio-communities-frontpage.757287079172672a7b02.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-frontpage.757287079172672a7b02.js", + "publicPath": "/static/dist/js/invenio-communities-frontpage.757287079172672a7b02.js" + }, + "js/invenio-communities-invitations.ef4646bff64a9d376267.js": { + "name": "js/invenio-communities-invitations.ef4646bff64a9d376267.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-invitations.ef4646bff64a9d376267.js", + "publicPath": "/static/dist/js/invenio-communities-invitations.ef4646bff64a9d376267.js" + }, + "js/invenio-communities-invitations~invenio-communities-members~invenio-communities-members-manager.c589aeec260850c55680.js": { + "name": "js/invenio-communities-invitations~invenio-communities-members~invenio-communities-members-manager.c589aeec260850c55680.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-invitations~invenio-communities-members~invenio-communities-members-manager.c589aeec260850c55680.js", + "publicPath": "/static/dist/js/invenio-communities-invitations~invenio-communities-members~invenio-communities-members-manager.c589aeec260850c55680.js" + }, + "js/invenio-communities-invitations~invenio-communities-requests.ff051d9573313b766adc.js": { + "name": "js/invenio-communities-invitations~invenio-communities-requests.ff051d9573313b766adc.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-invitations~invenio-communities-requests.ff051d9573313b766adc.js", + "publicPath": "/static/dist/js/invenio-communities-invitations~invenio-communities-requests.ff051d9573313b766adc.js" + }, + "js/invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.7acd261e6dae4dc01ab9.js": { + "name": "js/invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.7acd261e6dae4dc01ab9.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.7acd261e6dae4dc01ab9.js", + "publicPath": "/static/dist/js/invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.7acd261e6dae4dc01ab9.js" + }, + "js/invenio-communities-members-manager.3363b397a7dd2b1c3550.js": { + "name": "js/invenio-communities-members-manager.3363b397a7dd2b1c3550.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-members-manager.3363b397a7dd2b1c3550.js", + "publicPath": "/static/dist/js/invenio-communities-members-manager.3363b397a7dd2b1c3550.js" + }, + "js/invenio-communities-members-public.6e9bc7941e991dbdb2f8.js": { + "name": "js/invenio-communities-members-public.6e9bc7941e991dbdb2f8.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-members-public.6e9bc7941e991dbdb2f8.js", + "publicPath": "/static/dist/js/invenio-communities-members-public.6e9bc7941e991dbdb2f8.js" + }, + "js/invenio-communities-members.41bc0c3eec186652b95f.js": { + "name": "js/invenio-communities-members.41bc0c3eec186652b95f.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-members.41bc0c3eec186652b95f.js", + "publicPath": "/static/dist/js/invenio-communities-members.41bc0c3eec186652b95f.js" + }, + "js/invenio-communities-members~invenio-communities-members-manager.d7b3fb52444c0adc7d33.js": { + "name": "js/invenio-communities-members~invenio-communities-members-manager.d7b3fb52444c0adc7d33.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-members~invenio-communities-members-manager.d7b3fb52444c0adc7d33.js", + "publicPath": "/static/dist/js/invenio-communities-members~invenio-communities-members-manager.d7b3fb52444c0adc7d33.js" + }, + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-members-public.5f2e82f59b019c1841e6.js": { + "name": "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-members-public.5f2e82f59b019c1841e6.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-members-public.5f2e82f59b019c1841e6.js", + "publicPath": "/static/dist/js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-members-public.5f2e82f59b019c1841e6.js" + }, + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js": { + "name": "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js", + "publicPath": "/static/dist/js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js" + }, + "js/invenio-communities-new.461f7a1b08f9ff46a99e.js": { + "name": "js/invenio-communities-new.461f7a1b08f9ff46a99e.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-new.461f7a1b08f9ff46a99e.js", + "publicPath": "/static/dist/js/invenio-communities-new.461f7a1b08f9ff46a99e.js" + }, + "js/invenio-communities-new~invenio-communities-privileges~invenio-communities-profile.968d481cabfbf39553ad.js": { + "name": "js/invenio-communities-new~invenio-communities-privileges~invenio-communities-profile.968d481cabfbf39553ad.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-new~invenio-communities-privileges~invenio-communities-profile.968d481cabfbf39553ad.js", + "publicPath": "/static/dist/js/invenio-communities-new~invenio-communities-privileges~invenio-communities-profile.968d481cabfbf39553ad.js" + }, + "js/invenio-communities-privileges.f10b9e16a55c32215031.js": { + "name": "js/invenio-communities-privileges.f10b9e16a55c32215031.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-privileges.f10b9e16a55c32215031.js", + "publicPath": "/static/dist/js/invenio-communities-privileges.f10b9e16a55c32215031.js" + }, + "js/invenio-communities-profile.d5c24ea5a8ffd4658d35.js": { + "name": "js/invenio-communities-profile.d5c24ea5a8ffd4658d35.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-profile.d5c24ea5a8ffd4658d35.js", + "publicPath": "/static/dist/js/invenio-communities-profile.d5c24ea5a8ffd4658d35.js" + }, + "js/invenio-communities-requests.a7e5d7c106912122946b.js": { + "name": "js/invenio-communities-requests.a7e5d7c106912122946b.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-requests.a7e5d7c106912122946b.js", + "publicPath": "/static/dist/js/invenio-communities-requests.a7e5d7c106912122946b.js" + }, + "js/invenio-communities-search.9ac30fd8c894a16f918b.js": { + "name": "js/invenio-communities-search.9ac30fd8c894a16f918b.js", + "path": "/invenio/instance/static/dist/js/invenio-communities-search.9ac30fd8c894a16f918b.js", + "publicPath": "/static/dist/js/invenio-communities-search.9ac30fd8c894a16f918b.js" + }, + "js/invenio-requests-base.06522baeacd35f179168.js": { + "name": "js/invenio-requests-base.06522baeacd35f179168.js", + "path": "/invenio/instance/static/dist/js/invenio-requests-base.06522baeacd35f179168.js", + "publicPath": "/static/dist/js/invenio-requests-base.06522baeacd35f179168.js" + }, + "js/manifest.4695496aebf9efb0cd82.js": { + "name": "js/manifest.4695496aebf9efb0cd82.js", + "path": "/invenio/instance/static/dist/js/manifest.4695496aebf9efb0cd82.js", + "publicPath": "/static/dist/js/manifest.4695496aebf9efb0cd82.js" + }, + "js/oarepo_ui_forms.b28a0864bf143cb9a055.js": { + "name": "js/oarepo_ui_forms.b28a0864bf143cb9a055.js", + "path": "/invenio/instance/static/dist/js/oarepo_ui_forms.b28a0864bf143cb9a055.js", + "publicPath": "/static/dist/js/oarepo_ui_forms.b28a0864bf143cb9a055.js" + }, + "js/oarepo_ui_forms~oarepo_vocabularies_forms.9ae700f302de2931ba77.js": { + "name": "js/oarepo_ui_forms~oarepo_vocabularies_forms.9ae700f302de2931ba77.js", + "path": "/invenio/instance/static/dist/js/oarepo_ui_forms~oarepo_vocabularies_forms.9ae700f302de2931ba77.js", + "publicPath": "/static/dist/js/oarepo_ui_forms~oarepo_vocabularies_forms.9ae700f302de2931ba77.js" + }, + "js/oarepo_ui_search.ad60aadf85ba3fff286d.js": { + "name": "js/oarepo_ui_search.ad60aadf85ba3fff286d.js", + "path": "/invenio/instance/static/dist/js/oarepo_ui_search.ad60aadf85ba3fff286d.js", + "publicPath": "/static/dist/js/oarepo_ui_search.ad60aadf85ba3fff286d.js" + }, + "js/oarepo_ui_search~oarepo_vocabularies_detail~oarepo_vocabularies_search.56df6f65c43f8b0737e3.js": { + "name": "js/oarepo_ui_search~oarepo_vocabularies_detail~oarepo_vocabularies_search.56df6f65c43f8b0737e3.js", + "path": "/invenio/instance/static/dist/js/oarepo_ui_search~oarepo_vocabularies_detail~oarepo_vocabularies_search.56df6f65c43f8b0737e3.js", + "publicPath": "/static/dist/js/oarepo_ui_search~oarepo_vocabularies_detail~oarepo_vocabularies_search.56df6f65c43f8b0737e3.js" + }, + "js/oarepo_ui.7724d779e1a8a681f30a.js": { + "name": "js/oarepo_ui.7724d779e1a8a681f30a.js", + "path": "/invenio/instance/static/dist/js/oarepo_ui.7724d779e1a8a681f30a.js", + "publicPath": "/static/dist/js/oarepo_ui.7724d779e1a8a681f30a.js" + }, + "js/oarepo_vocabularies_detail.d4cf8fb17558171be139.js": { + "name": "js/oarepo_vocabularies_detail.d4cf8fb17558171be139.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_detail.d4cf8fb17558171be139.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_detail.d4cf8fb17558171be139.js" + }, + "js/oarepo_vocabularies_detail~oarepo_vocabularies_search.71bcec28303ca863314b.js": { + "name": "js/oarepo_vocabularies_detail~oarepo_vocabularies_search.71bcec28303ca863314b.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_detail~oarepo_vocabularies_search.71bcec28303ca863314b.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_detail~oarepo_vocabularies_search.71bcec28303ca863314b.js" + }, + "js/oarepo_vocabularies_forms.127ff3203acdc2611b74.js": { + "name": "js/oarepo_vocabularies_forms.127ff3203acdc2611b74.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.127ff3203acdc2611b74.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.127ff3203acdc2611b74.js" + }, + "js/oarepo_vocabularies_forms.207c2f3bdc23e89f1d7d.js": { + "name": "js/oarepo_vocabularies_forms.207c2f3bdc23e89f1d7d.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.207c2f3bdc23e89f1d7d.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.207c2f3bdc23e89f1d7d.js" + }, + "js/oarepo_vocabularies_forms.4edc9ea27840c56b5ab0.js": { + "name": "js/oarepo_vocabularies_forms.4edc9ea27840c56b5ab0.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.4edc9ea27840c56b5ab0.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.4edc9ea27840c56b5ab0.js" + }, + "js/oarepo_vocabularies_forms.5c5575fe59e2e1b956c6.js": { + "name": "js/oarepo_vocabularies_forms.5c5575fe59e2e1b956c6.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.5c5575fe59e2e1b956c6.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.5c5575fe59e2e1b956c6.js" + }, + "js/oarepo_vocabularies_forms.664a50ee3bf01863db9c.js": { + "name": "js/oarepo_vocabularies_forms.664a50ee3bf01863db9c.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.664a50ee3bf01863db9c.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.664a50ee3bf01863db9c.js" + }, + "js/oarepo_vocabularies_forms.6bbfc79fb1a2e55b277c.js": { + "name": "js/oarepo_vocabularies_forms.6bbfc79fb1a2e55b277c.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.6bbfc79fb1a2e55b277c.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.6bbfc79fb1a2e55b277c.js" + }, + "js/oarepo_vocabularies_forms.789972720f36780e2ea1.js": { + "name": "js/oarepo_vocabularies_forms.789972720f36780e2ea1.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.789972720f36780e2ea1.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.789972720f36780e2ea1.js" + }, + "js/oarepo_vocabularies_forms.7a381c4fd36a4c0a2139.js": { + "name": "js/oarepo_vocabularies_forms.7a381c4fd36a4c0a2139.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.7a381c4fd36a4c0a2139.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.7a381c4fd36a4c0a2139.js" + }, + "js/oarepo_vocabularies_forms.7b4d28046d21e87908cd.js": { + "name": "js/oarepo_vocabularies_forms.7b4d28046d21e87908cd.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.7b4d28046d21e87908cd.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.7b4d28046d21e87908cd.js" + }, + "js/oarepo_vocabularies_forms.8c8a4ab4d8fe1d65eef9.js": { + "name": "js/oarepo_vocabularies_forms.8c8a4ab4d8fe1d65eef9.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.8c8a4ab4d8fe1d65eef9.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.8c8a4ab4d8fe1d65eef9.js" + }, + "js/oarepo_vocabularies_forms.a50bcf4b474e704f7309.js": { + "name": "js/oarepo_vocabularies_forms.a50bcf4b474e704f7309.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.a50bcf4b474e704f7309.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.a50bcf4b474e704f7309.js" + }, + "js/oarepo_vocabularies_forms.ac990f7983702c60f67e.js": { + "name": "js/oarepo_vocabularies_forms.ac990f7983702c60f67e.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.ac990f7983702c60f67e.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.ac990f7983702c60f67e.js" + }, + "js/oarepo_vocabularies_forms.b5a54cadad8b156c498f.js": { + "name": "js/oarepo_vocabularies_forms.b5a54cadad8b156c498f.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.b5a54cadad8b156c498f.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.b5a54cadad8b156c498f.js" + }, + "js/oarepo_vocabularies_forms.c07feac8a96087fe887d.js": { + "name": "js/oarepo_vocabularies_forms.c07feac8a96087fe887d.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.c07feac8a96087fe887d.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.c07feac8a96087fe887d.js" + }, + "js/oarepo_vocabularies_forms.c2355e484fe67215446a.js": { + "name": "js/oarepo_vocabularies_forms.c2355e484fe67215446a.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.c2355e484fe67215446a.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.c2355e484fe67215446a.js" + }, + "js/oarepo_vocabularies_forms.ce27f236ebe46c7c821a.js": { + "name": "js/oarepo_vocabularies_forms.ce27f236ebe46c7c821a.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.ce27f236ebe46c7c821a.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.ce27f236ebe46c7c821a.js" + }, + "js/oarepo_vocabularies_forms.d1b8ac09e17b634c8b3d.js": { + "name": "js/oarepo_vocabularies_forms.d1b8ac09e17b634c8b3d.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.d1b8ac09e17b634c8b3d.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.d1b8ac09e17b634c8b3d.js" + }, + "js/oarepo_vocabularies_forms.e0001f00ced33092da3f.js": { + "name": "js/oarepo_vocabularies_forms.e0001f00ced33092da3f.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.e0001f00ced33092da3f.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.e0001f00ced33092da3f.js" + }, + "js/oarepo_vocabularies_forms.e75cdac977465ba77131.js": { + "name": "js/oarepo_vocabularies_forms.e75cdac977465ba77131.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_forms.e75cdac977465ba77131.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_forms.e75cdac977465ba77131.js" + }, + "js/oarepo_vocabularies_search.3efc909a421d69b44b16.js": { + "name": "js/oarepo_vocabularies_search.3efc909a421d69b44b16.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_search.3efc909a421d69b44b16.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_search.3efc909a421d69b44b16.js" + }, + "js/oarepo_vocabularies_ui_components.26409fd60ecb8ccebb18.js": { + "name": "js/oarepo_vocabularies_ui_components.26409fd60ecb8ccebb18.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_ui_components.26409fd60ecb8ccebb18.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_ui_components.26409fd60ecb8ccebb18.js" + }, + "js/oarepo_vocabularies_ui_components.de4d3f4261ebc8cbf950.js": { + "name": "js/oarepo_vocabularies_ui_components.de4d3f4261ebc8cbf950.js", + "path": "/invenio/instance/static/dist/js/oarepo_vocabularies_ui_components.de4d3f4261ebc8cbf950.js", + "publicPath": "/static/dist/js/oarepo_vocabularies_ui_components.de4d3f4261ebc8cbf950.js" + }, + "js/open_pdf.2837432f2839645f9914.js": { + "name": "js/open_pdf.2837432f2839645f9914.js", + "path": "/invenio/instance/static/dist/js/open_pdf.2837432f2839645f9914.js", + "publicPath": "/static/dist/js/open_pdf.2837432f2839645f9914.js" + }, + "js/pdfjs_css.c3921995a5cd9553c53e.js": { + "name": "js/pdfjs_css.c3921995a5cd9553c53e.js", + "path": "/invenio/instance/static/dist/js/pdfjs_css.c3921995a5cd9553c53e.js", + "publicPath": "/static/dist/js/pdfjs_css.c3921995a5cd9553c53e.js" + }, + "js/pdfjs_css.c5058d4cb87e7e7e7e45.js": { + "name": "js/pdfjs_css.c5058d4cb87e7e7e7e45.js", + "path": "/invenio/instance/static/dist/js/pdfjs_css.c5058d4cb87e7e7e7e45.js", + "publicPath": "/static/dist/js/pdfjs_css.c5058d4cb87e7e7e7e45.js" + }, + "js/pdfjs_js.a9a7c168e4cbfe05f754.js": { + "name": "js/pdfjs_js.a9a7c168e4cbfe05f754.js", + "path": "/invenio/instance/static/dist/js/pdfjs_js.a9a7c168e4cbfe05f754.js", + "publicPath": "/static/dist/js/pdfjs_js.a9a7c168e4cbfe05f754.js" + }, + "js/previewer_theme.293dd3c431dd27b06f08.js": { + "name": "js/previewer_theme.293dd3c431dd27b06f08.js", + "path": "/invenio/instance/static/dist/js/previewer_theme.293dd3c431dd27b06f08.js", + "publicPath": "/static/dist/js/previewer_theme.293dd3c431dd27b06f08.js" + }, + "js/previewer_theme.af08a70dcfdb468863e1.js": { + "name": "js/previewer_theme.af08a70dcfdb468863e1.js", + "path": "/invenio/instance/static/dist/js/previewer_theme.af08a70dcfdb468863e1.js", + "publicPath": "/static/dist/js/previewer_theme.af08a70dcfdb468863e1.js" + }, + "js/prism_css.22c9656ce42c3a49d582.js": { + "name": "js/prism_css.22c9656ce42c3a49d582.js", + "path": "/invenio/instance/static/dist/js/prism_css.22c9656ce42c3a49d582.js", + "publicPath": "/static/dist/js/prism_css.22c9656ce42c3a49d582.js" + }, + "js/prism_css.f6bf7f8fde5425f1a6dc.js": { + "name": "js/prism_css.f6bf7f8fde5425f1a6dc.js", + "path": "/invenio/instance/static/dist/js/prism_css.f6bf7f8fde5425f1a6dc.js", + "publicPath": "/static/dist/js/prism_css.f6bf7f8fde5425f1a6dc.js" + }, + "js/prism_js.68de206741bf8e0e49b1.js": { + "name": "js/prism_js.68de206741bf8e0e49b1.js", + "path": "/invenio/instance/static/dist/js/prism_js.68de206741bf8e0e49b1.js", + "publicPath": "/static/dist/js/prism_js.68de206741bf8e0e49b1.js" + }, + "js/simple_image_css.561e05d32df67a9df4c4.js": { + "name": "js/simple_image_css.561e05d32df67a9df4c4.js", + "path": "/invenio/instance/static/dist/js/simple_image_css.561e05d32df67a9df4c4.js", + "publicPath": "/static/dist/js/simple_image_css.561e05d32df67a9df4c4.js" + }, + "js/simple_image_css.8d0b56840c279e774976.js": { + "name": "js/simple_image_css.8d0b56840c279e774976.js", + "path": "/invenio/instance/static/dist/js/simple_image_css.8d0b56840c279e774976.js", + "publicPath": "/static/dist/js/simple_image_css.8d0b56840c279e774976.js" + }, + "js/theme-admin.0ff5897140e434b53d40.js": { + "name": "js/theme-admin.0ff5897140e434b53d40.js", + "path": "/invenio/instance/static/dist/js/theme-admin.0ff5897140e434b53d40.js", + "publicPath": "/static/dist/js/theme-admin.0ff5897140e434b53d40.js" + }, + "js/theme-admin.a9c83de7ffd547a8fef7.js": { + "name": "js/theme-admin.a9c83de7ffd547a8fef7.js", + "path": "/invenio/instance/static/dist/js/theme-admin.a9c83de7ffd547a8fef7.js", + "publicPath": "/static/dist/js/theme-admin.a9c83de7ffd547a8fef7.js" + }, + "js/theme.0a1b1fcdbcecfe21bec9.js": { + "name": "js/theme.0a1b1fcdbcecfe21bec9.js", + "path": "/invenio/instance/static/dist/js/theme.0a1b1fcdbcecfe21bec9.js", + "publicPath": "/static/dist/js/theme.0a1b1fcdbcecfe21bec9.js" + }, + "js/theme.7e75449e2458aa35146e.js": { + "name": "js/theme.7e75449e2458aa35146e.js", + "path": "/invenio/instance/static/dist/js/theme.7e75449e2458aa35146e.js", + "publicPath": "/static/dist/js/theme.7e75449e2458aa35146e.js" + }, + "js/vendors~adminlte.0def173073df55d9729d.js": { + "name": "js/vendors~adminlte.0def173073df55d9729d.js", + "path": "/invenio/instance/static/dist/js/vendors~adminlte.0def173073df55d9729d.js", + "publicPath": "/static/dist/js/vendors~adminlte.0def173073df55d9729d.js" + }, + "js/vendors~adminlte.7dbbf26e15359810b482.js": { + "name": "js/vendors~adminlte.7dbbf26e15359810b482.js", + "path": "/invenio/instance/static/dist/js/vendors~adminlte.7dbbf26e15359810b482.js", + "publicPath": "/static/dist/js/vendors~adminlte.7dbbf26e15359810b482.js" + }, + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js": { + "name": "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "path": "/invenio/instance/static/dist/js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "publicPath": "/static/dist/js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js" + }, + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.e7f1fcc82cb020ad2070.js": { + "name": "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.e7f1fcc82cb020ad2070.js", + "path": "/invenio/instance/static/dist/js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.e7f1fcc82cb020ad2070.js", + "publicPath": "/static/dist/js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.e7f1fcc82cb020ad2070.js" + }, + "js/vendors~d3_csv.9c049b06455aa1f3574a.js": { + "name": "js/vendors~d3_csv.9c049b06455aa1f3574a.js", + "path": "/invenio/instance/static/dist/js/vendors~d3_csv.9c049b06455aa1f3574a.js", + "publicPath": "/static/dist/js/vendors~d3_csv.9c049b06455aa1f3574a.js" + }, + "js/vendors~d3_csv.f5a770bc8e6f5fc3358a.js": { + "name": "js/vendors~d3_csv.f5a770bc8e6f5fc3358a.js", + "path": "/invenio/instance/static/dist/js/vendors~d3_csv.f5a770bc8e6f5fc3358a.js", + "publicPath": "/static/dist/js/vendors~d3_csv.f5a770bc8e6f5fc3358a.js" + }, + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js": { + "name": "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js" + }, + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js": { + "name": "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js" + }, + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js": { + "name": "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js" + }, + "js/vendors~invenio-administration-details.68e4b67a323ee0be345a.js": { + "name": "js/vendors~invenio-administration-details.68e4b67a323ee0be345a.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-details.68e4b67a323ee0be345a.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-details.68e4b67a323ee0be345a.js" + }, + "js/vendors~invenio-administration-edit.57623728e2561684210d.js": { + "name": "js/vendors~invenio-administration-edit.57623728e2561684210d.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-edit.57623728e2561684210d.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-edit.57623728e2561684210d.js" + }, + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js": { + "name": "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js" + }, + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js": { + "name": "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js" + }, + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js": { + "name": "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js" + }, + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js": { + "name": "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js" + }, + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js": { + "name": "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "publicPath": "/static/dist/js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js" + }, + "js/vendors~invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.71782eb9a729b4a1f6dc.js": { + "name": "js/vendors~invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.71782eb9a729b4a1f6dc.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.71782eb9a729b4a1f6dc.js", + "publicPath": "/static/dist/js/vendors~invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.71782eb9a729b4a1f6dc.js" + }, + "js/vendors~invenio-communities-invitations~oarepo_ui_forms~oarepo_vocabularies_forms.fcc18fa787a9246039f1.js": { + "name": "js/vendors~invenio-communities-invitations~oarepo_ui_forms~oarepo_vocabularies_forms.fcc18fa787a9246039f1.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-communities-invitations~oarepo_ui_forms~oarepo_vocabularies_forms.fcc18fa787a9246039f1.js", + "publicPath": "/static/dist/js/vendors~invenio-communities-invitations~oarepo_ui_forms~oarepo_vocabularies_forms.fcc18fa787a9246039f1.js" + }, + "js/vendors~invenio-communities-privileges~invenio-communities-profile.fe62a7845824a9026922.js": { + "name": "js/vendors~invenio-communities-privileges~invenio-communities-profile.fe62a7845824a9026922.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-communities-privileges~invenio-communities-profile.fe62a7845824a9026922.js", + "publicPath": "/static/dist/js/vendors~invenio-communities-privileges~invenio-communities-profile.fe62a7845824a9026922.js" + }, + "js/vendors~invenio-communities-profile.3a346855744e571fc076.js": { + "name": "js/vendors~invenio-communities-profile.3a346855744e571fc076.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-communities-profile.3a346855744e571fc076.js", + "publicPath": "/static/dist/js/vendors~invenio-communities-profile.3a346855744e571fc076.js" + }, + "js/vendors~invenio-communities-profile~oarepo_vocabularies_forms.47ce335f4a316a63c91d.js": { + "name": "js/vendors~invenio-communities-profile~oarepo_vocabularies_forms.47ce335f4a316a63c91d.js", + "path": "/invenio/instance/static/dist/js/vendors~invenio-communities-profile~oarepo_vocabularies_forms.47ce335f4a316a63c91d.js", + "publicPath": "/static/dist/js/vendors~invenio-communities-profile~oarepo_vocabularies_forms.47ce335f4a316a63c91d.js" + }, + "js/vendors~oarepo_ui_forms~oarepo_vocabularies_forms.78fa06a269d54eb5d9aa.js": { + "name": "js/vendors~oarepo_ui_forms~oarepo_vocabularies_forms.78fa06a269d54eb5d9aa.js", + "path": "/invenio/instance/static/dist/js/vendors~oarepo_ui_forms~oarepo_vocabularies_forms.78fa06a269d54eb5d9aa.js", + "publicPath": "/static/dist/js/vendors~oarepo_ui_forms~oarepo_vocabularies_forms.78fa06a269d54eb5d9aa.js" + }, + "js/vendors~pdfjs_js.15011b7f4b2e611aa57a.js": { + "name": "js/vendors~pdfjs_js.15011b7f4b2e611aa57a.js", + "path": "/invenio/instance/static/dist/js/vendors~pdfjs_js.15011b7f4b2e611aa57a.js", + "publicPath": "/static/dist/js/vendors~pdfjs_js.15011b7f4b2e611aa57a.js" + }, + "js/vendors~previewer_theme~theme.ba2deb8c39b0bd1f14f3.js": { + "name": "js/vendors~previewer_theme~theme.ba2deb8c39b0bd1f14f3.js", + "path": "/invenio/instance/static/dist/js/vendors~previewer_theme~theme.ba2deb8c39b0bd1f14f3.js", + "publicPath": "/static/dist/js/vendors~previewer_theme~theme.ba2deb8c39b0bd1f14f3.js" + }, + "js/vendors~previewer_theme~theme.ee93338293bbbc6dbfbd.js": { + "name": "js/vendors~previewer_theme~theme.ee93338293bbbc6dbfbd.js", + "path": "/invenio/instance/static/dist/js/vendors~previewer_theme~theme.ee93338293bbbc6dbfbd.js", + "publicPath": "/static/dist/js/vendors~previewer_theme~theme.ee93338293bbbc6dbfbd.js" + }, + "js/vendors~prism_js.6682fd1a890b9218fd52.js": { + "name": "js/vendors~prism_js.6682fd1a890b9218fd52.js", + "path": "/invenio/instance/static/dist/js/vendors~prism_js.6682fd1a890b9218fd52.js", + "publicPath": "/static/dist/js/vendors~prism_js.6682fd1a890b9218fd52.js" + }, + "js/zip_css.01c6b0ff38bdf04e7efb.js": { + "name": "js/zip_css.01c6b0ff38bdf04e7efb.js", + "path": "/invenio/instance/static/dist/js/zip_css.01c6b0ff38bdf04e7efb.js", + "publicPath": "/static/dist/js/zip_css.01c6b0ff38bdf04e7efb.js" + }, + "js/zip_css.e311b442e1e5e4274a29.js": { + "name": "js/zip_css.e311b442e1e5e4274a29.js", + "path": "/invenio/instance/static/dist/js/zip_css.e311b442e1e5e4274a29.js", + "publicPath": "/static/dist/js/zip_css.e311b442e1e5e4274a29.js" + } + }, + "chunks": { + "adminlte": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "js/vendors~adminlte.7dbbf26e15359810b482.js", + "js/adminlte.42a924dd510a5e51b979.js" + ], + "base": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "js/base.9d47e96f9fb3514286ce.js" + ], + "base-admin-theme": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "js/base-admin-theme.4b122d5ea696062f654a.js" + ], + "bottom_css": [ + "js/manifest.4695496aebf9efb0cd82.js", + "css/bottom_css.1b2e27b61142106979cc.css", + "js/bottom_css.c7def77184aad651320f.js" + ], + "bottom_js": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "js/bottom_js.a408d1a120e9055464ac.js" + ], + "d3_csv": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "js/vendors~d3_csv.f5a770bc8e6f5fc3358a.js", + "js/d3_csv.f7e63bb90faea4725332.js" + ], + "fullscreen_js": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/fullscreen_js.e3bb6fe1bc026c6bcc0a.js" + ], + "i18n_app": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "js/i18n_app.0c4c0993bdaa6a4fa94e.js" + ], + "invenio_search_ui_app": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio_search_ui_app.3a229e7520cb83507459.js" + ], + "invenio-administration-create": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "js/invenio-administration-create.12b08625af77e0c1e5d2.js" + ], + "invenio-administration-details": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-details.68e4b67a323ee0be345a.js", + "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js", + "js/invenio-administration-details~invenio-communities-admin-featured~invenio-communities-admin-search.746e78604f6b773c1a1d.js", + "js/invenio-administration-details.4d65c7f63cebb416f887.js" + ], + "invenio-administration-edit": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-edit.57623728e2561684210d.js", + "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "js/invenio-administration-edit.e004ee5710fb8d22b10d.js" + ], + "invenio-administration-search": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search.8bd20d7547e718fd150c.js", + "js/invenio-administration-search.abe875852d9b3340742a.js" + ], + "invenio-communities-admin-featured": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search.8bd20d7547e718fd150c.js", + "js/invenio-administration-details~invenio-communities-admin-featured~invenio-communities-admin-search.746e78604f6b773c1a1d.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search.34e33317cc55856bdd80.js", + "js/invenio-communities-admin-featured.b3183bafa1129ccee058.js" + ], + "invenio-communities-admin-search": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-administration-create~invenio-administration-details~invenio-administration-edit~invenio-adm~c42839fd.9d0557140c360e30d0ad.js", + "js/invenio-administration-details~invenio-administration-search~invenio-communities-admin-featured~inve~39dbfc21.6f882ffe91620507a036.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search.8bd20d7547e718fd150c.js", + "js/invenio-administration-details~invenio-communities-admin-featured~invenio-communities-admin-search.746e78604f6b773c1a1d.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search.34e33317cc55856bdd80.js", + "js/invenio-communities-admin-search.a861c1c50417e54b78f8.js" + ], + "invenio-communities-carousel": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-communities-carousel.37197bcd4b7ff52118a5.js" + ], + "invenio-communities-details-search": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-communities-details-search.c911e2f28076f1b5fa96.js" + ], + "invenio-communities-featured": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-communities-featured.856d2ee24ba69bcc5fb1.js" + ], + "invenio-communities-frontpage": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/invenio-communities-frontpage.757287079172672a7b02.js" + ], + "invenio-communities-invitations": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/vendors~invenio-communities-invitations~oarepo_ui_forms~oarepo_vocabularies_forms.fcc18fa787a9246039f1.js", + "js/vendors~invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.71782eb9a729b4a1f6dc.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.7acd261e6dae4dc01ab9.js", + "js/invenio-communities-invitations~invenio-communities-members~invenio-communities-members-manager.c589aeec260850c55680.js", + "js/invenio-communities-invitations~invenio-communities-requests.ff051d9573313b766adc.js", + "js/invenio-communities-invitations.ef4646bff64a9d376267.js" + ], + "invenio-communities-members": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js", + "js/invenio-communities-invitations~invenio-communities-members~invenio-communities-members-manager.c589aeec260850c55680.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-members-public.5f2e82f59b019c1841e6.js", + "js/invenio-communities-members~invenio-communities-members-manager.d7b3fb52444c0adc7d33.js", + "js/invenio-communities-members.41bc0c3eec186652b95f.js" + ], + "invenio-communities-members-manager": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js", + "js/invenio-communities-invitations~invenio-communities-members~invenio-communities-members-manager.c589aeec260850c55680.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-members-public.5f2e82f59b019c1841e6.js", + "js/invenio-communities-members~invenio-communities-members-manager.d7b3fb52444c0adc7d33.js", + "js/invenio-communities-members-manager.3363b397a7dd2b1c3550.js" + ], + "invenio-communities-members-public": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-members-public.5f2e82f59b019c1841e6.js", + "js/invenio-communities-members-public.6e9bc7941e991dbdb2f8.js" + ], + "invenio-communities-new": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js", + "js/invenio-communities-new~invenio-communities-privileges~invenio-communities-profile.968d481cabfbf39553ad.js", + "js/invenio-communities-new.461f7a1b08f9ff46a99e.js" + ], + "invenio-communities-privileges": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-communities-privileges~invenio-communities-profile.fe62a7845824a9026922.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js", + "js/invenio-communities-new~invenio-communities-privileges~invenio-communities-profile.968d481cabfbf39553ad.js", + "js/invenio-communities-privileges.f10b9e16a55c32215031.js" + ], + "invenio-communities-profile": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/vendors~invenio-communities-profile~oarepo_vocabularies_forms.47ce335f4a316a63c91d.js", + "js/vendors~invenio-communities-privileges~invenio-communities-profile.fe62a7845824a9026922.js", + "js/vendors~invenio-communities-profile.3a346855744e571fc076.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-communities-members~invenio-communities-members-manager~invenio-communities-new~invenio-comm~0e7746b6.aeab749b2980be9f06ed.js", + "js/invenio-communities-new~invenio-communities-privileges~invenio-communities-profile.968d481cabfbf39553ad.js", + "js/invenio-communities-profile.d5c24ea5a8ffd4658d35.js" + ], + "invenio-communities-requests": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/vendors~invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.71782eb9a729b4a1f6dc.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.7acd261e6dae4dc01ab9.js", + "js/invenio-communities-invitations~invenio-communities-requests.ff051d9573313b766adc.js", + "js/invenio-communities-requests.a7e5d7c106912122946b.js" + ], + "invenio-communities-search": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-communities-admin-featured~invenio-communities-admin-search~invenio-communities-carousel~inv~98c4a9cd.49ab88eedb6b548939bf.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/invenio-communities-search.9ac30fd8c894a16f918b.js" + ], + "invenio-requests-base": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.71782eb9a729b4a1f6dc.js", + "js/invenio-communities-invitations~invenio-communities-requests~invenio-requests-base.7acd261e6dae4dc01ab9.js", + "js/invenio-requests-base.06522baeacd35f179168.js" + ], + "oarepo_ui": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/oarepo_ui.7724d779e1a8a681f30a.js" + ], + "oarepo_ui_forms": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/vendors~invenio-communities-invitations~oarepo_ui_forms~oarepo_vocabularies_forms.fcc18fa787a9246039f1.js", + "js/vendors~oarepo_ui_forms~oarepo_vocabularies_forms.78fa06a269d54eb5d9aa.js", + "js/oarepo_ui_forms~oarepo_vocabularies_forms.9ae700f302de2931ba77.js", + "js/oarepo_ui_forms.b28a0864bf143cb9a055.js" + ], + "oarepo_ui_search": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/oarepo_ui_search~oarepo_vocabularies_detail~oarepo_vocabularies_search.56df6f65c43f8b0737e3.js", + "js/oarepo_ui_search.ad60aadf85ba3fff286d.js" + ], + "oarepo_vocabularies_detail": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/oarepo_ui_search~oarepo_vocabularies_detail~oarepo_vocabularies_search.56df6f65c43f8b0737e3.js", + "js/oarepo_vocabularies_detail~oarepo_vocabularies_search.71bcec28303ca863314b.js", + "js/oarepo_vocabularies_detail.d4cf8fb17558171be139.js" + ], + "oarepo_vocabularies_forms": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/vendors~invenio-communities-invitations~oarepo_ui_forms~oarepo_vocabularies_forms.fcc18fa787a9246039f1.js", + "js/vendors~oarepo_ui_forms~oarepo_vocabularies_forms.78fa06a269d54eb5d9aa.js", + "js/vendors~invenio-communities-profile~oarepo_vocabularies_forms.47ce335f4a316a63c91d.js", + "js/oarepo_ui_forms~oarepo_vocabularies_forms.9ae700f302de2931ba77.js", + "js/oarepo_vocabularies_forms.8c8a4ab4d8fe1d65eef9.js" + ], + "oarepo_vocabularies_search": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d198f411.e2145fa894f86c01e3d7.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~17a921b5.c30f1f7f67bc72307ecd.js", + "js/vendors~invenio-administration-create~invenio-administration-details~invenio-administration-edit~inv~d50aface.d40bc31e78be5cc33cc4.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6e1ad9b9.1f5e2e3dc72f23eb59e0.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~6fd4a4a2.b15ab95e22d760186475.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~fb2c456e.4a44d9e4d96375c30ee9.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-search~invenio-communities-details-s~e903ca29.bf4d2b11f446a22416e3.js", + "js/invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-search~in~de8835e7.f105cf5d39a5b32ee139.js", + "js/oarepo_ui_search~oarepo_vocabularies_detail~oarepo_vocabularies_search.56df6f65c43f8b0737e3.js", + "js/oarepo_vocabularies_detail~oarepo_vocabularies_search.71bcec28303ca863314b.js", + "js/oarepo_vocabularies_search.3efc909a421d69b44b16.js" + ], + "oarepo_vocabularies_ui_components": [ + "js/manifest.4695496aebf9efb0cd82.js", + "css/oarepo_vocabularies_ui_components.22a6dcb4ec850142e289.css", + "js/oarepo_vocabularies_ui_components.de4d3f4261ebc8cbf950.js" + ], + "open_pdf": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/open_pdf.2837432f2839645f9914.js" + ], + "pdfjs_css": [ + "js/manifest.4695496aebf9efb0cd82.js", + "css/pdfjs_css.7523441f07ec785e6f0f.css", + "js/pdfjs_css.c5058d4cb87e7e7e7e45.js" + ], + "pdfjs_js": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~invenio-administration-search~invenio-communities-admin-featured~invenio-communities-admin-s~e806c643.e1e1cdf17c63a9995c88.js", + "js/vendors~pdfjs_js.15011b7f4b2e611aa57a.js", + "js/pdfjs_js.a9a7c168e4cbfe05f754.js" + ], + "previewer_theme": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "css/vendors~previewer_theme~theme.96782c7b6e34f730c329.css", + "js/vendors~previewer_theme~theme.ba2deb8c39b0bd1f14f3.js", + "js/previewer_theme.af08a70dcfdb468863e1.js" + ], + "prism_css": [ + "js/manifest.4695496aebf9efb0cd82.js", + "css/prism_css.d26348f46347b7751296.css", + "js/prism_css.22c9656ce42c3a49d582.js" + ], + "prism_js": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~prism_js.6682fd1a890b9218fd52.js", + "js/prism_js.68de206741bf8e0e49b1.js" + ], + "simple_image_css": [ + "js/manifest.4695496aebf9efb0cd82.js", + "css/simple_image_css.290dcaa3fef4f2b83552.css", + "js/simple_image_css.8d0b56840c279e774976.js" + ], + "theme": [ + "js/manifest.4695496aebf9efb0cd82.js", + "js/vendors~adminlte~base~base-admin-theme~bottom_js~d3_csv~i18n_app~previewer_theme~theme.88caf9afb6e144d288ae.js", + "css/vendors~previewer_theme~theme.96782c7b6e34f730c329.css", + "js/vendors~previewer_theme~theme.ba2deb8c39b0bd1f14f3.js", + "js/theme.7e75449e2458aa35146e.js" + ], + "theme-admin": [ + "js/manifest.4695496aebf9efb0cd82.js", + "css/theme-admin.11e5c170f835c367813e.css", + "js/theme-admin.a9c83de7ffd547a8fef7.js" + ], + "zip_css": [ + "js/manifest.4695496aebf9efb0cd82.js", + "css/zip_css.3d4504b43b600f573196.css", + "js/zip_css.01c6b0ff38bdf04e7efb.js" + ] + }, + "publicPath": "/static/dist/", + "error": "ESLintError", + "message": "\n ✘ http://eslint.org/docs/rules/no-undef 'error' is not defined \n js/oarepo_vocabularies_ui/form/api/DepositApiClient.js:98:29\n \n\n\n✘ 1 problem (1 error, 0 warnings)\n\n\nErrors:\n 1 http://eslint.org/docs/rules/no-undef" +} diff --git a/tests/request_data/test_create_group.yaml b/tests/request_data/test_create_group.yaml new file mode 100644 index 0000000..6247779 --- /dev/null +++ b/tests/request_data/test_create_group.yaml @@ -0,0 +1,100 @@ +responses: +- response: + auto_calculate_content_length: false + body: '[{"id":15516,"createdAt":"2024-06-05 09:58:30.7417","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:30.7417","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:ABC","description":"","uuid":"06ff5c42-20a4-4c44-9894-dadcfeec99a7","shortName":"ABC","beanName":"Group"},{"id":15518,"createdAt":"2024-06-05 + 09:58:31.153758","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.153758","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:curators","description":"Community + curators","uuid":"87b677b2-145a-414f-b139-842d521f24a4","shortName":"curators","beanName":"Group"},{"id":15517,"createdAt":"2024-06-05 + 09:58:31.04761","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.04761","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:members","description":"Community + members","uuid":"f0a02638-cd54-4924-b1e9-b61f43753ca3","shortName":"members","beanName":"Group"},{"id":15520,"createdAt":"2024-06-05 + 09:58:31.377526","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.377526","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:publishers","description":"Community + publishers (publishes the record)","uuid":"1a74190e-5634-4624-899e-04da844771f5","shortName":"publishers","beanName":"Group"},{"id":15519,"createdAt":"2024-06-05 + 09:58:31.264524","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.264524","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:reviewers","description":"Community + reviewers (mark records as reviewed)","uuid":"72cc98a0-7ab9-4197-a93d-4f56265b529b","shortName":"reviewers","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/createGroup +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/addAdmin diff --git a/tests/request_data/test_create_group_existing.yaml b/tests/request_data/test_create_group_existing.yaml new file mode 100644 index 0000000..9362dbe --- /dev/null +++ b/tests/request_data/test_create_group_existing.yaml @@ -0,0 +1,61 @@ +responses: +- response: + auto_calculate_content_length: false + body: '[{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"},{"id":15516,"createdAt":"2024-06-05 + 09:58:30.7417","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:30.7417","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:ABC","description":"","uuid":"06ff5c42-20a4-4c44-9894-dadcfeec99a7","shortName":"ABC","beanName":"Group"},{"id":15518,"createdAt":"2024-06-05 + 09:58:31.153758","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.153758","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:curators","description":"Community + curators","uuid":"87b677b2-145a-414f-b139-842d521f24a4","shortName":"curators","beanName":"Group"},{"id":15517,"createdAt":"2024-06-05 + 09:58:31.04761","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.04761","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:members","description":"Community + members","uuid":"f0a02638-cd54-4924-b1e9-b61f43753ca3","shortName":"members","beanName":"Group"},{"id":15520,"createdAt":"2024-06-05 + 09:58:31.377526","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.377526","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:publishers","description":"Community + publishers (publishes the record)","uuid":"1a74190e-5634-4624-899e-04da844771f5","shortName":"publishers","beanName":"Group"},{"id":15519,"createdAt":"2024-06-05 + 09:58:31.264524","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.264524","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:reviewers","description":"Community + reviewers (mark records as reviewed)","uuid":"72cc98a0-7ab9-4197-a93d-4f56265b529b","shortName":"reviewers","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins diff --git a/tests/request_data/test_create_resource_for_group.yaml b/tests/request_data/test_create_resource_for_group.yaml new file mode 100644 index 0000000..de1198b --- /dev/null +++ b/tests/request_data/test_create_resource_for_group.yaml @@ -0,0 +1,173 @@ +responses: +- response: + auto_calculate_content_length: false + body: '{"errorId":"191c1a8001a","resource":null,"name":"ResourceNotExistsException","message":"Error + 191c1a8001a: Incorrect result size: expected 1, actual 0","friendlyMessageTemplate":null,"suppressed":[]}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 400 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '{"id":14408,"createdAt":"2024-09-05 12:08:18.589969","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 12:08:18.589969","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:AAA","description":"Resource + for community AAA","uuid":"4c09431a-bb4d-4b9d-9abc-224166165d42","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/createResource +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignGroupToResource +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":null,"valueCreatedAt":null,"valueCreatedBy":null,"valueModifiedAt":null,"valueModifiedBy":null,"entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/setAttribute +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignService diff --git a/tests/request_data/test_create_resource_for_group_existing.yaml b/tests/request_data/test_create_resource_for_group_existing.yaml new file mode 100644 index 0000000..3bf42a5 --- /dev/null +++ b/tests/request_data/test_create_resource_for_group_existing.yaml @@ -0,0 +1,96 @@ +responses: +- response: + auto_calculate_content_length: false + body: '{"id":14408,"createdAt":"2024-09-05 12:08:18.589969","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 12:08:18.589969","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:AAA","description":"Resource + for community AAA","uuid":"4c09431a-bb4d-4b9d-9abc-224166165d42","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:AAA"],"valueCreatedAt":"2024-09-05 + 12:08:19.143935","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-05 + 12:08:19.143935","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices diff --git a/tests/request_data/test_initial_sync_community b/tests/request_data/test_initial_sync_community new file mode 100644 index 0000000..2585029 --- /dev/null +++ b/tests/request_data/test_initial_sync_community @@ -0,0 +1,800 @@ +responses: +- response: + auto_calculate_content_length: false + body: '[{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"},{"id":15516,"createdAt":"2024-06-05 + 09:58:30.7417","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:30.7417","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:ABC","description":"","uuid":"06ff5c42-20a4-4c44-9894-dadcfeec99a7","shortName":"ABC","beanName":"Group"},{"id":15518,"createdAt":"2024-06-05 + 09:58:31.153758","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.153758","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:curators","description":"Community + curators","uuid":"87b677b2-145a-414f-b139-842d521f24a4","shortName":"curators","beanName":"Group"},{"id":15517,"createdAt":"2024-06-05 + 09:58:31.04761","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.04761","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:members","description":"Community + members","uuid":"f0a02638-cd54-4924-b1e9-b61f43753ca3","shortName":"members","beanName":"Group"},{"id":15520,"createdAt":"2024-06-05 + 09:58:31.377526","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.377526","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:publishers","description":"Community + publishers (publishes the record)","uuid":"1a74190e-5634-4624-899e-04da844771f5","shortName":"publishers","beanName":"Group"},{"id":15519,"createdAt":"2024-06-05 + 09:58:31.264524","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.264524","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:reviewers","description":"Community + reviewers (mark records as reviewed)","uuid":"72cc98a0-7ab9-4197-a93d-4f56265b529b","shortName":"reviewers","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '{"id":15889,"createdAt":"2024-09-05 13:53:26.67219","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 13:53:26.67219","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"439f9fe9-0a2e-44e8-bc44-8b0f0f1cbad8","shortName":"Community + cuni","beanName":"Group"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/createGroup +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/addAdmin +- response: + auto_calculate_content_length: false + body: '{"errorId":"191c2084328","resource":null,"name":"ResourceNotExistsException","message":"Error + 191c2084328: Incorrect result size: expected 1, actual 0","friendlyMessageTemplate":null,"suppressed":[]}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 400 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '{"id":14412,"createdAt":"2024-09-05 13:53:27.221654","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 13:53:27.221654","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni","description":"Resource + for community cuni","uuid":"b5e649a9-913f-49a3-abd5-b31adc85c01d","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/createResource +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignGroupToResource +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":null,"valueCreatedAt":null,"valueCreatedBy":null,"valueModifiedAt":null,"valueModifiedBy":null,"entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/setAttribute +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignService +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '{"id":15890,"createdAt":"2024-09-05 13:53:28.371454","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 13:53:28.371454","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15889,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"7a3d2f5b-b8f1-4e11-a9a4-c9d7f30eeea6","shortName":"Role curator + of cuni","beanName":"Group"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/createGroup +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/addAdmin +- response: + auto_calculate_content_length: false + body: '{"errorId":"191c20849f9","resource":null,"name":"ResourceNotExistsException","message":"Error + 191c20849f9: Incorrect result size: expected 1, actual 0","friendlyMessageTemplate":null,"suppressed":[]}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 400 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '{"id":14413,"createdAt":"2024-09-05 13:53:28.957072","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 13:53:28.957072","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:curator","description":"Resource + for community cuni and role curator","uuid":"c3342a80-8c86-420f-948d-f943c1584aa1","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/createResource +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignGroupToResource +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":null,"valueCreatedAt":null,"valueCreatedBy":null,"valueModifiedAt":null,"valueModifiedBy":null,"entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/setAttribute +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignService +- response: + auto_calculate_content_length: false + body: '[{"id":15890,"createdAt":"2024-09-05 13:53:28.371454","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 13:53:28.371454","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15889,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"7a3d2f5b-b8f1-4e11-a9a4-c9d7f30eeea6","shortName":"Role curator + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '{"id":15891,"createdAt":"2024-09-05 13:53:30.111419","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 13:53:30.111419","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15889,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"350b11fd-ac63-4478-b237-160b5d9e816f","shortName":"Role member + of cuni","beanName":"Group"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/createGroup +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/addAdmin +- response: + auto_calculate_content_length: false + body: '{"errorId":"191c20850bf","resource":null,"name":"ResourceNotExistsException","message":"Error + 191c20850bf: Incorrect result size: expected 1, actual 0","friendlyMessageTemplate":null,"suppressed":[]}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 400 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '{"id":14414,"createdAt":"2024-09-05 13:53:30.702549","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 13:53:30.702549","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:member","description":"Resource + for community cuni and role member","uuid":"f7dedca0-1302-401d-8328-cbdee1180202","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/createResource +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignGroupToResource +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":null,"valueCreatedAt":null,"valueCreatedBy":null,"valueModifiedAt":null,"valueModifiedBy":null,"entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/setAttribute +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignService diff --git a/tests/request_data/test_login.yaml b/tests/request_data/test_login.yaml new file mode 100644 index 0000000..7dd67e8 --- /dev/null +++ b/tests/request_data/test_login.yaml @@ -0,0 +1 @@ +responses: [] diff --git a/tests/request_data/test_no_communities_user_exists_but_not_linked.yaml b/tests/request_data/test_no_communities_user_exists_but_not_linked.yaml new file mode 100644 index 0000000..7dd67e8 --- /dev/null +++ b/tests/request_data/test_no_communities_user_exists_but_not_linked.yaml @@ -0,0 +1 @@ +responses: [] diff --git a/tests/request_data/test_no_communities_user_linked.yaml b/tests/request_data/test_no_communities_user_linked.yaml new file mode 100644 index 0000000..7dd67e8 --- /dev/null +++ b/tests/request_data/test_no_communities_user_linked.yaml @@ -0,0 +1 @@ +responses: [] diff --git a/tests/request_data/test_suspend_user.yaml b/tests/request_data/test_suspend_user.yaml new file mode 100644 index 0000000..7dd67e8 --- /dev/null +++ b/tests/request_data/test_suspend_user.yaml @@ -0,0 +1 @@ +responses: [] diff --git a/tests/request_data/test_with_communities.yaml b/tests/request_data/test_with_communities.yaml new file mode 100644 index 0000000..cd7a289 --- /dev/null +++ b/tests/request_data/test_with_communities.yaml @@ -0,0 +1,2198 @@ +responses: +- response: + auto_calculate_content_length: false + body: '[{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"},{"id":15516,"createdAt":"2024-06-05 + 09:58:30.7417","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:30.7417","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:ABC","description":"","uuid":"06ff5c42-20a4-4c44-9894-dadcfeec99a7","shortName":"ABC","beanName":"Group"},{"id":15518,"createdAt":"2024-06-05 + 09:58:31.153758","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.153758","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:curators","description":"Community + curators","uuid":"87b677b2-145a-414f-b139-842d521f24a4","shortName":"curators","beanName":"Group"},{"id":15517,"createdAt":"2024-06-05 + 09:58:31.04761","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.04761","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:members","description":"Community + members","uuid":"f0a02638-cd54-4924-b1e9-b61f43753ca3","shortName":"members","beanName":"Group"},{"id":15520,"createdAt":"2024-06-05 + 09:58:31.377526","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.377526","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:publishers","description":"Community + publishers (publishes the record)","uuid":"1a74190e-5634-4624-899e-04da844771f5","shortName":"publishers","beanName":"Group"},{"id":15519,"createdAt":"2024-06-05 + 09:58:31.264524","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.264524","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:reviewers","description":"Community + reviewers (mark records as reviewed)","uuid":"72cc98a0-7ab9-4197-a93d-4f56265b529b","shortName":"reviewers","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=228E31E07A5C77DDE5E086BB9C73209D; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '{"id":15897,"createdAt":"2024-09-07 14:32:46.617691","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:46.617691","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"975dbd35-7647-4c9a-8ee0-4b5db096d814","shortName":"Community + cuni","beanName":"Group"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B0A21546A54D65ED4B74FDD411427912; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/createGroup +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=0242F5A5721A024681FF596B45340679; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=709E80E238CA6BEE73C6D4D5288FCB87; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/addAdmin +- response: + auto_calculate_content_length: false + body: '{"errorId":"191cc78fe02","resource":null,"name":"ResourceNotExistsException","message":"Error + 191cc78fe02: Incorrect result size: expected 1, actual 0","friendlyMessageTemplate":null,"suppressed":[]}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=4EB0E0C8EDC9E8CA928F3D449DC9F9F7; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 400 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '{"id":14419,"createdAt":"2024-09-07 14:32:47.293869","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:47.293869","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni","description":"Resource + for community cuni","uuid":"3d8b6b2b-a82a-4f34-ba19-ab7932614a38","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=FBB89040E728FCC319BA245A77C6AE28; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/createResource +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=463923028F955A6A2A19CFC21E967650; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=9FE577FD4CEA6B81FEFD3F7CD2B5EA79; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignGroupToResource +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":null,"valueCreatedAt":null,"valueCreatedBy":null,"valueModifiedAt":null,"valueModifiedBy":null,"entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=489CCB2C5B17FC36230F9A915146BE3E; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=7F0C40B9CE623116B8EBBBA1035CA3BA; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/setAttribute +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=520FBBC0F934D88EB8C2A29AC6C7E00D; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1F729019083DE71EA80E07D55FAB59E3; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignService +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=D5B77C87CBCF39D4C5D596633DAB7118; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=47E483E3041CD995826372FFA679878A; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/createGroup +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=21CBD97D4956D9E17A24CA9532DCB987; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=F56D053C7484081F0DD4B1F3371DF156; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/addAdmin +- response: + auto_calculate_content_length: false + body: '{"errorId":"191cc7905d8","resource":null,"name":"ResourceNotExistsException","message":"Error + 191cc7905d8: Incorrect result size: expected 1, actual 0","friendlyMessageTemplate":null,"suppressed":[]}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=8DAB12ADB26EC5E1784C5FF422A9F807; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 400 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '{"id":14420,"createdAt":"2024-09-07 14:32:49.259214","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:49.259214","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:curator","description":"Resource + for community cuni and role curator","uuid":"89526a54-1bfe-4ad1-9c17-55678ad66077","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B1752D23B1B109233E69D854EBAE6D45; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/createResource +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=25871DDE4B618A40EE5D4FE5FBEDAC3E; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=C459C737F1E8B0D7851D0FE9EF819FC7; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignGroupToResource +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":null,"valueCreatedAt":null,"valueCreatedBy":null,"valueModifiedAt":null,"valueModifiedBy":null,"entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=BFE1E7F0BE83AAA8E999B9CE4C2E75C2; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=9A4B1A67DA800DDA7081804C40571A6B; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/setAttribute +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=721BBF94E318DE63693E4D314CE51FE1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=C918FE29048450F9E4B47D276333F894; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignService +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=56117D4C6612806618D70CAD0FACBA78; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=EF3884BD7C7C63ED19E44F952C78C142; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/createGroup +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=3EB6AC04EEDF4A42169D6D3F2DD64DAF; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=F520AA2A5275351E75289864CDFEA9C2; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/addAdmin +- response: + auto_calculate_content_length: false + body: '{"errorId":"191cc790cf1","resource":null,"name":"ResourceNotExistsException","message":"Error + 191cc790cf1: Incorrect result size: expected 1, actual 0","friendlyMessageTemplate":null,"suppressed":[]}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B5986A9F5BB697838ACF6B4D46AF5DC7; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 400 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '{"id":14421,"createdAt":"2024-09-07 14:32:51.079886","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:51.079886","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:member","description":"Resource + for community cuni and role member","uuid":"27ce1628-a2f7-4f2c-8aaa-03effd31358c","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=339388C05012D7D8956540F0CEBA9364; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/createResource +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1683A101A1B43B2B0E620F59F05B5A34; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=8A946AFCF02C95C1CAD0D837C9B0C649; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignGroupToResource +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":null,"valueCreatedAt":null,"valueCreatedBy":null,"valueModifiedAt":null,"valueModifiedBy":null,"entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=CA0FD6ECEB727DCCFC2E92E4D0CE6964; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=862BD70336C5DCE4731CD9284B57E5EF; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/setAttribute +- response: + auto_calculate_content_length: false + body: '[]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=124ED146F26142942898F1A38EE04FA1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: 'null' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=02EEDF2C49EE46C86EEFED565B807F8B; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/assignService +- response: + auto_calculate_content_length: false + body: '[{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"},{"id":15516,"createdAt":"2024-06-05 + 09:58:30.7417","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:30.7417","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:ABC","description":"","uuid":"06ff5c42-20a4-4c44-9894-dadcfeec99a7","shortName":"ABC","beanName":"Group"},{"id":15518,"createdAt":"2024-06-05 + 09:58:31.153758","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.153758","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:curators","description":"Community + curators","uuid":"87b677b2-145a-414f-b139-842d521f24a4","shortName":"curators","beanName":"Group"},{"id":15517,"createdAt":"2024-06-05 + 09:58:31.04761","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.04761","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:members","description":"Community + members","uuid":"f0a02638-cd54-4924-b1e9-b61f43753ca3","shortName":"members","beanName":"Group"},{"id":15520,"createdAt":"2024-06-05 + 09:58:31.377526","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.377526","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:publishers","description":"Community + publishers (publishes the record)","uuid":"1a74190e-5634-4624-899e-04da844771f5","shortName":"publishers","beanName":"Group"},{"id":15519,"createdAt":"2024-06-05 + 09:58:31.264524","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.264524","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:reviewers","description":"Community + reviewers (mark records as reviewed)","uuid":"72cc98a0-7ab9-4197-a93d-4f56265b529b","shortName":"reviewers","beanName":"Group"},{"id":15897,"createdAt":"2024-09-07 + 14:32:46.617691","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:46.617691","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"975dbd35-7647-4c9a-8ee0-4b5db096d814","shortName":"Community + cuni","beanName":"Group"},{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=01A2C27B7367C1FD8D07B918C891336C; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=F4D4CD4A9FE36D5383EB397008D70612; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14419,"createdAt":"2024-09-07 14:32:47.293869","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:47.293869","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni","description":"Resource + for community cuni","uuid":"3d8b6b2b-a82a-4f34-ba19-ab7932614a38","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=8D86B32B1C015178D5BD80C7905D7822; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15897,"createdAt":"2024-09-07 14:32:46.617691","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:46.617691","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"975dbd35-7647-4c9a-8ee0-4b5db096d814","shortName":"Community + cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=0A823FD2B96C35E21BFA01E7948B8DED; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni"],"valueCreatedAt":"2024-09-07 + 14:32:47.942955","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:47.942955","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=074F731D08C30F68CB1DBB280D881767; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=08434ACBD368218805935694A13A33DC; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=575E8402E0FABE46713CE6FDCB9902F8; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=841F4CE7FC9791E71CE1A31A2AB667B4; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14420,"createdAt":"2024-09-07 14:32:49.259214","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:49.259214","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:curator","description":"Resource + for community cuni and role curator","uuid":"89526a54-1bfe-4ad1-9c17-55678ad66077","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=F732C2F5E0D477256BF9657D1DF19915; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=E5DE9FBDF6938ED3FBAF7F84714D8DA9; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni:role:curator"],"valueCreatedAt":"2024-09-07 + 14:32:49.843897","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:49.843897","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=BE4D1958D2FC7F9B33661D0CF1EF6B3F; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=3989DEA164A462AEEC56D5B64B5987FB; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=C4DA1491211D6AAD64D7C6FD0BA48715; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=AA19BA5778154F8D20B7F490DC56AD98; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14421,"createdAt":"2024-09-07 14:32:51.079886","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:51.079886","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:member","description":"Resource + for community cuni and role member","uuid":"27ce1628-a2f7-4f2c-8aaa-03effd31358c","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=50F281E5A7D337D3D0B05B340A247368; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=3F63506563AA214044F273B969B8CD4B; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni:role:member"],"valueCreatedAt":"2024-09-07 + 14:32:51.646351","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:51.646351","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B9CA14C9094E42BE194C97564BFB831B; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=08B2D664ED66D7E7EE3E164FA22CE0FD; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"},{"id":15516,"createdAt":"2024-06-05 + 09:58:30.7417","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:30.7417","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:ABC","description":"","uuid":"06ff5c42-20a4-4c44-9894-dadcfeec99a7","shortName":"ABC","beanName":"Group"},{"id":15518,"createdAt":"2024-06-05 + 09:58:31.153758","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.153758","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:curators","description":"Community + curators","uuid":"87b677b2-145a-414f-b139-842d521f24a4","shortName":"curators","beanName":"Group"},{"id":15517,"createdAt":"2024-06-05 + 09:58:31.04761","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.04761","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:members","description":"Community + members","uuid":"f0a02638-cd54-4924-b1e9-b61f43753ca3","shortName":"members","beanName":"Group"},{"id":15520,"createdAt":"2024-06-05 + 09:58:31.377526","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.377526","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:publishers","description":"Community + publishers (publishes the record)","uuid":"1a74190e-5634-4624-899e-04da844771f5","shortName":"publishers","beanName":"Group"},{"id":15519,"createdAt":"2024-06-05 + 09:58:31.264524","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.264524","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:reviewers","description":"Community + reviewers (mark records as reviewed)","uuid":"72cc98a0-7ab9-4197-a93d-4f56265b529b","shortName":"reviewers","beanName":"Group"},{"id":15897,"createdAt":"2024-09-07 + 14:32:46.617691","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:46.617691","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"975dbd35-7647-4c9a-8ee0-4b5db096d814","shortName":"Community + cuni","beanName":"Group"},{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=A72B4BEEFB9B3EB0EC002055E439BFCC; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=C97CA02AA60683AAA9AE8B4E139B4E39; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14419,"createdAt":"2024-09-07 14:32:47.293869","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:47.293869","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni","description":"Resource + for community cuni","uuid":"3d8b6b2b-a82a-4f34-ba19-ab7932614a38","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=5AFE4F6170F1E41ACFEA0933E64B81ED; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15897,"createdAt":"2024-09-07 14:32:46.617691","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:46.617691","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"975dbd35-7647-4c9a-8ee0-4b5db096d814","shortName":"Community + cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=F6BE1AEA739CE2AC68DAD8A7519F4251; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni"],"valueCreatedAt":"2024-09-07 + 14:32:47.942955","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:47.942955","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=8AE46BC030FA958177F912485F8A3FD1; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B8A2173E7F26755DA9D0FC9DFC9008B6; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B55708188A55E0896A3E0592C713174D; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=97A88A3F9FBB26913CF87BC91362F69D; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14420,"createdAt":"2024-09-07 14:32:49.259214","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:49.259214","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:curator","description":"Resource + for community cuni and role curator","uuid":"89526a54-1bfe-4ad1-9c17-55678ad66077","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=CD79B8D7C7C7DE4553C6E5808F0E346B; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=D8F1BBF0A36F21E92E537E672F9DB961; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni:role:curator"],"valueCreatedAt":"2024-09-07 + 14:32:49.843897","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:49.843897","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B8FB4DF44F5120CE78D4DFD058CD68A3; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=6C892F6C3E951C7B401C3F1912979036; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=C2E8846D51D8E84355B877D2575B1B6F; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B6BFA4429D770364617EBC2B6F359219; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14421,"createdAt":"2024-09-07 14:32:51.079886","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:51.079886","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:member","description":"Resource + for community cuni and role member","uuid":"27ce1628-a2f7-4f2c-8aaa-03effd31358c","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=57523492F1E29C98EC72A3BE3F3B1E94; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=4FAFBE5A31C0D02AD274C1FEBAA4AB9A; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni:role:member"],"valueCreatedAt":"2024-09-07 + 14:32:51.646351","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:51.646351","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=AD0588174D4B82FBFEDE84DF939A97EA; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=62407FA01C82BB38BABA178BC4D5AEE8; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15883,"createdAt":"2024-09-05 08:38:34.31645","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-05 + 08:38:34.31645","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:AAA","description":"Community + AAA","uuid":"9e43aeab-1d1d-4aaa-bb36-6aa452269c3b","shortName":"AAA","beanName":"Group"},{"id":15516,"createdAt":"2024-06-05 + 09:58:30.7417","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:30.7417","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:ABC","description":"","uuid":"06ff5c42-20a4-4c44-9894-dadcfeec99a7","shortName":"ABC","beanName":"Group"},{"id":15518,"createdAt":"2024-06-05 + 09:58:31.153758","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.153758","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:curators","description":"Community + curators","uuid":"87b677b2-145a-414f-b139-842d521f24a4","shortName":"curators","beanName":"Group"},{"id":15517,"createdAt":"2024-06-05 + 09:58:31.04761","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.04761","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:members","description":"Community + members","uuid":"f0a02638-cd54-4924-b1e9-b61f43753ca3","shortName":"members","beanName":"Group"},{"id":15520,"createdAt":"2024-06-05 + 09:58:31.377526","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.377526","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:publishers","description":"Community + publishers (publishes the record)","uuid":"1a74190e-5634-4624-899e-04da844771f5","shortName":"publishers","beanName":"Group"},{"id":15519,"createdAt":"2024-06-05 + 09:58:31.264524","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-06-05 + 09:58:31.264524","modifiedBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","createdByUid":131924,"modifiedByUid":131924,"voId":4003,"parentGroupId":15516,"name":"devrepo:communities:ABC:reviewers","description":"Community + reviewers (mark records as reviewed)","uuid":"72cc98a0-7ab9-4197-a93d-4f56265b529b","shortName":"reviewers","beanName":"Group"},{"id":15897,"createdAt":"2024-09-07 + 14:32:46.617691","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:46.617691","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"975dbd35-7647-4c9a-8ee0-4b5db096d814","shortName":"Community + cuni","beanName":"Group"},{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1A72435830625FD2F126F786DE1B1F3F; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=3027BB36CB023F04B4A7C0A24C101280; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14419,"createdAt":"2024-09-07 14:32:47.293869","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:47.293869","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni","description":"Resource + for community cuni","uuid":"3d8b6b2b-a82a-4f34-ba19-ab7932614a38","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=2FAE5B577CECB251300D767EC1DBA8D3; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15897,"createdAt":"2024-09-07 14:32:46.617691","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:46.617691","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15393,"name":"devrepo:communities:Community + cuni","description":"Charles university members","uuid":"975dbd35-7647-4c9a-8ee0-4b5db096d814","shortName":"Community + cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=77025157E054E9AB0C9A557AB7D2BBF6; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni"],"valueCreatedAt":"2024-09-07 + 14:32:47.942955","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:47.942955","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=B8366348BED32FAEBD1FFEC1DD162A22; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=282B9E809B6899167DD2D8324D551491; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=1A18B5E14C75A861309CBF14D4446CB4; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=235BB9ED6ECE6F86623A4E3BCDCD7CEB; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14420,"createdAt":"2024-09-07 14:32:49.259214","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:49.259214","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:curator","description":"Resource + for community cuni and role curator","uuid":"89526a54-1bfe-4ad1-9c17-55678ad66077","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=3FC569683F8CD8F6E877CC2423C94D66; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=2E69C7749A948E2AA1322BD21F150203; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni:role:curator"],"valueCreatedAt":"2024-09-07 + 14:32:49.843897","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:49.843897","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=A8E142E47B21C325CA2D508F08500E07; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=A5052DF36242B8B53EADFBD74690BDF6; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices +- response: + auto_calculate_content_length: false + body: '[{"id":15898,"createdAt":"2024-09-07 14:32:48.520236","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:48.520236","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role curator of cuni","description":"Group for role curator of community + cuni","uuid":"1de44d68-2e99-4e8e-a3b3-49e11f44c6e3","shortName":"Role curator + of cuni","beanName":"Group"},{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=83FFE187BEDCFE94D3C17AEB7EA528DD; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAllSubGroups +- response: + auto_calculate_content_length: false + body: '[{"id":144994,"createdAt":"2024-09-04 16:59:32.270937","createdBy":"12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz","modifiedAt":"2024-09-04 + 17:01:13.690275","modifiedBy":"perunRegistrar","createdByUid":131924,"modifiedByUid":-1,"firstName":"(Service)","lastName":"nrp-fa-devrepo","middleName":null,"titleBefore":null,"titleAfter":"(Service) + nrp-fa-devrepo","serviceUser":true,"sponsoredUser":false,"uuid":"3c13d782-5ee6-4c25-81e8-f7cbda41f482","majorSpecificType":"SERVICE","specificUser":true,"beanName":"User"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=47B9C942AC502DDECC87D480767A3BA0; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/groupsManager/getAdmins +- response: + auto_calculate_content_length: false + body: '{"id":14421,"createdAt":"2024-09-07 14:32:51.079886","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:51.079886","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"facilityId":4662,"voId":4003,"name":"Community:cuni:member","description":"Resource + for community cuni and role member","uuid":"27ce1628-a2f7-4f2c-8aaa-03effd31358c","beanName":"Resource"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=DA657A6304BF4B93D088093378662303; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getResourceByName +- response: + auto_calculate_content_length: false + body: '[{"id":15899,"createdAt":"2024-09-07 14:32:50.462202","createdBy":"nrp-fa-devrepo@META","modifiedAt":"2024-09-07 + 14:32:50.462202","modifiedBy":"nrp-fa-devrepo@META","createdByUid":144994,"modifiedByUid":144994,"voId":4003,"parentGroupId":15897,"name":"devrepo:communities:Community + cuni:Role member of cuni","description":"Group for role member of community + cuni","uuid":"63d4d6ab-96db-401a-b29a-3020f8732a56","shortName":"Role member + of cuni","beanName":"Group"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=42E52B73788F681E979D28A822D6E976; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedGroups +- response: + auto_calculate_content_length: false + body: '{"id":3585,"createdAt":"2019-11-04 09:18:27.260377","createdBy":"445753@muni.cz","modifiedAt":"2019-11-04 + 09:18:27.260377","modifiedBy":"445753@muni.cz","createdByUid":59835,"modifiedByUid":59835,"friendlyName":"capabilities","namespace":"urn:perun:resource:attribute-def:def","description":"Capabilities + according to AARC specification. i.e. specification of resource and optional + actions.","type":"java.util.ArrayList","displayName":"Capabilities","writable":true,"unique":false,"value":["res:communities:cuni:role:member"],"valueCreatedAt":"2024-09-07 + 14:32:51.646351","valueCreatedBy":"nrp-fa-devrepo@META","valueModifiedAt":"2024-09-07 + 14:32:51.646351","valueModifiedBy":"nrp-fa-devrepo@META","entity":"resource","baseFriendlyName":"capabilities","friendlyNameParameter":"","beanName":"Attribute"}' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=14F025112D7A54DF021FED920D0076AA; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/attributesManager/getAttribute +- response: + auto_calculate_content_length: false + body: '[{"id":1023,"createdAt":"2024-07-24 14:13:56.174237","createdBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","modifiedAt":"2024-07-24 + 14:13:56.174237","modifiedBy":"df6fe45d8bb8eabb942792eacc62f57df2e2a5e1@einfra.cesnet.cz","createdByUid":59835,"modifiedByUid":59835,"name":"nrp_invenio_export","description":"Propagation + of data required for NRP Invenio hosted by CESNET","delay":10,"recurrence":2,"enabled":true,"script":"./generic_json_gen","useExpiredMembers":true,"beanName":"Service"}]' + content_type: text/plain + headers: + Cache-Control: no-cache, no-store, max-age=0, must-revalidate + Expires: '0' + Keep-Alive: timeout=5, max=100 + Pragma: no-cache + Referrer-Policy: no-referrer-when-downgrade + Set-Cookie: PERUNSESSION=8CE6A527E10C3E66501E99DE336D593B; Path=/; Secure; HttpOnly; + SameSite=Strict + Strict-Transport-Security: max-age=63072000 + Transfer-Encoding: chunked + Vary: Accept-Encoding + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + X-XSS-Protection: 1; mode=block + method: POST + status: 200 + url: https://perun-api.e-infra.cz/krb/rpc/json/resourcesManager/getAssignedServices diff --git a/tests/templates/oarepo/invenio_theme/header_login.html b/tests/templates/oarepo/invenio_theme/header_login.html new file mode 100644 index 0000000..eeff142 --- /dev/null +++ b/tests/templates/oarepo/invenio_theme/header_login.html @@ -0,0 +1 @@ + diff --git a/tests/test_login.py b/tests/test_login.py new file mode 100644 index 0000000..ef64de0 --- /dev/null +++ b/tests/test_login.py @@ -0,0 +1,86 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +import pytest +from invenio_access.permissions import system_identity +from invenio_accounts.models import User, UserIdentity +from invenio_communities import current_communities +from invenio_communities.members.records.models import MemberModel + + +@pytest.mark.skip(reason="This test is intended to be run manually") +def test_login(app, db, location, search_clear, client, test_ui_pages): + """ + This test shows how to log in a user using the E-Infra OIDC provider. + As log-in is a process based on a web browser, the test must be run + manually at the moment + + To run it, set the following environment variables: + INVENIO_EINFRA_CONSUMER_KEY + INVENIO_EINFRA_CONSUMER_SECRET + + Then check that you have correct e-infra configuration in the conftest.py + (correct ids of groups, facilities, attributes, ...) and run the test. + + Note: The test will fail if the user does not have exactly one membership + inside perun AAI in the community with the slug 'cuni' and role 'curator' + """ + my_original_email = "ms@cesnet.cz" + user = User( + username="asdasdasd", + email=my_original_email, + active=True, + password="1234", + user_profile={"full_name": "Mirek Simek"}, + ) + db.session.add(user) + db.session.commit() + + identity = UserIdentity.create( + user=user, + method="e-infra", + external_id="12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz", + ) + db.session.commit() + + community = current_communities.service.create( + system_identity, + { + "slug": "CUNI", + "metadata": { + "title": "Charles University", + "description": "Charles university members", + }, + "access": {"visibility": "public"}, + }, + ) + current_communities.service.indexer.refresh() + + member_list = MemberModel.query.filter_by(user_id=user.id).all() + assert len(member_list) == 0 + + resp = client.get("/oauth/login/e-infra/", base_url="https://127.0.0.1:5000/") + assert resp.status_code == 302 + location = resp.headers["Location"] + print( + "Open your browser and go to the following location. Log-in there and copy the final URL here" + ) + print(location) + redirect_url = input("Paste the final URL here: ") + redirect_url = redirect_url.strip() + redirect_url = redirect_url[len("https://127.0.0.1:5000") :] + + resp = client.get(redirect_url, base_url="https://127.0.0.1:5000/") + assert resp.status_code == 302 + location = resp.headers["Location"] + print(location) + + # check that the user has the correct community roles + member_list = MemberModel.query.filter_by(user_id=user.id).all() + assert len(member_list) == 1 + assert str(member_list[0].community_id) == community.id + assert member_list[0].role == "curator" diff --git a/tests/test_low_level_perun_api.py b/tests/test_low_level_perun_api.py new file mode 100644 index 0000000..e23e124 --- /dev/null +++ b/tests/test_low_level_perun_api.py @@ -0,0 +1,101 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +def test_create_non_existing_group( + smart_record, low_level_perun_api, test_repo_communities_id +): + + with smart_record("test_create_group.yaml") as recorded: + group, group_created, admin_created = low_level_perun_api.create_group( + name="AAA", + description="Community AAA", + parent_group_id=test_repo_communities_id, + ) + if recorded: + assert group["id"] == 15883 + else: + print(f"Add the >>> assert group['id'] == {group['id']} here <<<") + + assert group_created == True + assert admin_created == True + + +def test_create_existing_group( + smart_record, low_level_perun_api, test_repo_communities_id +): + + with smart_record("test_create_group_existing.yaml"): + group, group_created, admin_created = low_level_perun_api.create_group( + name="AAA", + description="Community AAA", + parent_group_id=test_repo_communities_id, + ) + assert not group_created + assert not admin_created + + +def test_create_resource_for_group( + smart_record, + low_level_perun_api, + test_repo_communities_id, + test_group_id, + test_vo_id, + test_facility_id, + test_capabilities_attribute_id, + perun_sync_service_id, +): + + with smart_record("test_create_resource_for_group.yaml") as recorded: + resource, resource_created = ( + low_level_perun_api.create_resource_with_group_and_capabilities( + vo_id=test_vo_id, + facility_id=test_facility_id, + group_id=test_group_id, + name="Community:AAA", + description="Resource for community AAA", + capability_attr_id=test_capabilities_attribute_id, + capabilities=["res:communities:AAA"], + perun_sync_service_id=perun_sync_service_id, + ) + ) + if recorded: + assert resource["id"] == 14408 + else: + print(f"Add the >>> assert resource['id'] == {resource['id']} here <<<") + assert resource_created == True + + +def test_create_resource_for_group_existing( + smart_record, + low_level_perun_api, + test_repo_communities_id, + test_group_id, + test_vo_id, + test_facility_id, + test_capabilities_attribute_id, + perun_sync_service_id, +): + + with smart_record("test_create_resource_for_group_existing.yaml") as recorded: + resource, resource_created = ( + low_level_perun_api.create_resource_with_group_and_capabilities( + vo_id=test_vo_id, + facility_id=test_facility_id, + group_id=test_group_id, + name="Community:AAA", + description="Resource for community AAA", + capability_attr_id=test_capabilities_attribute_id, + capabilities=["res:communities:AAA"], + perun_sync_service_id=perun_sync_service_id, + ) + ) + if recorded: + assert resource["id"] == 14408 + else: + print(f"Add the >>> assert resource['id'] == {resource['id']} here <<<") + + assert resource_created == False diff --git a/tests/test_perun_sync_task.py b/tests/test_perun_sync_task.py new file mode 100644 index 0000000..206d212 --- /dev/null +++ b/tests/test_perun_sync_task.py @@ -0,0 +1,29 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +from invenio_access.permissions import system_identity +from invenio_communities import current_communities + +from oarepo_oidc_einfra.tasks import synchronize_community_to_perun + + +def test_sync_community(app, db, location, smart_record, search_clear): + community = current_communities.service.create( + system_identity, + { + "slug": "CUNI", + "metadata": { + "title": "Charles University", + "description": "Charles university members", + }, + "access": {"visibility": "public"}, + }, + ) + current_communities.service.indexer.refresh() + + with smart_record("test_initial_sync_community") as recorded: + synchronize_community_to_perun(community.id) diff --git a/tests/test_store_dump.py b/tests/test_store_dump.py new file mode 100644 index 0000000..3e79517 --- /dev/null +++ b/tests/test_store_dump.py @@ -0,0 +1,56 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +import pytest +from invenio_access.models import ActionUsers +from invenio_accounts.models import User +from invenio_oauth2server.models import Token +from invenio_records_resources.services.errors import PermissionDeniedError + +from oarepo_oidc_einfra.resources import upload_dump_action + + +def test_store_dump(app, db, client, test_ui_pages): + + user = User(email="test@test.com", active=True) + db.session.add(user) + db.session.commit() + + token = Token.create_personal("test", user.id, scopes=[], is_internal=False) + db.session.commit() + + with pytest.raises(PermissionDeniedError): + client.post( + "/api/oidc-einfra/dumps/upload", + base_url="https://127.0.0.1:5000/", + json={ + "resources": {}, + "users": {}, + }, + headers={ + "Authorization": f"Bearer {token.access_token}", + "Content-Type": "application/json", + }, + ) + + db.session.add(ActionUsers.allow(upload_dump_action, user_id=user.id)) + db.session.commit() + + post_result = client.post( + "/api/oidc-einfra/dumps/upload", + base_url="https://127.0.0.1:5000/", + json={ + "resources": {}, + "users": {}, + }, + headers={ + "Authorization": f"Bearer {token.access_token}", + "Content-Type": "application/json", + }, + ) + assert post_result.status_code == 201 + assert post_result.json == {"status": "ok"} diff --git a/tests/test_update_from_perun_dump.py b/tests/test_update_from_perun_dump.py new file mode 100644 index 0000000..ff11a68 --- /dev/null +++ b/tests/test_update_from_perun_dump.py @@ -0,0 +1,165 @@ +# +# Copyright (C) 2024 CESNET z.s.p.o. +# +# oarepo-oidc-einfra is free software; you can redistribute it and/or +# modify it under the terms of the MIT License; see LICENSE file for more +# details. +# +from pathlib import Path + +from invenio_access.permissions import system_identity +from invenio_accounts.models import User, UserIdentity +from invenio_communities import current_communities +from invenio_communities.members import Member + +from oarepo_oidc_einfra.communities import CommunityRole, CommunitySupport +from oarepo_oidc_einfra.tasks import update_from_perun_dump + + +def touri(filename): + return (Path(__file__).parent / "dump_data" / filename).as_uri() + + +def test_no_communities(app, db, location, search_clear): + update_from_perun_dump(touri("1.json")) + update_from_perun_dump(touri("2.json")) + update_from_perun_dump(touri("3.json")) + + +def test_no_communities_user_exists_but_not_linked( + app, db, location, search_clear, smart_record +): + with smart_record( + "test_no_communities_user_exists_but_not_linked.yaml" + ) as recorded: + my_original_email = "ms@cesnet.cz" + user = User( + username="asdasdasd", + email=my_original_email, + active=True, + password="1234", + user_profile={"full_name": "Mirek Simek"}, + ) + db.session.add(user) + db.session.commit() + + update_from_perun_dump(touri("1.json")) + update_from_perun_dump(touri("2.json")) + update_from_perun_dump(touri("3.json")) + + user = User.query.filter_by(username="asdasdasd").one() + assert user.user_profile["full_name"] == "Mirek Simek" + assert user.email == my_original_email + + +def test_no_communities_user_linked(app, db, location, search_clear, smart_record): + with smart_record("test_no_communities_user_linked.yaml") as recorded: + my_original_email = "ms@cesnet.cz" + user = User( + username="asdasdasd", + email=my_original_email, + active=True, + password="1234", + user_profile={"full_name": "Mirek Simek"}, + ) + db.session.add(user) + db.session.commit() + + identity = UserIdentity.create( + user=user, + method="e-infra", + external_id="12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz", + ) + db.session.commit() + + update_from_perun_dump(touri("1.json")) + update_from_perun_dump(touri("2.json")) + update_from_perun_dump(touri("3.json")) + + user = User.query.filter_by(username="asdasdasd").one() + assert user.user_profile["full_name"] == "Miroslav Šimek" + assert user.user_profile["affiliations"] == "CESNET, z. s. p. o." + assert user.email == "miroslav.simek@cesnet.cz" + + +def test_with_communities(app, db, location, search_clear, smart_record): + with smart_record("test_with_communities.yaml") as recorded: + my_original_email = "ms@cesnet.cz" + user = User( + username="asdasdasd", + email=my_original_email, + active=True, + password="1234", + user_profile={"full_name": "Mirek Simek"}, + ) + db.session.add(user) + db.session.commit() + + identity = UserIdentity.create( + user=user, + method="e-infra", + external_id="12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz", + ) + db.session.commit() + + community = current_communities.service.create( + system_identity, + { + "slug": "CUNI", + "metadata": { + "title": "Charles University", + "description": "Charles university members", + }, + "access": {"visibility": "public"}, + }, + ) + current_communities.service.indexer.refresh() + + update_from_perun_dump(touri("1.json")) + update_from_perun_dump(touri("2.json")) + update_from_perun_dump(touri("3.json")) + + memberships = list(Member.model_cls.query.filter_by(user_id=user.id).all()) + assert len(memberships) == 1 + assert memberships[0].role == "curator" + assert str(memberships[0].community_id) == community.id + + # add a new curator so that there will ve 2 curators + u2 = User(email="u2@test.com", active=True, password="1234") + db.session.add(u2) + db.session.commit() + + cs = CommunitySupport() + cs.set_user_community_membership(u2, {CommunityRole(community.id, "curator")}) + + # this should remove the first one + update_from_perun_dump(touri("4.json")) + + # check that the first one is gone + memberships = list(Member.model_cls.query.filter_by(user_id=user.id).all()) + assert len(memberships) == 0 + + +def test_user_not_found_anymore(app, db, location, search_clear, smart_record): + with smart_record("test_suspend_user.yaml") as recorded: + user = User( + username="asdasdasd", + email="ms@cesnet.cz", + active=True, + password="1234", + user_profile={"full_name": "Mirek Simek"}, + ) + db.session.add(user) + db.session.commit() + + identity = UserIdentity.create( + user=user, + method="e-infra", + external_id="12ccb0f5d93f3b81d7987863fb687a4b592e9a28@einfra.cesnet.cz", + ) + db.session.commit() + + update_from_perun_dump(touri("5.json")) + + # check that the user still exists + User.query.filter_by(username="asdasdasd").one()