[Checkins] SVN: zope.password/trunk/ Keep things backwards compatible by creating an extended interface.

Martijn Pieters mj at zopatista.com
Sun Feb 20 09:30:59 EST 2011


Log message for revision 120463:
  Keep things backwards compatible by creating an extended interface.
  
  By moving the match method to a IMatchingPasswordManager, we keep the original interface unchanged and thus backwards compatible. Users of zope.password that require the new functionality can test for the new interface.

Changed:
  U   zope.password/trunk/CHANGES.txt
  U   zope.password/trunk/README.txt
  U   zope.password/trunk/setup.py
  U   zope.password/trunk/src/zope/password/configure.zcml
  U   zope.password/trunk/src/zope/password/interfaces.py
  U   zope.password/trunk/src/zope/password/legacy.py
  U   zope.password/trunk/src/zope/password/password.py
  U   zope.password/trunk/src/zope/password/testing.py

-=-
Modified: zope.password/trunk/CHANGES.txt
===================================================================
--- zope.password/trunk/CHANGES.txt	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/CHANGES.txt	2011-02-20 14:30:59 UTC (rev 120463)
@@ -2,12 +2,13 @@
 CHANGES
 =======
 
-4.0.0 (unreleased)
+3.7.0 (unreleased)
 ------------------
 
-- Add a 'match' method to the IPasswordManager interface, which returns True
-  if a given password hash was encdoded with the scheme implemented by the
-  specific manager.
+- Add a new IMatchingPasswordManager interface with a 'match' method, which
+  returns True if a given password hash was encdoded with the scheme
+  implemented by the specific manager. All managers in this package implement
+  this interface.
 
 - Use {SHA} as the prefix for SHA1-encoded passwords to be compatible with
   RFC 2307, but support matching against {SHA1} for backwards compatibility.

Modified: zope.password/trunk/README.txt
===================================================================
--- zope.password/trunk/README.txt	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/README.txt	2011-02-20 14:30:59 UTC (rev 120463)
@@ -39,7 +39,7 @@
 
 It's very easy to use password managers. The
 ``zope.password.interfaces.IPasswordManager`` interface defines only
-three methods::
+two methods::
 
   def encodePassword(password):
       """Return encoded data for the given password"""
@@ -47,6 +47,9 @@
   def checkPassword(encoded_password, password):
       """Return whether the given encoded data coincide with the given password"""
 
+An extended interface, ``zope.password.interfaces.IMatchingPasswordManager``,
+adds one additional method::
+
   def match(encoded_password):
       """
       Returns True when the given data was encoded with the scheme

Modified: zope.password/trunk/setup.py
===================================================================
--- zope.password/trunk/setup.py	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/setup.py	2011-02-20 14:30:59 UTC (rev 120463)
@@ -17,7 +17,7 @@
 
 
 setup(name='zope.password',
-      version='4.0.0dev',
+      version='3.7.0dev',
       author='Zope Foundation and Contributors',
       author_email='zope-dev at zope.org',
       description='Password encoding and checking utilities',

Modified: zope.password/trunk/src/zope/password/configure.zcml
===================================================================
--- zope.password/trunk/src/zope/password/configure.zcml	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/src/zope/password/configure.zcml	2011-02-20 14:30:59 UTC (rev 120463)
@@ -5,38 +5,38 @@
 
   <utility
       name="Plain Text"
-      provides=".interfaces.IPasswordManager"
+      provides=".interfaces.IMatchingPasswordManager"
       factory=".password.PlainTextPasswordManager"
       />
 
   <utility
       name="MD5"
-      provides=".interfaces.IPasswordManager"
+      provides=".interfaces.IMatchingPasswordManager"
       factory=".password.MD5PasswordManager"
       />
 
   <utility
       name="SHA1"
-      provides=".interfaces.IPasswordManager"
+      provides=".interfaces.IMatchingPasswordManager"
       factory=".password.SHA1PasswordManager"
       />
 
   <utility
       name="SSHA"
-      provides=".interfaces.IPasswordManager"
+      provides=".interfaces.IMatchingPasswordManager"
       factory=".password.SSHAPasswordManager"
       />
 
   <utility
       name="MYSQL"
-      provides=".interfaces.IPasswordManager"
+      provides=".interfaces.IMatchingPasswordManager"
       factory=".legacy.MySQLPasswordManager"
       />
 
   <configure zcml:condition="installed crypt">
   <utility
       name="Crypt"
-      provides=".interfaces.IPasswordManager"
+      provides=".interfaces.IMatchingPasswordManager"
       factory=".legacy.CryptPasswordManager"
       />
   </configure>
@@ -50,23 +50,23 @@
   <configure zcml:condition="installed zope.security">
 
     <class class=".password.PlainTextPasswordManager">
-      <allow interface=".interfaces.IPasswordManager" />
+      <allow interface=".interfaces.IMatchingPasswordManager" />
     </class>
   
     <class class=".password.MD5PasswordManager">
-      <allow interface=".interfaces.IPasswordManager" />
+      <allow interface=".interfaces.IMatchingPasswordManager" />
     </class>
   
     <class class=".password.SHA1PasswordManager">
-      <allow interface=".interfaces.IPasswordManager" />
+      <allow interface=".interfaces.IMatchingPasswordManager" />
     </class>
   
     <class class=".password.SSHAPasswordManager">
-      <allow interface=".interfaces.IPasswordManager" />
+      <allow interface=".interfaces.IMatchingPasswordManager" />
     </class>
 
     <class class=".password.SSHAPasswordManager">
-      <allow interface=".interfaces.IPasswordManager" />
+      <allow interface=".interfaces.IMatchingPasswordManager" />
     </class>
 
   </configure>

Modified: zope.password/trunk/src/zope/password/interfaces.py
===================================================================
--- zope.password/trunk/src/zope/password/interfaces.py	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/src/zope/password/interfaces.py	2011-02-20 14:30:59 UTC (rev 120463)
@@ -24,6 +24,9 @@
     def checkPassword(encoded_password, password):
         """Does the given encoded data coincide with the given password"""
 
+class IMatchingPasswordManager(IPasswordManager):
+    """Password manager with hash matching support"""
+
     def match(encoded_password):
         """
         Returns True when the given data was encoded with the scheme

