diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml new file mode 100644 index 00000000..3990834f --- /dev/null +++ b/.github/workflows/integration.yml @@ -0,0 +1,49 @@ +name: Integration + +on: + workflow_dispatch: + pull_request: + +jobs: + test: + name: Integration + runs-on: ubuntu-latest + services: + postgres: + image: postgres:17 + env: + POSTGRES_USER: keystone + POSTGRES_PASSWORD: '1234' + ports: + - 5432:5432 + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install necessary python packages + run: pip install keystone uwsgi psycopg2 + + - name: Prepare keystone config file + env: + store_id: ${{ steps.store.outputs.store_id }} + model_id: ${{ steps.store.outputs.model_id }} + run: | + mkdir -p etc + echo "[database]" >> etc/keystone.conf + echo "connection = postgresql://keystone:1234@127.0.0.1:5432/keystone" >> etc/keystone.conf + echo "[fernet_receipts]" >> etc/keystone.conf + echo "key_repository = $(pwd)/etc/fernet" >> etc/keystone.conf + echo "[fernet_tokens]" >> etc/keystone.conf + echo "key_repository = $(pwd)/etc/fernet" >> etc/keystone.conf + cat etc/keystone.conf + + - name: Init keystone + run: | + mkdir -p etc/fernet + keystone-manage --config-file etc/keystone.conf db_sync + keystone-manage --config-file etc/keystone.conf fernet_setup + keystone-manage --config-file etc/keystone.conf bootstrap --bootstrap-password password diff --git a/tools/keystone_bench_fernet.py b/tools/keystone_bench_fernet.py new file mode 100644 index 00000000..f7bb509f --- /dev/null +++ b/tools/keystone_bench_fernet.py @@ -0,0 +1,47 @@ +from pathlib import Path +import pytest +import tempfile + +from keystone.token.providers.fernet.core import Provider +import keystone.conf +from keystone.conf import configure + +CONF = keystone.conf.CONF + +@pytest.fixture(scope="session", autouse=True) +def execute_before_any_test(): + configure(CONF) + + +def test_fenet_token_python(benchmark): + key_repo = tempfile.TemporaryDirectory() + CONF.set_override("key_repository", key_repo.name, "fernet_tokens") + with open(Path(key_repo.name, "0"), "w") as fp: + fp.write("3HgVBYzXMJYSr-5hxYI5lvmXK9-UjwQNwQYnKlA3-aA=") + fp.flush() + with open(Path(key_repo.name, "1"), "w") as fp: + fp.write("BFTs1CIVIBLTP4GOrQ26VETrJ7Zwz1O4wbEcCQ966eM=") + fp.flush() + + fernet = Provider() + token = "gAAAAABnt1rtv0ROracU_8Iqyf5wIN5R4bo7Enk1P_KQeLtiC8bC4_qvCj9PzBOq1EHflF20aYYJq2dVDoy9hBxM23ua79YVjCd1BnjN8Mxz5ZG0-kYfEJPytVydWqKPG9p5V5eQ5H0ztsxJJZFG6qQHRDBUrk_SuKox8aVddX38Oa5Nx7wCGnA" + + token = benchmark(lambda: fernet.validate_token(token)) + + assert token == ( + '4b7d364ad87d400bbd91798e3c15e9c2', + ['external'], + ['FL7FbzBKQsK115_4TyyiIw'], + None, + None, + '97cd761d581b485792a4afc8cc6a998d', + None, + None, + None, + None, + None, + None, + None, + '2025-02-20T16:40:13.000000Z', + '2025-02-20T17:40:13.000000Z', + )