mirror of
https://github.com/simple-login/app.git
synced 2024-11-10 21:27:10 +01:00
Limit email search to only 10 aliases to avoid timing out (#2183)
This commit is contained in:
parent
80d1369bf9
commit
a8988cb8f6
@ -753,12 +753,37 @@ class EmailSearchAdmin(BaseView):
|
|||||||
if not alias and not user and not mailbox:
|
if not alias and not user and not mailbox:
|
||||||
no_match = True
|
no_match = True
|
||||||
|
|
||||||
|
def user_mailboxes(user_id: int) -> list[Mailbox]:
|
||||||
|
return (
|
||||||
|
Mailbox.filter_by(user_id=user_id)
|
||||||
|
.order_by(Mailbox.id.asc())
|
||||||
|
.limit(10)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
|
def user_mailboxes_count(user_id: int) -> int:
|
||||||
|
return Mailbox.filter_by(user_id=user_id).order_by(Mailbox.id.asc()).count()
|
||||||
|
|
||||||
|
def user_aliases(user_id: int) -> list[Alias]:
|
||||||
|
return (
|
||||||
|
Alias.filter_by(user_id=user_id)
|
||||||
|
.order_by(Alias.id.asc())
|
||||||
|
.limit(10)
|
||||||
|
.all()
|
||||||
|
)
|
||||||
|
|
||||||
|
def user_aliases_count(user_id: int) -> int:
|
||||||
|
return Alias.filter_by(user_id=user_id).count()
|
||||||
|
|
||||||
return self.render(
|
return self.render(
|
||||||
"admin/alias_search.html",
|
"admin/email_search.html",
|
||||||
email=email,
|
email=email,
|
||||||
no_match=no_match,
|
no_match=no_match,
|
||||||
alias=alias,
|
alias=alias,
|
||||||
mailbox=mailbox,
|
mailbox=mailbox,
|
||||||
user=user,
|
user=user,
|
||||||
user_aliases=lambda user_id: Alias.filter_by(user_id=user_id).all(),
|
user_aliases=user_aliases,
|
||||||
|
user_aliases_count=user_aliases_count,
|
||||||
|
user_mailboxes=user_mailboxes,
|
||||||
|
user_mailboxes_count=user_mailboxes_count,
|
||||||
)
|
)
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
export DB_URI=postgresql://myuser:mypassword@localhost:15432/simplelogin
|
export DB_URI=postgresql://myuser:mypassword@localhost:15432/simplelogin
|
||||||
echo 'drop schema public cascade; create schema public;' | psql $DB_URI
|
echo 'drop schema public cascade; create schema public;' | psql $DB_URI
|
||||||
|
|
||||||
rye run alembic upgrade head
|
poetry run alembic upgrade head
|
||||||
rye run flask dummy-data
|
poetry run flask dummy-data
|
||||||
|
@ -3,4 +3,4 @@
|
|||||||
export DB_URI=postgresql://myuser:mypassword@localhost:15432/test
|
export DB_URI=postgresql://myuser:mypassword@localhost:15432/test
|
||||||
echo 'drop schema public cascade; create schema public;' | psql $DB_URI
|
echo 'drop schema public cascade; create schema public;' | psql $DB_URI
|
||||||
|
|
||||||
rye run alembic upgrade head
|
poetry run alembic upgrade head
|
||||||
|
@ -1,300 +0,0 @@
|
|||||||
{% extends 'admin/master.html' %}
|
|
||||||
|
|
||||||
{% block body %}
|
|
||||||
|
|
||||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
|
||||||
<form method="post">
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="email">Email to search:</label>
|
|
||||||
<input type="text"
|
|
||||||
class="form-control"
|
|
||||||
name="email"
|
|
||||||
value="{{ email or '' }}"/>
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="btn btn-primary">Submit</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
{% if no_match %}
|
|
||||||
|
|
||||||
<div class="border border-dark border-2 mt-1 mb-2 p-3 alert alert-warning"
|
|
||||||
role="alert">
|
|
||||||
No user, alias or mailbox found for {{ email }}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if alias %}
|
|
||||||
|
|
||||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
|
||||||
<h3>Alias {{ alias.email }} found</h3>
|
|
||||||
<dl>
|
|
||||||
<dt>
|
|
||||||
Alias id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.email }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Created at
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.created_at }}
|
|
||||||
</dd>
|
|
||||||
<dt class="mb-2">
|
|
||||||
User
|
|
||||||
</dt>
|
|
||||||
<dd class="ml-4 border-secondary border p-2">
|
|
||||||
<dl>
|
|
||||||
<dt>
|
|
||||||
User id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.user.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.user.email }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Premium
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.user.is_premium() }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Disabled
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.user.disabled }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Crated At
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ alias.user.created_at }}
|
|
||||||
</dd>
|
|
||||||
<dt class="border-dark border-top-2 mb-2">
|
|
||||||
Mailboxes
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{% for mailbox in alias.mailboxes %}
|
|
||||||
|
|
||||||
<dl class="border border-grey border-2 ml-4 p-2">
|
|
||||||
<dt>
|
|
||||||
Mailbox id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.email }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Verified
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.verified }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Created At
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.created_at }}
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
{% endfor %}
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if user %}
|
|
||||||
|
|
||||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
|
||||||
<h3>User {{ user.email }} found</h3>
|
|
||||||
<dl>
|
|
||||||
<dt>
|
|
||||||
User id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ user.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ user.email }}
|
|
||||||
</dd>
|
|
||||||
{% if user.is_paid() %}
|
|
||||||
|
|
||||||
<dt>
|
|
||||||
Paid
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
Yes
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Subscription
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ user.get_active_subscription() }}
|
|
||||||
</dd>
|
|
||||||
{% else %}
|
|
||||||
<dt>
|
|
||||||
Paid
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
No
|
|
||||||
</dd>
|
|
||||||
{% endif %}
|
|
||||||
<dt>
|
|
||||||
Created at
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ user.created_at }}
|
|
||||||
</dd>
|
|
||||||
<dt class="mb-2">
|
|
||||||
Mailboxes
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{% for mailbox in user.mailboxes() %}
|
|
||||||
|
|
||||||
<dl class="border border-dark p-2 ml-4">
|
|
||||||
<dt>
|
|
||||||
Mailbox id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.email }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Verified
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.verified }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Created At
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.created_at }}
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
{% endfor %}
|
|
||||||
</dd>
|
|
||||||
<dt class="mb-2">
|
|
||||||
Aliases
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{% for mailbox in user_aliases(user.id) %}
|
|
||||||
|
|
||||||
<dl class="border border-dark p-2 ml-4">
|
|
||||||
<dt>
|
|
||||||
Mailbox id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.email }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Verified
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.verified }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Created At
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.created_at }}
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
{% endfor %}
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% if mailbox %}
|
|
||||||
|
|
||||||
<div class="border border-dark mt-1 mb-2 p-3">
|
|
||||||
<h3>Mailbox {{ mailbox.email }} found</h3>
|
|
||||||
<dl>
|
|
||||||
<dt>
|
|
||||||
Mailbox id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.email }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Created at
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.created_at }}
|
|
||||||
</dd>
|
|
||||||
<dt class="mb-2">
|
|
||||||
User
|
|
||||||
</dt>
|
|
||||||
<dd class="ml-4">
|
|
||||||
<dl class="border-dark border p-2">
|
|
||||||
<dt>
|
|
||||||
User id
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.user.id }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Email
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.user.email }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Premium
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.user.is_premium() }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Disabled
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.user.disabled }}
|
|
||||||
</dd>
|
|
||||||
<dt>
|
|
||||||
Crated At
|
|
||||||
</dt>
|
|
||||||
<dd>
|
|
||||||
{{ mailbox.user.created_at }}
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock %}
|
|
139
templates/admin/email_search.html
Normal file
139
templates/admin/email_search.html
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
{% extends 'admin/master.html' %}
|
||||||
|
|
||||||
|
{% macro show_user(user) -%}
|
||||||
|
<h4>User {{ user.email }} with ID {{ user.id }}.</h4>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">User ID</th>
|
||||||
|
<th scope="col">Email</th>
|
||||||
|
<th scope="col">Paid</th>
|
||||||
|
<th>Subscription</th>
|
||||||
|
<th>Created At</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{ user.id }}</td>
|
||||||
|
<td>{{ user.email }}</td>
|
||||||
|
<td>{{ "yes" if user.is_paid() else No }}</td>
|
||||||
|
<td>{{ user.get_active_subscription() }}</td>
|
||||||
|
<td>{{ user.created_at }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{%- endmacro %}
|
||||||
|
{% macro list_mailboxes(mbox_count, mboxes) %}
|
||||||
|
<h4>
|
||||||
|
{{ mbox_count }} Mailboxes found.
|
||||||
|
{% if mbox_count>10 %}Showing only the first 10.{% endif %}
|
||||||
|
</h4>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Mailbox ID</th>
|
||||||
|
<th>Email</th>
|
||||||
|
<th>Verified</th>
|
||||||
|
<th>Created At</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for mailbox in mboxes %}
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>{{ mailbox.id }}</td>
|
||||||
|
<td>{{ mailbox.email }}</td>
|
||||||
|
<td>{{ "Yes" if mailbox.verified else "No" }}</td>
|
||||||
|
<td>{{ mailbox.created_at }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endmacro %}
|
||||||
|
{% macro list_alias(alias_count, aliases) %}
|
||||||
|
<h4>
|
||||||
|
{{ alias_count }} Aliases found.
|
||||||
|
{% if alias_count>10 %}Showing only the first 10.{% endif %}
|
||||||
|
</h4>
|
||||||
|
<table class="table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Alias ID</th>
|
||||||
|
<th>Email</th>
|
||||||
|
<th>Verified</th>
|
||||||
|
<th>Created At</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for alias in aliases %}
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>{{ alias.id }}</td>
|
||||||
|
<td>{{ alias.email }}</td>
|
||||||
|
<td>{{ "Yes" if alias.verified else "No" }}</td>
|
||||||
|
<td>
|
||||||
|
{{ alias.created_at }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endmacro %}
|
||||||
|
{% block body %}
|
||||||
|
|
||||||
|
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||||
|
<form method="post">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">
|
||||||
|
Email to search:
|
||||||
|
</label>
|
||||||
|
<input type="text"
|
||||||
|
class="form-control"
|
||||||
|
name="email"
|
||||||
|
value="{{ email or '' }}"/>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary">
|
||||||
|
Submit
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% if no_match %}
|
||||||
|
|
||||||
|
<div class="border border-dark border-2 mt-1 mb-2 p-3 alert alert-warning"
|
||||||
|
role="alert">
|
||||||
|
No user, alias or mailbox found for {{ email }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if alias %}
|
||||||
|
|
||||||
|
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||||
|
<h3 class="mb-3">
|
||||||
|
Found Alias {{ alias.email }}
|
||||||
|
</h3>
|
||||||
|
{{ list_alias(1,[alias]) }}
|
||||||
|
{{ show_user(alias.user) }}
|
||||||
|
{{ list_mailboxes(user_mailboxes_count(alias.user.id), user_mailboxes(alias.user.id) ) }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if user %}
|
||||||
|
|
||||||
|
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||||
|
<h3 class="mb-3">
|
||||||
|
Found User {{ user.email }}
|
||||||
|
</h3>
|
||||||
|
{{ show_user(user) }}
|
||||||
|
{{ list_mailboxes(user_mailboxes_count(user.id), user_mailboxes(user.id) ) }}
|
||||||
|
{{ list_alias(user_aliases_count(user.id),user_aliases(user.id)) }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if mailbox %}
|
||||||
|
|
||||||
|
<div class="border border-dark mt-1 mb-2 p-3">
|
||||||
|
<h3 class="mb-3">
|
||||||
|
Found Mailbox {{ mailbox.email }}
|
||||||
|
</h3>
|
||||||
|
{{ list_mailboxes(1, [mailbox] ) }}
|
||||||
|
{{ show_user(mailbox.user) }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue
Block a user