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. |