[Checkins] SVN: Sandbox/luciano/kirbi/src/kirbi/ implementation of session login (currently broken)

Luciano Ramalho luciano at ramalho.org
Thu Aug 16 23:22:13 EDT 2007


Log message for revision 78892:
  implementation of session login (currently broken)
  

Changed:
  U   Sandbox/luciano/kirbi/src/kirbi/app.py
  A   Sandbox/luciano/kirbi/src/kirbi/app_templates/login.pt
  U   Sandbox/luciano/kirbi/src/kirbi/user.py

-=-
Modified: Sandbox/luciano/kirbi/src/kirbi/app.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/app.py	2007-08-17 02:48:16 UTC (rev 78891)
+++ Sandbox/luciano/kirbi/src/kirbi/app.py	2007-08-17 03:22:12 UTC (rev 78892)
@@ -7,6 +7,17 @@
 from zope.component import getSiteManager
 from zope.traversing import browser
 
+from zope.app.authentication import PluggableAuthentication
+from zope.app.authentication.principalfolder import PrincipalFolder
+from zope.app.authentication.principalfolder import InternalPrincipal
+from zope.app.authentication.session import SessionCredentialsPlugin
+from zope.app.security.interfaces import IAuthentication
+from zope.app.security.interfaces import IUnauthenticatedPrincipal
+from zope.app.securitypolicy.interfaces import IPrincipalRoleManager, IRole
+from zope.app.securitypolicy.interfaces import IRolePermissionManager
+from zope.app.securitypolicy.role import LocalRole
+from zope import schema
+
 PAC_NAME = u'pac'
 USER_FOLDER_NAME = u'u'
 
@@ -14,14 +25,37 @@
 grok.define_permission('kirbi.EditBook')
 grok.define_permission('kirbi.DeleteBook')
 
+def setup_pau(pau):
+    pau['principals'] = PrincipalFolder('kirbi.principals.')
+    pau.authenticatorPlugins = ('principals',)
+
+    pau['session'] = session = SessionCredentialsPlugin()
+    session.loginpagename = 'login'
+    pau.credentialsPlugins = ('No Challenge if Authenticated', 'session',)
+
+def role_factory(*args):
+    def factory():
+        return LocalRole(*args)
+    return factory
+
 class Kirbi(grok.Application, grok.Container):
     """Peer-to-peer library system."""
+    grok.local_utility(PluggableAuthentication, IAuthentication,
+                       setup=setup_pau)
+    grok.local_utility(role_factory(u'Book Owner'), IRole,
+                       name='kirbi.Owner',
+                       name_in_container='kirbi.Owner')
     def __init__(self):
         global sitePac, siteUsers, siteUsersURL
         super(Kirbi, self).__init__()
         self.pac = self[PAC_NAME] = Pac()
         self.user_folder = self[USER_FOLDER_NAME] = UserFolder()
 
+ at grok.subscribe(Kirbi, grok.IObjectAddedEvent)
+def grant_permissions(app, event):
+    role_manager = IRolePermissionManager(app)
+    role_manager.grantPermissionToRole('kirbi.EditBook', 'kirbi.Owner')
+
 class Index(grok.View):
 
     def pac_url(self):
@@ -46,3 +80,17 @@
     """The master page template macro."""
     # register this view for all objects
     grok.context(Interface)
+
+class Login(grok.View):
+    grok.context(Interface)
+
+    def update(self, login_submit=None):
+        if (not IUnauthenticatedPrincipal.providedBy(self.request.principal)
+            and login_submit is not None):
+            camefrom = self.request.get('camefrom', '.')
+            self.redirect(camefrom)
+
+class Logout(grok.View):
+    grok.context(Interface)
+    def render(self):
+        return "This should log you out (but doesn't yet)."

Added: Sandbox/luciano/kirbi/src/kirbi/app_templates/login.pt
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/app_templates/login.pt	                        (rev 0)
+++ Sandbox/luciano/kirbi/src/kirbi/app_templates/login.pt	2007-08-17 03:22:12 UTC (rev 78892)
@@ -0,0 +1,22 @@
+<html metal:use-macro="context/@@master/page">
+<body>
+<div metal:fill-slot="body">
+
+Login
+
+<form action="" tal:attributes="action request/URL" method="post">
+
+  <input type="text" name="login" id="login" />
+
+  <input type="password" name="password" id="password" />
+
+  <input type="hidden" name="camefrom"
+         tal:attributes="value request/camefrom | nothing">
+
+  <input type="submit" name="login_submit" value="Log in" />
+
+</form>
+
+</div>
+</body>
+</html>

Modified: Sandbox/luciano/kirbi/src/kirbi/user.py
===================================================================
--- Sandbox/luciano/kirbi/src/kirbi/user.py	2007-08-17 02:48:16 UTC (rev 78891)
+++ Sandbox/luciano/kirbi/src/kirbi/user.py	2007-08-17 03:22:12 UTC (rev 78892)
@@ -2,8 +2,8 @@
 from interfaces import IUser
 from zope.app.authentication.interfaces import IPrincipalInfo
 from zope.app.authentication.interfaces import IAuthenticatorPlugin
+from zope.app.security.interfaces import IUnauthenticatedPrincipal
 from zope.interface import Interface, implements, invariant, Invalid
-from zope import schema
 import sha
 import app
 
@@ -106,16 +106,6 @@
     def update(self, query=None):
         self.results_title = '%d users' % len(self.context)
 
-class Login(grok.View):
-    grok.context(UserFolder)
-    def render(self):
-        return 'This should log you in...'
-
-class Logout(grok.View):
-    grok.context(UserFolder)
-    def render(self):
-        return "This should log you out (but doesn't yet)."
-
 class Join(grok.AddForm):
     """User registration form"""
     grok.context(UserFolder)
@@ -127,8 +117,19 @@
     ### XXX: find out how to display message of the Invalid exception raised
     ### by the password confirmation invariant (see interfaces.IUser)
     @grok.action('Save')
-    def add(self, **data):
+    def join(self, **data):
         login = data['login']
         self.context[login] = User(**data)
+    
+        #XXX: change this to use our User class instead of the InternalPrincipal
+        # add principal to principal folder
+        pau = component.getUtility(IAuthentication)
+        principals = pau['principals']
+        principals[email] = InternalPrincipal(login, password, name)
+
+        # assign role to principal
+        role_manager = IPrincipalRoleManager(self.context)
+        role_manager.assignRoleToPrincipal('kirbi.Owner',
+                                           principals.prefix + login)
         self.redirect(self.url(login))
 



More information about the Checkins mailing list