-
Notifications
You must be signed in to change notification settings - Fork 74
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: digital business card #2290
Merged
Merged
Changes from all commits
Commits
Show all changes
37 commits
Select commit
Hold shift + click to select a range
58e63e2
feat: devcontainer configuraton for vscode
amanji 107604e
feat: hard code digital business card schema
amanji 3793db1
feat: hard code digital business card schema
amanji d0c51ce
feat: issue credentials through Traction tenant
amanji 7b88982
refactor: app initialization workflow
amanji ad0fa01
feat: use out-of-band invitation for connecting
amanji 2e75d5f
feat: use v2.0 for issuing credential
amanji 79a2631
feat: web socket implmentation with flask-socketio
amanji fc8edc4
feat: db migration script to enable revocation
amanji 4fe8406
feat: revocation endpoint
amanji aec27f2
feat: replace endpoints
amanji 99e54fe
chore: fix linting errors
amanji 88e3ccc
chore: update requirements
amanji fd96a6e
chore: update tests
amanji e397e04
feat: traction token exchanger
amanji 1f2fe2b
chore: update workflow variables
amanji 4090b35
chore: update workflow variables
amanji 7f1f546
refactor: ws cors setting is a config option
amanji a259818
chore: fix linting errors
amanji 080825f
refactor: clean up init in digital credential service
amanji 6beb1b1
18284: digital credentials (#2260)
amanji 87d0854
feat: endpoints to reset credential offers
amanji 4042676
Merge remote-tracking branch 'upstream/feature-digital-credentials' i…
amanji 26a01e7
feat: credential id lookup table
amanji 32a7d7a
feat: add business roles
amanji 205dd68
18284 Add pre-fork server hook to gunicorn config (#2285)
argush3 c55cebc
chore: fix tests and linting
amanji 8ad8cb9
chore: fix tests
amanji 65a9a4d
18284 feat: digital credentials (#2281)
amanji 2fc5cb3
Merge remote-tracking branch 'upstream/feature-digital-credentials' i…
amanji d368673
refactor: remove records from Traction on deletion
amanji 0b3b60b
Revert "feat: web socket implmentation with flask-socketio"
amanji 9763a17
fix: port so it doesnt overlap with airplay server on OSX
amanji 633e3d9
Revert "fix: port so it doesnt overlap with airplay server on OSX"
amanji 2976d11
feat: digital credentials (#2287)
amanji b22e419
Merge remote-tracking branch 'upstream/feature-digital-credentials' i…
amanji fc6c34a
Merge branch 'feature-digital-credentials'
amanji File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
FROM mcr.microsoft.com/devcontainers/python:1-3.8-bookworm | ||
|
||
ENV PYTHONUNBUFFERED 1 | ||
|
||
# [Optional] If your requirements rarely change, uncomment this section to add them to the image. | ||
# COPY requirements.txt /tmp/pip-tmp/ | ||
# RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requirements.txt \ | ||
# && rm -rf /tmp/pip-tmp | ||
|
||
# [Optional] Uncomment this section to install additional OS packages. | ||
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ | ||
# && apt-get -y install --no-install-recommends <your-package-list-here> | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the | ||
// README at: https://github.com/devcontainers/templates/tree/main/src/postgres | ||
{ | ||
"name": "Python 3 & PostgreSQL", | ||
"dockerComposeFile": "docker-compose.yml", | ||
"service": "app", | ||
"workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", | ||
"features": { | ||
"ghcr.io/devcontainers/features/docker-outside-of-docker:1": {}, | ||
"ghcr.io/itsmechlark/features/postgresql:1": {} | ||
}, | ||
|
||
// Features to add to the dev container. More info: https://containers.dev/features. | ||
// "features": {}, | ||
|
||
// Use 'forwardPorts' to make a list of ports inside the container available locally. | ||
// This can be used to network with other containers or the host. | ||
// "forwardPorts": [5000, 5432], | ||
|
||
// Use 'postCreateCommand' to run commands after the container is created. | ||
// "postCreateCommand": "pip install --user -r requirements.txt", | ||
|
||
// Configure tool-specific properties. | ||
// "customizations": {}, | ||
|
||
// Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. | ||
// "remoteUser": "root", | ||
|
||
// Enable this on OSX to add ssh key to agent inside container | ||
"initializeCommand": "find ~/.ssh/ -type f -exec grep -l 'PRIVATE' {} \\; | xargs ssh-add" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
version: '3.8' | ||
|
||
services: | ||
app: | ||
build: | ||
context: .. | ||
dockerfile: .devcontainer/Dockerfile | ||
|
||
volumes: | ||
- ../..:/workspaces:cached | ||
|
||
# Overrides default command so things don't shut down after the process ends. | ||
command: sleep infinity | ||
|
||
# Runs app on the same network as the database container, allows "forwardPorts" in devcontainer.json function. | ||
network_mode: service:db | ||
|
||
# Use "forwardPorts" in **devcontainer.json** to forward an app port locally. | ||
# (Adding the "ports" property to this file will not forward from a Codespace.) | ||
|
||
db: | ||
image: postgres:latest | ||
restart: unless-stopped | ||
volumes: | ||
- postgres-data:/var/lib/postgresql/data | ||
environment: | ||
POSTGRES_USER: postgres | ||
POSTGRES_DB: postgres | ||
POSTGRES_PASSWORD: postgres | ||
|
||
# Add "forwardPorts": ["5432"] to **devcontainer.json** to forward PostgreSQL locally. | ||
# (Adding the "ports" property to this file will not forward from a Codespace.) | ||
|
||
volumes: | ||
postgres-data: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
|
||
import time | ||
|
||
|
||
def pre_fork(server, worker): | ||
# Delay loading of each worker by 5 seconds | ||
# This is done to work around an issue where the Traction API is returning an invalid token. The issue happens | ||
# when successive token retrieval calls are made with less than 2-3 seconds between the calls. | ||
time.sleep(5) | ||
|
26 changes: 26 additions & 0 deletions
26
legal-api/migrations/versions/6b65b40a5164_add_revocation_to_dc_credentials.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
"""add revocation to dc_credentials | ||
|
||
Revision ID: 6b65b40a5164 | ||
Revises: 9a9ac165365e | ||
Create Date: 2023-10-11 22:20:14.023687 | ||
|
||
""" | ||
from alembic import op | ||
import sqlalchemy as sa | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision = '6b65b40a5164' | ||
down_revision = '9a9ac165365e' | ||
branch_labels = None | ||
depends_on = None | ||
|
||
|
||
def upgrade(): | ||
op.add_column('dc_issued_credentials', sa.Column('credential_revocation_id', sa.String(length=10), nullable=True)) | ||
op.add_column('dc_issued_credentials', sa.Column('revocation_registry_id', sa.String(length=200), nullable=True)) | ||
|
||
|
||
def downgrade(): | ||
op.drop_column('dc_issued_credentials', 'credential_revocation_id') | ||
op.drop_column('dc_issued_credentials', 'revocation_registry_id') |
30 changes: 30 additions & 0 deletions
30
legal-api/migrations/versions/6e28f267db2a_create_issued_business_user_credentials_.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
"""create issued business user credentials table | ||
|
||
Revision ID: 6e28f267db2a | ||
Revises: 8148a25d695e | ||
Create Date: 2023-10-17 02:17:08.232290 | ||
|
||
""" | ||
from alembic import op | ||
import sqlalchemy as sa | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision = '6e28f267db2a' | ||
down_revision = '8148a25d695e' | ||
branch_labels = None | ||
depends_on = None | ||
|
||
|
||
def upgrade(): | ||
op.create_table('dc_issued_business_user_credentials', | ||
sa.Column('id', sa.Integer(), nullable=False), | ||
sa.Column('user_id', sa.Integer(), nullable=False), | ||
sa.Column('business_id', sa.Integer(), nullable=False), | ||
sa.PrimaryKeyConstraint('id'), | ||
sa.ForeignKeyConstraint(['business_id'], ['businesses.id']), | ||
sa.ForeignKeyConstraint(['user_id'], ['users.id'])) | ||
|
||
|
||
def downgrade(): | ||
op.drop_table('dc_issued_business_user_credentials') |
28 changes: 28 additions & 0 deletions
28
legal-api/migrations/versions/8148a25d695e_change_field_type.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
"""change field type | ||
|
||
Revision ID: 8148a25d695e | ||
Revises: 6b65b40a5164 | ||
Create Date: 2023-10-17 01:05:30.977475 | ||
|
||
""" | ||
from alembic import op | ||
import sqlalchemy as sa | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision = '8148a25d695e' | ||
down_revision = '6b65b40a5164' | ||
branch_labels = None | ||
depends_on = None | ||
|
||
|
||
def upgrade(): | ||
op.alter_column('dc_issued_credentials', 'credential_id', | ||
existing_type=sa.String(length=100), | ||
type_=sa.String(length=10)) | ||
|
||
|
||
def downgrade(): | ||
op.alter_column('dc_issued_credentials', 'credential_id', | ||
existing_type=sa.String(length=10), | ||
type_=sa.String(length=100)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# Copyright © 2023 Province of British Columbia | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# http://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
"""This module holds function decorators.""" | ||
|
||
import json | ||
from functools import wraps | ||
|
||
import jwt | ||
import requests | ||
from flask import current_app | ||
from jwt import ExpiredSignatureError | ||
|
||
|
||
def requires_traction_auth(f): | ||
"""Check for a valid Traction token and refresh if needed.""" | ||
@wraps(f) | ||
def decorated_function(*args, **kwargs): | ||
traction_api_url = current_app.config['TRACTION_API_URL'] | ||
traction_tenant_id = current_app.config['TRACTION_TENANT_ID'] | ||
traction_api_key = current_app.config['TRACTION_API_KEY'] | ||
|
||
if traction_api_url is None: | ||
raise EnvironmentError('TRACTION_API_URL environment vairable is not set') | ||
|
||
if traction_tenant_id is None: | ||
raise EnvironmentError('TRACTION_TENANT_ID environment vairable is not set') | ||
|
||
if traction_api_key is None: | ||
raise EnvironmentError('TRACTION_API_KEY environment vairable is not set') | ||
|
||
try: | ||
if not hasattr(current_app, 'api_token'): | ||
raise jwt.ExpiredSignatureError | ||
|
||
jwt.decode(current_app.api_token, options={'verify_signature': False}) | ||
except ExpiredSignatureError: | ||
current_app.logger.info('JWT token expired or is missing, requesting new token') | ||
response = requests.post(f'{traction_api_url}/multitenancy/tenant/{traction_tenant_id}/token', | ||
headers={'Content-Type': 'application/json'}, | ||
data=json.dumps({'api_key': traction_api_key})) | ||
response.raise_for_status() | ||
current_app.api_token = response.json()['token'] | ||
|
||
return f(*args, **kwargs) | ||
return decorated_function |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we have the BUSINESS_SCHEMA_ID and BUSINESS_CRED_DEF_ID values for Test and Prod yet? If so, please email them to me and I can put them in 1Password. If not, how do we get them?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, there are
45 TRACTION_xxx keys that are not yet configured in Test and Prod.