Modified: zope.password/trunk/src/zope/password/legacy.py
===================================================================
--- zope.password/trunk/src/zope/password/legacy.py	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/src/zope/password/legacy.py	2011-02-20 14:30:59 UTC (rev 120463)
@@ -25,7 +25,7 @@
     crypt = None
 
 from zope.interface import implements
-from zope.password.interfaces import IPasswordManager
+from zope.password.interfaces import IMatchingPasswordManager
 
 _encoder = getencoder("utf-8")
 
@@ -41,7 +41,7 @@
         >>> from zope.interface.verify import verifyObject
 
         >>> manager = CryptPasswordManager()
-        >>> verifyObject(IPasswordManager, manager)
+        >>> verifyObject(IMatchingPasswordManager, manager)
         True
 
         >>> password = u"right \N{CYRILLIC CAPITAL LETTER A}"
@@ -95,7 +95,7 @@
 
         """
 
-        implements(IPasswordManager)
+        implements(IMatchingPasswordManager)
 
         def encodePassword(self, password, salt=None):
             if salt is None:
@@ -122,7 +122,7 @@
     >>> from zope.interface.verify import verifyObject
 
     >>> manager = MySQLPasswordManager()
-    >>> verifyObject(IPasswordManager, manager)
+    >>> verifyObject(IMatchingPasswordManager, manager)
     True
 
     >>> password = u"right \N{CYRILLIC CAPITAL LETTER A}"
@@ -161,7 +161,7 @@
 
     """
 
-    implements(IPasswordManager)
+    implements(IMatchingPasswordManager)
 
     def encodePassword(self, password):
         nr = 1345345333L

Modified: zope.password/trunk/src/zope/password/password.py
===================================================================
--- zope.password/trunk/src/zope/password/password.py	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/src/zope/password/password.py	2011-02-20 14:30:59 UTC (rev 120463)
@@ -28,7 +28,7 @@
     from sha import new as sha1
 
 from zope.interface import implements
-from zope.password.interfaces import IPasswordManager
+from zope.password.interfaces import IMatchingPasswordManager
 
 _encoder = getencoder("utf-8")
 
@@ -39,7 +39,7 @@
     >>> from zope.interface.verify import verifyObject
 
     >>> manager = PlainTextPasswordManager()
-    >>> verifyObject(IPasswordManager, manager)
+    >>> verifyObject(IMatchingPasswordManager, manager)
     True
 
     >>> password = u"right \N{CYRILLIC CAPITAL LETTER A}"
@@ -61,7 +61,7 @@
     False
     """
 
-    implements(IPasswordManager)
+    implements(IMatchingPasswordManager)
 
     def encodePassword(self, password):
         return password
@@ -92,7 +92,7 @@
     >>> from zope.interface.verify import verifyObject
 
     >>> manager = SSHAPasswordManager()
-    >>> verifyObject(IPasswordManager, manager)
+    >>> verifyObject(IMatchingPasswordManager, manager)
     True
 
     >>> password = u"right \N{CYRILLIC CAPITAL LETTER A}"
@@ -145,8 +145,6 @@
 
     """
 
-    implements(IPasswordManager)
-
     def encodePassword(self, password, salt=None):
         if salt is None:
             salt = urandom(4)
@@ -176,7 +174,7 @@
     >>> from zope.interface.verify import verifyObject
 
     >>> manager = MD5PasswordManager()
