diff --git a/ldapcherry/backend/backendLdap.py b/ldapcherry/backend/backendLdap.py index d6215cc..3febdc0 100644 --- a/ldapcherry/backend/backendLdap.py +++ b/ldapcherry/backend/backendLdap.py @@ -460,12 +460,82 @@ class Backend(ldapcherry.backend.Backend): dn = self._byte_p2(self._get_user(self._byte_p2(username), NO_ATTR)) # delete if dn is not None: + groups = self.get_groups(username) + self._logger( + severity=logging.DEBUG, + msg="%(backend)s: removing user '%(user)s' from '%(group)s'" % { + 'user': username, + 'group': groups, + 'backend': self.backend_name + } + ) + self.del_from_groups(username, groups) ldap_client.delete_s(dn) else: ldap_client.unbind_s() raise UserDoesntExist(username, self.backend_name) ldap_client.unbind_s() + def __isModify(self, username, attrs, old_attrs, attr): + modify = True + # early exit + if old_attrs.get(attr) is None: + return modify + # various modification checks + if type(old_attrs[attr]) is list: + if type(attrs[attr]) is list: + if old_attrs[attr] == attrs[attr]: + self._logger( + severity=logging.DEBUG, + msg="%(backend)s: skipping modification of equal-attribute '%(attr)s'" + "/'%(oldAttr)s' for user '%(user)s'" % { + 'user': username, + 'attr': attrs[attr], + 'oldAttr': old_attrs[attr], + 'backend': self.backend_name + } + ) + modify = False + if attrs[attr] in old_attrs[attr]: + self._logger( + severity=logging.DEBUG, + msg="%(backend)s: skipping modification of attribute '%(attr)s'" + " for user '%(user)s' as it is contained by '%(oldAttr)s'" % { + 'user': username, + 'attr': attrs[attr], + 'oldAttr': old_attrs[attr], + 'backend': self.backend_name + } + ) + modify = False + else: + if type(attrs[attr]) is list: + if old_attrs[attr] in attrs[attr]: + self._logger( + severity=logging.DEBUG, + msg="%(backend)s: skipping modification of contained-attribute '%(attr)s' " + "for user '%(user)s'" % { + 'user': username, + 'attr': attrs[attr], + 'backend': self.backend_name + } + ) + modify = False + else: + if attrs[attr] == old_attrs[attr]: + self._logger( + severity=logging.DEBUG, + msg="%(backend)s: skipping modification of equal-attribute '%(attr)s'" + "/'%(oldAttr)s' for user '%(user)s'" % { + 'user': username, + 'attr': attrs[attr], + 'oldAttr': old_attrs[attr], + 'backend': self.backend_name + } + ) + modify = False + return modify + def set_attrs(self, username, attrs): """ set user attributes""" ldap_client = self._bind() @@ -475,6 +545,20 @@ class Backend(ldapcherry.backend.Backend): dn = self._byte_p2(tmp[0]) old_attrs = tmp[1] for attr in attrs: + # skip equal attributes + if not self.__isModify(username, attrs, old_attrs, attr): + continue + else: + self._logger( + severity=logging.DEBUG, + msg="%(backend)s: modifying user '%(user)s':" + " '%(attr)s' vs. '%(oldAttr)s'" % { + 'user': username, + 'attr': attrs[attr], + 'oldAttr': old_attrs.get(attr), + 'backend': self.backend_name + } + ) bcontent = self._byte_p2(attrs[attr]) battr = self._byte_p2(attr) new = {battr: self._modlist(self._byte_p3(bcontent))} diff --git a/resources/static/js/lc-filler.js b/resources/static/js/lc-filler.js index 904c2e7..5fa1e18 100644 --- a/resources/static/js/lc-filler.js +++ b/resources/static/js/lc-filler.js @@ -7,16 +7,26 @@ * */ +function normalizeName(name) { + return removeDiacritics(name).toLowerCase().replace(/[^a-z]/g, ''); +} + +function lcUidExt(firstname, lastname, firstnameEnd, lastnameEnd){ + return normalizeName(firstname).substring(0, parseInt(firstnameEnd))+normalizeName(lastname).substring(0,parseInt(lastnameEnd)); +} + function lcUid(firstname, lastname){ - var ascii_firstname = removeDiacritics(firstname).toLowerCase().replace(/[^a-z]/g, ''); - var ascii_lastname = removeDiacritics(lastname).toLowerCase().replace(/[^a-z]/g, ''); - return ascii_firstname.charAt(0)+ascii_lastname.substring(0,7); + return lcUidExt(firstname, lastname, 0, 7); } function lcDisplayName(firstname, lastname){ return firstname+' '+lastname; } +function lcMailExt(firstname, lastname, domain, firstnameEnd, lastnameEnd){ + return lcUidExt(firstname, lastname, firstnameEnd, lastnameEnd)+domain; +} + function lcMail(firstname, lastname, domain){ return lcUid(firstname, lastname)+domain; } diff --git a/resources/static/js/ppolicy.js b/resources/static/js/ppolicy.js index 8e9ef25..8c3e5ce 100644 --- a/resources/static/js/ppolicy.js +++ b/resources/static/js/ppolicy.js @@ -6,7 +6,7 @@ $('#form').validator({ }; var $ret = 'PPolicy error'; $.ajax({ - url: '/checkppolicy', + url: './checkppolicy', type: 'POST', dataType: 'json', async: false, diff --git a/resources/templates/adduser.tmpl b/resources/templates/adduser.tmpl index cd8e31f..aaca2ea 100644 --- a/resources/templates/adduser.tmpl +++ b/resources/templates/adduser.tmpl @@ -6,7 +6,7 @@
-
- +
diff --git a/resources/templates/base.tmpl b/resources/templates/base.tmpl index 5a66230..7cdeaf9 100644 --- a/resources/templates/base.tmpl +++ b/resources/templates/base.tmpl @@ -8,43 +8,43 @@ - - - + + + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + + % if custom_js: % for js in custom_js: - + % endfor %endif @@ -70,6 +70,6 @@

LdapCherry • © 2016 • Pierre-François Carpentier • Released under the MIT License

- + diff --git a/resources/templates/error.tmpl b/resources/templates/error.tmpl index a20e659..cc8496b 100644 --- a/resources/templates/error.tmpl +++ b/resources/templates/error.tmpl @@ -9,7 +9,7 @@ ${message} - Return + Return diff --git a/resources/templates/modify.tmpl b/resources/templates/modify.tmpl index b494fcc..94a98d1 100644 --- a/resources/templates/modify.tmpl +++ b/resources/templates/modify.tmpl @@ -6,7 +6,7 @@
-
- +
diff --git a/resources/templates/navbar.tmpl b/resources/templates/navbar.tmpl index 99d3a88..981a0e7 100644 --- a/resources/templates/navbar.tmpl +++ b/resources/templates/navbar.tmpl @@ -6,19 +6,19 @@