[Checkins] SVN: z3c.authviewlet/trunk/ Moved files in ``z3c.authviewlet.browser`` to ``z3c.authviewlet`` as we only have browser code in this package.

Michael Howitz mh at gocept.com
Sat Dec 26 08:54:06 EST 2009


Log message for revision 107088:
  Moved files in ``z3c.authviewlet.browser`` to ``z3c.authviewlet`` as we only have browser code in this package.
  

Changed:
  U   z3c.authviewlet/trunk/CHANGES.txt
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/auth.py
  D   z3c.authviewlet/trunk/src/z3c/authviewlet/browser/
  D   z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/login_failed.pt
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/login_success.pt
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/logout.pt
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/logout_head.pt
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/redirect.pt
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/redirect_head.pt
  A   z3c.authviewlet/trunk/src/z3c/authviewlet/session_cred_loginform.pt
  U   z3c.authviewlet/trunk/src/z3c/authviewlet/tests/ftesting.zcml

-=-
Modified: z3c.authviewlet/trunk/CHANGES.txt
===================================================================
--- z3c.authviewlet/trunk/CHANGES.txt	2009-12-26 13:28:52 UTC (rev 107087)
+++ z3c.authviewlet/trunk/CHANGES.txt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -1,24 +1,25 @@
-=======
-Changes
-=======
-
+=======
+Changes
+=======
+
 0.6.1 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- Moved files in ``z3c.authviewlet.browser`` to ``z3c.authviewlet`` as
+  we only have browser code in this package.
 
 
 0.6.0 (2009-12-24)
