Skip to content
Snippets Groups Projects

Full schema support

Merged Julian requested to merge full-schema-support into master

Files

+ 38
0
import socketserver
import pwd
import grp
import ldapserver
class RequestHandler(ldapserver.LDAPRequestHandler):
subschema = ldapserver.schema.RFC2307BIS_SUBSCHEMA
def do_search(self, basedn, scope, filterobj):
yield from super().do_search(basedn, scope, filterobj)
yield self.subschema.Object('dc=example,dc=com', **{
'objectClass': ['top', 'dcObject', 'organization'],
'structuralObjectClass': ['organization'],
})
user_gids = {}
for user in pwd.getpwall():
user_gids[user.pw_gid] = user_gids.get(user.pw_gid, set()) | {user.pw_name}
yield self.subschema.Object(ldapserver.dn.DN('ou=users,dc=example,dc=com', uid=user.pw_name), **{
'objectClass': ['top', 'inetorgperson', 'organizationalperson', 'person', 'posixaccount'],
'structuralObjectClass': ['organization'],
'uid': [user.pw_name],
'uidNumber': [user.pw_uid],
'gidNumber': [user.pw_gid],
'cn': [user.pw_gecos],
})
for group in grp.getgrall():
members = set(group.gr_mem) | user_gids.get(group.gr_gid, set())
yield self.subschema.Object(ldapserver.dn.DN('ou=groups,dc=example,dc=com', cn=group.gr_name), **{
'objectClass': ['structuralobjectclass', 'objectclass', 'cn', 'description', 'gidnumber', 'uniquemember'],
'structuralObjectClass': ['organization'],
'cn': [group.gr_name],
'gidNumber': [group.gr_gid],
'uniqueMember': [ldapserver.dn.DN('ou=user,dc=example,dc=com', uid=name) for name in members],
})
if __name__ == '__main__':
socketserver.ThreadingTCPServer(('127.0.0.1', 3890), RequestHandler).serve_forever()
Loading