-    >>> verifyObject(IPasswordManager, manager)
+    >>> verifyObject(IMatchingPasswordManager, manager)
     True
 
     >>> password = u"right \N{CYRILLIC CAPITAL LETTER A}"
@@ -222,8 +220,6 @@
 
     """
 
-    implements(IPasswordManager)
-
     def encodePassword(self, password, salt=None):
         if salt is None:
             salt = "%08x" % randint(0, 0xffffffff)
@@ -249,7 +245,7 @@
     >>> from zope.interface.verify import verifyObject
 
     >>> manager = SHA1PasswordManager()
-    >>> verifyObject(IPasswordManager, manager)
+    >>> verifyObject(IMatchingPasswordManager, manager)
     True
 
     >>> password = u"right \N{CYRILLIC CAPITAL LETTER A}"
@@ -308,8 +304,6 @@
 
     """
 
-    implements(IPasswordManager)
-
     def encodePassword(self, password, salt=None):
         if salt is None:
             salt = "%08x" % randint(0, 0xffffffff)

Modified: zope.password/trunk/src/zope/password/testing.py
===================================================================
--- zope.password/trunk/src/zope/password/testing.py	2011-02-20 13:59:02 UTC (rev 120462)
+++ zope.password/trunk/src/zope/password/testing.py	2011-02-20 14:30:59 UTC (rev 120463)
@@ -18,7 +18,7 @@
 from zope.component import provideUtility
 from zope.schema.interfaces import IVocabularyFactory
 
-from zope.password.interfaces import IPasswordManager
+from zope.password.interfaces import IMatchingPasswordManager
 from zope.password.password import PlainTextPasswordManager
 from zope.password.password import MD5PasswordManager
 from zope.password.password import SHA1PasswordManager
@@ -38,15 +38,15 @@
     >>> from zope.component import getUtility
     >>> setUpPasswordManagers()
 
-    >>> getUtility(IPasswordManager, 'Plain Text')
+    >>> getUtility(IMatchingPasswordManager, 'Plain Text')
     <zope.password.password.PlainTextPasswordManager object at 0x...>
-    >>> getUtility(IPasswordManager, 'SSHA')
+    >>> getUtility(IMatchingPasswordManager, 'SSHA')
     <zope.password.password.SSHAPasswordManager object at 0x...>
-    >>> getUtility(IPasswordManager, 'MD5')
+    >>> getUtility(IMatchingPasswordManager, 'MD5')
     <zope.password.password.MD5PasswordManager object at 0x...>
-    >>> getUtility(IPasswordManager, 'SHA1')
+    >>> getUtility(IMatchingPasswordManager, 'SHA1')
     <zope.password.password.SHA1PasswordManager object at 0x...>
-    >>> getUtility(IPasswordManager, 'MYSQL')
+    >>> getUtility(IMatchingPasswordManager, 'MYSQL')
     <zope.password.legacy.MySQLPasswordManager object at 0x...>
 
     >>> try:
@@ -55,8 +55,8 @@
     ...     CryptPasswordManager = None
     ...     True
     ... else:
-    ...     from zope.password.legacy import CryptPasswordManager
-    ...     getUtility(IPasswordManager, 'Crypt') is CryptPasswordManager
+    ...     from zope.password.legacy import CryptPasswordManager as cpm
+    ...     getUtility(IMatchingPasswordManager, 'Crypt') is cpm
     True
 
     >>> voc = getUtility(IVocabularyFactory, 'Password Manager Names')
@@ -78,14 +78,15 @@
     True
     
     """
-    provideUtility(PlainTextPasswordManager(), IPasswordManager, 'Plain Text')
-    provideUtility(SSHAPasswordManager(), IPasswordManager, 'SSHA')
-    provideUtility(MD5PasswordManager(), IPasswordManager, 'MD5')
-    provideUtility(SHA1PasswordManager(), IPasswordManager, 'SHA1')
-    provideUtility(MySQLPasswordManager(), IPasswordManager, 'MYSQL')
+    provideUtility(PlainTextPasswordManager(), IMatchingPasswordManager,
+                   'Plain Text')
+    provideUtility(SSHAPasswordManager(), IMatchingPasswordManager, 'SSHA')
+    provideUtility(MD5PasswordManager(), IMatchingPasswordManager, 'MD5')
+    provideUtility(SHA1PasswordManager(), IMatchingPasswordManager, 'SHA1')
+    provideUtility(MySQLPasswordManager(), IMatchingPasswordManager, 'MYSQL')
     
     if CryptPasswordManager is not None:
-        provideUtility(CryptPasswordManager, IPasswordManager, 'Crypt')
+        provideUtility(CryptPasswordManager, IMatchingPasswordManager, 'Crypt')
 
     provideUtility(PasswordManagerNamesVocabulary,
                    IVocabularyFactory, 'Password Manager Names')



More information about the checkins mailing list