2022-05-18 09:31:26 +00:00
|
|
|
from canaille.ldap_backend.ldapobject import LDAPObject
|
2021-12-20 22:57:27 +00:00
|
|
|
from canaille.models import User
|
2020-10-22 15:37:01 +00:00
|
|
|
|
|
|
|
|
2022-05-19 10:36:39 +00:00
|
|
|
def test_signin_and_out(testclient, user):
|
2020-08-20 08:31:36 +00:00
|
|
|
with testclient.session_transaction() as session:
|
2020-12-11 10:52:37 +00:00
|
|
|
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
|
|
|
|
2021-12-06 14:40:30 +00:00
|
|
|
res.form["login"] = "John (johnny) Doe"
|
2021-01-23 21:30:43 +00:00
|
|
|
res = res.form.submit(status=302)
|
|
|
|
res = res.follow(status=200)
|
|
|
|
|
|
|
|
with testclient.session_transaction() as session:
|
2021-12-06 14:40:30 +00:00
|
|
|
assert "John (johnny) Doe" == session.get("attempt_login")
|
2021-01-23 21:30:43 +00:00
|
|
|
|
2020-08-20 08:31:36 +00:00
|
|
|
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:
|
2020-12-11 10:52:37 +00:00
|
|
|
assert [user.dn] == session.get("user_dn")
|
2021-01-23 21:30:43 +00:00
|
|
|
assert "attempt_login" not in session
|
2020-08-20 08:31:36 +00:00
|
|
|
|
2021-12-06 22:17:08 +00:00
|
|
|
res = testclient.get("/login", status=302)
|
|
|
|
|
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:
|
2020-12-11 10:52:37 +00:00
|
|
|
assert not session.get("user_dn")
|
2020-08-20 08:31:36 +00:00
|
|
|
|
|
|
|
|
2022-05-19 10:36:39 +00:00
|
|
|
def test_signin_wrong_password(testclient, user):
|
2020-08-20 08:31:36 +00:00
|
|
|
with testclient.session_transaction() as session:
|
2020-12-11 10:52:37 +00:00
|
|
|
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
|
|
|
|
2021-12-06 14:40:30 +00:00
|
|
|
res.form["login"] = "John (johnny) Doe"
|
2021-01-23 21:30:43 +00:00
|
|
|
res = res.form.submit(status=302)
|
|
|
|
res = res.follow(status=200)
|
2020-08-20 08:31:36 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
2022-05-19 10:36:39 +00:00
|
|
|
def test_signin_with_alternate_attribute(testclient, 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"
|
2021-01-23 21:30:43 +00:00
|
|
|
res = res.form.submit(status=302)
|
|
|
|
res = res.follow(status=200)
|
|
|
|
|
2020-08-20 08:45:33 +00:00
|
|
|
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:
|
2020-12-11 10:52:37 +00:00
|
|
|
assert [user.dn] == session.get("user_dn")
|
2020-10-22 15:37:01 +00:00
|
|
|
|
|
|
|
|
2020-11-16 14:39:58 +00:00
|
|
|
def test_user_without_password_first_login(testclient, slapd_connection):
|
2021-12-08 14:01:35 +00:00
|
|
|
User.ldap_object_classes(slapd_connection)
|
2020-11-16 14:39:58 +00:00
|
|
|
u = User(
|
|
|
|
objectClass=["inetOrgPerson"],
|
|
|
|
cn="Temp User",
|
|
|
|
sn="Temp",
|
|
|
|
uid="temp",
|
|
|
|
mail="john@doe.com",
|
|
|
|
)
|
2022-05-08 14:31:17 +00:00
|
|
|
u.save()
|
2020-11-16 14:39:58 +00:00
|
|
|
|
|
|
|
res = testclient.get("/login", status=200)
|
|
|
|
res.form["login"] = "Temp User"
|
|
|
|
res = res.form.submit(status=302).follow(status=200)
|
|
|
|
|
|
|
|
assert "First login" in res
|
|
|
|
|
2022-05-08 14:31:17 +00:00
|
|
|
u.delete()
|
2022-05-18 09:31:26 +00:00
|
|
|
|
2020-11-16 14:39:58 +00:00
|
|
|
|
2020-11-25 16:41:03 +00:00
|
|
|
def test_user_deleted_in_session(testclient, slapd_connection):
|
2021-12-08 14:01:35 +00:00
|
|
|
User.ldap_object_classes(slapd_connection)
|
2020-11-25 16:41:03 +00:00
|
|
|
u = User(
|
|
|
|
objectClass=["inetOrgPerson"],
|
|
|
|
cn="Jake Doe",
|
|
|
|
sn="Jake",
|
|
|
|
uid="jake",
|
|
|
|
mail="jake@doe.com",
|
|
|
|
userPassword="{SSHA}fw9DYeF/gHTHuVMepsQzVYAkffGcU8Fz",
|
|
|
|
)
|
2022-05-08 14:31:17 +00:00
|
|
|
u.save()
|
2020-12-11 10:52:37 +00:00
|
|
|
testclient.get("/profile/jake", status=403)
|
|
|
|
|
|
|
|
with testclient.session_transaction() as session:
|
|
|
|
session["user_dn"] = [u.dn]
|
2020-11-25 16:41:03 +00:00
|
|
|
|
|
|
|
testclient.get("/profile/jake", status=200)
|
2022-05-08 14:31:17 +00:00
|
|
|
u.delete()
|
2020-11-25 16:41:03 +00:00
|
|
|
|
|
|
|
testclient.get("/profile/jake", status=403)
|
2020-12-11 10:52:37 +00:00
|
|
|
with testclient.session_transaction() as session:
|
|
|
|
assert not session.get("user_dn")
|
|
|
|
|
|
|
|
|
2022-05-19 10:36:39 +00:00
|
|
|
def test_impersonate(testclient, logged_admin, user):
|
2020-12-11 10:52:37 +00:00
|
|
|
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
|
2020-12-31 18:55:30 +00:00
|
|
|
|
|
|
|
|
2022-05-19 10:36:39 +00:00
|
|
|
def test_wrong_login(testclient, user):
|
2022-04-06 15:32:11 +00:00
|
|
|
testclient.app.config["HIDE_INVALID_LOGINS"] = True
|
2020-12-31 18:55:30 +00:00
|
|
|
|
|
|
|
res = testclient.get("/login", status=200)
|
|
|
|
res.form["login"] = "invalid"
|
2021-01-23 21:30:43 +00:00
|
|
|
res = res.form.submit(status=302)
|
|
|
|
res = res.follow(status=200)
|
|
|
|
|
2020-12-31 18:55:30 +00:00
|
|
|
res.form["password"] = "incorrect horse"
|
|
|
|
res = res.form.submit(status=200)
|
2021-01-01 12:55:20 +00:00
|
|
|
assert "The login 'invalid' does not exist" not in res.text
|
2020-12-31 18:55:30 +00:00
|
|
|
|
2022-04-06 15:32:11 +00:00
|
|
|
testclient.app.config["HIDE_INVALID_LOGINS"] = False
|
2020-12-31 18:55:30 +00:00
|
|
|
|
|
|
|
res = testclient.get("/login", status=200)
|
|
|
|
res.form["login"] = "invalid"
|
|
|
|
res = res.form.submit(status=200)
|
2022-04-06 15:32:11 +00:00
|
|
|
assert "The login 'invalid' does not exist" in res.text
|
2021-01-01 15:42:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_admin_self_deletion(testclient, slapd_connection):
|
2022-05-18 09:31:26 +00:00
|
|
|
LDAPObject.ldap_object_classes(slapd_connection)
|
|
|
|
LDAPObject.ldap_object_attributes(slapd_connection)
|
|
|
|
|
2021-01-01 15:42:13 +00:00
|
|
|
admin = User(
|
|
|
|
objectClass=["inetOrgPerson"],
|
|
|
|
cn="Temp admin",
|
|
|
|
sn="admin",
|
|
|
|
uid="temp",
|
|
|
|
mail="temp@temp.com",
|
|
|
|
userPassword="{SSHA}Vmgh2jkD0idX3eZHf8RzGos31oerjGiU",
|
|
|
|
)
|
2022-05-08 14:31:17 +00:00
|
|
|
admin.save()
|
2021-01-01 15:42:13 +00:00
|
|
|
with testclient.session_transaction() as sess:
|
|
|
|
sess["user_dn"] = [admin.dn]
|
|
|
|
|
|
|
|
res = testclient.get("/profile/temp")
|
|
|
|
res = (
|
|
|
|
res.form.submit(name="action", value="delete", status=302)
|
|
|
|
.follow(status=302)
|
|
|
|
.follow(status=200)
|
|
|
|
)
|
|
|
|
|
2022-05-08 14:31:17 +00:00
|
|
|
assert User.get("temp") is None
|
2021-01-01 15:42:13 +00:00
|
|
|
|
|
|
|
with testclient.session_transaction() as sess:
|
|
|
|
assert not sess.get("user_dn")
|
|
|
|
|
|
|
|
|
|
|
|
def test_user_self_deletion(testclient, slapd_connection):
|
2022-05-18 09:31:26 +00:00
|
|
|
LDAPObject.ldap_object_classes(slapd_connection)
|
|
|
|
LDAPObject.ldap_object_attributes(slapd_connection)
|
|
|
|
|
2021-01-01 15:42:13 +00:00
|
|
|
user = User(
|
|
|
|
objectClass=["inetOrgPerson"],
|
|
|
|
cn="Temp user",
|
|
|
|
sn="user",
|
|
|
|
uid="temp",
|
|
|
|
mail="temp@temp.com",
|
|
|
|
userPassword="{SSHA}Vmgh2jkD0idX3eZHf8RzGos31oerjGiU",
|
|
|
|
)
|
2022-05-08 14:31:17 +00:00
|
|
|
user.save()
|
2021-01-01 15:42:13 +00:00
|
|
|
with testclient.session_transaction() as sess:
|
|
|
|
sess["user_dn"] = [user.dn]
|
|
|
|
|
2022-04-05 15:16:09 +00:00
|
|
|
testclient.app.config["ACL"]["DEFAULT"]["PERMISSIONS"] = ["edit_self"]
|
2021-01-01 15:42:13 +00:00
|
|
|
res = testclient.get("/profile/temp")
|
|
|
|
assert "Delete my account" not in res
|
|
|
|
|
2022-04-05 15:16:09 +00:00
|
|
|
testclient.app.config["ACL"]["DEFAULT"]["PERMISSIONS"] = [
|
|
|
|
"edit_self",
|
|
|
|
"delete_account",
|
|
|
|
]
|
2021-01-01 15:42:13 +00:00
|
|
|
res = testclient.get("/profile/temp")
|
|
|
|
assert "Delete my account" in res
|
|
|
|
res = (
|
|
|
|
res.form.submit(name="action", value="delete", status=302)
|
|
|
|
.follow(status=302)
|
|
|
|
.follow(status=200)
|
|
|
|
)
|
|
|
|
|
2022-05-08 14:31:17 +00:00
|
|
|
assert User.get("temp") is None
|
2021-01-01 15:42:13 +00:00
|
|
|
|
|
|
|
with testclient.session_transaction() as sess:
|
|
|
|
assert not sess.get("user_dn")
|
|
|
|
|
2021-12-02 17:23:14 +00:00
|
|
|
testclient.app.config["ACL"]["DEFAULT"]["PERMISSIONS"] = []
|
2021-12-07 18:30:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_login_placeholder(testclient):
|
|
|
|
testclient.app.config["LDAP"]["USER_FILTER"] = "(uid={login})"
|
|
|
|
placeholder = testclient.get("/login").form["login"].attrs["placeholder"]
|
|
|
|
assert placeholder == "jdoe"
|
|
|
|
|
|
|
|
testclient.app.config["LDAP"]["USER_FILTER"] = "(cn={login})"
|
|
|
|
placeholder = testclient.get("/login").form["login"].attrs["placeholder"]
|
|
|
|
assert placeholder == "John Doe"
|
|
|
|
|
|
|
|
testclient.app.config["LDAP"]["USER_FILTER"] = "(mail={login})"
|
|
|
|
placeholder = testclient.get("/login").form["login"].attrs["placeholder"]
|
|
|
|
assert placeholder == "john@doe.com"
|
|
|
|
|
|
|
|
testclient.app.config["LDAP"]["USER_FILTER"] = "(|(uid={login})(email={login}))"
|
|
|
|
placeholder = testclient.get("/login").form["login"].attrs["placeholder"]
|
|
|
|
assert placeholder == "jdoe or john@doe.com"
|