I guess any solution si welcome, I didn't have spare time to work on this and because of the many ldap system to be tested against the change to be made I have been reluctante to work on this scince could be very long to finish the refactoring... :(
Richard On Thu, Jan 8, 2015 at 2:49 PM, Carlos Hanson <[email protected]> wrote: > Greetings, > > I've been humming along quite nicely until I released a new application > last month which is used by our entire staff rather than our department. > Now I have run into the duplicate user problem, but I looked through the > code and figured out why. I had forgotten that you mentioned it to me in > this thread. > > After reviewing your suggested solution and seeing that it has not been > implemented, I thought we might consider an alternative. Since Auth has > get_or_create_user() and it is called by Auth.login(), isn't it reasonable > to think that a particular login_method can also create a user? Given that > ldap_auth is already doing so, I suggest that we ask the login_method for > the user. If we get it, use it. If not, Auth can use its > get_or_create_user(). > > For example, in tools.py starting at line 2467: > > # try alternate logins 1st as these have the > # current version of the password > user = None > for login_method in settings.login_methods: > if login_method != self and \ > login_method(request.vars[username], > request.vars[passfield]): > if not self in settings.login_methods: > # do not store password in db > form.vars[passfield] = None > try: > user = login_method.get_user() > except AttributeError: > # login method has not implemented get_user() > pass > if user is None: > user = self.get_or_create_user( > form.vars, settings.update_fields) > break > > > > On Friday, August 16, 2013 at 3:10:36 PM UTC-7, Richard wrote: >> >> Hello Carlos, >> >> Yes you have to pass the db, doc is pretty un clear. Also, it stop >> working because when to tell to manage_user=True it start to check the >> credential against Active Directory. If you read the doc carefully you will >> discrover that if there is a password in the password field it will be >> prioritise on the AD credential. And if I remember my test, when >> Imanage_user is activating the password is cleared on user update >> (auth_user record is updated each time the user is login on). So, then the >> db become essential to allow ldap_auth to authentify user that was not the >> case before because it was web2py normal authenfication mecahnism which was >> a priority. >> >> Notice that ldap_auth contrib is not preventing logon with email as >> username, see this thread : https://groups.google.com/d/ >> msg/web2py/sEpOWYk0mFA/XOivgLvR0rEJ >> >> So, take care, because if you don't add padding, since you have activate >> management of user, new user (duplicate user) will be added with email as >> username. Massimo is aware (see thread) I suggest a patch but he is still >> in reflexion. You can apply the patch in the mean time to prevent >> duplicated user. But it may have backward compatibility issue (I don't >> know). There is also an other option, refactor ldap_auth and make it return >> validation error on email input as username, but it requires that we don't >> break ldap_auth. If you are in to refactor we can check what we could do. >> >> Also, I read that manage user =True is not working properly, so better >> leave it to false, I think. >> >> >> Hope it helps. >> >> Richard >> >> >> >> >> >> >> On Fri, Aug 16, 2013 at 1:22 PM, Carlos Hanson <[email protected]> >> wrote: >> >>> I am using ldap_auth. The following example shows an error I received >>> after adding manage_user=True. It is unclear to me why this is a problem. >>> >>> >>> ldap_auth_aux = ldap_auth(mode='ad', >>> ... server='my.domain.controller', >>> ... base_dn='ou=Users,dc=domain,dc=com', >>> ... filterstr='objectClass=*', >>> ... manage_user=True, >>> ... user_firstname_attrib='givenName', >>> ... user_lastname_attrib='sn', >>> ... user_mail_attrib='mail') >>> >>> import logging >>> >>> logger = logging.getLogger('web2py.auth.ldap_auth') >>> >>> logger.setLevel(logging.DEBUG) >>> >>> >>> ldap_auth_aux('chanson', '********') >>> DEBUG:web2py.auth.ldap_auth:mode: [ad] manage_user: [True] custom_scope: >>> [subtree] manage_groups: [False] >>> INFO:web2py.auth.ldap_auth:[my.domain.controller] Initialize ldap >>> connection >>> INFO:web2py.auth.ldap_auth:[chanson] Manage user data >>> Traceback (most recent call last): >>> File "<console>", line 1, in <module> >>> File "/srv/www/web2py/gluon/contrib/login_methods/ldap_auth.py", line >>> 421, in ldap_auth_aux >>> user_in_db = db(db.auth_user.email == username) >>> AttributeError: 'NoneType' object has no attribute 'auth_user' >>> >>> >>> ldap_auth_aux('chanson', '********', db=db) >>> DEBUG:web2py.auth.ldap_auth:mode: [ad] manage_user: [True] custom_scope: >>> [subtree] manage_groups: [False] >>> INFO:web2py.auth.ldap_auth:[my.domain.controller] Initialize ldap >>> connection >>> INFO:web2py.auth.ldap_auth:[chanson] Manage user data >>> True >>> >>> db.commit() >>> >>> >>> The Traceback in the error ticket showed one of the following prior to >>> the error on line 421 in ldap_auth_aux: >>> >>> - File "/srv/www/web2py/gluon/tools.py", line 2123, in login >>> - File "/srv/www/web2py/gluon/tools.py", line 2144, in login >>> >>> The interesting code is the following: >>> >>> login_method(request.vars[username], >>> request.vars[passfield]): >>> >>> db is not passed to the function. The function definition of >>> ldap_auth_aux has db=db, but the function is defined in ldap_auth which >>> defaults to db=None. I am not sure how it worked before. My solution is to >>> add db=db to my login_methods definition: >>> >>> auth.settings.login_methods = [ >>> ldap_auth(...as usual..., >>> manage_user=True, >>> user_firstname_attrib='givenName', >>> user_lastname_attrib='sn', >>> user_mail_attrib='mail', >>> db=db >>> ) >>> ] >>> >>> >>> I also noticed that the user_xxx_attrib values are case sensitive. For >>> example, I use givenName for the user_firstname_attrib. Searching ldap is >>> case insensitive, so I think the results should not be, but the results >>> create a dictionary which has case sensitive keys. In my case, if I use >>> givenname, which is the norm for me when I interact with ldap, line 665 of >>> ldap_auth.py throws an exception and my first_name in the auth_user table >>> gets created or updated to None, depending on whether the user exists or >>> not. >>> >>> I don't know if this needs to be changed necessarily. I think it would >>> be better to be case insensitive, since searches are that way, but if not, >>> at a minimum the documentation should say it that the case of the attribute >>> should match the schema definition. >>> >>> I'm not sure how to resolve the db=db issue above other than the way I >>> did, since I am unclear why it worked before I added manage_user=True. >>> >>> Carlos Hanson >>> >>> -- >>> >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "web2py-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >> >> -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

