diff options
Diffstat (limited to 'db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py')
| -rw-r--r-- | db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py | 160 |
1 files changed, 88 insertions, 72 deletions
diff --git a/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py b/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py index 5498291..b94ffb8 100644 --- a/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py +++ b/db/migrations/versions/202607021740-fc6608d3f9cc_added_oauth_models.py | |||
| @@ -5,100 +5,116 @@ Revises: 115caa5a76d0 | |||
| 5 | Create Date: 2026-07-02 17:40:58.968553 | 5 | Create Date: 2026-07-02 17:40:58.968553 |
| 6 | 6 | ||
| 7 | """ | 7 | """ |
| 8 | |||
| 8 | import json | 9 | import json |
| 9 | import os | 10 | import os |
| 10 | from datetime import datetime, UTC | 11 | from collections.abc import Sequence |
| 12 | from datetime import UTC, datetime | ||
| 11 | from secrets import token_hex | 13 | from secrets import token_hex |
| 12 | from random import randbytes | ||
| 13 | from typing import Sequence, Union | ||
| 14 | from uuid import uuid4, uuid7 | 14 | from uuid import uuid4, uuid7 |
| 15 | 15 | ||
| 16 | from alembic import op | ||
| 17 | import sqlalchemy as sa | 16 | import sqlalchemy as sa |
| 18 | import sqlmodel | 17 | import sqlmodel |
| 19 | from authlib.integrations.sqla_oauth2 import OAuth2ClientMixin | 18 | from alembic import op |
| 20 | 19 | ||
| 21 | # revision identifiers, used by Alembic. | 20 | # revision identifiers, used by Alembic. |
| 22 | revision: str = 'fc6608d3f9cc' | 21 | revision: str = "fc6608d3f9cc" |
| 23 | down_revision: Union[str, Sequence[str], None] = '115caa5a76d0' | 22 | down_revision: str | Sequence[str] | None = "115caa5a76d0" |
| 24 | branch_labels: Union[str, Sequence[str], None] = None | 23 | branch_labels: str | Sequence[str] | None = None |
| 25 | depends_on: Union[str, Sequence[str], None] = None | 24 | depends_on: str | Sequence[str] | None = None |
| 26 | 25 | ||
| 27 | 26 | ||
| 28 | def upgrade() -> None: | 27 | def upgrade() -> None: |
| 29 | """Upgrade schema.""" | 28 | """Upgrade schema.""" |
| 30 | # ### commands auto generated by Alembic - please adjust! ### | 29 | # ### commands auto generated by Alembic - please adjust! ### |
| 31 | client_application = op.create_table('clientapplication', | 30 | client_application = op.create_table( |
| 32 | sa.Column('id', sa.Uuid(), nullable=False), | 31 | "clientapplication", |
| 33 | sa.Column('name', sqlmodel.sql.sqltypes.AutoString(), nullable=False), | 32 | sa.Column("id", sa.Uuid(), nullable=False), |
| 34 | sa.Column('client_id', sa.String(length=48), nullable=True), | 33 | sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False), |
| 35 | sa.Column('client_secret', sa.String(length=120), nullable=True), | 34 | sa.Column("client_id", sa.String(length=48), nullable=True), |
| 36 | sa.Column('client_id_issued_at', sa.Integer(), nullable=False), | 35 | sa.Column("client_secret", sa.String(length=120), nullable=True), |
| 37 | sa.Column('client_secret_expires_at', sa.Integer(), nullable=False), | 36 | sa.Column("client_id_issued_at", sa.Integer(), nullable=False), |
| 38 | sa.Column('client_metadata', sa.Text(), nullable=True), | 37 | sa.Column("client_secret_expires_at", sa.Integer(), nullable=False), |
| 39 | sa.PrimaryKeyConstraint('id') | 38 | sa.Column("client_metadata", sa.Text(), nullable=True), |
| 39 | sa.PrimaryKeyConstraint("id"), | ||
| 40 | ) | ||
| 41 | op.create_index( | ||
| 42 | op.f("ix_clientapplication_client_id"), | ||
| 43 | "clientapplication", | ||
| 44 | ["client_id"], | ||
| 45 | unique=False, | ||
| 40 | ) | 46 | ) |
| 41 | op.create_index(op.f('ix_clientapplication_client_id'), 'clientapplication', ['client_id'], unique=False) | 47 | op.create_table( |
| 42 | op.create_table('authcode', | 48 | "authcode", |
| 43 | sa.Column('id', sa.Uuid(), nullable=False), | 49 | sa.Column("id", sa.Uuid(), nullable=False), |
| 44 | sa.Column('user_id', sa.Uuid(), nullable=False), | 50 | sa.Column("user_id", sa.Uuid(), nullable=False), |
| 45 | sa.Column('code', sa.String(length=120), nullable=False), | 51 | sa.Column("code", sa.String(length=120), nullable=False), |
| 46 | sa.Column('client_id', sa.String(length=48), nullable=True), | 52 | sa.Column("client_id", sa.String(length=48), nullable=True), |
| 47 | sa.Column('redirect_uri', sa.Text(), nullable=True), | 53 | sa.Column("redirect_uri", sa.Text(), nullable=True), |
| 48 | sa.Column('response_type', sa.Text(), nullable=True), | 54 | sa.Column("response_type", sa.Text(), nullable=True), |
| 49 | sa.Column('scope', sa.Text(), nullable=True), | 55 | sa.Column("scope", sa.Text(), nullable=True), |
| 50 | sa.Column('nonce', sa.Text(), nullable=True), | 56 | sa.Column("nonce", sa.Text(), nullable=True), |
| 51 | sa.Column('auth_time', sa.Integer(), nullable=False), | 57 | sa.Column("auth_time", sa.Integer(), nullable=False), |
| 52 | sa.Column('acr', sa.Text(), nullable=True), | 58 | sa.Column("acr", sa.Text(), nullable=True), |
| 53 | sa.Column('amr', sa.Text(), nullable=True), | 59 | sa.Column("amr", sa.Text(), nullable=True), |
| 54 | sa.Column('code_challenge', sa.Text(), nullable=True), | 60 | sa.Column("code_challenge", sa.Text(), nullable=True), |
| 55 | sa.Column('code_challenge_method', sa.String(length=48), nullable=True), | 61 | sa.Column("code_challenge_method", sa.String(length=48), nullable=True), |
| 56 | sa.ForeignKeyConstraint(['user_id'], ['user.id'], ondelete='CASCADE'), | 62 | sa.ForeignKeyConstraint(["user_id"], ["user.id"], ondelete="CASCADE"), |
| 57 | sa.PrimaryKeyConstraint('id'), | 63 | sa.PrimaryKeyConstraint("id"), |
| 58 | sa.UniqueConstraint('code') | 64 | sa.UniqueConstraint("code"), |
| 59 | ) | 65 | ) |
| 60 | op.create_table('authtoken', | 66 | op.create_table( |
| 61 | sa.Column('id', sa.Uuid(), nullable=False), | 67 | "authtoken", |
| 62 | sa.Column('user_id', sa.Uuid(), nullable=False), | 68 | sa.Column("id", sa.Uuid(), nullable=False), |
| 63 | sa.Column('client_id', sa.String(length=48), nullable=True), | 69 | sa.Column("user_id", sa.Uuid(), nullable=False), |
| 64 | sa.Column('token_type', sa.String(length=40), nullable=True), | 70 | sa.Column("client_id", sa.String(length=48), nullable=True), |
| 65 | sa.Column('access_token', sa.String(length=255), nullable=False), | 71 | sa.Column("token_type", sa.String(length=40), nullable=True), |
| 66 | sa.Column('refresh_token', sa.String(length=255), nullable=True), | 72 | sa.Column("access_token", sa.String(length=255), nullable=False), |
| 67 | sa.Column('scope', sa.Text(), nullable=True), | 73 | sa.Column("refresh_token", sa.String(length=255), nullable=True), |
| 68 | sa.Column('issued_at', sa.Integer(), nullable=False), | 74 | sa.Column("scope", sa.Text(), nullable=True), |
| 69 | sa.Column('access_token_revoked_at', sa.Integer(), nullable=False), | 75 | sa.Column("issued_at", sa.Integer(), nullable=False), |
| 70 | sa.Column('refresh_token_revoked_at', sa.Integer(), nullable=False), | 76 | sa.Column("access_token_revoked_at", sa.Integer(), nullable=False), |
| 71 | sa.Column('expires_in', sa.Integer(), nullable=False), | 77 | sa.Column("refresh_token_revoked_at", sa.Integer(), nullable=False), |
| 72 | sa.ForeignKeyConstraint(['user_id'], ['user.id'], ondelete='CASCADE'), | 78 | sa.Column("expires_in", sa.Integer(), nullable=False), |
| 73 | sa.PrimaryKeyConstraint('id'), | 79 | sa.ForeignKeyConstraint(["user_id"], ["user.id"], ondelete="CASCADE"), |
| 74 | sa.UniqueConstraint('access_token') | 80 | sa.PrimaryKeyConstraint("id"), |
| 81 | sa.UniqueConstraint("access_token"), | ||
| 82 | ) | ||
| 83 | op.create_index( | ||
| 84 | op.f("ix_authtoken_refresh_token"), "authtoken", ["refresh_token"], unique=False | ||
| 75 | ) | 85 | ) |
| 76 | op.create_index(op.f('ix_authtoken_refresh_token'), 'authtoken', ['refresh_token'], unique=False) | ||
| 77 | 86 | ||
| 78 | op.bulk_insert(client_application, [ | 87 | op.bulk_insert( |
| 79 | { | 88 | client_application, |
| 80 | 'id': uuid7(), | 89 | [ |
| 81 | 'name': 'TTUN', | 90 | { |
| 82 | 'client_id': uuid4().hex, | 91 | "id": uuid7(), |
| 83 | 'client_secret': token_hex(32), | 92 | "name": "TTUN", |
| 84 | 'client_id_issued_at': datetime.now(tz=UTC).timestamp(), | 93 | "client_id": uuid4().hex, |
| 85 | 'client_secret_expires_at': datetime.now(tz=UTC).timestamp() + 3600, | 94 | "client_secret": token_hex(32), |
| 86 | 'client_metadata': json.dumps({ | 95 | "client_id_issued_at": datetime.now(tz=UTC).timestamp(), |
| 87 | 'redirect_uris': [ | 96 | "client_secret_expires_at": datetime.now(tz=UTC).timestamp() + 3600, |
| 88 | f'//{os.environ['TUNNEL_DOMAIN']}/oauth/callback' | 97 | "client_metadata": json.dumps( |
| 89 | ], | 98 | { |
| 90 | }) | 99 | "redirect_uris": [ |
| 91 | } | 100 | f"//{os.environ['TUNNEL_DOMAIN']}/oauth/callback" |
| 92 | ]) | 101 | ], |
| 102 | } | ||
| 103 | ), | ||
| 104 | } | ||
| 105 | ], | ||
| 106 | ) | ||
| 93 | # ### end Alembic commands ### | 107 | # ### end Alembic commands ### |
| 94 | 108 | ||
| 95 | 109 | ||
| 96 | def downgrade() -> None: | 110 | def downgrade() -> None: |
| 97 | """Downgrade schema.""" | 111 | """Downgrade schema.""" |
| 98 | # ### commands auto generated by Alembic - please adjust! ### | 112 | # ### commands auto generated by Alembic - please adjust! ### |
| 99 | op.drop_index(op.f('ix_authtoken_refresh_token'), table_name='authtoken') | 113 | op.drop_index(op.f("ix_authtoken_refresh_token"), table_name="authtoken") |
| 100 | op.drop_table('authtoken') | 114 | op.drop_table("authtoken") |
| 101 | op.drop_table('authcode') | 115 | op.drop_table("authcode") |
| 102 | op.drop_index(op.f('ix_clientapplication_client_id'), table_name='clientapplication') | 116 | op.drop_index( |
| 103 | op.drop_table('clientapplication') | 117 | op.f("ix_clientapplication_client_id"), table_name="clientapplication" |
| 118 | ) | ||
| 119 | op.drop_table("clientapplication") | ||
| 104 | # ### end Alembic commands ### | 120 | # ### end Alembic commands ### |
