mirror of
https://github.com/simple-login/app.git
synced 2025-02-24 15:53:22 +08:00
display whether a domain is premium
This commit is contained in:
parent
03521b5a84
commit
8482a55df6
3 changed files with 73 additions and 11 deletions
|
@ -43,12 +43,22 @@
|
|||
|
||||
<div class="col-sm-6 p-1">
|
||||
<select class="form-control" name="suffix">
|
||||
{% for suffix in suffixes %}
|
||||
<option value="{{ suffix[2] }}">
|
||||
{% if suffix[0] %}
|
||||
{{ suffix[1] }} (your domain)
|
||||
{% for suffix_info in suffixes %}
|
||||
<option value="{{ suffix_info.signed_suffix }}"
|
||||
{% if suffix_info.is_premium %}
|
||||
title="Only available to Premium accounts"
|
||||
{% elif not suffix_info.is_custom and at_least_a_premium_domain %}
|
||||
title="Available to all accounts"
|
||||
{% endif %}
|
||||
>
|
||||
{% if suffix_info.is_custom %}
|
||||
{{ suffix_info.suffix }} (your domain)
|
||||
{% else %}
|
||||
{{ suffix[1] }}
|
||||
{% if suffix_info.is_premium %}
|
||||
{{ suffix_info.suffix }} (Premium domain)
|
||||
{% else %}
|
||||
{{ suffix_info.suffix }} (Public domain)
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</option>
|
||||
{% endfor %}
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
from dataclasses import dataclass
|
||||
|
||||
from flask import render_template, redirect, url_for, flash, request
|
||||
from flask_login import login_required, current_user
|
||||
from itsdangerous import TimestampSigner, SignatureExpired
|
||||
|
@ -47,6 +49,50 @@ def available_suffixes(user: User) -> [bool, str, str]:
|
|||
return suffixes
|
||||
|
||||
|
||||
@dataclass
|
||||
class SuffixInfo:
|
||||
is_custom: bool
|
||||
suffix: str
|
||||
signed_suffix: str
|
||||
is_premium: bool
|
||||
|
||||
|
||||
def available_suffixes_more_info(user: User) -> [SuffixInfo]:
|
||||
"""
|
||||
Similar to as available_suffixes() but also return whether the suffix comes from a premium domain
|
||||
Note that is-premium-domain is only relevant for SL domain
|
||||
"""
|
||||
user_custom_domains = user.verified_custom_domains()
|
||||
|
||||
suffixes: [SuffixInfo] = []
|
||||
|
||||
# put custom domain first
|
||||
# for each user domain, generate both the domain and a random suffix version
|
||||
for alias_domain in user_custom_domains:
|
||||
suffix = "@" + alias_domain.domain
|
||||
suffixes.append(SuffixInfo(True, suffix, signer.sign(suffix).decode(), False))
|
||||
if alias_domain.random_prefix_generation:
|
||||
suffix = "." + random_word() + "@" + alias_domain.domain
|
||||
suffixes.append(
|
||||
SuffixInfo(True, suffix, signer.sign(suffix).decode(), False)
|
||||
)
|
||||
|
||||
# then SimpleLogin domain
|
||||
for sl_domain in user.get_sl_domains():
|
||||
suffix = (
|
||||
("" if DISABLE_ALIAS_SUFFIX else "." + random_word())
|
||||
+ "@"
|
||||
+ sl_domain.domain
|
||||
)
|
||||
suffixes.append(
|
||||
SuffixInfo(
|
||||
False, suffix, signer.sign(suffix).decode(), sl_domain.premium_only
|
||||
)
|
||||
)
|
||||
|
||||
return suffixes
|
||||
|
||||
|
||||
@dashboard_bp.route("/custom_alias", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def custom_alias():
|
||||
|
@ -60,8 +106,12 @@ def custom_alias():
|
|||
return redirect(url_for("dashboard.index"))
|
||||
|
||||
user_custom_domains = [cd.domain for cd in current_user.verified_custom_domains()]
|
||||
# List of (is_custom_domain, alias-suffix, time-signed alias-suffix)
|
||||
suffixes = available_suffixes(current_user)
|
||||
suffixes = available_suffixes_more_info(current_user)
|
||||
at_least_a_premium_domain = False
|
||||
for suffix in suffixes:
|
||||
if not suffix.is_custom and suffix.is_premium:
|
||||
at_least_a_premium_domain = True
|
||||
break
|
||||
|
||||
mailboxes = current_user.mailboxes()
|
||||
|
||||
|
@ -180,6 +230,7 @@ def custom_alias():
|
|||
"dashboard/custom_alias.html",
|
||||
user_custom_domains=user_custom_domains,
|
||||
suffixes=suffixes,
|
||||
at_least_a_premium_domain=at_least_a_premium_domain,
|
||||
mailboxes=mailboxes,
|
||||
)
|
||||
|
||||
|
|
|
@ -560,14 +560,15 @@ class User(db.Model, ModelMixin, UserMixin):
|
|||
- SimpleLogin public domains, available for all users (ALIAS_DOMAIN)
|
||||
- SimpleLogin premium domains, only available for Premium accounts (PREMIUM_ALIAS_DOMAIN)
|
||||
"""
|
||||
return [sl_domain.domain for sl_domain in self.get_sl_domains()]
|
||||
|
||||
def get_sl_domains(self) -> ["SLDomain"]:
|
||||
if self.is_premium():
|
||||
query = SLDomain.query.all()
|
||||
query = SLDomain.query
|
||||
else:
|
||||
query = SLDomain.filter_by(premium_only=False)
|
||||
|
||||
domains = [sl_domain.domain for sl_domain in query]
|
||||
|
||||
return domains
|
||||
return query.all()
|
||||
|
||||
def available_alias_domains(self) -> [str]:
|
||||
"""return all domains that user can use when creating a new alias, including:
|
||||
|
|
Loading…
Reference in a new issue