[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)