canaille-globuzma/tests/conftest.py

266 lines
11 KiB
Python
Raw Normal View History

2020-08-18 15:39:34 +00:00
import os
2021-12-20 22:57:27 +00:00
import ldap.ldapobject
2020-08-18 15:39:34 +00:00
import pytest
2021-05-06 15:25:42 +00:00
import slapd
2021-12-20 22:57:27 +00:00
from canaille import create_app
from canaille.installation import setup_ldap_tree
from canaille.ldap_backend.backend import setup_ldap_models
from canaille.ldap_backend.ldapobject import LDAPObject
2021-12-20 22:57:27 +00:00
from canaille.models import Group
from canaille.models import User
from flask import g
2020-08-19 08:28:28 +00:00
from flask_webtest import TestApp
2020-08-18 15:39:34 +00:00
from werkzeug.security import gen_salt
2021-05-06 15:25:42 +00:00
class CustomSlapdObject(slapd.Slapd):
def __init__(self):
2021-05-24 15:43:15 +00:00
super().__init__(
suffix="dc=mydomain,dc=tld",
2021-05-24 15:43:15 +00:00
schemas=(
"core.ldif",
"cosine.ldif",
"nis.ldif",
"inetorgperson.ldif",
),
2021-05-24 15:43:15 +00:00
)
2020-08-18 15:39:34 +00:00
def init_tree(self):
suffix_dc = self.suffix.split(",")[0][3:]
self.ldapadd(
"\n".join(
[
"dn: " + self.suffix,
"objectClass: dcObject",
"objectClass: organization",
"dc: " + suffix_dc,
"o: " + suffix_dc,
"",
"dn: " + self.root_dn,
"objectClass: applicationProcess",
"cn: " + self.root_cn,
]
)
+ "\n"
)
@pytest.fixture(scope="session")
def slapd_server():
slapd = CustomSlapdObject()
try:
slapd.start()
slapd.init_tree()
for ldif in (
"demo/ldif/memberof-config.ldif",
"canaille/ldap_backend/schemas/oauth2-openldap.ldif",
"demo/ldif/bootstrap-users-tree.ldif",
"demo/ldif/bootstrap-oidc-tree.ldif",
):
with open(ldif) as fd:
slapd.ldapadd(fd.read())
yield slapd
finally:
slapd.stop()
@pytest.fixture
def slapd_connection(slapd_server, testclient):
g.ldap = ldap.ldapobject.SimpleLDAPObject(slapd_server.ldap_uri)
g.ldap.protocol_version = 3
g.ldap.simple_bind_s(slapd_server.root_dn, slapd_server.root_pw)
yield g.ldap
g.ldap.unbind_s()
2020-08-18 15:39:34 +00:00
2020-08-28 14:07:39 +00:00
@pytest.fixture
def configuration(slapd_server, smtpd):
smtpd.config.use_starttls = True
2021-11-08 17:09:05 +00:00
conf = {
"SECRET_KEY": gen_salt(24),
"LOGO": "/static/img/canaille-head.png",
"LDAP": {
"ROOT_DN": slapd_server.suffix,
"URI": slapd_server.ldap_uri,
"BIND_DN": slapd_server.root_dn,
"BIND_PW": slapd_server.root_pw,
"USER_BASE": "ou=users",
"USER_FILTER": "(|(uid={login})(cn={login}))",
"GROUP_BASE": "ou=groups",
2021-10-13 08:12:44 +00:00
"TIMEOUT": 0.1,
},
2021-12-02 17:23:14 +00:00
"ACL": {
"DEFAULT": {
"READ": ["uid", "groups"],
"PERMISSIONS": ["edit_self", "use_oidc"],
2021-12-02 17:23:14 +00:00
"WRITE": [
"mail",
"givenName",
2021-12-08 17:06:50 +00:00
"jpegPhoto",
2021-12-02 17:23:14 +00:00
"sn",
"displayName",
2021-12-02 17:23:14 +00:00
"userPassword",
"telephoneNumber",
"postalAddress",
2021-12-02 17:23:14 +00:00
"employeeNumber",
"preferredLanguage",
2021-12-02 17:23:14 +00:00
],
},
"ADMIN": {
"FILTER": "(|(uid=admin)(sn=admin))",
"PERMISSIONS": [
"manage_users",
"manage_oidc",
"delete_account",
"impersonate_users",
"manage_groups",
],
"WRITE": [
"groups",
],
},
"MODERATOR": {
"FILTER": "(|(uid=moderator)(sn=moderator))",
"PERMISSIONS": ["manage_users", "manage_groups", "delete_account"],
"WRITE": [
"groups",
],
},
},
"SMTP": {
"HOST": smtpd.hostname,
"PORT": smtpd.port,
"TLS": True,
"LOGIN": smtpd.config.login_username,
"PASSWORD": smtpd.config.login_password,
"FROM_ADDR": "admin@mydomain.tld",
},
}
2021-11-08 17:09:05 +00:00
return conf
@pytest.fixture
def app(configuration):
os.environ["AUTHLIB_INSECURE_TRANSPORT"] = "true"
setup_ldap_models(configuration)
2021-11-08 17:30:31 +00:00
setup_ldap_tree(configuration)
app = create_app(configuration)
2020-08-18 15:39:34 +00:00
return app
2020-08-19 07:09:22 +00:00
@pytest.fixture
def testclient(app):
app.config["TESTING"] = True
with app.app_context():
yield TestApp(app)
2020-08-19 07:09:22 +00:00
2020-08-18 15:39:34 +00:00
@pytest.fixture
def user(app, slapd_connection):
2021-12-08 14:01:35 +00:00
User.ldap_object_classes(slapd_connection)
2021-12-08 14:53:20 +00:00
LDAPObject.ldap_object_attributes(slapd_connection)
2020-08-20 08:45:33 +00:00
u = User(
2021-12-06 14:40:30 +00:00
cn="John (johnny) Doe",
2022-12-24 00:44:16 +00:00
gn="John",
2020-08-20 08:45:33 +00:00
sn="Doe",
uid="user",
2020-10-21 07:52:02 +00:00
mail="john@doe.com",
2020-10-22 15:37:01 +00:00
userPassword="{SSHA}fw9DYeF/gHTHuVMepsQzVYAkffGcU8Fz",
displayName="Johnny",
2022-12-04 10:53:37 +00:00
preferredLanguage="en",
2022-12-24 00:44:16 +00:00
telephoneNumber="555-000-000",
labeledURI="https://john.example",
postalAddress="1235, somewhere",
2020-08-20 08:45:33 +00:00
)
u.save()
2022-05-18 09:31:26 +00:00
yield u
u.delete()
2020-08-23 17:56:37 +00:00
2020-08-26 13:37:15 +00:00
@pytest.fixture
def admin(app, slapd_connection):
2021-12-08 14:01:35 +00:00
User.ldap_object_classes(slapd_connection)
2021-12-23 18:21:29 +00:00
LDAPObject.ldap_object_attributes(slapd_connection)
2020-08-26 13:37:15 +00:00
u = User(
cn="Jane Doe",
sn="Doe",
uid="admin",
2020-10-21 07:52:02 +00:00
mail="jane@doe.com",
2020-10-22 15:37:01 +00:00
userPassword="{SSHA}Vmgh2jkD0idX3eZHf8RzGos31oerjGiU",
2020-08-26 13:37:15 +00:00
)
u.save()
2022-05-18 09:31:26 +00:00
yield u
u.delete()
2020-08-26 13:37:15 +00:00
2020-11-02 11:13:03 +00:00
@pytest.fixture
def moderator(app, slapd_connection):
2021-12-08 14:01:35 +00:00
User.ldap_object_classes(slapd_connection)
2021-12-10 16:08:43 +00:00
LDAPObject.ldap_object_attributes(slapd_connection)
2020-11-02 11:13:03 +00:00
u = User(
cn="Jack Doe",
sn="Doe",
uid="moderator",
mail="jack@doe.com",
userPassword="{SSHA}+eHyxWqajMHsOWnhONC2vbtfNZzKTkag",
)
u.save()
2022-05-18 09:31:26 +00:00
yield u
u.delete()
2020-11-02 11:13:03 +00:00
2020-08-23 17:56:37 +00:00
@pytest.fixture
def logged_user(user, testclient):
with testclient.session_transaction() as sess:
sess["user_dn"] = [user.dn]
2020-08-23 17:56:37 +00:00
return user
2020-08-26 13:37:15 +00:00
@pytest.fixture
def logged_admin(admin, testclient):
with testclient.session_transaction() as sess:
sess["user_dn"] = [admin.dn]
2020-08-26 13:37:15 +00:00
return admin
2020-09-17 08:00:39 +00:00
2020-11-02 11:13:03 +00:00
@pytest.fixture
def logged_moderator(moderator, testclient):
with testclient.session_transaction() as sess:
sess["user_dn"] = [moderator.dn]
2020-11-02 11:13:03 +00:00
return moderator
2021-04-08 15:38:13 +00:00
@pytest.fixture
2021-06-03 10:00:04 +00:00
def foo_group(app, user, slapd_connection):
2021-12-08 14:01:35 +00:00
Group.ldap_object_classes(slapd_connection)
group = Group(
member=[user.dn],
cn="foo",
)
group.save()
user.load_groups()
yield group
2021-06-03 15:24:36 +00:00
user._groups = []
group.delete()
2021-06-03 15:24:36 +00:00
@pytest.fixture
2021-06-03 10:00:04 +00:00
def bar_group(app, admin, slapd_connection):
2021-12-08 14:01:35 +00:00
Group.ldap_object_classes(slapd_connection)
group = Group(
member=[admin.dn],
cn="bar",
)
group.save()
admin.load_groups()
yield group
2021-06-03 15:24:36 +00:00
admin._groups = []
group.delete()
2021-12-08 17:06:50 +00:00
@pytest.fixture
def jpeg_photo():
return b"\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x01,\x01,\x00\x00\xff\xfe\x00\x13Created with GIMP\xff\xe2\x02\xb0ICC_PROFILE\x00\x01\x01\x00\x00\x02\xa0lcms\x040\x00\x00mntrRGB XYZ \x07\xe5\x00\x0c\x00\x08\x00\x0f\x00\x16\x00(acspAPPL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-lcms\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\rdesc\x00\x00\x01 \x00\x00\x00@cprt\x00\x00\x01`\x00\x00\x006wtpt\x00\x00\x01\x98\x00\x00\x00\x14chad\x00\x00\x01\xac\x00\x00\x00,rXYZ\x00\x00\x01\xd8\x00\x00\x00\x14bXYZ\x00\x00\x01\xec\x00\x00\x00\x14gXYZ\x00\x00\x02\x00\x00\x00\x00\x14rTRC\x00\x00\x02\x14\x00\x00\x00 gTRC\x00\x00\x02\x14\x00\x00\x00 bTRC\x00\x00\x02\x14\x00\x00\x00 chrm\x00\x00\x024\x00\x00\x00$dmnd\x00\x00\x02X\x00\x00\x00$dmdd\x00\x00\x02|\x00\x00\x00$mluc\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0cenUS\x00\x00\x00$\x00\x00\x00\x1c\x00G\x00I\x00M\x00P\x00 \x00b\x00u\x00i\x00l\x00t\x00-\x00i\x00n\x00 \x00s\x00R\x00G\x00Bmluc\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0cenUS\x00\x00\x00\x1a\x00\x00\x00\x1c\x00P\x00u\x00b\x00l\x00i\x00c\x00 \x00D\x00o\x00m\x00a\x00i\x00n\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-sf32\x00\x00\x00\x00\x00\x01\x0cB\x00\x00\x05\xde\xff\xff\xf3%\x00\x00\x07\x93\x00\x00\xfd\x90\xff\xff\xfb\xa1\xff\xff\xfd\xa2\x00\x00\x03\xdc\x00\x00\xc0nXYZ \x00\x00\x00\x00\x00\x00o\xa0\x00\x008\xf5\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\x00$\x9f\x00\x00\x0f\x84\x00\x00\xb6\xc4XYZ \x00\x00\x00\x00\x00\x00b\x97\x00\x00\xb7\x87\x00\x00\x18\xd9para\x00\x00\x00\x00\x00\x03\x00\x00\x00\x02ff\x00\x00\xf2\xa7\x00\x00\rY\x00\x00\x13\xd0\x00\x00\n[chrm\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\xa3\xd7\x00\x00T|\x00\x00L\xcd\x00\x00\x99\x9a\x00\x00&g\x00\x00\x0f\\mluc\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0cenUS\x00\x00\x00\x08\x00\x00\x00\x1c\x00G\x00I\x00M\x00Pmluc\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0cenUS\x00\x00\x00\x08\x00\x00\x00\x1c\x00s\x00R\x00G\x00B\xff\xdb\x00C\x00\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xff\xdb\x00C\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\xff\xc2\x00\x11\x08\x00\x01\x00\x01\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x14\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x0c\x03\x01\x00\x02\x10\x03\x10\x00\x00\x01\x7f\x0f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x01\x00\x01\x05\x02\x7f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x03\x01\x01?\x01\x7f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x02\x01\x01?\x01\x7f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x01\x00\x06?\x02\x7f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x01\x00\x01?!\x7f\xff\xda\x00\x0c\x03\x01\x00\x02\x00\x03\x00\x00\x00\x10\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x03\x01\x01?\x10\x7f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x02\x01\x01?\x10\x7f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0