All pastes #1637202 Raw Edit

plone.session-2.1 patch - secure

public diff v1 · immutable
#1637202 ·published 2009-10-22 13:59 UTC
rendered paste body
diff --exclude='*.pyc' --exclude='*.svn' -rupN plone.session-2.1/plone/session/interfaces.py plone.session/plone/session/interfaces.py--- plone.session-2.1/plone/session/interfaces.py	2009-02-04 23:22:36.000000000 +0000+++ plone.session/plone/session/interfaces.py	2009-10-20 15:31:16.000000000 +0100@@ -5,7 +5,7 @@ class ISessionPlugin(Interface):     Session handling PAS plugin.     """ -    def setupSession(userid, response):+    def setupSession(userid, response, request):         """         Start a new session for a userid. The session will last until         PAS indicates that the user has logged out.diff --exclude='*.pyc' --exclude='*.svn' -rupN plone.session-2.1/plone/session/plugins/session.py plone.session/plone/session/plugins/session.py--- plone.session-2.1/plone/session/plugins/session.py	2009-02-04 23:22:36.000000000 +0000+++ plone.session/plone/session/plugins/session.py	2009-10-20 16:44:48.000000000 +0100@@ -1,4 +1,7 @@-from DateTime import DateTime+# Add option to set secure bit for all session cookies sent over https+# TODO: Move to seperate PAS session plugin - use secure bit if selected and +# currently over https and allow dynamic path setting+ from Products.PageTemplates.PageTemplateFile import PageTemplateFile from Products.PluggableAuthService.plugins.BasePlugin import BasePlugin from Products.PluggableAuthService.utils import classImplements@@ -23,9 +26,9 @@ from Products.PluggableAuthService.permi manage_addSessionPluginForm = PageTemplateFile('session', globals())      -def manage_addSessionPlugin(dispatcher, id, title=None, path='/', REQUEST=None):+def manage_addSessionPlugin(dispatcher, id, title=None, path='/', REQUEST=None, secure=True):     """Add a session plugin."""-    sp=SessionPlugin(id, title=title, path=path)+    sp=SessionPlugin(id, title=title, path=path, secure=secure)     dispatcher._setObject(id, sp)      if REQUEST is not None:@@ -42,7 +45,6 @@ class SessionPlugin(BasePlugin):     meta_type = "Plone Session Plugin"     security = ClassSecurityInfo()     cookie_name = "__ac"-    cookie_lifetime = 0      _properties = (             {@@ -57,18 +59,13 @@ class SessionPlugin(BasePlugin):                 "type"  : "string",                 "mode"  : "w",             },-            {-                "id"    : "cookie_lifetime",-                "label" : "Cookie lifetime (in days)",-                "type"  : "int",-                "mode"  : "w",-            },             ) -    def __init__(self, id, title=None, path="/"):+    def __init__(self, id, title=None, path="/", secure=True):         self._setId(id)         self.title=title         self.path=path+        self.secure=secure      @property     def source(self):@@ -89,16 +86,29 @@ class SessionPlugin(BasePlugin):       # ISessionPlugin implementation-    security.declareProtected(ManageUsers, 'setupSession')-    def setupSession(self, userid, response):+    def setupSession(self, userid, response, request):+        #self.plone_log('setupSession: START')+                 cookie=self.source.createIdentifier(userid)         cookie=binascii.b2a_base64(cookie).rstrip()--        if isinstance(self.cookie_lifetime, int) and self.cookie_lifetime:-            expires = (DateTime() + self.cookie_lifetime).toZone('GMT').rfc822()-            response.setCookie(self.cookie_name, cookie, path=self.path, expires=expires)+        secure = False+         +        if self.secure:++            s_url = request.get('SERVER_URL', None)+            +            #self.plone_log("setupSession: SERVER_URL: %s" % s_url)+            +            #Only set secure bit of cookie if currently over https+            if s_url is not None and s_url.startswith('https'):+                secure = True+        +        if secure:+            response.setCookie(self.cookie_name, cookie, path=self.path, secure=True)         else:             response.setCookie(self.cookie_name, cookie, path=self.path)+            +        #self.plone_log('setupSession: END')       # IExtractionPlugin implementation@@ -139,11 +149,16 @@ class SessionPlugin(BasePlugin):      # ICredentialsUpdatePlugin implementation     def updateCredentials(self, request, response, login, new_password):+        #self.plone_log('updateCredentials: START')+                 pas=self._getPAS()         info=pas._verifyUser(pas.plugins, login=login)         if info is not None:             # Only setup a session for users in our own user folder.-            self.setupSession(info["id"], response)+            self.setupSession(info["id"], response, request)+            +        #self.plone_log('updateCredentials: END')+           # ICredentialsResetPlugin implementationdiff --exclude='*.pyc' --exclude='*.svn' -rupN plone.session-2.1/plone/session/plugins/session.zpt plone.session/plone/session/plugins/session.zpt--- plone.session-2.1/plone/session/plugins/session.zpt	2009-02-04 23:22:36.000000000 +0000+++ plone.session/plone/session/plugins/session.zpt	2009-10-20 16:10:48.000000000 +0100@@ -42,6 +42,16 @@     </tr>     <tr>       <td align="left" valign="top">+        <div class="form-optional">+          Cookie Secure+        </div>+      </td>+      <td align="left" valign="top">+        <input type="checkbox" name="secure:boolean" checked="1" />+      </td>+    </tr>        +    <tr>+      <td align="left" valign="top">       </td>       <td align="left" valign="top">         <div class="form-element">