-------------------
-
-- Added `i18n domains` to allow translation (done in `z3c.locales` package).
-
-0.5.0 (2009-11-30)
-------------------
-
-- Moved authentication viewlet implementation from `z3c.layer.pagelet`
-  to this package. Not sure but probably we should skip the dependency
-  to ``zope.app.publisher.interfaces.http`` and use and define own
-  interfaces.
-
-- Initial release.
+------------------
+
+- Added `i18n domains` to allow translation (done in `z3c.locales` package).
+
+0.5.0 (2009-11-30)
+------------------
+
+- Moved authentication viewlet implementation from `z3c.layer.pagelet`
+  to this package. Not sure but probably we should skip the dependency
+  to ``zope.app.publisher.interfaces.http`` and use and define own
+  interfaces.
+
+- Initial release.

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/auth.py (from rev 107020, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/auth.py)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/auth.py	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/auth.py	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,175 @@
+##############################################################################
+#
+# Copyright (c) 2003-2009 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Login and Logout screens
+
+$Id:$
+"""
+import urllib
+import z3c.pagelet.interfaces
+import zope.app.publisher.interfaces.http
+import zope.authentication.interfaces
+import zope.component
+import zope.i18n
+import zope.i18nmessageid
+import zope.interface
+import zope.viewlet.interfaces
+import zope.viewlet.manager
+import zope.viewlet.viewlet
+
+_ = zope.i18nmessageid.MessageFactory("z3c")
+
+
+class ILoginLogoutHeadViewletManager(zope.viewlet.interfaces.IViewletManager):
+    """ViewletManager for supporting header contents (e. g. JavaScript)."""
+
+
+LoginLogoutHeadViewletManager = zope.viewlet.manager.ViewletManager(
+    'login-logout-head', ILoginLogoutHeadViewletManager)
+
+
+class ILoginLogoutViewletManager(zope.viewlet.interfaces.IViewletManager):
+    """ViewletManager for login and logout viewlets."""
+
+
+LoginLogoutViewletManager = zope.viewlet.manager.ViewletManager(
+    'login-logout', ILoginLogoutViewletManager,
+    bases=(zope.viewlet.manager.ConditionalViewletManager,))
+
+
+def authenticated(principal):
+    "Tell whether the principal is authenticated."
+    unauthenticated = zope.authentication.interfaces.IUnauthenticatedPrincipal
+    return not unauthenticated.providedBy(principal)
+
+
+def logout_supported(request):
+    "Tell whether logout is supported."
+    logout = zope.authentication.interfaces.ILogoutSupported(request, None)
+    return logout is not None
+
+
+def get_view_url(context, request, view_name):
+    "Compute the url of a view."
+    if view_name.startswith('@@'):
+        view_name = view_name[2:]
+        view_name_truncated = True
+    else:
+        view_name_truncated = False
+    view = zope.component.getMultiAdapter((context, request), name=view_name)
+    view_url = zope.component.getMultiAdapter(
+        (view, request), name='absolute_url')()
+    if view_name_truncated:
+        view_url = view_url.replace(view_name, '@@'+view_name)
+    return view_url
+
+
+def render_pagelet(context, request, view_name):
+    "Render a pagelet."
+    pagelet =  zope.component.getMultiAdapter(
+        (context, request), z3c.pagelet.interfaces.IPagelet, name=view_name)
+    return pagelet()
+
+
+class LoginViewlet(zope.viewlet.viewlet.ViewletBase):
+    """Display login link when user is not logged in."""
+
+    @property
+    def available(self):
+        return not authenticated(self.request.principal)
+
+    def render(self):
+        return u'<a href="%s?nextURL=%s">%s</a>' % (
+            get_view_url(self. context, self.request, self.viewName),
+            urllib.quote(self.request.getURL()),
+            zope.i18n.translate(_('[Login]', default='Login'),
+                                domain='z3c', context=self.request))
+
+
+class LogoutViewlet(zope.viewlet.viewlet.ViewletBase):
+    """Display logout link when user is logged in and logout is supported."""
+
+    @property
+    def available(self):
+        return (
+            authenticated(self.request.principal)
+            and
+            logout_supported(self.request))
+
+    def render(self):
+        return u'<a href="%s?nextURL=%s">%s</a>' % (
+            get_view_url(self. context, self.request, self.viewName),
+            urllib.quote(self.request.getURL()),
+            zope.i18n.translate(_('[Logout]', default='Logout'),
+                                domain='z3c',
+                                context=self.request))
+
+
+class HTTPAuthenticationLogin(object):
+
+    zope.interface.implements(zope.app.publisher.interfaces.http.ILogin)
+
+    def login(self, nextURL=None):
+        # we don't want to keep challenging if we're authenticated
+        if not authenticated(self.request.principal):
+            auth = zope.component.getUtility(
+                zope.authentication.interfaces.IAuthentication)
+            auth.unauthorized(
+                self.request.principal.id, self.request)
+            return render_pagelet(self, self.request, 'login_failed.html')
+        else:
+            if nextURL is None:
+                return render_pagelet(self, self.request, 'login_success.html')
+            else:
+                self.request.response.redirect(nextURL)
+
+
+class LoginFailedPagelet(object):
+    "Pagelet to display login failed notice."
+
+
+class LoginSuccessfulPagelet(object):
+    "Pagelet to display login succecc notice."
+
+
+class HTTPAuthenticationLogout(object):
+    """Since HTTP Authentication really does not know about logout, we are
+    simply challenging the client again."""
+
+    zope.interface.implements(zope.authentication.interfaces.ILogout)
+
+    def logout(self, nextURL=None):
+        if authenticated(self.request.principal):
+            auth = zope.component.getUtility(
+                zope.authentication.interfaces.IAuthentication)
+            zope.authentication.interfaces.ILogout(auth).logout(self.request)
+            if nextURL:
+                return render_pagelet(self, self.request, 'redirect.html')
+        if nextURL is None:
+            return render_pagelet(self, self.request, 'logout_success.html')
+        else:
+            return self.request.response.redirect(nextURL)
+
+
+class LogoutRedirectPagelet(object):
+    "Pagelet to display logout redirect."
+
+
+class LogoutSuccessPagelet(object):
+    "Pagelet to display logout success."
+
+
+class SessionCredentialsLoginForm(object):
+    "Login form using session credentials."
+
+

Deleted: z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml	2009-12-26 13:28:52 UTC (rev 107087)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml	2009-12-26 13:54:06 UTC (rev 107088)
@@ -1,7 +0,0 @@
-<configure
-    xmlns="http://namespaces.zope.org/zope"
-    i18n_domain="z3c">
-
-  <include package=".browser" />
-
-</configure>

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml (from rev 107019, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/configure.zcml)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/configure.zcml	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,170 @@
+<configure
+   xmlns="http://namespaces.zope.org/zope"
+   xmlns:browser="http://namespaces.zope.org/browser"
+   xmlns:z3c="http://namespaces.zope.org/z3c"
+   i18n_domain="z3c">
+
+  <!-- viewlets in head tag supporting login and logout
+       (viewlets are defined together with the pagelets below) -->
+  <browser:viewletManager
+     provides=".auth.ILoginLogoutHeadViewletManager"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="login-logout-head"
+     class=".auth.LoginLogoutHeadViewletManager"
+     permission="zope.Public"
+     />
+
+  <!-- viewlet manager and viewlets for login and logout links -->
+  <browser:viewletManager
+     provides=".auth.ILoginLogoutViewletManager"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="login-logout"
+     class=".auth.LoginLogoutViewletManager"
+     permission="zope.Public"
+     />
+
+  <browser:viewlet
+     manager=".auth.ILoginLogoutViewletManager"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="Login"
+     class=".auth.LoginViewlet"
+     permission="zope.Public"
+     weight="1"
+     viewName="@@login.html"
+     />
+
+  <browser:viewlet
+     manager=".auth.ILoginLogoutViewletManager"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="Logout"
+     class=".auth.LogoutViewlet"
+     permission="zope.Public"
+     weight="2"
+     viewName="@@logout.html"
+     />
+
+  <!-- login page (executing login and redirecting user) -->
+  <browser:page
+     for="*"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="login.html"
+     class=".auth.HTTPAuthenticationLogin"
+     attribute="login"
+     allowed_interface="zope.app.publisher.interfaces.http.ILogin"
+     permission="zope.Public"
+     />
+
+  <!-- login form for session credentials  -->
+  <z3c:pagelet
+     for="*"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="loginForm.html"
+     class=".auth.SessionCredentialsLoginForm"
+     permission="zope.Public"
+     />
+
+  <z3c:template
+     for=".auth.SessionCredentialsLoginForm"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     template="session_cred_loginform.pt"
+     />
+
+  <!-- login failed -->
+  <z3c:pagelet
+     for=".auth.HTTPAuthenticationLogin"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="login_failed.html"
+     class=".auth.LoginFailedPagelet"
+     permission="zope.Public"
+     />
+
+  <z3c:template
+     for=".auth.LoginFailedPagelet"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     template="login_failed.pt"
+     />
+
+  <!-- login success confirmation -->
+  <z3c:pagelet
+     for=".auth.HTTPAuthenticationLogin"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="login_success.html"
+     class=".auth.LoginSuccessfulPagelet"
+     permission="zope.Public"
+     />
+
+  <z3c:template
+     for=".auth.LoginSuccessfulPagelet"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     template="login_success.pt"
+     />
+
+  <!-- logout page (executing logout and redirecting user) -->
+  <browser:page
+     for="*"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="logout.html"
+     class=".auth.HTTPAuthenticationLogout"
+     attribute="logout"
+     allowed_interface="zope.app.publisher.interfaces.http.ILogout"
+     permission="zope.Public"
+     />
+
+  <!-- redirecting logout confirmation -->
+  <z3c:pagelet
+     for=".auth.HTTPAuthenticationLogout"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="redirect.html"
+     class=".auth.LogoutRedirectPagelet"
+     permission="zope.Public"
+     />
+
+  <z3c:template
+     for=".auth.LogoutRedirectPagelet"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     template="redirect.pt"
+     />
+
+  <browser:viewlet
+     manager=".auth.ILoginLogoutHeadViewletManager"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     view=".auth.LogoutRedirectPagelet"
+     name="Redirect"
+     template="redirect_head.pt"
+     permission="zope.Public"
+     />
+
+  <browser:viewlet
+     manager=".auth.ILoginLogoutHeadViewletManager"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     view=".auth.LogoutRedirectPagelet"
+     name="Logout"
+     template="logout_head.pt"
+     permission="zope.Public"
+     />
+
+  <!-- not redirecting logout confirmation -->
+  <z3c:pagelet
+     for=".auth.HTTPAuthenticationLogout"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     name="logout_success.html"
+     class=".auth.LogoutSuccessPagelet"
+     permission="zope.Public"
+     />
+
+  <z3c:template
+     for=".auth.LogoutSuccessPagelet"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     template="logout.pt"
+     />
+
+  <browser:viewlet
+     manager=".auth.ILoginLogoutHeadViewletManager"
+     layer="z3c.layer.pagelet.IPageletBrowserLayer"
+     view=".auth.LogoutSuccessPagelet"
+     name="Logout"
+     template="logout_head.pt"
+     permission="zope.Public"
+     />
+
+</configure>

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/login_failed.pt (from rev 107020, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/login_failed.pt)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/login_failed.pt	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/login_failed.pt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,10 @@
+<div i18n:domain="z3c">
+  <h1 i18n:translate="">Login Failed!</h1>
+
+  <p style="font-size: 150%">
+    <tal:block
+       i18n:translate="">You cancelled the login procedure.</tal:block>
+    <a tal:attributes="href python: view.request.get('nextURL', '.')"
+       i18n:translate="">Click here to return.</a>
+  </p>
+</div>

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/login_success.pt (from rev 107020, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/login_success.pt)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/login_success.pt	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/login_success.pt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,9 @@
+<div i18n:domain="z3c">
+  <h1 i18n:translate="">Login successful!</h1>
+  <p style="font-size: 200%" i18n:translate="">
+    You are now logged in as
+    <em tal:content="view/request/principal/title"
+        i18n:name="UserTitle">Joe Smith</em>.
+  </p>
+  <a href="." i18n:translate="">Back to the main page.</a>
+</div>

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/logout.pt (from rev 107020, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/logout.pt)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/logout.pt	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/logout.pt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,8 @@
+<div i18n:domain="z3c">
+  <h1 i18n:translate="">Logout successful!</h1>
+
+  <p style="font-size: 200%" i18n:translate="">
+    You are now logged out.
+  </p>
+  <a href="." i18n:translate="">Back to the main page.</a>
+</div>

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/logout_head.pt (from rev 107019, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/logout_head.pt)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/logout_head.pt	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/logout_head.pt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,16 @@
+<script type="text/javascript"><!--
+  // clear HTTP Authentication
+  try {
+    if (window.XMLHttpRequest) {
+      var xmlhttp = new XMLHttpRequest();
+      // Send invalid credentials, then abort
+      xmlhttp.open("GET", "@@", true, "logout", "logout");
+      xmlhttp.send("");
+      xmlhttp.abort();
+    } else if (document.execCommand) {
+      // IE specific command
+      document.execCommand("ClearAuthenticationCache");
+    }
+  } catch(e) { }
+  //-->
+</script>

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/redirect.pt (from rev 107020, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/redirect.pt)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/redirect.pt	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/redirect.pt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,9 @@
+<div i18n:domain="z3c">
+  <h1 i18n:translate="">You are being redirected!</h1>
+
+  <p style="font-size: 150%">
+    <a tal:attributes="href view/request/nextURL" i18n:translate="">
+      If you see this screen for more than 5 seconds, click here.
+    </a>
+  </p>
+</div>

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/redirect_head.pt (from rev 107019, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/redirect_head.pt)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/redirect_head.pt	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/redirect_head.pt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,2 @@
+<meta http-equiv="refresh" content="0;url=./"
+      tal:attributes="content string:0;;url=${request/nextURL}" />

Copied: z3c.authviewlet/trunk/src/z3c/authviewlet/session_cred_loginform.pt (from rev 107020, z3c.authviewlet/trunk/src/z3c/authviewlet/browser/session_cred_loginform.pt)
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/session_cred_loginform.pt	                        (rev 0)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/session_cred_loginform.pt	2009-12-26 13:54:06 UTC (rev 107088)
@@ -0,0 +1,37 @@
+<div i18n:domain="z3c"
+     tal:define="principal python:request.principal.id">
+  <p i18n:translate=""
+     tal:condition="python: principal == 'zope.anybody'">
+    Please provide Login Information
+  </p>
+  <p i18n:translate=""
+     tal:condition="python: principal != 'zope.anybody'">
+    You are not authorized to perform this action. However, you may login as a
+    different user who is authorized.
+  </p>
+  <form action="" method="post">
+    <div tal:omit-tag=""
+         tal:condition="python:principal != 'zope.anybody' and 'SUBMIT' in request">
+      <span tal:define="dummy python:request.response.redirect(request.get('camefrom', ''))" />
+    </div>
+    <div class="row">
+      <div class="label"><label for="login" i18n:translate="">User Name</label></div>
+      <div class="field">
+        <input type="text" name="login" id="login" />
+      </div>
+    </div>
+
+    <div class="row">
+      <div class="label"><label for="password" i18n:translate="">Password</label></div>
+      <div class="field">
+        <input type="password" name="password" id="password" />
+      </div>
+    </div>
+
+    <div class="row">
+      <input class="form-element" type="submit"
+             name="SUBMIT" value="Log in" i18n:attributes="value login-button" />
+    </div>
+    <input type="hidden" name="camefrom" tal:attributes="value request/camefrom | nothing">
+  </form>
+</div>

Modified: z3c.authviewlet/trunk/src/z3c/authviewlet/tests/ftesting.zcml
===================================================================
--- z3c.authviewlet/trunk/src/z3c/authviewlet/tests/ftesting.zcml	2009-12-26 13:28:52 UTC (rev 107087)
+++ z3c.authviewlet/trunk/src/z3c/authviewlet/tests/ftesting.zcml	2009-12-26 13:54:06 UTC (rev 107088)
@@ -40,13 +40,13 @@
 
   <!-- use tempate with head slot for logout pagelets -->
   <z3c:layout
-      for="z3c.authviewlet.browser.auth.LogoutRedirectPagelet"
+      for="z3c.authviewlet.auth.LogoutRedirectPagelet"
       layer="z3c.layer.pagelet.IPageletBrowserLayer"
       template="login-logout-template.pt"
       />
 
   <z3c:layout
-      for="z3c.authviewlet.browser.auth.LogoutSuccessPagelet"
+      for="z3c.authviewlet.auth.LogoutSuccessPagelet"
       layer="z3c.layer.pagelet.IPageletBrowserLayer"
       template="login-logout-template.pt"
       />



More information about the checkins mailing list