canaille-globuzma/tests/test_profile.py

477 lines
15 KiB
Python
Raw Normal View History

2020-11-01 10:33:56 +00:00
from canaille.models import User
2021-12-08 17:06:50 +00:00
from webtest import Upload
2020-11-01 10:33:56 +00:00
def test_edition_permission(
testclient,
slapd_server,
logged_user,
admin,
foo_group,
bar_group,
jpeg_photo,
):
testclient.app.config["ACL"]["DEFAULT"]["PERMISSIONS"] = []
testclient.get("/profile/user", status=403)
testclient.app.config["ACL"]["DEFAULT"]["PERMISSIONS"] = ["edit_self"]
testclient.get("/profile/user", status=200)
2021-12-02 17:23:14 +00:00
def test_edition(
2021-12-08 17:06:50 +00:00
testclient,
slapd_server,
logged_user,
admin,
foo_group,
bar_group,
jpeg_photo,
2021-06-03 13:00:11 +00:00
):
2020-10-31 16:41:24 +00:00
res = testclient.get("/profile/user", status=200)
2021-12-20 22:57:27 +00:00
assert set(res.form["groups"].options) == {
("cn=foo,ou=groups,dc=mydomain,dc=tld", True, "foo"),
("cn=bar,ou=groups,dc=mydomain,dc=tld", False, "bar"),
2021-12-20 22:57:27 +00:00
}
2021-06-03 13:00:11 +00:00
assert logged_user.groups == [foo_group]
assert foo_group.member == [logged_user.dn]
assert bar_group.member == [admin.dn]
assert res.form["groups"].attrs["readonly"]
2021-06-03 13:00:11 +00:00
assert res.form["uid"].attrs["readonly"]
res.form["uid"] = "toto"
res.form["givenName"] = "given_name"
res.form["sn"] = "family_name"
res.form["displayName"] = "display_name"
res.form["mail"] = "email@mydomain.tld"
res.form["telephoneNumber"] = "555-666-777"
res.form["postalAddress"] = "postal_address"
res.form["employeeNumber"] = 666
2021-06-03 13:00:11 +00:00
res.form["groups"] = [
"cn=foo,ou=groups,dc=mydomain,dc=tld",
"cn=bar,ou=groups,dc=mydomain,dc=tld",
2021-06-03 13:00:11 +00:00
]
res.form["preferredLanguage"] = "fr"
2021-12-08 17:06:50 +00:00
res.form["jpegPhoto"] = Upload("logo.jpg", jpeg_photo)
res = res.form.submit(name="action", value="edit").follow()
assert "Profile updated successfuly." in res, str(res)
2020-10-20 09:44:45 +00:00
logged_user = User.get(dn=logged_user.dn)
logged_user.load_groups()
2021-12-06 13:52:10 +00:00
2020-10-20 09:44:45 +00:00
assert ["user"] == logged_user.uid
assert ["given_name"] == logged_user.givenName
assert ["family_name"] == logged_user.sn
assert "display_name" == logged_user.displayName
2020-10-20 09:44:45 +00:00
assert ["email@mydomain.tld"] == logged_user.mail
assert ["555-666-777"] == logged_user.telephoneNumber
assert ["postal_address"] == logged_user.postalAddress
assert "fr" == logged_user.preferredLanguage
assert "666" == logged_user.employeeNumber
2021-12-08 17:06:50 +00:00
assert [jpeg_photo] == logged_user.jpegPhoto
2020-10-21 07:52:02 +00:00
foo_group.reload()
bar_group.reload()
2021-06-03 13:00:11 +00:00
assert logged_user.groups == [foo_group]
assert foo_group.member == [logged_user.dn]
assert bar_group.member == [admin.dn]
assert logged_user.check_password("correct horse battery staple")
2020-10-21 08:26:31 +00:00
2022-01-11 18:32:55 +00:00
logged_user.uid = ["user"]
logged_user.cn = ["John (johnny) Doe"]
logged_user.sn = ["Doe"]
logged_user.mail = ["john@doe.com"]
logged_user.givenName = None
logged_user.jpegPhoto = None
logged_user.save()
2022-01-11 18:32:55 +00:00
2020-10-21 07:52:02 +00:00
def test_field_permissions_none(testclient, slapd_server, logged_user):
2021-12-02 17:23:14 +00:00
testclient.get("/profile/user", status=200)
logged_user.telephoneNumber = ["555-666-777"]
logged_user.save()
2021-12-02 17:23:14 +00:00
testclient.app.config["ACL"]["DEFAULT"] = {
"READ": ["uid"],
"WRITE": [],
"PERMISSIONS": ["edit_self"],
}
2021-12-02 17:23:14 +00:00
res = testclient.get("/profile/user", status=200)
assert "telephoneNumber" not in res.form.fields
testclient.post(
"/profile/user", {"action": "edit", "telephoneNumber": "000-000-000"}
)
user = User.get(dn=logged_user.dn)
assert user.telephoneNumber == ["555-666-777"]
2021-12-02 17:23:14 +00:00
def test_field_permissions_read(testclient, slapd_server, logged_user):
2021-12-02 17:23:14 +00:00
testclient.get("/profile/user", status=200)
logged_user.telephoneNumber = ["555-666-777"]
logged_user.save()
2021-12-02 17:23:14 +00:00
testclient.app.config["ACL"]["DEFAULT"] = {
"READ": ["uid", "telephoneNumber"],
"WRITE": [],
"PERMISSIONS": ["edit_self"],
2021-12-02 17:23:14 +00:00
}
res = testclient.get("/profile/user", status=200)
assert "telephoneNumber" in res.form.fields
testclient.post(
"/profile/user", {"action": "edit", "telephoneNumber": "000-000-000"}
)
user = User.get(dn=logged_user.dn)
assert user.telephoneNumber == ["555-666-777"]
2021-12-02 17:23:14 +00:00
def test_field_permissions_write(testclient, slapd_server, logged_user):
2021-12-02 17:23:14 +00:00
testclient.get("/profile/user", status=200)
logged_user.telephoneNumber = ["555-666-777"]
logged_user.save()
2021-12-02 17:23:14 +00:00
testclient.app.config["ACL"]["DEFAULT"] = {
"READ": ["uid"],
"WRITE": ["telephoneNumber"],
"PERMISSIONS": ["edit_self"],
2021-12-02 17:23:14 +00:00
}
res = testclient.get("/profile/user", status=200)
assert "telephoneNumber" in res.form.fields
testclient.post(
"/profile/user", {"action": "edit", "telephoneNumber": "000-000-000"}
)
user = User.get(dn=logged_user.dn)
assert user.telephoneNumber == ["000-000-000"]
2021-12-02 17:23:14 +00:00
def test_simple_user_cannot_edit_other(testclient, logged_user):
testclient.get("/profile/user", status=200)
testclient.get("/profile/admin", status=403)
testclient.post("/profile/admin", {"action": "edit"}, status=403)
testclient.post("/profile/admin", {"action": "delete"}, status=403)
testclient.get("/users", status=403)
def test_bad_email(testclient, logged_user):
2020-10-31 16:41:24 +00:00
res = testclient.get("/profile/user", status=200)
2020-10-21 07:52:02 +00:00
res.form["mail"] = "john@doe.com"
2020-10-21 07:52:02 +00:00
res = res.form.submit(name="action", value="edit").follow()
2020-10-21 07:52:02 +00:00
assert ["john@doe.com"] == logged_user.mail
2020-10-31 16:41:24 +00:00
res = testclient.get("/profile/user", status=200)
2020-10-21 07:52:02 +00:00
res.form["mail"] = "yolo"
2020-10-21 07:52:02 +00:00
2020-11-01 10:33:56 +00:00
res = res.form.submit(name="action", value="edit", status=200)
2020-10-21 07:52:02 +00:00
logged_user.reload()
2020-10-21 07:52:02 +00:00
assert ["john@doe.com"] == logged_user.mail
2020-10-21 08:26:31 +00:00
def test_surname_is_mandatory(testclient, logged_user):
res = testclient.get("/profile/user", status=200)
logged_user.sn = ["Doe"]
res.form["sn"] = ""
res = res.form.submit(name="action", value="edit", status=200)
logged_user.reload()
assert ["Doe"] == logged_user.sn
def test_password_change(testclient, logged_user):
2020-10-31 16:41:24 +00:00
res = testclient.get("/profile/user", status=200)
2020-10-21 08:26:31 +00:00
res.form["password1"] = "new_password"
res.form["password2"] = "new_password"
res = res.form.submit(name="action", value="edit").follow()
2020-10-21 08:26:31 +00:00
assert logged_user.check_password("new_password")
2020-10-21 08:26:31 +00:00
2020-10-31 16:41:24 +00:00
res = testclient.get("/profile/user", status=200)
2020-10-21 08:26:31 +00:00
res.form["password1"] = "correct horse battery staple"
res.form["password2"] = "correct horse battery staple"
res = res.form.submit(name="action", value="edit").follow()
assert "Profile updated successfuly" in res
2020-10-21 08:26:31 +00:00
assert logged_user.check_password("correct horse battery staple")
2020-10-21 08:26:31 +00:00
def test_password_change_fail(testclient, logged_user):
2020-10-31 16:41:24 +00:00
res = testclient.get("/profile/user", status=200)
2020-10-21 08:26:31 +00:00
res.form["password1"] = "new_password"
res.form["password2"] = "other_password"
2020-11-01 10:33:56 +00:00
res = res.form.submit(name="action", value="edit", status=200)
2020-10-21 08:26:31 +00:00
assert logged_user.check_password("correct horse battery staple")
2020-10-21 08:26:31 +00:00
2020-10-31 16:41:24 +00:00
res = testclient.get("/profile/user", status=200)
2020-10-21 08:26:31 +00:00
res.form["password1"] = "new_password"
res.form["password2"] = ""
2020-11-01 10:33:56 +00:00
res = res.form.submit(name="action", value="edit", status=200)
2020-10-21 08:26:31 +00:00
assert logged_user.check_password("correct horse battery staple")
2020-11-01 10:33:56 +00:00
2020-11-02 11:13:03 +00:00
def test_admin_bad_request(testclient, logged_moderator):
2020-11-01 10:33:56 +00:00
testclient.post("/profile/admin", {"action": "foobar"}, status=400)
testclient.get("/profile/foobar", status=404)
2020-11-02 11:13:03 +00:00
def test_user_creation_edition_and_deletion(
testclient, logged_moderator, foo_group, bar_group
2020-11-02 11:13:03 +00:00
):
2020-11-01 10:33:56 +00:00
# The user does not exist.
res = testclient.get("/users", status=200)
assert User.get("george") is None
2020-11-01 10:33:56 +00:00
assert "george" not in res.text
# Fill the profile for a new user.
res = testclient.get("/profile", status=200)
res.form["uid"] = "george"
res.form["givenName"] = "George"
res.form["sn"] = "Abitbol"
res.form["mail"] = "george@abitbol.com"
res.form["telephoneNumber"] = "555-666-888"
res.form["groups"] = ["cn=foo,ou=groups,dc=mydomain,dc=tld"]
2020-11-01 10:33:56 +00:00
res.form["password1"] = "totoyolo"
res.form["password2"] = "totoyolo"
# User have been created
res = res.form.submit(name="action", value="edit", status=302).follow(status=200)
george = User.get("george")
george.load_groups()
foo_group.reload()
assert "George" == george.givenName[0]
assert george.groups == [foo_group]
assert george.check_password("totoyolo")
2020-11-01 10:33:56 +00:00
assert "george" in testclient.get("/users", status=200).text
assert "readonly" not in res.form["groups"].attrs
2021-06-03 13:00:11 +00:00
res.form["givenName"] = "Georgio"
2021-06-03 13:00:11 +00:00
res.form["groups"] = [
"cn=foo,ou=groups,dc=mydomain,dc=tld",
"cn=bar,ou=groups,dc=mydomain,dc=tld",
2021-06-03 13:00:11 +00:00
]
2020-11-01 10:33:56 +00:00
# User have been edited
res = res.form.submit(name="action", value="edit").follow()
george = User.get("george")
george.load_groups()
assert "Georgio" == george.givenName[0]
assert george.check_password("totoyolo")
foo_group.reload()
bar_group.reload()
2021-06-03 13:00:11 +00:00
assert george.dn in set(foo_group.member)
assert george.dn in set(bar_group.member)
assert set(george.groups) == {foo_group, bar_group}
assert "george" in testclient.get("/users", status=200).text
2020-11-01 10:33:56 +00:00
assert "george" in testclient.get("/users", status=200).text
# User have been deleted.
res = res.form.submit(name="action", value="delete", status=302).follow(status=200)
assert User.get("george") is None
2020-11-01 10:33:56 +00:00
assert "george" not in res.text
def test_user_creation_form_validation_failed(
testclient, logged_moderator, foo_group, bar_group
):
res = testclient.get("/users", status=200)
assert User.get("george") is None
assert "george" not in res.text
res = testclient.get("/profile", status=200)
res = res.form.submit(name="action", value="edit")
assert "User account creation failed" in res
assert User.get("george") is None
def test_cn_setting_with_given_name_and_surname(testclient, logged_moderator):
res = testclient.get("/profile", status=200)
res.form["uid"] = "george"
res.form["givenName"] = "George"
res.form["sn"] = "Abitbol"
res.form["mail"] = "george@abitbol.com"
res = res.form.submit(name="action", value="edit", status=302).follow(status=200)
george = User.get("george")
assert george.cn[0] == "George Abitbol"
def test_cn_setting_with_surname_only(testclient, logged_moderator):
res = testclient.get("/profile", status=200)
res.form["uid"] = "george"
res.form["sn"] = "Abitbol"
res.form["mail"] = "george@abitbol.com"
res = res.form.submit(name="action", value="edit", status=302).follow(status=200)
george = User.get("george")
assert george.cn[0] == "Abitbol"
def test_first_login_mail_button(smtpd, testclient, slapd_connection, logged_admin):
2021-12-08 14:01:35 +00:00
User.ldap_object_classes(slapd_connection)
u = User(
objectClass=["inetOrgPerson"],
cn="Temp User",
sn="Temp",
uid="temp",
mail="john@doe.com",
)
u.save()
res = testclient.get("/profile/temp", status=200)
assert "This user does not have a password yet" in res
assert "Send" in res
res = res.form.submit(name="action", value="password-initialization-mail").follow()
assert (
"A password initialization link has been sent at the user email address. It should be received within 10 minutes."
in res
)
assert len(smtpd.messages) == 1
u.reload()
u.userPassword = ["{SSHA}fw9DYeF/gHTHuVMepsQzVYAkffGcU8Fz"]
u.save()
res = testclient.get("/profile/temp", status=200)
assert "This user does not have a password yet" not in res
2021-01-22 17:26:53 +00:00
u.delete()
2022-05-18 09:31:26 +00:00
2021-01-22 17:26:53 +00:00
def test_email_reset_button(smtpd, testclient, slapd_connection, logged_admin):
2021-12-08 14:01:35 +00:00
User.ldap_object_classes(slapd_connection)
2021-01-22 17:26:53 +00:00
u = User(
objectClass=["inetOrgPerson"],
cn="Temp User",
sn="Temp",
uid="temp",
mail="john@doe.com",
userPassword=["{SSHA}fw9DYeF/gHTHuVMepsQzVYAkffGcU8Fz"],
)
u.save()
2021-01-22 17:26:53 +00:00
res = testclient.get("/profile/temp", status=200)
assert "If the user has forgotten his password" in res, res.text
2021-01-22 17:26:53 +00:00
assert "Send" in res
res = res.form.submit(name="action", value="password-reset-mail").follow()
2021-01-22 17:26:53 +00:00
assert (
"A password reset link has been sent at the user email address. It should be received within 10 minutes."
in res
)
assert len(smtpd.messages) == 1
2021-12-08 17:06:50 +00:00
u.delete()
2022-05-18 09:31:26 +00:00
2021-12-08 17:06:50 +00:00
def test_photo_on_profile_edition(
2021-12-08 17:06:50 +00:00
testclient,
slapd_server,
logged_user,
jpeg_photo,
):
# Add a photo
res = testclient.get("/profile/user", status=200)
res.form["jpegPhoto"] = Upload("logo.jpg", jpeg_photo)
res.form["jpegPhoto_delete"] = False
res = res.form.submit(name="action", value="edit").follow()
2021-12-08 17:06:50 +00:00
assert "Profile updated successfuly." in res, str(res)
logged_user = User.get(dn=logged_user.dn)
2021-12-08 17:06:50 +00:00
assert [jpeg_photo] == logged_user.jpegPhoto
# No change
res = testclient.get("/profile/user", status=200)
res.form["jpegPhoto_delete"] = False
res = res.form.submit(name="action", value="edit").follow()
2021-12-08 17:06:50 +00:00
assert "Profile updated successfuly." in res, str(res)
logged_user = User.get(dn=logged_user.dn)
2021-12-08 17:06:50 +00:00
assert [jpeg_photo] == logged_user.jpegPhoto
# Photo deletion
res = testclient.get("/profile/user", status=200)
res.form["jpegPhoto_delete"] = True
res = res.form.submit(name="action", value="edit").follow()
2021-12-08 17:06:50 +00:00
assert "Profile updated successfuly." in res, str(res)
logged_user = User.get(dn=logged_user.dn)
2021-12-08 17:06:50 +00:00
assert [] == logged_user.jpegPhoto
# Photo deletion AND upload, this should never happen
res = testclient.get("/profile/user", status=200)
res.form["jpegPhoto"] = Upload("logo.jpg", jpeg_photo)
res.form["jpegPhoto_delete"] = True
res = res.form.submit(name="action", value="edit").follow()
2021-12-08 17:06:50 +00:00
assert "Profile updated successfuly." in res, str(res)
logged_user = User.get(dn=logged_user.dn)
2021-12-08 17:06:50 +00:00
assert [] == logged_user.jpegPhoto
def test_photo_on_profile_creation(testclient, slapd_server, jpeg_photo, logged_admin):
res = testclient.get("/users", status=200)
assert User.get("foobar") is None
assert "foobar" not in res.text
res = testclient.get("/profile", status=200)
res.form["jpegPhoto"] = Upload("logo.jpg", jpeg_photo)
res.form["uid"] = "foobar"
res.form["sn"] = "Abitbol"
res.form["mail"] = "george@abitbol.com"
res = res.form.submit(name="action", value="edit", status=302).follow(status=200)
user = User.get("foobar")
assert user.jpegPhoto == [jpeg_photo]
user.delete()
def test_photo_deleted_on_profile_creation(
testclient, slapd_server, jpeg_photo, logged_admin
):
res = testclient.get("/users", status=200)
assert User.get("foobar") is None
assert "foobar" not in res.text
res = testclient.get("/profile", status=200)
res.form["jpegPhoto"] = Upload("logo.jpg", jpeg_photo)
res.form["jpegPhoto_delete"] = True
res.form["uid"] = "foobar"
res.form["sn"] = "Abitbol"
res.form["mail"] = "george@abitbol.com"
res = res.form.submit(name="action", value="edit", status=302).follow(status=200)
user = User.get("foobar")
assert user.jpegPhoto == []
user.delete()