Changeset View
Changeset View
Standalone View
Standalone View
pykolab/auth/ldap/__init__.py
Show First 20 Lines • Show All 1,311 Lines • ▼ Show 20 Lines | def _change_add_sharedfolder(self, entry, change): | ||||
folderacl_entry_attribute = 'acl' | folderacl_entry_attribute = 'acl' | ||||
if not entry.has_key(folderacl_entry_attribute): | if not entry.has_key(folderacl_entry_attribute): | ||||
entry[folderacl_entry_attribute] = self.get_entry_attribute( | entry[folderacl_entry_attribute] = self.get_entry_attribute( | ||||
entry['id'], | entry['id'], | ||||
folderacl_entry_attribute | folderacl_entry_attribute | ||||
) | ) | ||||
if not entry[folderacl_entry_attribute] == None: | |||||
# Parse it before assigning it | |||||
entry['kolabfolderaclentry'] = [] | |||||
if not isinstance(entry[folderacl_entry_attribute], list): | |||||
entry[folderacl_entry_attribute] = [ entry[folderacl_entry_attribute] ] | |||||
for acl_entry in entry[folderacl_entry_attribute]: | |||||
acl_access = acl_entry.split()[-1] | |||||
if len(acl_entry.split(', ')) > 1: | |||||
aci_subject = ', '.join(acl_entry.split(', ')[:-1]) | |||||
else: | |||||
aci_subject = acl_entry.split()[0] | |||||
log.debug(_("Found a subject %r with access %r") % (aci_subject, acl_access), level=8) | |||||
access_lookup_dict = { | |||||
'all': 'lrsedntxakcpiw', | |||||
'append': 'wip', | |||||
'full': 'lrswipkxtecdn', | |||||
'read': 'lrs', | |||||
'read-only': 'lrs', | |||||
'read-write': 'lrswitedn', | |||||
'post': 'p', | |||||
'semi-full': 'lrswit', | |||||
'write': 'lrswite', | |||||
} | |||||
if access_lookup_dict.has_key(acl_access): | |||||
acl_access = access_lookup_dict[acl_access] | |||||
log.debug(_("Found a subject %r with access %r") % (aci_subject, acl_access), level=8) | |||||
entry['kolabfolderaclentry'].append("(%r, %r, %r)" % (folder_path, aci_subject, acl_access)) | |||||
if not self.imap.shared_folder_exists(folder_path): | if not self.imap.shared_folder_exists(folder_path): | ||||
self.imap.shared_folder_create(folder_path, server) | self.imap.shared_folder_create(folder_path, server) | ||||
self.imap.set_acl(folder_path, 'anyone', '') | |||||
if entry.has_key('kolabfoldertype') and \ | if entry.has_key('kolabfoldertype') and \ | ||||
not entry['kolabfoldertype'] == None: | not entry['kolabfoldertype'] == None: | ||||
self.imap.shared_folder_set_type( | self.imap.shared_folder_set_type( | ||||
folder_path, | folder_path, | ||||
entry['kolabfoldertype'] | entry['kolabfoldertype'] | ||||
) | ) | ||||
if entry.has_key('kolabfolderaclentry') and \ | entry['kolabfolderaclentry'] = self._parse_acl(entry[folderacl_entry_attribute]) | ||||
not entry['kolabfolderaclentry'] == None: | |||||
self.imap._set_kolab_mailfolder_acls( | self.imap._set_kolab_mailfolder_acls( | ||||
entry['kolabfolderaclentry'] | entry['kolabfolderaclentry'], folder_path | ||||
) | ) | ||||
if entry.has_key(delivery_address_attribute) and \ | if entry.has_key(delivery_address_attribute) and \ | ||||
not entry[delivery_address_attribute] == None: | not entry[delivery_address_attribute] == None: | ||||
self.imap.set_acl(folder_path, 'anyone', '+p') | self.imap.set_acl(folder_path, 'anyone', '+p') | ||||
#if server == None: | #if server == None: | ||||
#self.entry_set_attribute(mailserver_attribute, server) | #self.entry_set_attribute(mailserver_attribute, server) | ||||
▲ Show 20 Lines • Show All 328 Lines • ▼ Show 20 Lines | def _change_modify_sharedfolder(self, entry, change): | ||||
folderacl_entry_attribute = 'acl' | folderacl_entry_attribute = 'acl' | ||||
if not entry.has_key(folderacl_entry_attribute): | if not entry.has_key(folderacl_entry_attribute): | ||||
entry[folderacl_entry_attribute] = self.get_entry_attribute( | entry[folderacl_entry_attribute] = self.get_entry_attribute( | ||||
entry['id'], | entry['id'], | ||||
folderacl_entry_attribute | folderacl_entry_attribute | ||||
) | ) | ||||
if not entry[folderacl_entry_attribute] == None: | |||||
# Parse it before assigning it | |||||
entry['kolabfolderaclentry'] = [] | |||||
if not isinstance(entry[folderacl_entry_attribute], list): | |||||
entry[folderacl_entry_attribute] = [ entry[folderacl_entry_attribute] ] | |||||
for acl_entry in entry[folderacl_entry_attribute]: | |||||
acl_access = acl_entry.split()[-1] | |||||
if len(acl_entry.split(', ')) > 1: | |||||
aci_subject = ', '.join(acl_entry.split(', ')[:-1]) | |||||
else: | |||||
aci_subject = acl_entry.split()[0] | |||||
log.debug(_("Found a subject %r with access %r") % (aci_subject, acl_access), level=8) | |||||
access_lookup_dict = { | |||||
'all': 'lrsedntxakcpiw', | |||||
'append': 'wip', | |||||
'full': 'lrswipkxtecdn', | |||||
'read': 'lrs', | |||||
'read-only': 'lrs', | |||||
'read-write': 'lrswitedn', | |||||
'post': 'p', | |||||
'semi-full': 'lrswit', | |||||
'write': 'lrswite', | |||||
} | |||||
if access_lookup_dict.has_key(acl_access): | |||||
acl_access = access_lookup_dict[acl_access] | |||||
log.debug(_("Found a subject %r with access %r") % (aci_subject, acl_access), level=8) | |||||
entry['kolabfolderaclentry'].append("(%r, %r, %r)" % (folder_path, aci_subject, acl_access)) | |||||
if not self.imap.shared_folder_exists(folder_path): | if not self.imap.shared_folder_exists(folder_path): | ||||
self.imap.shared_folder_create(folder_path, server) | self.imap.shared_folder_create(folder_path, server) | ||||
self.imap.set_acl(folder_path, 'anyone', '') | |||||
if entry.has_key('kolabfoldertype') and \ | if entry.has_key('kolabfoldertype') and \ | ||||
not entry['kolabfoldertype'] == None: | not entry['kolabfoldertype'] == None: | ||||
self.imap.shared_folder_set_type( | self.imap.shared_folder_set_type( | ||||
folder_path, | folder_path, | ||||
entry['kolabfoldertype'] | entry['kolabfoldertype'] | ||||
) | ) | ||||
if entry.has_key('kolabfolderaclentry') and \ | entry['kolabfolderaclentry'] = self._parse_acl(entry[folderacl_entry_attribute]) | ||||
not entry['kolabfolderaclentry'] == None: | |||||
self.imap._set_kolab_mailfolder_acls( | self.imap._set_kolab_mailfolder_acls( | ||||
entry['kolabfolderaclentry'] | entry['kolabfolderaclentry'], folder_path, True | ||||
) | ) | ||||
if entry.has_key(delivery_address_attribute) and \ | if entry.has_key(delivery_address_attribute) and \ | ||||
not entry[delivery_address_attribute] == None: | not entry[delivery_address_attribute] == None: | ||||
self.imap.set_acl(folder_path, 'anyone', '+p') | self.imap.set_acl(folder_path, 'anyone', '+p') | ||||
def _change_modify_user(self, entry, change): | def _change_modify_user(self, entry, change): | ||||
""" | """ | ||||
Handle the changes for an object of type user. | Handle the changes for an object of type user. | ||||
▲ Show 20 Lines • Show All 161 Lines • ▼ Show 20 Lines | def _change_none_sharedfolder(self, entry, change): | ||||
if entry.has_key('kolabfoldertype') and \ | if entry.has_key('kolabfoldertype') and \ | ||||
not entry['kolabfoldertype'] == None: | not entry['kolabfoldertype'] == None: | ||||
self.imap.shared_folder_set_type( | self.imap.shared_folder_set_type( | ||||
folder_path, | folder_path, | ||||
entry['kolabfoldertype'] | entry['kolabfoldertype'] | ||||
) | ) | ||||
if entry.has_key('kolabfolderaclentry') and \ | entry['kolabfolderaclentry'] = self._parse_acl(entry['kolabfolderaclentry']) | ||||
not entry['kolabfolderaclentry'] == None: | |||||
if isinstance(entry['kolabfolderaclentry'], basestring): | |||||
entry['kolabfolderaclentry'] = [ entry['kolabfolderaclentry'] ] | |||||
import copy | |||||
_acls = copy.deepcopy(entry['kolabfolderaclentry']) | |||||
entry['kolabfolderaclentry'] = [] | |||||
for _entry in _acls: | |||||
if _entry[0] == "(": | |||||
entry['kolabfolderaclentry'].append(_entry) | |||||
continue | |||||
s,r = [x.strip() for x in _entry.split(',')] | |||||
entry['kolabfolderaclentry'].append("('%s', '%s', '%s')" % (folder_path, s, r)) | |||||
self.imap._set_kolab_mailfolder_acls( | self.imap._set_kolab_mailfolder_acls( | ||||
entry['kolabfolderaclentry'] | entry['kolabfolderaclentry'], folder_path, True | ||||
) | ) | ||||
elif entry['kolabfolderaclentry'] in [None,[]]: | |||||
for ace in self.imap.list_acls(folder_path): | |||||
aci_subject = ace.split()[0] | |||||
self.imap.set_acl(folder_path, aci_subject, '') | |||||
delivery_address_attribute = self.config_get('sharedfolder_delivery_address_attribute') | delivery_address_attribute = self.config_get('sharedfolder_delivery_address_attribute') | ||||
if entry.has_key(delivery_address_attribute) and \ | if entry.has_key(delivery_address_attribute) and \ | ||||
not entry[delivery_address_attribute] == None: | not entry[delivery_address_attribute] == None: | ||||
self.imap.set_acl(folder_path, 'anyone', '+p') | self.imap.set_acl(folder_path, 'anyone', '+p') | ||||
#if server == None: | #if server == None: | ||||
#self.entry_set_attribute(mailserver_attribute, server) | #self.entry_set_attribute(mailserver_attribute, server) | ||||
▲ Show 20 Lines • Show All 946 Lines • ▼ Show 20 Lines | def _search(self, | ||||
failed_ok = True | failed_ok = True | ||||
log.error(_("An error occured using %s: %r") % (supported_control, errmsg)) | log.error(_("An error occured using %s: %r") % (supported_control, errmsg)) | ||||
log.error(_("%s") % (traceback.format_exc())) | log.error(_("%s") % (traceback.format_exc())) | ||||
continue | continue | ||||
return _results | return _results | ||||
def _parse_acl(self, acl): | |||||
""" | |||||
Parse LDAP ACL specification for use in IMAP | |||||
""" | |||||
results = [] | |||||
if acl is not None: | |||||
if not isinstance(acl, list): | |||||
acl = [ acl ] | |||||
for acl_entry in acl: | |||||
# entry already converted to IMAP format? | |||||
if acl_entry[0] == "(": | |||||
results.append(acl_entry) | |||||
continue | |||||
acl_access = acl_entry.split()[-1] | |||||
acl_subject = acl_entry.split(', ') | |||||
if len(acl_subject) > 1: | |||||
acl_subject = ', '.join(acl_subject[:-1]) | |||||
else: | |||||
acl_subject = acl_entry.split()[0] | |||||
results.append("(%r, %r)" % (acl_subject, acl_access)) | |||||
return results |