mirror of
https://github.com/chatmail/relay.git
synced 2026-05-17 03:48:58 +00:00
57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
import pytest
|
|
import smtplib
|
|
|
|
|
|
def test_login_basic_functioning(imap_or_smtp, gencreds, lp):
|
|
"""Test a) that an initial login creates a user automatically
|
|
and b) verify we can also login a second time with the same password
|
|
and c) that using a different password fails the login."""
|
|
user, password = gencreds()
|
|
lp.sec(f"login first time with {user} {password}")
|
|
imap_or_smtp.connect()
|
|
imap_or_smtp.login(user, password)
|
|
lp.indent("success")
|
|
|
|
lp.sec(f"reconnect and login second time {user} {password}")
|
|
imap_or_smtp.connect()
|
|
imap_or_smtp.login(user, password)
|
|
imap_or_smtp.connect()
|
|
lp.sec("success")
|
|
|
|
lp.sec(f"reconnect and verify wrong password fails {user} ")
|
|
imap_or_smtp.connect()
|
|
with pytest.raises(imap_or_smtp.AuthError):
|
|
imap_or_smtp.login(user, password + "wrong")
|
|
|
|
|
|
def test_login_same_password(imap_or_smtp, gencreds):
|
|
"""Test two different users logging in with the same password
|
|
to ensure that authentication process does not confuse the users
|
|
by using only the password hash as a key.
|
|
"""
|
|
user1, password1 = gencreds()
|
|
user2, _ = gencreds()
|
|
imap_or_smtp.connect()
|
|
imap_or_smtp.login(user1, password1)
|
|
imap_or_smtp.connect()
|
|
imap_or_smtp.login(user2, password1)
|
|
|
|
|
|
@pytest.mark.slow
|
|
def test_exceed_rate_limit(cmsetup, gencreds, mailgen):
|
|
"""Test that the per-account send-mail limit is exceeded."""
|
|
user1, user2 = cmsetup.gen_users(2)
|
|
mail = mailgen.get_encrypted(user1.addr, user2.addr)
|
|
for i in range(100):
|
|
print("Sending mail", str(i))
|
|
try:
|
|
user1.smtp.sendmail(user1.addr, [user2.addr], mail)
|
|
except smtplib.SMTPException as e:
|
|
if i < 80:
|
|
pytest.fail(f"rate limit was exceeded too early with msg {i}")
|
|
outcome = e.recipients[user2.addr]
|
|
assert outcome[0] == 450
|
|
assert b'4.7.1: Too much mail from' in outcome[1]
|
|
return
|
|
pytest.fail("Rate limit was not exceeded")
|