Use an anonymous LDAP bind to search for MIFARE cards - server ACLs have been updated...
[uccvend-vendserver.git] / sql-edition / servers / LDAPConnector.py
1 #!/usr/bin/env python2.4
2
3 import ldap
4 import ldap.filter
5
6 LDAP_TIMEOUT = 10
7
8 def get_ldap_connection():
9         ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, '/etc/ssl/UCC-CA.crt')
10         ldap.set_option(ldap.OPT_X_TLS,1)
11         ldap.set_option(ldap.OPT_X_TLS_ALLOW,1)
12         #ldap.set_option(ldap.OPT_DEBUG_LEVEL,255)
13         conn = ldap.initialize('ldaps://mussel.ucc.gu.uwa.edu.au:636/')
14         
15         # Anonymous bind - server ACLs should allow searching on uccDispenseMIFARE
16         conn.simple_bind_s()
17         return conn
18
19 def get_uid(card_id):
20         ldapconn = get_ldap_connection()
21         
22         basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au'
23         filter = ldap.filter.filter_format('(uccDispenseMIFARE=%s)', (card_id, ))
24         attrs = ('uidNumber',)
25         
26         results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT)
27         
28         ldapconn.unbind()
29         
30         if len(results) != 1:
31                 raise ValueError, "no UID found for card ID"
32         
33         return results[0][1]['uidNumber'][0]
34
35 def set_card_id(uidNumber, card_id):
36         ldapconn = get_ldap_connection()
37         
38         # fix uidNumber for three/four digit uids
39         uidNumber = str(int(uidNumber))
40         basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au'
41         filter = ldap.filter.filter_format('(uidNumber=%s)', (uidNumber, ))
42         attrs = ('objectClass', )
43         
44         results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT)
45         
46         if len(results) != 1:
47                 raise "ValueError", 'error in uidNumber'
48         
49         user_dn = results[0][0]
50         
51         mod_attrs = []
52         
53         # Does it have the correct object class?
54         if 'uccDispenseAccount' not in results[0][1]['objectClass']:
55                 # Add uccDispenseAccount objectclass
56                 mod_attrs.append((ldap.MOD_ADD, 'objectClass', 'uccDispenseAccount'))
57         
58         # Add MIFARE Card ID
59         mod_attrs.append((ldap.MOD_ADD, 'uccDispenseMIFARE', card_id))
60         
61         # Use a double-try here to work around something that's fixed in Python 2.5
62         try:
63             try:
64                 ldapconn.modify_s(user_dn, mod_attrs)
65             except ldap.TYPE_OR_VALUE_EXISTS, e:
66                 pass
67         finally:
68             ldapconn.unbind()
69
70 if __name__ == '__main__':
71         #print get_uid('\x01\x02\x03\x04\x05\x06')
72         set_card_id('11251', '\x01\x02\x03\x04\x05\x06')

UCC git Repository :: git.ucc.asn.au