[Checkins] SVN: Sandbox/ulif/megrok.login/src/megrok/login/authplugins.py Add auto-registering principal folder.
Uli Fouquet
uli at gnufix.de
Mon Dec 8 08:25:05 EST 2008
Log message for revision 93778:
Add auto-registering principal folder.
Changed:
U Sandbox/ulif/megrok.login/src/megrok/login/authplugins.py
-=-
Modified: Sandbox/ulif/megrok.login/src/megrok/login/authplugins.py
===================================================================
--- Sandbox/ulif/megrok.login/src/megrok/login/authplugins.py 2008-12-08 13:24:01 UTC (rev 93777)
+++ Sandbox/ulif/megrok.login/src/megrok/login/authplugins.py 2008-12-08 13:25:05 UTC (rev 93778)
@@ -14,9 +14,13 @@
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from zope.app.authentication.interfaces import IQuerySchemaSearch
-from zope.app.authentication.principalfolder import PrincipalInfo
+from zope.app.authentication.principalfolder import (PrincipalInfo,
+ PrincipalFolder,
+ InternalPrincipal)
from zope.app.authentication.principalfolder import ISearchSchema
+from zope.app.container.interfaces import DuplicateIDError
from zope.app.security.principalregistry import principalRegistry
+from zope.app.securitypolicy.interfaces import IPrincipalPermissionManager
from zope.interface import implements
class PrincipalRegistryAuthenticator(object):
@@ -81,3 +85,40 @@
or (batch_size is not None and n > batch_size)):
n += 1
yield u''+value.__name__
+
+
+class AutoRegisteringPrincipalFolder(PrincipalFolder):
+ """A principalfolder, that autoregisters new principals.
+ """
+ def __init__(self, prefix='', autopermissions=()):
+ super(AutoRegisteringPrincipalFolder, self).__init__(prefix)
+ self.__id_by_login = self._newContainerData()
+ self.auto_permissions = autopermissions
+
+ def authenticateCredentials(self, credentials):
+ """An authentication that adds the credentials if possible.
+ """
+ if not isinstance(credentials, dict):
+ return None
+ if not ('login' in credentials and 'password' in credentials):
+ return None
+ id = self.__id_by_login.get(credentials['login'])
+ if id is None:
+ # Create new principal...
+ id = credentials['login']
+ principal = InternalPrincipal(id, credentials['password'], id)
+ try:
+ self[id] = principal
+ perm_mgr = IPrincipalPermissionManager(
+ self.__parent__.__parent__.__parent__)
+ for perm in self.auto_permissions:
+ perm_mgr.grantPermissionToPrincipal(
+ perm, self.prefix + id)
+ except DuplicateIDError:
+ pass
+ internal = self[id]
+ if not internal.checkPassword(credentials["password"]):
+ return None
+ return PrincipalInfo(self.prefix + id, internal.login, internal.title,
+ internal.description)
+
More information about the Checkins
mailing list