4.49.7
Some checks failed
Build-Release-Image / Build-Image (linux/arm64) (push) Successful in 3m21s
Build-Release-Image / Build-Image (linux/amd64) (push) Has been cancelled
Build-Release-Image / Merge-Images (push) Has been cancelled
Build-Release-Image / Create-Release (push) Has been cancelled
Build-Release-Image / Notify (push) Has been cancelled
Some checks failed
Build-Release-Image / Build-Image (linux/arm64) (push) Successful in 3m21s
Build-Release-Image / Build-Image (linux/amd64) (push) Has been cancelled
Build-Release-Image / Merge-Images (push) Has been cancelled
Build-Release-Image / Create-Release (push) Has been cancelled
Build-Release-Image / Notify (push) Has been cancelled
This commit is contained in:
@ -33,7 +33,7 @@
|
||||
This email address is used to log in to SimpleLogin.
|
||||
<br />
|
||||
If you want to change the mailbox that emails are forwarded to, use the
|
||||
<a href="{{ url_for('dashboard.mailbox_route') }}">
|
||||
<a href="{{ url_for("dashboard.mailbox_route") }}">
|
||||
<i class="fe fe-inbox"></i> Mailboxes page
|
||||
</a>
|
||||
instead.
|
||||
@ -50,14 +50,14 @@
|
||||
<div class="mt-2">
|
||||
<span class="text-danger float-left">Pending email change: {{ pending_email }}</span>
|
||||
<form method="POST"
|
||||
action="{{ url_for('dashboard.resend_email_change') }}"
|
||||
action="{{ url_for("dashboard.resend_email_change") }}"
|
||||
class="float-left ml-2">
|
||||
{{ change_email_form.csrf_token }}
|
||||
<a onclick="this.closest('form').submit()"
|
||||
class="btn btn-secondary btn-sm">Resend confirmation email</a>
|
||||
</form>
|
||||
<form method="POST"
|
||||
action="{{ url_for('dashboard.cancel_email_change') }}"
|
||||
action="{{ url_for("dashboard.cancel_email_change") }}"
|
||||
class="float-left ml-2">
|
||||
{{ change_email_form.csrf_token }}
|
||||
<a onclick="this.closest('form').submit()"
|
||||
@ -91,10 +91,10 @@
|
||||
</div>
|
||||
{% if not current_user.enable_otp %}
|
||||
|
||||
<a href="{{ url_for('dashboard.mfa_setup') }}"
|
||||
<a href="{{ url_for("dashboard.mfa_setup") }}"
|
||||
class="btn btn-outline-primary">Setup TOTP</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('dashboard.mfa_cancel') }}"
|
||||
<a href="{{ url_for("dashboard.mfa_cancel") }}"
|
||||
class="btn btn-outline-danger">Disable TOTP</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
@ -111,10 +111,10 @@
|
||||
</div>
|
||||
{% if current_user.fido_uuid is none %}
|
||||
|
||||
<a href="{{ url_for('dashboard.fido_setup') }}"
|
||||
<a href="{{ url_for("dashboard.fido_setup") }}"
|
||||
class="btn btn-outline-primary">Setup WebAuthn</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('dashboard.fido_manage') }}"
|
||||
<a href="{{ url_for("dashboard.fido_manage") }}"
|
||||
class="btn btn-outline-info">Manage WebAuthn</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
@ -146,7 +146,7 @@
|
||||
<div class="card-body">
|
||||
<div class="card-title">Account Deletion</div>
|
||||
<div class="mb-3">If SimpleLogin isn't the right fit for you, you can simply delete your account.</div>
|
||||
<a href="{{ url_for('dashboard.delete_account') }}"
|
||||
<a href="{{ url_for("dashboard.delete_account") }}"
|
||||
class="btn btn-outline-danger">Delete account</a>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -27,7 +27,7 @@
|
||||
<br />
|
||||
<img src="/static/images/reverse-alias.svg"
|
||||
style="border: 1px solid"
|
||||
class="my-2 img-fluid"/>
|
||||
class="my-2 img-fluid" />
|
||||
</p>
|
||||
<p>This might seem like "magic" but trust us, only the first time is a bit awkward.</p>
|
||||
<p>
|
||||
@ -75,9 +75,7 @@
|
||||
{% else %}
|
||||
<button disabled
|
||||
title="Upgrade to premium to create reverse-aliases"
|
||||
class="btn btn-primary mt-2">
|
||||
Create reverse-alias
|
||||
</button>
|
||||
class="btn btn-primary mt-2">Create reverse-alias</button>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
@ -98,9 +96,7 @@
|
||||
{% if highlight_contact_id %}
|
||||
|
||||
<a href="{{ url_for("dashboard.alias_contact_manager", alias_id=alias.id, highlight_contact_id=highlight_contact_id) }}"
|
||||
class="btn btn-light">
|
||||
Reset
|
||||
</a>
|
||||
class="btn btn-light">Reset</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for("dashboard.alias_contact_manager", alias_id=alias.id) }}"
|
||||
class="btn btn-light">Reset</a>
|
||||
@ -114,7 +110,7 @@
|
||||
|
||||
{% set contact = contact_info.contact %}
|
||||
<div class="col-md-6">
|
||||
<div class="my-2 p-2 card {% if contact.id == highlight_contact_id %} highlight-row{% endif %}">
|
||||
<div class="my-2 p-2 card {% if contact.id == highlight_contact_id %}highlight-row{% endif %}">
|
||||
<div class="mb-2 row">
|
||||
<div class="col">
|
||||
<span class="font-weight-bold">{{ contact.website_email }}</span>
|
||||
@ -139,15 +135,11 @@
|
||||
target="_blank"
|
||||
data-toggle="tooltip"
|
||||
title="You can click on this to open your email client. Or use the copy button 👉"
|
||||
class="font-weight-bold">
|
||||
*************************
|
||||
</a>
|
||||
class="font-weight-bold">*************************</a>
|
||||
<span class="clipboard btn btn-sm btn-success copy-btn"
|
||||
data-toggle="tooltip"
|
||||
title="Copy the reverse-alias to clipboard"
|
||||
data-clipboard-text="{{ contact.website_send_to() }}">
|
||||
Copy reverse-alias
|
||||
</span>
|
||||
data-clipboard-text="{{ contact.website_send_to() }}">Copy reverse-alias</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="mb-2 text-muted small-text">
|
||||
@ -207,14 +199,12 @@
|
||||
<nav aria-label="Contact navigation">
|
||||
<ul class="pagination">
|
||||
<li class="page-item">
|
||||
<a class="btn btn-outline-secondary {% if page == 0 %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.alias_contact_manager', alias_id=alias.id, page=page-1) }}">
|
||||
<a class="btn btn-outline-secondary {% if page == 0 %}disabled{% endif %}" href="{{ url_for('dashboard.alias_contact_manager', alias_id=alias.id, page=page-1) }}">
|
||||
Previous
|
||||
</a>
|
||||
</li>
|
||||
<li class="page-item">
|
||||
<a class="btn btn-outline-secondary {% if last_page %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.alias_contact_manager', alias_id=alias.id, page=page+1) }}">
|
||||
<a class="btn btn-outline-secondary {% if last_page %}disabled{% endif %}" href="{{ url_for('dashboard.alias_contact_manager', alias_id=alias.id, page=page+1) }}">
|
||||
Next
|
||||
</a>
|
||||
</li>
|
||||
|
@ -13,7 +13,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Total</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">Last 14 days</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">Last 14 days</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ total }}</div>
|
||||
</div>
|
||||
@ -25,7 +27,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Forwarded</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">Last 14 days</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">Last 14 days</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ email_forwarded }}</div>
|
||||
</div>
|
||||
@ -37,7 +41,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Replies/Sent</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">Last 14 days</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">Last 14 days</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ email_replied }}</div>
|
||||
</div>
|
||||
@ -49,7 +55,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Blocked</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">Last 14 days</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">Last 14 days</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ email_blocked }}</div>
|
||||
</div>
|
||||
@ -111,14 +119,12 @@
|
||||
<nav aria-label="Alias log navigation">
|
||||
<ul class="pagination">
|
||||
<li class="page-item">
|
||||
<a class="btn btn-outline-secondary {% if page_id == 0 %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.alias_log', alias_id=alias_id, page_id=page_id-1) }}">
|
||||
<a class="btn btn-outline-secondary {% if page_id == 0 %}disabled{% endif %}" href="{{ url_for('dashboard.alias_log', alias_id=alias_id, page_id=page_id-1) }}">
|
||||
Previous
|
||||
</a>
|
||||
</li>
|
||||
<li class="page-item">
|
||||
<a class="btn btn-outline-secondary {% if last_page %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.alias_log', alias_id=alias_id, page_id=page_id+1) }}">
|
||||
<a class="btn btn-outline-secondary {% if last_page %}disabled{% endif %}" href="{{ url_for('dashboard.alias_log', alias_id=alias_id, page_id=page_id+1) }}">
|
||||
Next
|
||||
</a>
|
||||
</li>
|
||||
|
@ -15,10 +15,7 @@
|
||||
<select data-width="100%" class="mailbox-select" multiple name="mailbox_ids">
|
||||
{% for mailbox in mailboxes %}
|
||||
|
||||
<option value="{{ mailbox.id }}"
|
||||
{% if mailbox.id == current_user.default_mailbox_id %} selected{% endif %}>
|
||||
{{ mailbox.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox.id }}" {% if mailbox.id == current_user.default_mailbox_id %}selected{% endif %}>{{ mailbox.email }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button class="btn btn-success mt-2">Confirm</button>
|
||||
|
@ -16,9 +16,7 @@
|
||||
<em data-toggle="tooltip"
|
||||
title="Click to copy"
|
||||
class="clipboard"
|
||||
data-clipboard-text="{{ alias_transfer_url }}">
|
||||
{{ alias_transfer_url }}
|
||||
</em>
|
||||
data-clipboard-text="{{ alias_transfer_url }}">{{ alias_transfer_url }}</em>
|
||||
<p class="mt-5">
|
||||
Please copy the transfer URL. <strong>We won't be able to display it again</strong>. If you need to access it again you can generate a new URL.
|
||||
</p>
|
||||
|
@ -22,7 +22,7 @@
|
||||
<br />
|
||||
The period left in the current subscription isn't taken into account.
|
||||
<br />
|
||||
<a href="{{ url_for('dashboard.pricing') }}"
|
||||
<a href="{{ url_for("dashboard.pricing") }}"
|
||||
class="btn btn-primary mt-2">Re-subscribe</a>
|
||||
</p>
|
||||
{% else %}
|
||||
|
@ -43,12 +43,14 @@
|
||||
{% endif %}
|
||||
<div class="form-group">
|
||||
<label class="form-label">PGP Public Key</label>
|
||||
<textarea name="pgp" {% if not current_user.is_premium() %} disabled {% endif %} class="form-control" rows=10 id="pgp-public-key" placeholder="(Drag and drop or paste your pgp public key here) -----BEGIN PGP PUBLIC KEY BLOCK-----">{{ contact.pgp_public_key or "" }}</textarea>
|
||||
<textarea name="pgp"
|
||||
{% if not current_user.is_premium() %}disabled{% endif %}
|
||||
class="form-control"
|
||||
rows="10"
|
||||
id="pgp-public-key"
|
||||
placeholder="(Drag and drop or paste your pgp public key here) -----BEGIN PGP PUBLIC KEY BLOCK-----">{{ contact.pgp_public_key or "" }}</textarea>
|
||||
</div>
|
||||
<button class="btn btn-primary" name="action" {% if not current_user.is_premium() %}
|
||||
disabled {% endif %} value="save">
|
||||
Save
|
||||
</button>
|
||||
<button class="btn btn-primary" name="action" {% if not current_user.is_premium() %}disabled{% endif %} value="save">Save</button>
|
||||
{% if contact.pgp_finger_print %}
|
||||
|
||||
<button class="btn btn-danger float-right" name="action" value="remove">Remove</button>
|
||||
|
@ -74,10 +74,7 @@
|
||||
required>
|
||||
{% for mailbox in mailboxes %}
|
||||
|
||||
<option value="{{ mailbox.id }}"
|
||||
{% if mailbox.id == current_user.default_mailbox_id %} selected{% endif %}>
|
||||
{{ mailbox.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox.id }}" {% if mailbox.id == current_user.default_mailbox_id %}selected{% endif %}>{{ mailbox.email }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<div class="small-text">The mailbox(es) that owns this alias.</div>
|
||||
@ -102,7 +99,6 @@
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block script %}
|
||||
|
||||
<script>
|
||||
$('.mailbox-select').multipleSelect();
|
||||
|
||||
|
@ -30,9 +30,7 @@
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="alert alert-primary collapse {% if not custom_domains %} show{% endif %}"
|
||||
id="howtouse"
|
||||
role="alert">
|
||||
<div class="alert alert-primary collapse {% if not custom_domains %}show{% endif %}" id="howtouse" role="alert">
|
||||
By adding your domain, you can create aliases like <b>hi@my-domain.com</b>
|
||||
<br />
|
||||
You can also enable <b>catch-all</b> to create aliases on-the-fly:
|
||||
@ -50,18 +48,14 @@
|
||||
{% if custom_domain.ownership_verified and not custom_domain.verified %}
|
||||
|
||||
<a href="{{ url_for('dashboard.domain_detail_dns', custom_domain_id=custom_domain.id, _anchor='dns-setup') }}"
|
||||
class="btn btn-info btn-sm">
|
||||
Ownership verified. Setup the DNS
|
||||
</a>
|
||||
class="btn btn-info btn-sm">Ownership verified. Setup the DNS</a>
|
||||
{% elif custom_domain.ownership_verified and custom_domain.verified %}
|
||||
<span class="badge badge-success">Domain ready</span>
|
||||
<!-- custom_domain.ownership_verified is False -->
|
||||
{% else %}
|
||||
<a href="{{ url_for('dashboard.domain_detail_dns', custom_domain_id=custom_domain.id, _anchor='ownership-form') }}"
|
||||
class="btn btn-warning btn-sm"
|
||||
role="button">
|
||||
Verify domain ownership
|
||||
</a>
|
||||
role="button">Verify domain ownership</a>
|
||||
{% endif %}
|
||||
</h5>
|
||||
<h6 class="card-subtitle mb-4 text-muted">
|
||||
|
@ -22,9 +22,7 @@
|
||||
|
||||
<div class="alert alert-danger" role="alert">This feature is only available in premium plan.</div>
|
||||
{% endif %}
|
||||
<div class="alert alert-primary collapse {% if not dirs %} show{% endif %}"
|
||||
id="howtouse"
|
||||
role="alert">
|
||||
<div class="alert alert-primary collapse {% if not dirs %}show{% endif %}" id="howtouse" role="alert">
|
||||
<div>
|
||||
Directory allows you to create aliases <b>on the fly</b>.
|
||||
</div>
|
||||
@ -68,10 +66,10 @@
|
||||
<form method="post">
|
||||
{{ toggle_dir_form.csrf_token }}
|
||||
<input type="hidden" name="form-name" value="toggle-directory">
|
||||
{{ toggle_dir_form.directory_id( type="hidden", value=dir.id) }}
|
||||
{{ toggle_dir_form.directory_id(type="hidden", value=dir.id) }}
|
||||
<label class="custom-switch cursor" style="padding-left: 1rem" data-toggle="tooltip" {% if dir.disabled %}
|
||||
title="Enable directory on-the-fly alias creation" {% else %} title="Disable directory on-the-fly alias creation" {% endif %}>
|
||||
{{ toggle_dir_form.directory_enabled( class="custom-switch-input", checked=(not dir.disabled) ) }}
|
||||
{{ toggle_dir_form.directory_enabled(class="custom-switch-input", checked=(not dir.disabled) ) }}
|
||||
<span class="custom-switch-indicator"></span>
|
||||
</label>
|
||||
</form>
|
||||
@ -91,11 +89,11 @@
|
||||
data-toggle="tooltip"
|
||||
title="Aliases created with this directory are automatically owned by these mailboxes"></i>
|
||||
<br />
|
||||
{% set dir_mailboxes=dir.mailboxes %}
|
||||
{% set dir_mailboxes = dir.mailboxes %}
|
||||
<form method="post" class="mt-2">
|
||||
{{ update_dir_form.csrf_token }}
|
||||
<input type="hidden" name="form-name" value="update">
|
||||
{{ update_dir_form.directory_id( type="hidden", value=dir.id) }}
|
||||
{{ update_dir_form.directory_id(type="hidden", value=dir.id) }}
|
||||
<select data-width="100%"
|
||||
required
|
||||
class="mailbox-select"
|
||||
@ -103,10 +101,7 @@
|
||||
name="mailbox_ids">
|
||||
{% for mailbox in mailboxes %}
|
||||
|
||||
<option value="{{ mailbox.id }}"
|
||||
{% if mailbox in dir_mailboxes %} selected{% endif %}>
|
||||
{{ mailbox.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox.id }}" {% if mailbox in dir_mailboxes %}selected{% endif %}>{{ mailbox.email }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button class="mt-2 btn btn-outline-primary btn-sm">Update</button>
|
||||
@ -119,7 +114,7 @@
|
||||
<form method="post">
|
||||
{{ delete_dir_form.csrf_token }}
|
||||
<input type="hidden" name="form-name" value="delete">
|
||||
{{ delete_dir_form.directory_id( type="hidden", value=dir.id) }}
|
||||
{{ delete_dir_form.directory_id(type="hidden", value=dir.id) }}
|
||||
<span class="card-link btn btn-link float-right text-danger delete-dir">Delete</span>
|
||||
</form>
|
||||
</div>
|
||||
@ -129,7 +124,7 @@
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="row {% if current_user.directory_quota <= 0 %} disabled-content{% endif %}">
|
||||
<div class="row {% if current_user.directory_quota <= 0 %}disabled-content{% endif %}">
|
||||
<div class="col">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
@ -139,8 +134,8 @@
|
||||
<h2 class="h4 mb-1">New Directory</h2>
|
||||
<div class="small-text mb-4">You can create up to {{ current_user.directory_quota }} directories.</div>
|
||||
{{ new_dir_form.name(class="form-control", placeholder="my-directory",
|
||||
pattern="[0-9a-z-_]{3,}",
|
||||
title="Only letter, number, dash (-), underscore (_) can be used. Directory name must be at least 3 characters.") }}
|
||||
pattern="[0-9a-z-_]{3,}",
|
||||
title="Only letter, number, dash (-), underscore (_) can be used. Directory name must be at least 3 characters.") }}
|
||||
{{ render_field_errors(new_dir_form.name) }}
|
||||
<div class="small-text">
|
||||
Directory name must be at least 3 characters.
|
||||
@ -156,10 +151,7 @@
|
||||
<select data-width="100%" class="mailbox-select" multiple name="mailbox_ids">
|
||||
{% for mailbox in mailboxes %}
|
||||
|
||||
<option value="{{ mailbox.id }}"
|
||||
{% if mailbox.id == current_user.default_mailbox_id %} selected{% endif %}>
|
||||
{{ mailbox.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox.id }}" {% if mailbox.id == current_user.default_mailbox_id %}selected{% endif %}>{{ mailbox.email }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button id="btn-create-directory" class="btn btn-primary mt-2">Create</button>
|
||||
|
@ -13,7 +13,8 @@
|
||||
|
||||
<div class="alert alert-warning mt-3">Rules are ineffective when catch-all is enabled.</div>
|
||||
{% endif %}
|
||||
<div class="{% if custom_domain.catch_all %} disabled-content{% endif %}">
|
||||
<div class="{% if custom_domain.catch_all %}
|
||||
disabled-content{% endif %}">
|
||||
<div class="mt-3 mb-2">
|
||||
For a greater control than a simple catch-all, you can define a set of <b>rules</b> to auto create aliases.
|
||||
<br />
|
||||
@ -60,8 +61,7 @@
|
||||
<div class="form-group">
|
||||
<label>Regex</label>
|
||||
{{ new_auto_create_rule_form.regex(class="form-control",
|
||||
placeholder="prefix.*"
|
||||
) }}
|
||||
placeholder="prefix.*") }}
|
||||
{{ render_field_errors(new_auto_create_rule_form.regex) }}
|
||||
<div class="small-text">
|
||||
For example, if you want aliases that starts with <b>prefix</b> to be automatically created, you can set
|
||||
@ -95,10 +95,7 @@
|
||||
name="mailbox_ids">
|
||||
{% for mailbox in mailboxes %}
|
||||
|
||||
<option value="{{ mailbox.id }}"
|
||||
{% if mailbox.id == current_user.default_mailbox_id %} selected{% endif %}>
|
||||
{{ mailbox.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox.id }}" {% if mailbox.id == current_user.default_mailbox_id %}selected{% endif %}>{{ mailbox.email }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
@ -128,9 +125,7 @@
|
||||
{% if auto_create_test_result %}
|
||||
|
||||
<div class="alert {% if auto_create_test_passed %}
|
||||
alert-success {% else %} alert-warning {% endif %}">
|
||||
{{ auto_create_test_result }}
|
||||
</div>
|
||||
alert-success {% else %} alert-warning {% endif %}">{{ auto_create_test_result }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -63,8 +63,8 @@
|
||||
{% endif %}
|
||||
<hr />
|
||||
{% endif %}
|
||||
<div class="{% if not custom_domain.ownership_verified %} disabled-content{% endif %}"
|
||||
id="dns-setup">
|
||||
<div class="{% if not custom_domain.ownership_verified %}
|
||||
disabled-content{% endif %}" id="dns-setup">
|
||||
{% if not custom_domain.ownership_verified %}
|
||||
|
||||
<div class="alert alert-warning">A domain ownership must be verified first.</div>
|
||||
@ -177,9 +177,7 @@
|
||||
<em data-toggle="tooltip"
|
||||
title="Click to copy"
|
||||
class="clipboard"
|
||||
data-clipboard-text="{{ spf_record }}">
|
||||
{{ spf_record }}
|
||||
</em>
|
||||
data-clipboard-text="{{ spf_record }}">{{ spf_record }}</em>
|
||||
</div>
|
||||
<form method="post" action="#spf-form">
|
||||
{{ csrf_form.csrf_token }}
|
||||
@ -238,9 +236,7 @@
|
||||
Setting up DKIM is highly recommended to reduce the chance your emails ending up in the recipient's Spam
|
||||
folder.
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
Add the following CNAME DNS records to your domain.
|
||||
</div>
|
||||
<div class="mb-2">Add the following CNAME DNS records to your domain.</div>
|
||||
{% for dkim_prefix, dkim_cname_value in dkim_records %}
|
||||
|
||||
<div class="mb-2 p-3 dns-record">
|
||||
@ -256,9 +252,7 @@
|
||||
title="Click to copy"
|
||||
class="clipboard"
|
||||
data-clipboard-text="{{ dkim_cname_value }}."
|
||||
style="overflow-wrap: break-word">
|
||||
{{ dkim_cname_value }}.
|
||||
</em>
|
||||
style="overflow-wrap: break-word">{{ dkim_cname_value }}.</em>
|
||||
</div>
|
||||
{% endfor %}
|
||||
<div class="alert alert-info">
|
||||
@ -282,21 +276,15 @@
|
||||
<input type="hidden" name="form-name" value="check-dkim">
|
||||
{% if custom_domain.dkim_verified %}
|
||||
|
||||
<button type="submit" class="btn btn-outline-primary">
|
||||
Re-verify
|
||||
</button>
|
||||
<button type="submit" class="btn btn-outline-primary">Re-verify</button>
|
||||
{% else %}
|
||||
<button type="submit" class="btn btn-primary">
|
||||
Verify
|
||||
</button>
|
||||
<button type="submit" class="btn btn-primary">Verify</button>
|
||||
{% endif %}
|
||||
</form>
|
||||
{% if not dkim_ok %}
|
||||
|
||||
<div class="text-danger mt-4">
|
||||
<p>
|
||||
Your DNS is not correctly set.
|
||||
</p>
|
||||
<p>Your DNS is not correctly set.</p>
|
||||
<ul>
|
||||
{% for custom_record, retrieved_cname in dkim_errors.items() %}
|
||||
|
||||
@ -312,10 +300,8 @@
|
||||
</div>
|
||||
{% if custom_domain.dkim_verified %}
|
||||
|
||||
<div class="text-danger mt-4">
|
||||
DKIM is still enabled. Please update your DKIM settings with all CNAME records
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="text-danger mt-4">DKIM is still enabled. Please update your DKIM settings with all CNAME records</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
<hr />
|
||||
@ -330,24 +316,20 @@
|
||||
{% else %}
|
||||
<span class="cursor"
|
||||
data-toggle="tooltip"
|
||||
data-original-title="DMARC Not Verified">🚫 </span>
|
||||
data-original-title="DMARC Not Verified">🚫</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
DMARC
|
||||
<a href="https://en.wikipedia.org/wiki/DMARC"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
(Wikipedia↗)
|
||||
</a>
|
||||
rel="noopener noreferrer">(Wikipedia↗)</a>
|
||||
is designed to protect the domain from unauthorized use, commonly known as email spoofing.
|
||||
<br />
|
||||
Built around SPF and DKIM, a DMARC policy tells the receiving mail server what to do if
|
||||
neither of those authentication methods passes.
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
Add the following TXT DNS record to your domain.
|
||||
</div>
|
||||
<div class="mb-2">Add the following TXT DNS record to your domain.</div>
|
||||
<div class="mb-2 p-3 dns-record">
|
||||
Record: TXT
|
||||
<br />
|
||||
@ -360,9 +342,7 @@
|
||||
<em data-toggle="tooltip"
|
||||
title="Click to copy"
|
||||
class="clipboard"
|
||||
data-clipboard-text="{{ dmarc_record }}">
|
||||
{{ dmarc_record }}
|
||||
</em>
|
||||
data-clipboard-text="{{ dmarc_record }}">{{ dmarc_record }}</em>
|
||||
</div>
|
||||
<div class="alert alert-info">
|
||||
Some DNS registrar might require a full record path, in this case please use
|
||||
@ -377,13 +357,9 @@
|
||||
<input type="hidden" name="form-name" value="check-dmarc">
|
||||
{% if custom_domain.dmarc_verified %}
|
||||
|
||||
<button type="submit" class="btn btn-outline-primary">
|
||||
Re-verify
|
||||
</button>
|
||||
<button type="submit" class="btn btn-outline-primary">Re-verify</button>
|
||||
{% else %}
|
||||
<button type="submit" class="btn btn-primary">
|
||||
Verify
|
||||
</button>
|
||||
<button type="submit" class="btn btn-primary">Verify</button>
|
||||
{% endif %}
|
||||
</form>
|
||||
{% if not dmarc_ok %}
|
||||
|
@ -34,13 +34,14 @@
|
||||
.
|
||||
</div>
|
||||
</div>
|
||||
<div class="{% if not custom_domain.catch_all %} disabled-content{% endif %}">
|
||||
<div class="{% if not custom_domain.catch_all %}
|
||||
disabled-content{% endif %}">
|
||||
<div>
|
||||
Auto-created aliases are automatically owned by the following mailboxes
|
||||
<i class="fe fe-corner-right-down"></i>
|
||||
.
|
||||
</div>
|
||||
{% set domain_mailboxes=custom_domain.mailboxes %}
|
||||
{% set domain_mailboxes = custom_domain.mailboxes %}
|
||||
<form method="post" class="mt-2">
|
||||
{{ csrf_form.csrf_token }}
|
||||
<input type="hidden" name="form-name" value="update">
|
||||
@ -54,10 +55,7 @@
|
||||
name="mailbox_ids">
|
||||
{% for mailbox in mailboxes %}
|
||||
|
||||
<option value="{{ mailbox.id }}"
|
||||
{% if mailbox in domain_mailboxes %} selected{% endif %}>
|
||||
{{ mailbox.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox.id }}" {% if mailbox in domain_mailboxes %}selected{% endif %}>{{ mailbox.email }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
|
@ -45,7 +45,7 @@
|
||||
<td>Link a New Key</td>
|
||||
<td></td>
|
||||
<td class="text-center">
|
||||
<a href="{{ url_for('dashboard.fido_setup') }}">
|
||||
<a href="{{ url_for("dashboard.fido_setup") }}">
|
||||
<button class="btn btn-outline-success">Link</button>
|
||||
</a>
|
||||
</td>
|
||||
|
@ -61,8 +61,7 @@
|
||||
class="btn btn-success dropdown-toggle btn-group-border-left"
|
||||
data-toggle="dropdown"
|
||||
aria-haspopup="true"
|
||||
aria-expanded="false">
|
||||
</button>
|
||||
aria-expanded="false"></button>
|
||||
<div class="dropdown-menu dropdown-menu-right border-left"
|
||||
aria-labelledby="btnGroupDrop1">
|
||||
<div>
|
||||
@ -125,7 +124,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Aliases</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">All time</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">All time</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ stats.nb_alias }}</div>
|
||||
</div>
|
||||
@ -137,7 +138,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Forwarded</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">Last 14 days</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">Last 14 days</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ stats.nb_forward }}</div>
|
||||
</div>
|
||||
@ -149,7 +152,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Replies/Sent</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">Last 14 days</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">Last 14 days</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ stats.nb_reply }}</div>
|
||||
</div>
|
||||
@ -161,7 +166,9 @@
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="subheader">Blocked</div>
|
||||
<div class="text-muted"
|
||||
style="order: 2; margin-left: auto; font-size: .8rem">Last 14 days</div>
|
||||
style="order: 2;
|
||||
margin-left: auto;
|
||||
font-size: .8rem">Last 14 days</div>
|
||||
</div>
|
||||
<div class="h1 m-0">{{ stats.nb_block }}</div>
|
||||
</div>
|
||||
@ -177,52 +184,28 @@
|
||||
<select name="sort"
|
||||
onchange="this.form.submit()"
|
||||
class="form-control mr-3 shadow">
|
||||
<option value="" {% if sort == "" %} selected{% endif %}>
|
||||
Sort by most recent activity
|
||||
</option>
|
||||
<option value="old2new" {% if sort == "old2new" %} selected{% endif %}>
|
||||
Alias Old-Recent
|
||||
</option>
|
||||
<option value="new2old" {% if sort == "new2old" %} selected{% endif %}>
|
||||
Alias Recent-Old
|
||||
</option>
|
||||
<option value="a2z" {% if sort == "a2z" %} selected{% endif %}>
|
||||
Alias A-Z
|
||||
</option>
|
||||
<option value="z2a" {% if sort == "z2a" %} selected{% endif %}>
|
||||
Alias Z-A
|
||||
</option>
|
||||
<option value="" {% if sort == "" %}selected{% endif %}>Sort by most recent activity</option>
|
||||
<option value="old2new" {% if sort == "old2new" %}selected{% endif %}>Alias Old-Recent</option>
|
||||
<option value="new2old" {% if sort == "new2old" %}selected{% endif %}>Alias Recent-Old</option>
|
||||
<option value="a2z" {% if sort == "a2z" %}selected{% endif %}>Alias A-Z</option>
|
||||
<option value="z2a" {% if sort == "z2a" %}selected{% endif %}>Alias Z-A</option>
|
||||
</select>
|
||||
<select name="filter"
|
||||
onchange="this.form.submit()"
|
||||
class="form-control mr-3 shadow"
|
||||
style="max-width: 200px">
|
||||
<option value="" {% if filter == "" %} selected{% endif %}>
|
||||
All Aliases
|
||||
</option>
|
||||
<option value="pinned" {% if filter == "pinned" %} selected{% endif %}>
|
||||
Pinned Aliases
|
||||
</option>
|
||||
<option value="enabled" {% if filter == "enabled" %} selected{% endif %}>
|
||||
Only Enabled Aliases
|
||||
</option>
|
||||
<option value="disabled" {% if filter == "disabled" %} selected{% endif %}>
|
||||
Only Disabled Aliases
|
||||
</option>
|
||||
<option value="hibp" {% if filter == "hibp" %} selected{% endif %}>
|
||||
Only Aliases Found In Data Breaches
|
||||
</option>
|
||||
<option value="" {% if filter == "" %}selected{% endif %}>All Aliases</option>
|
||||
<option value="pinned" {% if filter == "pinned" %}selected{% endif %}>Pinned Aliases</option>
|
||||
<option value="enabled" {% if filter == "enabled" %}selected{% endif %}>Only Enabled Aliases</option>
|
||||
<option value="disabled" {% if filter == "disabled" %}selected{% endif %}>Only Disabled Aliases</option>
|
||||
<option value="hibp" {% if filter == "hibp" %}selected{% endif %}>Only Aliases Found In Data Breaches</option>
|
||||
{% for mailbox in current_user.mailboxes() %}
|
||||
|
||||
<option value="mailbox:{{ mailbox.id }}" {% if filter == "mailbox:" ~ mailbox.id %}
|
||||
selected {% endif %}>
|
||||
{{ mailbox.email }}'s aliases
|
||||
</option>
|
||||
<option value="mailbox:{{ mailbox.id }}" {% if filter == "mailbox:" ~ mailbox.id %}selected{% endif %}>{{ mailbox.email }}'s aliases</option>
|
||||
{% endfor %}
|
||||
{% for directory in current_user.directories %}
|
||||
|
||||
<option value="directory:{{ directory.id }}" {% if filter == "directory:" ~ directory.id %}
|
||||
selected {% endif %}>
|
||||
<option value="directory:{{ directory.id }}" {% if filter == "directory:" ~ directory.id %}selected{% endif %}>
|
||||
Directory <b>{{ directory.name }}</b> aliases
|
||||
</option>
|
||||
{% endfor %}
|
||||
@ -237,7 +220,7 @@
|
||||
<div style="margin-left: auto">
|
||||
{% if query or sort or filter %}
|
||||
|
||||
<a href="{{ url_for('dashboard.index') }}"
|
||||
<a href="{{ url_for("dashboard.index") }}"
|
||||
class="btn btn-outline-secondary">Reset</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
@ -251,10 +234,11 @@
|
||||
|
||||
{% set alias = alias_info.alias %}
|
||||
<div class="col-12 col-lg-6" id="alias-container-{{ alias.id }}">
|
||||
<div class="card p-4 shadow-sm {% if alias.id == highlight_alias_id %} highlight-row{% endif %} ">
|
||||
<div class="card p-4 shadow-sm {% if alias.id == highlight_alias_id %}highlight-row{% endif %} ">
|
||||
<div class="row">
|
||||
<div class="col-8">
|
||||
<span class="{% if alias.id == highlight_alias_id %} highlighted{% endif %} clipboard cursor mb-0" {% if loop.index ==1 %}
|
||||
<span class="{% if alias.id == highlight_alias_id %}
|
||||
highlighted{% endif %} clipboard cursor mb-0" {% if loop.index ==1 %}
|
||||
data-intro="This is your first <em>alias</em>.
|
||||
<br />
|
||||
<br />
|
||||
@ -358,7 +342,15 @@
|
||||
</div>
|
||||
<div class="d-flex mb-2">
|
||||
<div class="flex-grow-1 mr-2">
|
||||
<textarea id="note-{{ alias.id }}" name="note" class="form-control" style="font-size: 12px" rows="2" placeholder="e.g. where the alias is used or why is it created" onchange="handleNoteChange({{ alias.id }}, '{{ alias.email }}')" onfocus="handleNoteFocus({{ alias.id }})" onblur="handleNoteBlur({{ alias.id }})">{{ alias.note or "" }}</textarea>
|
||||
<textarea id="note-{{ alias.id }}"
|
||||
name="note"
|
||||
class="form-control"
|
||||
style="font-size: 12px"
|
||||
rows="2"
|
||||
placeholder="e.g. where the alias is used or why is it created"
|
||||
onchange="handleNoteChange({{ alias.id }}, '{{ alias.email }}')"
|
||||
onfocus="handleNoteFocus({{ alias.id }})"
|
||||
onblur="handleNoteBlur({{ alias.id }})">{{ alias.note or "" }}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Send Email && More button -->
|
||||
@ -399,27 +391,21 @@
|
||||
</div>
|
||||
<!-- END Send Email && More button -->
|
||||
<!-- Collapse section -->
|
||||
<div class="{% if not current_user.expand_alias_info %} collapse{% endif %} mt-2"
|
||||
id="alias-{{ alias.id }}">
|
||||
<div class="{% if not current_user.expand_alias_info %}
|
||||
collapse{% endif %} mt-2" id="alias-{{ alias.id }}">
|
||||
{% if alias_info.latest_email_log != None %}
|
||||
|
||||
<div style="font-size: 12px">
|
||||
Alias created {{ alias.created_at | dt }}
|
||||
</div>
|
||||
<div style="font-size: 12px">Alias created {{ alias.created_at | dt }}</div>
|
||||
{% endif %}
|
||||
<span class="alias-activity">{{ alias_info.nb_forward }}</span> forwarded,
|
||||
<span class="alias-activity">{{ alias_info.nb_blocked }}</span> blocked,
|
||||
<span class="alias-activity">{{ alias_info.nb_reply }}</span> sent
|
||||
in the last 14 days
|
||||
<a href="{{ url_for('dashboard.alias_log', alias_id=alias.id) }}"
|
||||
class="btn btn-sm btn-link">
|
||||
See All →
|
||||
</a>
|
||||
class="btn btn-sm btn-link">See All →</a>
|
||||
{% if mailboxes|length > 1 %}
|
||||
|
||||
<div class="small-text">
|
||||
Current mailbox
|
||||
</div>
|
||||
<div class="small-text">Current mailbox</div>
|
||||
<div class="d-flex">
|
||||
<div class="flex-grow-1 mr-2">
|
||||
<select required
|
||||
@ -431,10 +417,7 @@
|
||||
onchange="handleMailboxChange({{ alias.id }}, '{{ alias.email }}')">
|
||||
{% for mailbox in mailboxes %}
|
||||
|
||||
<option value="{{ mailbox.id }}" {% if alias_info.contain_mailbox(mailbox.id) %}
|
||||
selected {% endif %}>
|
||||
{{ mailbox.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox.id }}" {% if alias_info.contain_mailbox(mailbox.id) %}selected{% endif %}>{{ mailbox.email }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
@ -502,11 +485,7 @@
|
||||
<input type="hidden" name="form-name" value="delete-alias">
|
||||
<input type="hidden" name="alias-id" value="{{ alias.id }}">
|
||||
<input type="hidden" name="alias" class="alias" value="{{ alias.email }}">
|
||||
<span class="btn btn-link btn-sm float-right text-danger"
|
||||
onclick="confirmDeleteAlias.call(this)"
|
||||
{% if alias.custom_domain %} data-custom-domain-trash-url="{{ alias.custom_domain.get_trash_url() }}"{% endif %}
|
||||
data-alias="{{ alias.id }}"
|
||||
data-alias-email="{{ alias.email }}">
|
||||
<span class="btn btn-link btn-sm float-right text-danger" onclick="confirmDeleteAlias.call(this)" {% if alias.custom_domain %}data-custom-domain-trash-url="{{ alias.custom_domain.get_trash_url() }}"{% endif %} data-alias="{{ alias.id }}" data-alias-email="{{ alias.email }}">
|
||||
Delete <i class="dropdown-icon fe fe-trash-2 text-danger"></i>
|
||||
</span>
|
||||
</form>
|
||||
@ -527,14 +506,12 @@
|
||||
<nav aria-label="Alias navigation">
|
||||
<ul class="pagination">
|
||||
<li class="page-item mr-1">
|
||||
<a class="btn btn-outline-primary {% if page == 0 %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.index', page=page-1, query=query, sort=sort, filter=filter) }}">
|
||||
<a class="btn btn-outline-primary {% if page == 0 %}disabled{% endif %}" href="{{ url_for('dashboard.index', page=page-1, query=query, sort=sort, filter=filter) }}">
|
||||
Previous
|
||||
</a>
|
||||
</li>
|
||||
<li class="page-item">
|
||||
<a class="btn btn-outline-primary {% if last_page %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.index', page=page+1, query=query, sort=sort, filter=filter) }}">
|
||||
<a class="btn btn-outline-primary {% if last_page %}disabled{% endif %}" href="{{ url_for('dashboard.index', page=page+1, query=query, sort=sort, filter=filter) }}">
|
||||
Next
|
||||
</a>
|
||||
</li>
|
||||
|
@ -22,21 +22,19 @@
|
||||
|
||||
<div class="alert alert-danger" role="alert">This feature is only available in premium plan.</div>
|
||||
{% endif %}
|
||||
<div class="alert alert-primary collapse {% if mailboxes|length == 1 %} show{% endif %}"
|
||||
id="howtouse"
|
||||
role="alert">
|
||||
<div class="alert alert-primary collapse {% if mailboxes|length == 1 %}show{% endif %}" id="howtouse" role="alert">
|
||||
A <em>mailbox</em> is just another personal email address. When creating a new alias, you could choose
|
||||
the
|
||||
mailbox that <em>owns</em> this alias, i.e:
|
||||
<br/>
|
||||
<br />
|
||||
- all emails sent to this alias will be forwarded to this mailbox
|
||||
<br/>
|
||||
<br />
|
||||
- from this mailbox, you can reply/send emails from the alias.
|
||||
<br/>
|
||||
<br/>
|
||||
<br />
|
||||
<br />
|
||||
When you signed up, a mailbox is automatically created with your email <b>{{ current_user.email }}</b>
|
||||
<br/>
|
||||
<br/>
|
||||
<br />
|
||||
<br />
|
||||
The mailbox doesn't have to be your email: it can be your friend's email
|
||||
if you want to create aliases for your buddy.
|
||||
</div>
|
||||
@ -75,9 +73,9 @@
|
||||
</h5>
|
||||
<h6 class="card-subtitle mb-2 text-muted">
|
||||
Created {{ mailbox.created_at | dt }}
|
||||
<br/>
|
||||
<br />
|
||||
<span class="font-weight-bold">{{ mailbox.nb_alias() }}</span> aliases.
|
||||
<br/>
|
||||
<br />
|
||||
</h6>
|
||||
<a href="{{ url_for('dashboard.mailbox_detail_route', mailbox_id=mailbox.id) }}">Edit
|
||||
➡</a>
|
||||
@ -92,9 +90,7 @@
|
||||
<input type="hidden" name="form-name" value="set-default">
|
||||
<input type="hidden" class="mailbox" value="{{ mailbox.email }}">
|
||||
<input type="hidden" name="mailbox_id" value="{{ mailbox.id }}">
|
||||
<button class="card-link btn btn-link {% if mailbox.id == current_user.default_mailbox_id %} disabled{% endif %}">
|
||||
Set As Default Mailbox
|
||||
</button>
|
||||
<button class="card-link btn btn-link {% if mailbox.id == current_user.default_mailbox_id %}disabled{% endif %}">Set As Default Mailbox</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
@ -105,22 +101,16 @@
|
||||
<input type="hidden" class="mailbox" value="{{ mailbox.email }}">
|
||||
<input type="hidden" name="mailbox_id" value="{{ mailbox.id }}">
|
||||
<select hidden name="transfer_mailbox_id" value="">
|
||||
<option value="-1">
|
||||
Delete my aliases
|
||||
</option>
|
||||
<option value="-1">Delete my aliases</option>
|
||||
{% for mailbox_opt in mailboxes %}
|
||||
|
||||
{% if mailbox_opt.verified and mailbox_opt.id != mailbox.id %}
|
||||
|
||||
<option value="{{ mailbox_opt.id }}">
|
||||
{{ mailbox_opt.email }}
|
||||
</option>
|
||||
<option value="{{ mailbox_opt.id }}">{{ mailbox_opt.email }}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</select>
|
||||
<span class="card-link btn btn-link text-danger float-right delete-mailbox {% if mailbox.id == current_user.default_mailbox_id %} disabled{% endif %}">
|
||||
Delete
|
||||
</span>
|
||||
<span class="card-link btn btn-link text-danger float-right delete-mailbox {% if mailbox.id == current_user.default_mailbox_id %}disabled{% endif %}">Delete</span>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -60,9 +60,7 @@
|
||||
<div class="mt-2">
|
||||
<span class="text-danger">Pending change: {{ pending_email }}</span>
|
||||
<a href="{{ url_for('dashboard.cancel_mailbox_change_route', mailbox_id=mailbox.id) }}"
|
||||
class="btn btn-secondary btn-sm">
|
||||
Cancel mailbox change
|
||||
</a>
|
||||
class="btn btn-secondary btn-sm">Cancel mailbox change</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
@ -123,13 +121,15 @@
|
||||
{{ csrf_form.csrf_token }}
|
||||
<div class="form-group">
|
||||
<label class="form-label">PGP Public Key</label>
|
||||
<textarea name="pgp" {% if not current_user.is_premium() %} disabled {% endif %} class="form-control" rows=10 id="pgp-public-key" placeholder="(Drag and drop or paste your pgp public key here) -----BEGIN PGP PUBLIC KEY BLOCK-----">{{ mailbox.pgp_public_key or "" }}</textarea>
|
||||
<textarea name="pgp"
|
||||
{% if not current_user.is_premium() %}disabled{% endif %}
|
||||
class="form-control"
|
||||
rows="10"
|
||||
id="pgp-public-key"
|
||||
placeholder="(Drag and drop or paste your pgp public key here) -----BEGIN PGP PUBLIC KEY BLOCK-----">{{ mailbox.pgp_public_key or "" }}</textarea>
|
||||
</div>
|
||||
<input type="hidden" name="form-name" value="pgp">
|
||||
<button class="btn btn-primary" name="action" {% if not current_user.is_premium() %}
|
||||
disabled {% endif %} value="save">
|
||||
Save
|
||||
</button>
|
||||
<button class="btn btn-primary" name="action" {% if not current_user.is_premium() %}disabled{% endif %} value="save">Save</button>
|
||||
{% if mailbox.pgp_finger_print %}
|
||||
|
||||
<button class="btn btn-danger float-right" name="action" value="remove">Remove</button>
|
||||
|
@ -8,7 +8,7 @@
|
||||
Mailbox <b>{{ mailbox.email }}</b> verified, you can now start creating alias with it
|
||||
</div>
|
||||
<div class="mx-auto">
|
||||
<a href="{{ url_for('dashboard.index') }}" class="btn btn-primary">Go To Home Page</a>
|
||||
<a href="{{ url_for("dashboard.index") }}" class="btn btn-primary">Go To Home Page</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -17,13 +17,9 @@
|
||||
white-space: normal;
|
||||
overflow: hidden;
|
||||
max-height: 100px;
|
||||
text-overflow: ellipsis;">
|
||||
{{ notification.message | safe }}
|
||||
</div>
|
||||
text-overflow: ellipsis">{{ notification.message | safe }}</div>
|
||||
<a href="{{ url_for('dashboard.notification_route', notification_id=notification.id) }}"
|
||||
class="mt-2 btn btn-outline-primary">
|
||||
More ➡
|
||||
</a>
|
||||
class="mt-2 btn btn-outline-primary">More ➡</a>
|
||||
<div class="small text-muted mt-2">{{ notification.created_at | dt }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -36,16 +32,12 @@
|
||||
<nav aria-label="Notification navigation">
|
||||
<ul class="pagination">
|
||||
<li class="page-item mr-1">
|
||||
<a class="btn btn-outline-primary {% if page == 0 %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.notifications_route', page=page-1) }}">
|
||||
<a class="btn btn-outline-primary {% if page == 0 %}disabled{% endif %}" href="{{ url_for('dashboard.notifications_route', page=page-1) }}">
|
||||
Previous
|
||||
</a>
|
||||
</li>
|
||||
<li class="page-item">
|
||||
<a class="btn btn-outline-primary {% if last_page %}disabled{% endif %}"
|
||||
href="{{ url_for('dashboard.notifications_route', page=page+1) }}">
|
||||
Next
|
||||
</a>
|
||||
<a class="btn btn-outline-primary {% if last_page %}disabled{% endif %}" href="{{ url_for('dashboard.notifications_route', page=page+1) }}">Next</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
@ -9,7 +9,7 @@
|
||||
if (window.Paddle === undefined) {
|
||||
console.log("cannot load Paddle from CDN");
|
||||
// split string to avoid djlint incorrectly formatting the file
|
||||
document.write('<' + 'script src="/static/vendor/paddle.js"><\/script' + '>');
|
||||
document.write('<' + 'script src="/static/vendor/paddle.js"><\/script ' + '>');
|
||||
}
|
||||
</script>
|
||||
<style type="text/css">
|
||||
@ -144,9 +144,7 @@
|
||||
{% set sub = current_user.get_paddle_subscription() %}
|
||||
<button class="{{ 'invisible' if sub or manual_sub or coinbase_sub }} btn btn-lg btn-outline-secondary w-100 btn-no-pointer"
|
||||
aria-disabled="true"
|
||||
disabled>
|
||||
Current plan
|
||||
</button>
|
||||
disabled>Current plan</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="list-unstyled">
|
||||
@ -172,9 +170,7 @@
|
||||
<div class="h3 my-3">$4 / month</div>
|
||||
<div class="text-center mt-4 mb-6">
|
||||
<button class="btn btn-primary btn-lg w-100"
|
||||
onclick="upgradePaddle({{ PADDLE_MONTHLY_PRODUCT_ID }})">
|
||||
Upgrade to Premium
|
||||
</button>
|
||||
onclick="upgradePaddle({{ PADDLE_MONTHLY_PRODUCT_ID }})">Upgrade to Premium</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="list-unstyled">
|
||||
@ -287,9 +283,7 @@
|
||||
{% set sub = current_user.get_paddle_subscription() %}
|
||||
<button class="{{ 'invisible' if sub or manual_sub or coinbase_sub }} btn btn-lg btn-outline-secondary w-100 btn-no-pointer"
|
||||
aria-disabled="true"
|
||||
disabled>
|
||||
Current plan
|
||||
</button>
|
||||
disabled>Current plan</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="list-unstyled">
|
||||
@ -315,9 +309,7 @@
|
||||
<div class="h3 my-3">$30 / year</div>
|
||||
<div class="text-center mt-4 mb-6">
|
||||
<button class="btn btn-primary btn-lg w-100"
|
||||
onclick="upgradePaddle({{ PADDLE_YEARLY_PRODUCT_ID }})">
|
||||
Upgrade to Premium
|
||||
</button>
|
||||
onclick="upgradePaddle({{ PADDLE_YEARLY_PRODUCT_ID }})">Upgrade to Premium</button>
|
||||
</div>
|
||||
</div>
|
||||
<ul class="list-unstyled">
|
||||
@ -447,18 +439,10 @@
|
||||
We use <a href="https://paddle.com" target="_blank" rel="noopener noreferrer">Paddle <i class="fe fe-external-link"></i></a> by default for handling payments via credit cards and PayPal. Paddle currently supports the following payment methods:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
Cards (including Mastercard, Visa, Maestro, American Express, Discover, Diners Club, JCB, UnionPay, and Mada)
|
||||
</li>
|
||||
<li>
|
||||
PayPal
|
||||
</li>
|
||||
<li>
|
||||
Apple Pay
|
||||
</li>
|
||||
<li>
|
||||
Wire Transfers (ACH/SEPA/BACS)
|
||||
</li>
|
||||
<li>Cards (including Mastercard, Visa, Maestro, American Express, Discover, Diners Club, JCB, UnionPay, and Mada)</li>
|
||||
<li>PayPal</li>
|
||||
<li>Apple Pay</li>
|
||||
<li>Wire Transfers (ACH/SEPA/BACS)</li>
|
||||
</ul>
|
||||
<p>
|
||||
More information can be found on
|
||||
@ -482,7 +466,7 @@
|
||||
</p>
|
||||
<div class="d-flex justify-content-center">
|
||||
<a class="btn btn-outline-primary text-center"
|
||||
href="{{ url_for('dashboard.coinbase_checkout_route') }}"
|
||||
href="{{ url_for("dashboard.coinbase_checkout_route") }}"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
Upgrade to Premium - cryptocurrency
|
||||
@ -520,7 +504,7 @@
|
||||
<div class="card-body">
|
||||
<p>
|
||||
To redeem or buy a coupon, please go to the
|
||||
<a href="{{ url_for('dashboard.coupon_route') }}">coupon page</a>. The coupon code can be used by you or given to someone as a gift.
|
||||
<a href="{{ url_for("dashboard.coupon_route") }}">coupon page</a>. The coupon code can be used by you or given to someone as a gift.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@ -554,18 +538,12 @@
|
||||
sending emails. Concretely:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
All aliases/domains/directories/mailboxes you have created are kept and continue working normally.
|
||||
</li>
|
||||
<li>
|
||||
You cannot create new aliases if you exceed the free plan limit, i.e. have more than 10 aliases.
|
||||
</li>
|
||||
<li>All aliases/domains/directories/mailboxes you have created are kept and continue working normally.</li>
|
||||
<li>You cannot create new aliases if you exceed the free plan limit, i.e. have more than 10 aliases.</li>
|
||||
<li>
|
||||
As features like catch-all or directory allow you to create aliases on-the-fly, those aliases cannot be automatically created if you have more than 10 aliases.
|
||||
</li>
|
||||
<li>
|
||||
You cannot add new domain, directory or mailbox.
|
||||
</li>
|
||||
<li>You cannot add new domain, directory or mailbox.</li>
|
||||
</ul>
|
||||
<p>
|
||||
For example, if you have 100 aliases by the time your subscription ends, these 100 aliases will continue receiving and sending emails normally. You cannot however create new aliases.
|
||||
@ -630,19 +608,11 @@
|
||||
aria-labelledby="pricing-faq-question-discounts"
|
||||
data-parent="#pricing-faq">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
We offer important discounts or free premium for:
|
||||
</p>
|
||||
<p>We offer important discounts or free premium for:</p>
|
||||
<ul>
|
||||
<li>
|
||||
students, professors or technical staffs working at an educational institute
|
||||
</li>
|
||||
<li>
|
||||
activists, dissidents or journalists
|
||||
</li>
|
||||
<li>
|
||||
charity organizations
|
||||
</li>
|
||||
<li>students, professors or technical staffs working at an educational institute</li>
|
||||
<li>activists, dissidents or journalists</li>
|
||||
<li>charity organizations</li>
|
||||
</ul>
|
||||
<p>
|
||||
Please send us an email at <a href="mailto:support@simplelogin.zendesk.com" target="_blank">support@simplelogin.zendesk.com</a> for more info.
|
||||
@ -677,9 +647,7 @@
|
||||
aria-labelledby="pricing-faq-question-refund"
|
||||
data-parent="#pricing-faq">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
No we don't have a refund policy because SimpleLogin has a trial period where you can try all premium features.
|
||||
</p>
|
||||
<p>No we don't have a refund policy because SimpleLogin has a trial period where you can try all premium features.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -34,7 +34,7 @@
|
||||
{% endif %}
|
||||
{% for referral in referrals %}
|
||||
|
||||
<div class="card p-4 shadow-sm {% if referral.id == highlight_id %} highlight-row{% endif %}">
|
||||
<div class="card p-4 shadow-sm {% if referral.id == highlight_id %}highlight-row{% endif %}">
|
||||
<form method="post">
|
||||
<input type="hidden" name="form-name" value="update">
|
||||
<input type="hidden" name="referral-id" value="{{ referral.id }}">
|
||||
@ -102,9 +102,7 @@
|
||||
title="Click to copy"
|
||||
class="clipboard"
|
||||
data-clipboard-text="{{ '?slref=' + referral.code }}"
|
||||
style="overflow-wrap: break-word">
|
||||
?slref={{ referral.code }}
|
||||
</em>
|
||||
style="overflow-wrap: break-word">?slref={{ referral.code }}</em>
|
||||
to any link on SimpleLogin website.
|
||||
</div>
|
||||
<div>
|
||||
|
@ -48,7 +48,7 @@
|
||||
{% set refused_email = email_log.refused_email %}
|
||||
{% set contact = email_log.contact %}
|
||||
{% set alias = contact.alias %}
|
||||
<div class="card p-4 shadow-sm {% if email_log.id == highlight_id %} highlight-row{% endif %}">
|
||||
<div class="card p-4 shadow-sm {% if email_log.id == highlight_id %}highlight-row{% endif %}">
|
||||
<div class="small-text">
|
||||
Sent {{ refused_email.created_at | dt }}
|
||||
{% if email_log.bounced %}
|
||||
@ -70,9 +70,7 @@
|
||||
To: {{ alias.email }}
|
||||
<a href='{{ url_for("dashboard.index", highlight_alias_id=alias.id) }}'
|
||||
class="text-danger small-text"
|
||||
style="text-decoration: underline">
|
||||
Disable Alias
|
||||
</a>
|
||||
style="text-decoration: underline">Disable Alias</a>
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if refused_email.deleted %}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -23,16 +23,14 @@
|
||||
|
||||
<div class="alert alert-danger" role="alert">
|
||||
This feature is only available on Premium plan.
|
||||
<a href="{{ url_for('dashboard.pricing') }}"
|
||||
<a href="{{ url_for("dashboard.pricing") }}"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
Upgrade<i class="fe fe-external-link"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="alert alert-primary collapse {% if not subdomains %} show{% endif %}"
|
||||
id="howtouse"
|
||||
role="alert">
|
||||
<div class="alert alert-primary collapse {% if not subdomains %}show{% endif %}" id="howtouse" role="alert">
|
||||
You can use subdomain to quickly create email aliases without opening SimpleLogin app.
|
||||
<br />
|
||||
Handy when you need to quickly give out an email address, for example on a phone call, in a meeting or just
|
||||
@ -65,8 +63,7 @@
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div class="row {% if current_user.subdomain_quota <= 0 %} disabled-content{% endif %}"
|
||||
id="new-subdomain">
|
||||
<div class="row {% if current_user.subdomain_quota <= 0 %}disabled-content{% endif %}" id="new-subdomain">
|
||||
<div class="col">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
@ -88,12 +85,7 @@
|
||||
<div class="form-group">
|
||||
<label>Root domain</label>
|
||||
<select name="domain" v-model="domain" class="form-control">
|
||||
{% for sl_domain in sl_domains %}
|
||||
|
||||
<option value="{{ sl_domain.domain }}">
|
||||
{{ sl_domain.domain }}
|
||||
</option>
|
||||
{% endfor %}
|
||||
{% for sl_domain in sl_domains %}<option value="{{ sl_domain.domain }}">{{ sl_domain.domain }}</option>{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<button class="btn btn-primary">Create</button>
|
||||
|
@ -1,6 +1,6 @@
|
||||
{% extends "default.html" %}
|
||||
|
||||
{% set active_page = 'dashboard' %}
|
||||
{% set active_page = "dashboard" %}
|
||||
{% block title %}Support{% endblock %}
|
||||
{% block default_content %}
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
<div class="card-title mb-3">Report a problem</div>
|
||||
<div class="alert alert-info">
|
||||
If an email cannot be delivered to your mailbox, please check
|
||||
<a href="{{ url_for('dashboard.notifications_route') }}">
|
||||
<a href="{{ url_for("dashboard.notifications_route") }}">
|
||||
your
|
||||
notifications
|
||||
</a>
|
||||
@ -28,7 +28,12 @@
|
||||
<form id="supportZendeskForm" method="post" enctype="multipart/form-data">
|
||||
<div class="mt-4 mb-5">
|
||||
<label for="issueDescription" class="form-label font-weight-bold">What happened?</label>
|
||||
<textarea class="form-control" required name="ticket_content" id="issueDescription" rows="3" placeholder="Please provide as much information as possible. For example which alias(es), mailbox(es) are affected, if this is a persistent issue...">{{- ticket_content or '' -}}</textarea>
|
||||
<textarea class="form-control"
|
||||
required
|
||||
name="ticket_content"
|
||||
id="issueDescription"
|
||||
rows="3"
|
||||
placeholder="Please provide as much information as possible. For example which alias(es), mailbox(es) are affected, if this is a persistent issue...">{{- ticket_content or '' -}}</textarea>
|
||||
</div>
|
||||
<div class="mt-5 font-weight-bold">Attach files to support request</div>
|
||||
<div class="text-muted">Only images, text and emails are accepted</div>
|
||||
@ -57,9 +62,7 @@
|
||||
<button class="btn btn-outline-primary"
|
||||
type="button"
|
||||
@click="generateRandomAlias"
|
||||
id="button-addon2">
|
||||
Generate a random alias
|
||||
</button>
|
||||
id="button-addon2">Generate a random alias</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
|
Reference in New Issue
Block a user