canaille-globuzma/tests/test_account.py

210 lines
6.5 KiB
Python
Raw Normal View History

2020-10-22 15:37:01 +00:00
import mock
from canaille.flaskutils import current_user
2020-10-22 15:37:01 +00:00
from canaille.account import profile_hash
from canaille.models import User
2020-10-22 15:37:01 +00:00
def test_login_and_out(testclient, slapd_connection, user):
2020-08-20 08:31:36 +00:00
with testclient.session_transaction() as session:
assert not session.get("user_dn")
2020-08-20 08:31:36 +00:00
2020-10-30 18:19:34 +00:00
res = testclient.get("/login", status=200)
2020-08-20 08:31:36 +00:00
res.form["login"] = "John Doe"
res.form["password"] = "correct horse battery staple"
res = res.form.submit()
2020-10-30 22:41:02 +00:00
res = res.follow(status=302)
res = res.follow(status=200)
2020-08-20 08:31:36 +00:00
with testclient.session_transaction() as session:
assert [user.dn] == session.get("user_dn")
2020-08-20 08:31:36 +00:00
res = testclient.get("/logout")
2020-10-30 22:41:02 +00:00
res = res.follow(status=302)
res = res.follow(status=200)
2020-08-20 08:31:36 +00:00
with testclient.session_transaction() as session:
assert not session.get("user_dn")
2020-08-20 08:31:36 +00:00
2020-10-22 15:37:01 +00:00
def test_login_wrong_password(testclient, slapd_connection, user):
2020-08-20 08:31:36 +00:00
with testclient.session_transaction() as session:
assert not session.get("user_dn")
2020-08-20 08:31:36 +00:00
2020-10-30 18:19:34 +00:00
res = testclient.get("/login", status=200)
2020-08-20 08:31:36 +00:00
res.form["login"] = "John Doe"
res.form["password"] = "incorrect horse"
2020-10-30 22:41:02 +00:00
res = res.form.submit(status=200)
2020-10-30 22:52:05 +00:00
assert "Login failed, please check your information" in res.text
2020-08-20 08:31:36 +00:00
2020-10-22 15:37:01 +00:00
def test_login_no_password(testclient, slapd_connection, user):
2020-08-20 08:31:36 +00:00
with testclient.session_transaction() as session:
assert not session.get("user_dn")
2020-08-20 08:31:36 +00:00
2020-10-30 18:19:34 +00:00
res = testclient.get("/login", status=200)
2020-08-20 08:31:36 +00:00
res.form["login"] = "John Doe"
res.form["password"] = ""
2020-10-30 22:41:02 +00:00
res = res.form.submit(status=200)
2020-10-30 22:52:05 +00:00
assert "Login failed, please check your information" in res.text
2020-08-20 08:45:33 +00:00
2020-10-22 15:37:01 +00:00
def test_login_with_alternate_attribute(testclient, slapd_connection, user):
2020-10-30 18:19:34 +00:00
res = testclient.get("/login", status=200)
2020-08-20 08:45:33 +00:00
res.form["login"] = "user"
res.form["password"] = "correct horse battery staple"
res = res.form.submit()
2020-10-30 22:41:02 +00:00
res = res.follow(status=302)
res = res.follow(status=200)
2020-08-20 08:45:33 +00:00
with testclient.session_transaction() as session:
assert [user.dn] == session.get("user_dn")
2020-10-22 15:37:01 +00:00
def test_user_without_password_first_login(testclient, slapd_connection):
User.ocs_by_name(slapd_connection)
u = User(
objectClass=["inetOrgPerson"],
cn="Temp User",
sn="Temp",
uid="temp",
mail="john@doe.com",
)
u.save(slapd_connection)
res = testclient.get("/login", status=200)
res.form["login"] = "Temp User"
res.form["password"] = "anything"
res = res.form.submit(status=302).follow(status=200)
assert "First login" in res
u.delete(conn=slapd_connection)
2020-10-22 15:37:01 +00:00
@mock.patch("smtplib.SMTP")
def test_password_forgotten(SMTP, testclient, slapd_connection, user):
2020-10-30 18:19:34 +00:00
res = testclient.get("/reset", status=200)
2020-10-22 15:37:01 +00:00
res.form["login"] = "user"
2020-10-30 22:41:02 +00:00
res = res.form.submit(status=200)
2020-10-22 15:37:01 +00:00
assert "A password reset link has been sent at your email address." in res.text
SMTP.assert_called_once_with(host="localhost", port=25)
@mock.patch("smtplib.SMTP")
def test_password_forgotten_invalid_form(SMTP, testclient, slapd_connection, user):
2020-10-30 18:19:34 +00:00
res = testclient.get("/reset", status=200)
2020-10-22 15:37:01 +00:00
res.form["login"] = ""
2020-10-30 22:41:02 +00:00
res = res.form.submit(status=200)
2020-10-22 15:37:01 +00:00
assert "Could not send the password reset link." in res.text
SMTP.assert_not_called()
@mock.patch("smtplib.SMTP")
def test_password_forgotten_invalid(SMTP, testclient, slapd_connection, user):
2020-10-30 18:19:34 +00:00
res = testclient.get("/reset", status=200)
2020-10-22 15:37:01 +00:00
res.form["login"] = "i-dont-really-exist"
2020-10-30 22:41:02 +00:00
res = res.form.submit(status=200)
2020-10-22 15:37:01 +00:00
assert "A password reset link has been sent at your email address." in res.text
SMTP.assert_not_called()
def test_password_reset(testclient, slapd_connection, user):
user.attr_type_by_name(conn=slapd_connection)
user.reload(conn=slapd_connection)
with testclient.app.app_context():
hash = profile_hash("user", user.userPassword[0])
2020-10-30 18:19:34 +00:00
res = testclient.get("/reset/user/" + hash, status=200)
2020-10-22 15:37:01 +00:00
res.form["password"] = "foobarbaz"
res.form["confirmation"] = "foobarbaz"
2020-10-30 22:41:02 +00:00
res = res.form.submit(status=302)
2020-10-22 15:37:01 +00:00
2020-10-30 22:41:02 +00:00
res = res.follow(status=200)
2020-10-22 15:37:01 +00:00
with testclient.app.app_context():
assert user.check_password("foobarbaz")
assert "Your password has been updated successfuly" in res.text
user.set_password("correct horse battery staple", conn=slapd_connection)
res = testclient.get("/reset/user/" + hash)
res = res.follow()
res = res.follow()
assert "The password reset link that brought you here was invalid." in res.text
def test_password_reset_bad_link(testclient, slapd_connection, user):
user.attr_type_by_name(conn=slapd_connection)
user.reload(conn=slapd_connection)
res = testclient.get("/reset/user/foobarbaz")
res = res.follow()
res = res.follow()
assert "The password reset link that brought you here was invalid." in res.text
def test_password_reset_bad_password(testclient, slapd_connection, user):
user.attr_type_by_name(conn=slapd_connection)
user.reload(conn=slapd_connection)
with testclient.app.app_context():
hash = profile_hash("user", user.userPassword[0])
2020-10-30 18:19:34 +00:00
res = testclient.get("/reset/user/" + hash, status=200)
2020-10-22 15:37:01 +00:00
res.form["password"] = "foobarbaz"
res.form["confirmation"] = "typo"
2020-10-30 22:41:02 +00:00
res = res.form.submit(status=200)
2020-10-22 15:37:01 +00:00
with testclient.app.app_context():
assert user.check_password("correct horse battery staple")
def test_user_deleted_in_session(testclient, slapd_connection):
User.ocs_by_name(slapd_connection)
u = User(
objectClass=["inetOrgPerson"],
cn="Jake Doe",
sn="Jake",
uid="jake",
mail="jake@doe.com",
userPassword="{SSHA}fw9DYeF/gHTHuVMepsQzVYAkffGcU8Fz",
)
u.save(slapd_connection)
testclient.get("/profile/jake", status=403)
with testclient.session_transaction() as session:
session["user_dn"] = [u.dn]
testclient.get("/profile/jake", status=200)
u.delete(conn=slapd_connection)
testclient.get("/profile/jake", status=403)
with testclient.session_transaction() as session:
assert not session.get("user_dn")
def test_impersonate(testclient, slapd_connection, logged_admin, user):
res = testclient.get("/", status=302).follow(status=200)
assert "admin" == res.form["uid"].value
res = (
testclient.get("/impersonate/user", status=302)
.follow(status=302)
.follow(status=200)
)
assert "user" == res.form["uid"].value
testclient.get("/logout", status=302).follow(status=302).follow(status=200)
res = testclient.get("/", status=302).follow(status=200)
assert "admin" == res.form["uid"].value