|
- # -*- coding: utf-8 -*-
-
- from flask import current_app
-
- from ldap3 import AttrDef
- from ldap3.core.exceptions import LDAPAttributeError
- from ldap3 import (STRING_TYPES, NUMERIC_TYPES, MODIFY_ADD, MODIFY_DELETE,
- MODIFY_REPLACE)
-
-
- class LdapField(object):
-
- def __init__(self, name, validate=None, default=None, dereference_dn=None):
- self.name = name
- self.validate = validate
- self.default = default
- self.dereference_dn = None
-
- def get_abstract_attr_def(self, key):
- return AttrDef(name=self.name, key=key,
- validate=self.validate,
- default=self.default,
- dereference_dn=self.dereference_dn)
-
-
- class LDAPAttribute(object):
-
- def __init__(self, name):
- self.__dict__['name'] = name
- self.__dict__['values'] = []
- self.__dict__['changetype'] = None
-
- def __str__(self):
- if isinstance(self.value, STRING_TYPES):
- return self.value
- else:
- return str(self.value)
-
- def __len__(self):
- return len(self.values)
-
- def __iter__(self):
- return self.values.__iter__()
-
- def __contains__(self, item):
- return item in self.__dict__['values']
-
- def __setattr__(self, item, value):
- if item not in ['value', '_init']:
- raise LDAPAttributeError('can not set key')
-
- # set changetype
- if item == 'value':
- if self.__dict__['values']:
- if not value:
- self.__dict__['changetype'] = MODIFY_DELETE
- else:
- self.__dict__['changetype'] = MODIFY_REPLACE
- else:
- self.__dict__['changetype'] = MODIFY_ADD
-
- if isinstance(value, (STRING_TYPES, NUMERIC_TYPES)):
- value = [value]
-
- self.__dict__['values'] = value
-
- @property
- def value(self):
- '''Return single value or list of values from the attribute.
- If FORCE_ATTRIBUTE_VALUE_AS_LIST is True, always return a
- list with values.
- '''
- if len(self.__dict__['values']) == 1 and current_app.config['FORCE_ATTRIBUTE_VALUE_AS_LIST'] is False:
- return self.__dict__['values'][0]
- else:
- return self.__dict__['values']
-
- @property
- def changetype(self):
- return self.__dict__['changetype']
-
- def get_changes_tuple(self):
- values = [val.encode('UTF-8') for val in self.__dict__['values']]
- return (self.changetype, values)
-
- def append(self, value):
- '''Add another value to the attribute'''
- if self.__dict__['values']:
- self.__dict__['changetype'] = MODIFY_REPLACE
-
- self.__dict__['values'].append(value)
-
- def delete(self):
- '''Delete this attribute
-
- This property sets the value to an empty list an the changetype
- to delete.
- '''
- self.value = []
|