mirror of
https://github.com/simple-login/app.git
synced 2025-02-23 23:34:05 +08:00
add CustomDomain ownership_verified, ownership_txt_token column. Set ownership_verified=True for domain that has verified=True
This commit is contained in:
parent
e03f9d2342
commit
52e2e67081
2 changed files with 72 additions and 1 deletions
|
@ -8,7 +8,7 @@ import arrow
|
||||||
from arrow import Arrow
|
from arrow import Arrow
|
||||||
from flask import url_for
|
from flask import url_for
|
||||||
from flask_login import UserMixin
|
from flask_login import UserMixin
|
||||||
from sqlalchemy import text, desc, CheckConstraint, Index
|
from sqlalchemy import text, desc, CheckConstraint, Index, Column
|
||||||
from sqlalchemy.orm import deferred
|
from sqlalchemy.orm import deferred
|
||||||
from sqlalchemy_utils import ArrowType
|
from sqlalchemy_utils import ArrowType
|
||||||
|
|
||||||
|
@ -1785,6 +1785,7 @@ class CustomDomain(db.Model, ModelMixin):
|
||||||
# default name to use when user replies/sends from alias
|
# default name to use when user replies/sends from alias
|
||||||
name = db.Column(db.String(128), nullable=True, default=None)
|
name = db.Column(db.String(128), nullable=True, default=None)
|
||||||
|
|
||||||
|
# mx verified
|
||||||
verified = db.Column(db.Boolean, nullable=False, default=False)
|
verified = db.Column(db.Boolean, nullable=False, default=False)
|
||||||
dkim_verified = db.Column(
|
dkim_verified = db.Column(
|
||||||
db.Boolean, nullable=False, default=False, server_default="0"
|
db.Boolean, nullable=False, default=False, server_default="0"
|
||||||
|
@ -1813,6 +1814,26 @@ class CustomDomain(db.Model, ModelMixin):
|
||||||
db.Integer, default=0, server_default="0", nullable=False
|
db.Integer, default=0, server_default="0", nullable=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# only domain has the ownership verified can go the next DNS step
|
||||||
|
# MX verified domains before this change don't have to do the TXT check
|
||||||
|
# and therefore have ownership_verified=True
|
||||||
|
ownership_verified = db.Column(
|
||||||
|
db.Boolean, nullable=False, default=False, server_default="0"
|
||||||
|
)
|
||||||
|
|
||||||
|
# randomly generated TXT value for verifying domain ownership
|
||||||
|
# the TXT record should be sl-verification=txt_token
|
||||||
|
ownership_txt_token = db.Column(db.String(128), nullable=True)
|
||||||
|
|
||||||
|
__table_args__ = (
|
||||||
|
Index(
|
||||||
|
"ix_unique_domain", # Index name
|
||||||
|
"domain", # Columns which are part of the index
|
||||||
|
unique=True,
|
||||||
|
postgresql_where=Column("ownership_verified"),
|
||||||
|
), # The condition
|
||||||
|
)
|
||||||
|
|
||||||
user = db.relationship(User, foreign_keys=[user_id])
|
user = db.relationship(User, foreign_keys=[user_id])
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -1828,6 +1849,20 @@ class CustomDomain(db.Model, ModelMixin):
|
||||||
def get_trash_url(self):
|
def get_trash_url(self):
|
||||||
return URL + f"/dashboard/domains/{self.id}/trash"
|
return URL + f"/dashboard/domains/{self.id}/trash"
|
||||||
|
|
||||||
|
def get_ownership_dns_txt_value(self):
|
||||||
|
return f"sl-verification={self.ownership_txt_token}"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(cls, **kw):
|
||||||
|
domain: CustomDomain = super(CustomDomain, cls).create(**kw)
|
||||||
|
|
||||||
|
# generate a domain ownership txt token
|
||||||
|
if not domain.ownership_txt_token:
|
||||||
|
domain.ownership_txt_token = random_string(30)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
return domain
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return f"<Custom Domain {self.domain}>"
|
return f"<Custom Domain {self.domain}>"
|
||||||
|
|
||||||
|
|
36
migrations/versions/2021_081718_d4392342465f_.py
Normal file
36
migrations/versions/2021_081718_d4392342465f_.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
"""empty message
|
||||||
|
|
||||||
|
Revision ID: d4392342465f
|
||||||
|
Revises: 9014cca7097c
|
||||||
|
Create Date: 2021-08-17 18:53:27.134187
|
||||||
|
|
||||||
|
"""
|
||||||
|
import sqlalchemy_utils
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'd4392342465f'
|
||||||
|
down_revision = '9014cca7097c'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.add_column('custom_domain', sa.Column('ownership_txt_token', sa.String(length=128), nullable=True))
|
||||||
|
op.add_column('custom_domain', sa.Column('ownership_verified', sa.Boolean(), server_default='0', nullable=False))
|
||||||
|
op.create_index('ix_unique_domain', 'custom_domain', ['domain'], unique=True,
|
||||||
|
postgresql_where=sa.text('ownership_verified'))
|
||||||
|
|
||||||
|
# set ownership_verified=True for domain that has verified=True
|
||||||
|
op.execute('UPDATE custom_domain SET ownership_verified = true WHERE verified = true')
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_index('ix_unique_domain', table_name='custom_domain')
|
||||||
|
op.drop_column('custom_domain', 'ownership_verified')
|
||||||
|
op.drop_column('custom_domain', 'ownership_txt_token')
|
||||||
|
# ### end Alembic commands ###
|
Loading…
Reference in a new issue