[Zope] LoginManager - With SQL

ed colmar ecolmar@uswest.net
Mon, 16 Oct 2000 09:49:10 -0600


Thanks for the tips everyone!

I keep going between UserDb and LoginManager to try to get this to work.
UserDb gives me weird errors, and isn't really current, so I'm focusing on
LM.

I feel like I'm getting closer to a solution, but I'm still having
difficuties...

I followed jPenny's how to regarding accessing SQL method variables from
within python, and wrapped the retrieveItem result in a User Class.  It
seems like it is at least running my code now, but no authentication...

Am I close?  Can Anyone working with LoginManager offer any insight into
this?

Thanks!

-e-

Here's the code I have in UserSources.py

class User(BasicUser):
    """  A wrapper for the basic user class """
    icon='misc_/UserDb/User_icon'

    def __init__(self, name, password, roles, domains):
        self.name   =name
        self.__     =password
        self.roles  =filter(None, map(strip, split(roles, ',')))
        self.domains=filter(None, map(strip, split(domains, ',')))

    def getUserName(self):
        return self.name

    def _getPassword(self):
        return self.__

    def getRoles(self):
        return self.roles

    def getDomains(self):
        return self.domains



class PGCryptUserSource(BasicUserSource):
    """  A sql based encrypted user source """
    meta_type="PG Crypt User Source"
    __plugin_kind__="User Source"

    def retrieveItem(self, name):
        try: res=self.getuserbyusername(username=name)
        except: return None

        fields2index={}
        fieldnames=res._schema.items()

        for i in range(len(fieldnames)):
            fields2index[fieldnames[i][0]]=fieldnames[i][1]

        username=res[0][fields2index['username']]
        password=res[0][fields2index['password']]
        roles=res[0][fields2index['roles']]
        domains=res[0][fields2index['domains']]

        return User(username, password, roles, domains)


    def rolesForUser(self, user):
        name = user.getUserName()
        res = self.getuserbyusername(username=name)
        fields2index={}
        fieldnames=res._schema.items()
        for i in range(len(fieldnames)):
            fields2index[fieldnames[i][0]]=fieldnames[i][1]
        roles=res[0][fields2index['roles']]
        return roles

    def domainsForUser(self, user):
        name = user.getUserName()
        res = self.getuserbyusername(username=name)
        fields2index={}
        fieldnames=res._schema.items()
        for i in range(len(fieldnames)):
            fields2index[fieldnames[i][0]]=fieldnames[i][1]
        domains=res[0][fields2index['domains']]
        return domains

    def authenticateUser(self, user, password, request):
        name = user.getUserName()
        res = self.getuserbyusername(username=name)
        fields2index={}
        fieldnames=res._schema.items()
        for i in range(len(fieldnames)):
            fields2index[fieldnames[i][0]]=fieldnames[i][1]
        passwd=res[0][fields2index['password']]
        if crypt.crypt(password,'ab')==passwd:
            return 1
        else:
            return 0




Here's one of the tracebacks that I get:

Error Type: TypeError
Error Value: argument 1: expected read-only character buffer, None found

Traceback (innermost last): File
/usr/local/zope/lib/python/ZPublisher/Publish.py, line 222, in
publish_module
File /usr/local/zope/lib/python/ZPublisher/Publish.py, line 187, in publish
File /usr/local/zope/lib/python/Zope/__init__.py, line 221, in
zpublisher_exception_hook (Object: Traversable)
File /usr/local/zope/lib/python/ZPublisher/Publish.py, line 162, in publish
File /usr/local/zope/lib/python/ZPublisher/BaseRequest.py, line 440, in
traverse
File /usr/local/zope/lib/python/Products/LoginManager/LoginManager.py, line
108, in validate (Object: ProviderContainer)
File /usr/local/zope/lib/python/Products/LoginManager/LoginMethods.py, line
235, in findLogin (Object: PlugInBase)
File /usr/local/zope/lib/python/Products/LoginManager/LoginManager.py, line
65, in getItem (Object: ProviderContainer)
File /usr/local/zope/lib/python/Products/ZPatterns/Rack.py, line 60, in
getItem (Object: ProviderContainer)
File /usr/local/zope/lib/python/Products/LoginManager/UserSources.py, line
522, in retrieveItem (Object: ProviderContainer)
File /usr/local/zope/lib/python/Products/LoginManager/UserSources.py, line
485, in __init__ TypeError: (see above)