X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=VendServer%2FLDAPConnector.py;fp=VendServer%2FLDAPConnector.py;h=8699fd2ba6f536d39efd434ca534c685bdad87e7;hb=6c130dc942392ccc8b7ffa0ec2ede5f9327f99e6;hp=0000000000000000000000000000000000000000;hpb=e423f11f190d685156cb557319b169d2b79b752f;p=uccvend-vendserver.git diff --git a/VendServer/LDAPConnector.py b/VendServer/LDAPConnector.py new file mode 100644 index 0000000..8699fd2 --- /dev/null +++ b/VendServer/LDAPConnector.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python2.4 + +import ldap +import ldap.filter + +LDAP_TIMEOUT = 10 + +def get_ldap_connection(): + ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, '/etc/ssl/UCC-CA.crt') + ldap.set_option(ldap.OPT_X_TLS,1) + ldap.set_option(ldap.OPT_X_TLS_ALLOW,1) + #ldap.set_option(ldap.OPT_DEBUG_LEVEL,255) + conn = ldap.initialize('ldaps://mussel.ucc.gu.uwa.edu.au/') + + binddn = 'cn=mifareagent,ou=profile,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' + passfile = open('/etc/dispense2/ldap.passwd') + password = passfile.readline().strip() + passfile.close() + + conn.simple_bind_s(binddn, password) + return conn + +def get_uid(card_id): + ldapconn = get_ldap_connection() + + basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' + filter = ldap.filter.filter_format('(uccDispenseMIFARE=%s)', (card_id, )) + attrs = ('uidNumber',) + + results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT) + + ldapconn.unbind() + + if len(results) != 1: + raise ValueError, "no UID found for card ID" + + return results[0][1]['uidNumber'][0] + +def get_uname(uid): + ldapconn = get_ldap_connection() + + basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' + filter = ldap.filter.filter_format('(uidNumber=%s)', (uid, )) + attrs = ('uid',) + + results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT) + + ldapconn.unbind() + + if len(results) != 1: + raise ValueError, "no username found for user id" + + return results[0][1]['uid'][0] + +def set_card_id(uidNumber, card_id): + ldapconn = get_ldap_connection() + + # fix uidNumber for three/four digit uids + uidNumber = str(int(uidNumber)) + basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' + filter = ldap.filter.filter_format('(uidNumber=%s)', (uidNumber, )) + attrs = ('objectClass', ) + + results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT) + + if len(results) != 1: + raise "ValueError", 'error in uidNumber' + + user_dn = results[0][0] + + mod_attrs = [] + + # Does it have the correct object class? + if 'uccDispenseAccount' not in results[0][1]['objectClass']: + # Add uccDispenseAccount objectclass + mod_attrs.append((ldap.MOD_ADD, 'objectClass', 'uccDispenseAccount')) + + # Add MIFARE Card ID + mod_attrs.append((ldap.MOD_ADD, 'uccDispenseMIFARE', card_id)) + + # Use a double-try here to work around something that's fixed in Python 2.5 + try: + try: + ldapconn.modify_s(user_dn, mod_attrs) + except ldap.TYPE_OR_VALUE_EXISTS, e: + pass + finally: + ldapconn.unbind() + +if __name__ == '__main__': + set_card_id('11126', '\x01\x02\x03\x04\x05\x06') + print get_uid('\x01\x02\x03\x04\x05\x06')