Thread: SF.net SVN: fclient: [307] trunk/sandbox/fcp2/key.py
Status: Pre-Alpha
Brought to you by:
jurner
|
From: <ju...@us...> - 2008-03-04 17:38:15
|
Revision: 307
http://fclient.svn.sourceforge.net/fclient/?rev=307&view=rev
Author: jurner
Date: 2008-03-04 09:38:18 -0800 (Tue, 04 Mar 2008)
Log Message:
-----------
new key module providing more in depth handling of freenet keys
Added Paths:
-----------
trunk/sandbox/fcp2/key.py
Added: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py (rev 0)
+++ trunk/sandbox/fcp2/key.py 2008-03-04 17:38:18 UTC (rev 307)
@@ -0,0 +1,272 @@
+"""Fcp keys"""
+
+import os, sys
+import base64
+import re
+import urlparse
+
+#--> rel import hack
+class _RelImportHack(object):
+ def __init__(self, n):
+ fpath = os.path.abspath(__file__)
+ for i in xrange(n): fpath = os.path.dirname(fpath)
+ sys.path.insert(0, fpath)
+ def __del__(self): sys.path.pop(0)
+hack = _RelImportHack(2)
+
+from fcp2 import consts
+
+
+del hack
+#<-- rel import hack
+#**************************************************************************************
+# consts
+#**************************************************************************************
+ReMatchExact = '\A%s\Z'
+
+#**************************************************************************************
+# freenet base64 for keys
+#**************************************************************************************
+def base64UrlsaveDecode(string):
+ """Decodes a base64 urlsave encoded string as encoded by freenet
+ @param string: string to decode
+ @return: decoded string
+
+ @raise TypeError: if the string can not be decoded
+ @note: this function handles non-standard encoding as used by freenet (see: freenet/src/support/base64.java)
+ """
+ # freenet uses - for + and ~ for /
+ altchars = '-~'
+
+ # padding may be ommitted or not
+ padding = 4 - len(string) % 4
+ if padding:
+ string += '=' * padding
+ return base64.b64decode(string, altchars)
+
+
+def stripKey(key):
+ """Strips all uri stuff from a key
+ @param key: (str) key to strip
+ @return: (str) key
+ """
+ return urlparse.urlsplit(key)[2]
+
+#****************************************************************************************
+# freenet keys
+#
+# KeyType@32 bytes hash, 32 bytes encryption key, 5 bytes extra
+#
+# all byte components are base64 encoded. Freenet uses base64 without padding
+# along with the following altchars for urlsave encode: - for + and ~ for /
+# see: freenet/support/base64.java
+#
+# so a key as the user gets it to see is:
+# KeyType@43 bytes, 43 bytes, 7 bytes ..of [A-Za-z0-9\-~]
+#
+# see: [freenet/src/support/base64.java]
+#
+#***************************************************************************************
+class KeyBase(object):
+ """
+ >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
+ >>> key.pythonToFcp()
+ 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
+ >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
+ >>> key.pythonToFcp()
+ 'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
+
+ >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
+ >>> key.pythonToFcp()
+ 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
+ >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
+ >>> key.pythonToFcp()
+ 'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
+
+ >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0')
+ >>> key.pythonToFcp()
+ 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
+ >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/')
+ >>> key.pythonToFcp()
+ 'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
+
+ >>> key = KeyBase.fcpToPython('KSK@abcde')
+ >>> key.pythonToFcp()
+ 'KSK@abcde/'
+ >>> key = KeyBase.fcpToPython('KSK@abcde/')
+ >>> key.pythonToFcp()
+ 'KSK@abcde/'
+
+ """
+
+ KeyTypesAll = {}
+
+ @classmethod
+ def fcpToPython(clss, string):
+ key = stripKey(string)
+ for clssKeyType in clss.KeyTypesAll.values():
+ result = clssKeyType.fromString(key)
+ if result is not None:
+ return result
+
+
+
+class CHK(KeyBase):
+ """"""
+ _key_pattern_ = '''
+ (?P<keyType>CHK@)
+ (?P<keyData>
+ (?P<hash>[a-z0-9\-~]{43}),
+ (?P<cryptoKey>[a-z0-9\-~]{43}),
+ (?P<extra>[a-z0-9\-~]{7})
+ )
+ (?: / (?P<filename>[^/]+?) (?: /)?)?
+ '''
+ KeyType = consts.KeyType.CHK
+ KeyPattern = re.compile(_key_pattern_, re.I | re.X)
+ ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
+
+ def __init__(self, filename=None):
+ """Creates a CHK key
+
+ @param filename: (str) filename to add to the key or None
+ """
+ self.keyData = None
+ self.filename = filename
+
+ def pythonToFcp(self):
+ out = self.KeyType
+ if self.keyData is not None:
+ out += self.keyData + '/'
+ if self.filename is not None:
+ out += self.filename + '/'
+ return out
+
+ @classmethod
+ def fromString(clss, string):
+ result = clss.ExactKeyPattern.match(string)
+ if result is not None:
+ d = result.groupdict()
+ clss = clss(filename=d['filename'])
+ clss.keyData = d['keyData']
+ return clss
+
+
+KeyBase.KeyTypesAll[CHK.KeyType] = CHK
+
+
+class SSK(KeyBase):
+ _key_pattern_ = '''
+ (?P<keyType>SSK@)
+ (?P<keyData>
+ (?P<hash>[a-z0-9\-~]{43}),
+ (?P<cryptoKey>[a-z0-9\-~]{43}),
+ (?P<extra>[a-z0-9\-~]{7})
+ )
+ (?: / (?P<filename>[^/]+?))
+ (?: /)?
+ '''
+ KeyType = consts.KeyType.SSK
+ KeyPattern = re.compile(_key_pattern_, re.I | re.X)
+ ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
+
+ def __init__(self, keyData, filename):
+ self.filename = filename
+ self.keyData = keyData
+
+ def pythonToFcp(self):
+ out = self.KeyType
+ if self.keyData is not None:
+ out += self.keyData + '/'
+ if self.filename is not None:
+ out += self.filename + '/'
+ return out
+
+ @classmethod
+ def fromString(clss, string):
+ result = clss.ExactKeyPattern.match(string)
+ if result is not None:
+ d = result.groupdict()
+ return clss(d['keyData'], d['filename'])
+
+KeyBase.KeyTypesAll[SSK.KeyType] = SSK
+
+
+class KSK(KeyBase):
+ _key_pattern_ = '''
+ (?P<keyType>KSK@)
+ (?P<filename>[^/]+?)
+ (?: /)?
+ '''
+ KeyType = consts.KeyType.KSK
+ KeyPattern = re.compile(_key_pattern_, re.I | re.X)
+ ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
+
+
+ def __init__(self, filename):
+ self.filename = filename
+
+ def pythonToFcp(self):
+ out = self.KeyType
+ if self.filename is not None:
+ out += self.filename + '/'
+ return out
+
+ @classmethod
+ def fromString(clss, string):
+ result = clss.ExactKeyPattern.match(string)
+ if result is not None:
+ d = result.groupdict()
+ clss = clss(filename=d['filename'])
+ return clss
+
+
+KeyBase.KeyTypesAll[KSK.KeyType] = KSK
+
+
+class USK(KeyBase):
+ _key_pattern_ = '''
+ (?P<keyType>USK@)
+ (?P<keyData>
+ (?P<hash>[a-z0-9\-~]{43}),
+ (?P<cryptoKey>[a-z0-9\-~]{43}),
+ (?P<extra>[a-z0-9\-~]{7})
+ )
+ (?: / (?P<filename>[^/]+?) )
+ (?: / (?P<edition>[\d]+))
+ (?: /)?
+ '''
+
+ KeyType = consts.KeyType.USK
+ KeyPattern = re.compile(_key_pattern_, re.I | re.X)
+ ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
+
+ def __init__(self, keyData, filename, edition=0):
+ self.edition = edition
+ self.filename = filename
+ self.keyData = keyData
+
+ def pythonToFcp(self):
+ out = self.KeyType
+ if self.keyData is not None:
+ out += self.keyData + '/'
+ if self.filename is not None:
+ out += self.filename + '/'
+ if self.edition is not None:
+ out += self.edition + '/'
+ return out
+
+ @classmethod
+ def fromString(clss, string):
+ result = clss.ExactKeyPattern.match(string)
+ if result is not None:
+ d = result.groupdict()
+ return clss(d['keyData'], d['filename'], edition=d['edition'])
+
+KeyBase.KeyTypesAll[USK.KeyType] = USK
+#*****************************************************************************
+#
+#*****************************************************************************
+if __name__ == '__main__':
+ import doctest
+ doctest.testmod()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-03-11 11:19:43
|
Revision: 365
http://fclient.svn.sourceforge.net/fclient/?rev=365&view=rev
Author: jUrner
Date: 2008-03-11 04:19:48 -0700 (Tue, 11 Mar 2008)
Log Message:
-----------
this and that
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-03-11 11:19:16 UTC (rev 364)
+++ trunk/sandbox/fcp2/key.py 2008-03-11 11:19:48 UTC (rev 365)
@@ -109,8 +109,13 @@
if result is not None:
return result
+
+ def toString(self):
+ """Returns the key as string"""
+ return self.pythonToFcp()
+
+
-
class CHK(KeyBase):
""""""
_key_pattern_ = '''
@@ -242,6 +247,12 @@
ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
def __init__(self, keyData, filename, edition=0):
+ """Creates a USK key
+ @param keyData: (str) public key
+ @param filename: (str) filename
+ @param edition: (int) edition number
+ """
+
self.edition = edition
self.filename = filename
self.keyData = keyData
@@ -253,7 +264,7 @@
if self.filename is not None:
out += self.filename + '/'
if self.edition is not None:
- out += self.edition + '/'
+ out += str(self.edition) + '/'
return out
@classmethod
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-04-09 08:04:38
|
Revision: 389
http://fclient.svn.sourceforge.net/fclient/?rev=389&view=rev
Author: jUrner
Date: 2008-04-09 01:04:37 -0700 (Wed, 09 Apr 2008)
Log Message:
-----------
metaclass fun for keys
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-04-09 08:03:56 UTC (rev 388)
+++ trunk/sandbox/fcp2/key.py 2008-04-09 08:04:37 UTC (rev 389)
@@ -23,6 +23,7 @@
# consts
#**************************************************************************************
ReMatchExact = '\A%s\Z'
+KeyTypesAll = {}
#**************************************************************************************
# freenet base64 for keys
@@ -67,8 +68,21 @@
# see: [freenet/src/support/base64.java]
#
#***************************************************************************************
+class KeyMeta(type):
+ """Metaclass for freenet keys"""
+
+ def __new__(klass, name, bases, kws):
+ newClass = type.__new__(klass, name, bases, kws)
+ if newClass.KeyType is not None:
+ KeyTypesAll[newClass.KeyType] = newClass
+ return newClass
+
+#**************************************************************************************
+#
+#**************************************************************************************
class KeyBase(object):
- """
+ """Base class for freenet keys
+
>>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
>>> key.pythonToFcp()
'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
@@ -99,12 +113,13 @@
"""
- KeyTypesAll = {}
+ __metaclass__ = KeyMeta
+ KeyType = None
@classmethod
def fcpToPython(clss, string):
key = stripKey(string)
- for clssKeyType in clss.KeyTypesAll.values():
+ for clssKeyType in KeyTypesAll.values():
result = clssKeyType.fromString(key)
if result is not None:
return result
@@ -157,9 +172,6 @@
return clss
-KeyBase.KeyTypesAll[CHK.KeyType] = CHK
-
-
class SSK(KeyBase):
_key_pattern_ = '''
(?P<keyType>SSK@)
@@ -194,9 +206,7 @@
d = result.groupdict()
return clss(d['keyData'], d['filename'])
-KeyBase.KeyTypesAll[SSK.KeyType] = SSK
-
class KSK(KeyBase):
_key_pattern_ = '''
(?P<keyType>KSK@)
@@ -226,9 +236,6 @@
return clss
-KeyBase.KeyTypesAll[KSK.KeyType] = KSK
-
-
class USK(KeyBase):
_key_pattern_ = '''
(?P<keyType>USK@)
@@ -274,7 +281,6 @@
d = result.groupdict()
return clss(d['keyData'], d['filename'], edition=d['edition'])
-KeyBase.KeyTypesAll[USK.KeyType] = USK
#*****************************************************************************
#
#*****************************************************************************
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-04-09 08:08:02
|
Revision: 390
http://fclient.svn.sourceforge.net/fclient/?rev=390&view=rev
Author: jUrner
Date: 2008-04-09 01:08:07 -0700 (Wed, 09 Apr 2008)
Log Message:
-----------
docs
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-04-09 08:04:37 UTC (rev 389)
+++ trunk/sandbox/fcp2/key.py 2008-04-09 08:08:07 UTC (rev 390)
@@ -72,6 +72,10 @@
"""Metaclass for freenet keys"""
def __new__(klass, name, bases, kws):
+ """Registers a key type to L{KeyTypesAll}
+ @note: if KeyType of the the key type is None it will not get registered
+ """
+
newClass = type.__new__(klass, name, bases, kws)
if newClass.KeyType is not None:
KeyTypesAll[newClass.KeyType] = newClass
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-04-09 21:27:03
|
Revision: 393
http://fclient.svn.sourceforge.net/fclient/?rev=393&view=rev
Author: jUrner
Date: 2008-04-09 14:26:57 -0700 (Wed, 09 Apr 2008)
Log Message:
-----------
looks like fiename part is optional in SSKs
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-04-09 21:09:58 UTC (rev 392)
+++ trunk/sandbox/fcp2/key.py 2008-04-09 21:26:57 UTC (rev 393)
@@ -184,8 +184,10 @@
(?P<cryptoKey>[a-z0-9\-~]{43}),
(?P<extra>[a-z0-9\-~]{7})
)
- (?: / (?P<filename>[^/]+?))
- (?: /)?
+ (
+ (?: / (?P<filename>[^/]+?))
+ (?: /)?
+ )?
'''
KeyType = consts.KeyType.SSK
KeyPattern = re.compile(_key_pattern_, re.I | re.X)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 10:57:32
|
Revision: 415
http://fclient.svn.sourceforge.net/fclient/?rev=415&view=rev
Author: jUrner
Date: 2008-06-29 03:57:31 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
added support to autoconvert fcp keys to python key
++ many changes and fixes
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-06-28 08:42:30 UTC (rev 414)
+++ trunk/sandbox/fcp2/key.py 2008-06-29 10:57:31 UTC (rev 415)
@@ -25,6 +25,9 @@
ReMatchExact = '\A%s\Z'
KeyTypesAll = {}
+# for testing, arbitrary but valid key data
+DummyKeyData = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA'
+
#**************************************************************************************
# freenet base64 for keys
#**************************************************************************************
@@ -51,7 +54,10 @@
@param key: (str) key to strip
@return: (str) key
"""
- return urlparse.urlsplit(key)[2]
+ result = urlparse.urlsplit(key)[2]
+ if result.startswith('/'):
+ result = result[1:]
+ return result
#****************************************************************************************
# freenet keys
@@ -84,56 +90,95 @@
#**************************************************************************************
#
#**************************************************************************************
-class KeyBase(object):
- """Base class for freenet keys
+class FcpTypeKey(object):
+ """key type for type conversions
- >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
+ >>> key.toString()
'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
+ >>> key.toString()
'CHK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo')
+ >>> key.toString()
'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/')
+ >>> key.toString()
'SSK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/'
- >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0')
+ >>> key.toString()
'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
- >>> key = KeyBase.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/')
+ >>> key.toString()
'USK@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,AAAAAAA/foo/0/'
- >>> key = KeyBase.fcpToPython('KSK@abcde')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('KSK@abcde')
+ >>> key.toString()
'KSK@abcde/'
- >>> key = KeyBase.fcpToPython('KSK@abcde/')
- >>> key.pythonToFcp()
+ >>> key = FcpTypeKey.fcpToPython('KSK@abcde/')
+ >>> key.toString()
'KSK@abcde/'
"""
-
- __metaclass__ = KeyMeta
- KeyType = None
-
+
@classmethod
def fcpToPython(clss, string):
+ """converts a fcp key to a python key
+ @param string: (str) fcp key
+ @return: python key object
+ @raise ValueError: if the string can not be converted
+ @note: use this method to convert an arbirary key to the corrosponding python key object
+ """
key = stripKey(string)
for clssKeyType in KeyTypesAll.values():
result = clssKeyType.fromString(key)
if result is not None:
return result
+ raise ValueError('Invalid key: %s' % string)
+ @classmethod
+ def pythonToFcp(self, key):
+ """returns the key as string
+ @return: (str) fcp key
+ """
+ return key.toString()
+
+
+
+def key(string):
+ """creates a key object from a string
+ @return: L{KeyBase}
+ """
+ return FcpTypeKey.fcpToPython(string)
- def toString(self):
- """Returns the key as string"""
- return self.pythonToFcp()
+#**************************************************************************************
+#
+#**************************************************************************************
+class KeyBase(object):
+ """Base class for freenet keys
+ """
+
+ __metaclass__ = KeyMeta
+ KeyType = None
+
+ def __eq__(self, other):
+ return self.toString() == other.toString()
+
+ def __ne__(self, other):
+ return self.pytoString() != other.toString()
+ @classmethod
+ def fromString(clss, string):
+ """should create a key object from a string
+ """
+ raise NotImplementedError()
+ def toString(self):
+ """should return the key as string"""
+ raise NotImplementedError()
+
class CHK(KeyBase):
""""""
@@ -144,21 +189,22 @@
(?P<cryptoKey>[a-z0-9\-~]{43}),
(?P<extra>[a-z0-9\-~]{7})
)
- (?: / (?P<filename>[^/]+?) (?: /)?)?
+ (?: / (?P<filename>[^/]+?)? (?: /)?)?
'''
KeyType = consts.KeyType.CHK
KeyPattern = re.compile(_key_pattern_, re.I | re.X)
ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
- def __init__(self, filename=None):
+ def __init__(self, keyData=None, filename=None):
"""Creates a CHK key
+ @param keyData: (str) key data or None
@param filename: (str) filename to add to the key or None
"""
- self.keyData = None
+ self.keyData = keyData
self.filename = filename
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.keyData is not None:
out += self.keyData + '/'
@@ -168,12 +214,11 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
- clss = clss(filename=d['filename'])
- clss.keyData = d['keyData']
- return clss
+ key = clss(d['keyData'], filename=d['filename'])
+ return key
class SSK(KeyBase):
@@ -197,7 +242,7 @@
self.filename = filename
self.keyData = keyData
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.keyData is not None:
out += self.keyData + '/'
@@ -207,7 +252,7 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
return clss(d['keyData'], d['filename'])
@@ -227,7 +272,7 @@
def __init__(self, filename):
self.filename = filename
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.filename is not None:
out += self.filename + '/'
@@ -235,11 +280,10 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
- clss = clss(filename=d['filename'])
- return clss
+ return clss(filename=d['filename'])
class USK(KeyBase):
@@ -270,7 +314,7 @@
self.filename = filename
self.keyData = keyData
- def pythonToFcp(self):
+ def toString(self):
out = self.KeyType
if self.keyData is not None:
out += self.keyData + '/'
@@ -282,14 +326,14 @@
@classmethod
def fromString(clss, string):
- result = clss.ExactKeyPattern.match(string)
+ result = clss.ExactKeyPattern.match(stripKey(string))
if result is not None:
d = result.groupdict()
return clss(d['keyData'], d['filename'], edition=d['edition'])
-
+
#*****************************************************************************
#
#*****************************************************************************
if __name__ == '__main__':
import doctest
- doctest.testmod()
+ print 'doctests failed: %s/%s' % doctest.testmod()
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-29 12:36:42
|
Revision: 420
http://fclient.svn.sourceforge.net/fclient/?rev=420&view=rev
Author: jUrner
Date: 2008-06-29 05:36:50 -0700 (Sun, 29 Jun 2008)
Log Message:
-----------
make filename optional for SSK and USK
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-06-29 10:59:46 UTC (rev 419)
+++ trunk/sandbox/fcp2/key.py 2008-06-29 12:36:50 UTC (rev 420)
@@ -238,7 +238,7 @@
KeyPattern = re.compile(_key_pattern_, re.I | re.X)
ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
- def __init__(self, keyData, filename):
+ def __init__(self, keyData, filename=None):
self.filename = filename
self.keyData = keyData
@@ -303,7 +303,7 @@
KeyPattern = re.compile(_key_pattern_, re.I | re.X)
ExactKeyPattern = re.compile(ReMatchExact % _key_pattern_, re.I | re.X)
- def __init__(self, keyData, filename, edition=0):
+ def __init__(self, keyData, filename=None, edition=0):
"""Creates a USK key
@param keyData: (str) public key
@param filename: (str) filename
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <jU...@us...> - 2008-06-30 08:54:24
|
Revision: 430
http://fclient.svn.sourceforge.net/fclient/?rev=430&view=rev
Author: jUrner
Date: 2008-06-30 01:54:21 -0700 (Mon, 30 Jun 2008)
Log Message:
-----------
whitespace and typos
Modified Paths:
--------------
trunk/sandbox/fcp2/key.py
Modified: trunk/sandbox/fcp2/key.py
===================================================================
--- trunk/sandbox/fcp2/key.py 2008-06-29 16:21:17 UTC (rev 429)
+++ trunk/sandbox/fcp2/key.py 2008-06-30 08:54:21 UTC (rev 430)
@@ -16,7 +16,6 @@
from fcp2 import consts
-
del hack
#<-- rel import hack
#**************************************************************************************
@@ -90,6 +89,7 @@
#**************************************************************************************
#
#**************************************************************************************
+#TODO: too bad, can not move this to types.py ...cross import
class FcpTypeKey(object):
"""key type for type conversions
@@ -146,7 +146,6 @@
return key.toString()
-
def key(string):
"""creates a key object from a string
@return: L{KeyBase}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|