SF.net SVN: fclient: [415] trunk/sandbox/fcp2/key.py
Status: Pre-Alpha
Brought to you by:
jurner
|
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.
|