Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Double @ Sign In Sent Email Causing Rate Limiting #3252

Open
lukedaviskzn opened this issue May 9, 2024 · 6 comments · May be fixed by #3254
Open

Double @ Sign In Sent Email Causing Rate Limiting #3252

lukedaviskzn opened this issue May 9, 2024 · 6 comments · May be fixed by #3254
Labels
type/bug Bug. Not working as intended

Comments

@lukedaviskzn
Copy link

lukedaviskzn commented May 9, 2024

Environment & Version

Docker Compose version v2.26.1

Mailu version 2.0

Description

If a user attempts to send an email to an invalid email address containing two @ signs, for example to "john@[email protected]", podop raises an exception and fails to lookup the domain part of the email. Postfix treats this as a temporary error, and advises the mail client to try again later. This repeats until the client is rate limited.

Note that '@' signs are allowed in the local part of an email address as long as they are within quotes. (Which is not the case here, but still.) https://en.wikipedia.org/wiki/Email_address#Local-part

Replication Steps

Send an to email address with two '@' signs.

Observed behaviour

Client rate limited.

Expected behaviour

Fail gracefully.

Logs

smtp-1  | ERROR:root:Error when processing request
smtp-1  | Traceback (most recent call last):
smtp-1  |   File "/app/venv/lib/python3.11/site-packages/podop/postfix.py", line 104, in process_request
smtp-1  |     result = await table.get(key)
smtp-1  |              ^^^^^^^^^^^^^^^^^^^^
smtp-1  |   File "/app/venv/lib/python3.11/site-packages/podop/table.py", line 35, in get
smtp-1  |     raise Exception(request.status)
smtp-1  | Exception: 500
smtp-1  | May 09 09:36:59 mail postfix/cleanup[123452]: warning: socketmap:unix:/tmp/podop.socket:recipientmap socketmap server temporary error: unknown error
smtp-1  | May 09 09:36:59 mail postfix/cleanup[123452]: warning: socketmap:unix:/tmp/podop.socket:recipientmap lookup error for ""john@1234"@gmail.com"
smtp-1  | May 09 09:36:59 mail postfix/cleanup[123452]: warning: 5E63228215BF: recipient_canonical_maps map lookup problem for "john@1234"@gmail.com -- message not accepted, try again later
smtp-1  | ERROR:root:Error when processing request
smtp-1  | Traceback (most recent call last):
smtp-1  |   File "/app/venv/lib/python3.11/site-packages/podop/postfix.py", line 104, in process_request
smtp-1  |     result = await table.get(key)
smtp-1  |              ^^^^^^^^^^^^^^^^^^^^
smtp-1  |   File "/app/venv/lib/python3.11/site-packages/podop/table.py", line 35, in get
smtp-1  |     raise Exception(request.status)
smtp-1  | Exception: 500
smtp-1  | May 09 09:36:59 mail postfix/cleanup[123452]: warning: socketmap:unix:/tmp/podop.socket:alias socketmap server temporary error: unknown error
smtp-1  | May 09 09:36:59 mail postfix/cleanup[123452]: warning: socketmap:unix:/tmp/podop.socket:alias lookup error for ""john@1234"@gmail.com"
smtp-1  | May 09 09:36:59 mail postfix/cleanup[123452]: warning: 5E63228215BF: virtual_alias_maps map lookup problem for john@[email protected] -- message not accepted, try again later
admin-1  | [2024-05-09 09:36:59,581] ERROR in app: Exception on /internal/postfix/recipient/map/"karld@1234"@gmail.com [GET]
admin-1  | Traceback (most recent call last):
admin-1  |   File "/app/venv/lib/python3.11/site-packages/srslib.py", line 295, in _split_addr
admin-1  |     local_part, host = addr.split('@')
admin-1  |     ^^^^^^^^^^^^^^^^
admin-1  | ValueError: too many values to unpack (expected 2)
admin-1  | 
admin-1  | During handling of the above exception, another exception occurred:
admin-1  | 
admin-1  | Traceback (most recent call last):
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 2529, in wsgi_app
admin-1  |     response = self.full_dispatch_request()
admin-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1825, in full_dispatch_request
admin-1  |     rv = self.handle_user_exception(e)
admin-1  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1823, in full_dispatch_request
admin-1  |     rv = self.dispatch_request()
admin-1  |          ^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1799, in dispatch_request
admin-1  |     return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/internal/views/postfix.py", line 114, in postfix_recipient_map
admin-1  |     if srslib.SRS.is_srs_address(recipient):
admin-1  |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/srslib.py", line 239, in is_srs_address
admin-1  |     local_part, host = cls._split_addr(addr)
admin-1  |                        ^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/srslib.py", line 297, in _split_addr
admin-1  |     raise InvalidAddressError('Invalid from_addr address: "%s"' % addr)
admin-1  | srslib.InvalidAddressError: Invalid from_addr address: ""john@1234"@gmail.com"
admin-1  | [2024-05-09 09:36:59,590] ERROR in app: Exception on /internal/postfix/alias/"john@1234"@gmail.com [GET]
admin-1  | Traceback (most recent call last):
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1800, in _execute_context
admin-1  |     context = constructor(
admin-1  |               ^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1077, in _init_compiled
admin-1  |     param = [
admin-1  |             ^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1078, in <listcomp>
admin-1  |     processors[key](compiled_params[key])
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py", line 1660, in process
admin-1  |     return process_param(value, dialect)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/models.py", line 66, in process_bind_param
admin-1  |     raise ValueError('email local part must not contain "@"')
admin-1  | ValueError: email local part must not contain "@"
admin-1  | 
admin-1  | The above exception was the direct cause of the following exception:
admin-1  | 
admin-1  | Traceback (most recent call last):
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 2529, in wsgi_app
admin-1  |     response = self.full_dispatch_request()
admin-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1825, in full_dispatch_request
admin-1  |     rv = self.handle_user_exception(e)
admin-1  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1823, in full_dispatch_request
admin-1  |     rv = self.dispatch_request()
admin-1  |          ^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1799, in dispatch_request
admin-1  |     return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/internal/views/postfix.py", line 36, in postfix_alias_map
admin-1  |     if destinations := models.Email.resolve_destination(localpart, domain_name):
admin-1  |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/models.py", line 459, in resolve_destination
admin-1  |     user = User.query.get(f'{localpart}@{domain_name}')
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "<string>", line 2, in get
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/util/deprecations.py", line 402, in warned
admin-1  |     return fn(*args, **kwargs)
admin-1  |            ^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 947, in get
admin-1  |     return self._get_impl(ident, loading.load_on_pk_identity)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 951, in _get_impl
admin-1  |     return self.session._get_impl(
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2955, in _get_impl
admin-1  |     return db_load_fn(
admin-1  |            ^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/loading.py", line 530, in load_on_pk_identity
admin-1  |     session.execute(
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 1714, in execute
admin-1  |     result = conn._execute_20(statement, params or {}, execution_options)
admin-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1705, in _execute_20
admin-1  |     return meth(self, args_10style, kwargs_10style, execution_options)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/sql/elements.py", line 333, in _execute_on_connection
admin-1  |     return connection._execute_clauseelement(
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1572, in _execute_clauseelement
admin-1  |     ret = self._execute_context(
admin-1  |           ^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1806, in _execute_context
admin-1  |     self._handle_dbapi_exception(
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2124, in _handle_dbapi_exception
admin-1  |     util.raise_(
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/util/compat.py", line 208, in raise_
admin-1  |     raise exception
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1800, in _execute_context
admin-1  |     context = constructor(
admin-1  |               ^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1077, in _init_compiled
admin-1  |     param = [
admin-1  |             ^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1078, in <listcomp>
admin-1  |     processors[key](compiled_params[key])
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py", line 1660, in process
admin-1  |     return process_param(value, dialect)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/models.py", line 66, in process_bind_param
admin-1  |     raise ValueError('email local part must not contain "@"')
admin-1  | sqlalchemy.exc.StatementError: (builtins.ValueError) email local part must not contain "@"
admin-1  | [SQL: SELECT user.email AS user_email, user.created_at AS user_created_at, user.updated_at AS user_updated_at, user.comment AS user_comment, user.localpart AS user_localpart, user.password AS user_password, user.quota_bytes AS user_quota_bytes, user.quota_bytes_used AS user_quota_bytes_used, user.global_admin AS user_global_admin, user.enabled AS user_enabled, user.enable_imap AS user_enable_imap, user.enable_pop AS user_enable_pop, user.allow_spoofing AS user_allow_spoofing, user.forward_enabled AS user_forward_enabled, user.forward_destination AS user_forward_destination, user.forward_keep AS user_forward_keep, user.reply_enabled AS user_reply_enabled, user.reply_subject AS user_reply_subject, user.reply_body AS user_reply_body, user.reply_startdate AS user_reply_startdate, user.reply_enddate AS user_reply_enddate, user.displayed_name AS user_displayed_name, user.spam_enabled AS user_spam_enabled, user.spam_mark_as_read AS user_spam_mark_as_read, user.spam_threshold AS user_spam_threshold, user.domain_name AS user_domain_name 
admin-1  | FROM user 
admin-1  | WHERE user.email = ?]
admin-1  | [parameters: [{'pk_1': '"john@1234"@gmail.com'}]]
@nextgens
Copy link
Contributor

Can you paste the logs of the admin container too please?

I suspect that the bug is in core/admin/mailu/internal/views/postfix.py

@nextgens nextgens added the type/bug Bug. Not working as intended label May 10, 2024
nextgens added a commit to nextgens/Mailu that referenced this issue May 10, 2024
@nextgens nextgens linked a pull request May 10, 2024 that will close this issue
2 tasks
@lukedaviskzn
Copy link
Author

Hi @nextgens, I have added the admin logs as requested.

@nextgens
Copy link
Contributor

Right, thank you.

Please see if what's on #3254 fixes it

@nextgens
Copy link
Contributor

I've also sent a PR upstream so that we can drop our workarounds jichu4n/srslib#3

@lukedaviskzn
Copy link
Author

No luck, I'm afraid. This time it looks like the alias map rather than the recipient map.

smtp-1  | May 10 12:33:02 mail postfix/smtpd[502]: discarding EHLO keywords: PIPELINING
smtp-1  | May 10 12:33:02 mail postfix/smtpd[502]: discarding EHLO keywords: PIPELINING
smtp-1  | May 10 12:33:02 mail postfix/smtpd[502]: 8E21D2C05DE2: client=unknown[...], sasl_method=XCLIENT, [email protected]
smtp-1  | ERROR:root:Error when processing request
smtp-1  | Traceback (most recent call last):
smtp-1  |   File "/app/venv/lib/python3.11/site-packages/podop/postfix.py", line 104, in process_request
smtp-1  |     result = await table.get(key)
smtp-1  |              ^^^^^^^^^^^^^^^^^^^^
smtp-1  |   File "/app/venv/lib/python3.11/site-packages/podop/table.py", line 35, in get
smtp-1  | May 10 12:33:02 mail postfix/cleanup[503]: warning: socketmap:unix:/tmp/podop.socket:alias socketmap server temporary error: unknown error
smtp-1  | May 10 12:33:02 mail postfix/cleanup[503]: warning: socketmap:unix:/tmp/podop.socket:alias lookup error for ""postmaster@1234"@example.com"
smtp-1  |     raise Exception(request.status)
smtp-1  | May 10 12:33:02 mail postfix/cleanup[503]: warning: 8E21D2C05DE2: virtual_alias_maps map lookup problem for postmaster@[email protected] -- message not accepted, try again later
smtp-1  | Exception: 500
smtp-1  | May 10 12:33:02 mail postfix/cleanup[503]: AA2C42820105: message-id=<[email protected]>
smtp-1  | May 10 12:33:02 mail postfix/qmgr[376]: AA2C42820105: from=<[email protected]>, size=1157, nrcpt=1 (queue active)
smtp-1  | May 10 12:33:02 mail postfix/smtpd[502]: disconnect from unknown[...] ehlo=2 xclient=0/1 mail=1 rcpt=1 data=0/1 commands=4/6
smtp-1  | May 10 12:33:02 mail postfix/lmtp[479]: AA2C42820105: to=<[email protected]>, orig_to=<postmaster>, relay=imap[...]:2525, delay=0.07, delays=0.02/0.01/0.01/0.03, dsn=2.0.0, status=sent (250 2.0.0 <[email protected]> AcbIK973PWbJAAAAwQb+xA Saved)
smtp-1  | May 10 12:33:02 mail postfix/qmgr[376]: AA2C42820105: removed
admin-1  | Traceback (most recent call last):
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1800, in _execute_context
admin-1  |     context = constructor(
admin-1  |               ^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1077, in _init_compiled
admin-1  |     param = [
admin-1  |             ^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1078, in <listcomp>
admin-1  |     processors[key](compiled_params[key])
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py", line 1660, in process
admin-1  |     return process_param(value, dialect)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/models.py", line 66, in process_bind_param
admin-1  |     raise ValueError('email local part must not contain "@"')
admin-1  | ValueError: email local part must not contain "@"
admin-1  | 
admin-1  | The above exception was the direct cause of the following exception:
admin-1  | 
admin-1  | Traceback (most recent call last):
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 2529, in wsgi_app
admin-1  |     response = self.full_dispatch_request()
admin-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1825, in full_dispatch_request
admin-1  |     rv = self.handle_user_exception(e)
admin-1  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1823, in full_dispatch_request
admin-1  |     rv = self.dispatch_request()
admin-1  |          ^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/flask/app.py", line 1799, in dispatch_request
admin-1  |     return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/internal/views/postfix.py", line 36, in postfix_alias_map
admin-1  |     if destinations := models.Email.resolve_destination(localpart, domain_name):
admin-1  |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/models.py", line 459, in resolve_destination
admin-1  |     user = User.query.get(f'{localpart}@{domain_name}')
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "<string>", line 2, in get
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/util/deprecations.py", line 402, in warned
admin-1  |     return fn(*args, **kwargs)
admin-1  |            ^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 947, in get
admin-1  |     return self._get_impl(ident, loading.load_on_pk_identity)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/query.py", line 951, in _get_impl
admin-1  |     return self.session._get_impl(
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 2955, in _get_impl
admin-1  |     return db_load_fn(
admin-1  |            ^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/loading.py", line 530, in load_on_pk_identity
admin-1  |     session.execute(
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/orm/session.py", line 1714, in execute
admin-1  |     result = conn._execute_20(statement, params or {}, execution_options)
admin-1  |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1705, in _execute_20
admin-1  |     return meth(self, args_10style, kwargs_10style, execution_options)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/sql/elements.py", line 333, in _execute_on_connection
admin-1  |     return connection._execute_clauseelement(
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1572, in _execute_clauseelement
admin-1  |     ret = self._execute_context(
admin-1  |           ^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1806, in _execute_context
admin-1  |     self._handle_dbapi_exception(
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 2124, in _handle_dbapi_exception
admin-1  |     util.raise_(
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/util/compat.py", line 208, in raise_
admin-1  |     raise exception
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/base.py", line 1800, in _execute_context
admin-1  |     context = constructor(
admin-1  |               ^^^^^^^^^^^^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1077, in _init_compiled
admin-1  |     param = [
admin-1  |             ^
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/engine/default.py", line 1078, in <listcomp>
admin-1  |     processors[key](compiled_params[key])
admin-1  |   File "/app/venv/lib/python3.11/site-packages/sqlalchemy/sql/type_api.py", line 1660, in process
admin-1  |     return process_param(value, dialect)
admin-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
admin-1  |   File "/app/mailu/models.py", line 66, in process_bind_param
admin-1  |     raise ValueError('email local part must not contain "@"')
admin-1  | sqlalchemy.exc.StatementError: (builtins.ValueError) email local part must not contain "@"
admin-1  | [SQL: SELECT user.email AS user_email, user.created_at AS user_created_at, user.updated_at AS user_updated_at, user.comment AS user_comment, user.localpart AS user_localpart, user.password AS user_password, user.quota_bytes AS user_quota_bytes, user.quota_bytes_used AS user_quota_bytes_used, user.global_admin AS user_global_admin, user.enabled AS user_enabled, user.enable_imap AS user_enable_imap, user.enable_pop AS user_enable_pop, user.allow_spoofing AS user_allow_spoofing, user.forward_enabled AS user_forward_enabled, user.forward_destination AS user_forward_destination, user.forward_keep AS user_forward_keep, user.reply_enabled AS user_reply_enabled, user.reply_subject AS user_reply_subject, user.reply_body AS user_reply_body, user.reply_startdate AS user_reply_startdate, user.reply_enddate AS user_reply_enddate, user.displayed_name AS user_displayed_name, user.spam_enabled AS user_spam_enabled, user.spam_mark_as_read AS user_spam_mark_as_read, user.spam_threshold AS user_spam_threshold, user.domain_name AS user_domain_name 
admin-1  | FROM user 
admin-1  | WHERE user.email = ?]
admin-1  | [parameters: [{'pk_1': '"postmaster@1234"@example.com'}]]

@nextgens
Copy link
Contributor

Right, that's something else... we really should have tests for this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type/bug Bug. Not working as intended
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants