mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-05-11 13:22:59 +00:00
add parser for immutable directory caps: DIR2-CHK, DIR2-LIT, DIR2-CHK-Verifier
This commit is contained in:
parent
9733201c0b
commit
f47672d12a
@ -331,3 +331,64 @@ class NewDirnode(unittest.TestCase):
|
|||||||
self.failUnless(IVerifierURI.providedBy(v))
|
self.failUnless(IVerifierURI.providedBy(v))
|
||||||
self.failUnlessEqual(v._filenode_uri,
|
self.failUnlessEqual(v._filenode_uri,
|
||||||
u1.get_verify_cap()._filenode_uri)
|
u1.get_verify_cap()._filenode_uri)
|
||||||
|
|
||||||
|
def test_immutable(self):
|
||||||
|
readkey = "\x01" * 16
|
||||||
|
uri_extension_hash = hashutil.uri_extension_hash("stuff")
|
||||||
|
needed_shares = 3
|
||||||
|
total_shares = 10
|
||||||
|
size = 1234
|
||||||
|
|
||||||
|
fnuri = uri.CHKFileURI(key=readkey,
|
||||||
|
uri_extension_hash=uri_extension_hash,
|
||||||
|
needed_shares=needed_shares,
|
||||||
|
total_shares=total_shares,
|
||||||
|
size=size)
|
||||||
|
fncap = fnuri.to_string()
|
||||||
|
self.failUnlessEqual(fncap, "URI:CHK:aeaqcaibaeaqcaibaeaqcaibae:nf3nimquen7aeqm36ekgxomalstenpkvsdmf6fplj7swdatbv5oa:3:10:1234")
|
||||||
|
u1 = uri.ImmutableDirectoryURI(fnuri)
|
||||||
|
self.failUnless(u1.is_readonly())
|
||||||
|
self.failIf(u1.is_mutable())
|
||||||
|
self.failUnless(IURI.providedBy(u1))
|
||||||
|
self.failIf(IFileURI.providedBy(u1))
|
||||||
|
self.failUnless(IDirnodeURI.providedBy(u1))
|
||||||
|
self.failUnless("DirectoryURI" in str(u1))
|
||||||
|
u1_filenode = u1.get_filenode_uri()
|
||||||
|
self.failIf(u1_filenode.is_mutable())
|
||||||
|
self.failUnless(u1_filenode.is_readonly())
|
||||||
|
self.failUnlessEqual(u1_filenode.to_string(), fncap)
|
||||||
|
self.failUnless(str(u1))
|
||||||
|
|
||||||
|
u2 = uri.from_string(u1.to_string())
|
||||||
|
self.failUnlessEqual(u1.to_string(), u2.to_string())
|
||||||
|
self.failUnless(u2.is_readonly())
|
||||||
|
self.failIf(u2.is_mutable())
|
||||||
|
self.failUnless(IURI.providedBy(u2))
|
||||||
|
self.failIf(IFileURI.providedBy(u2))
|
||||||
|
self.failUnless(IDirnodeURI.providedBy(u2))
|
||||||
|
|
||||||
|
u3 = u2.get_readonly()
|
||||||
|
self.failUnlessEqual(u3.to_string(), u2.to_string())
|
||||||
|
self.failUnless(str(u3))
|
||||||
|
|
||||||
|
u2_verifier = u2.get_verify_cap()
|
||||||
|
self.failUnless(isinstance(u2_verifier,
|
||||||
|
uri.ImmutableDirectoryURIVerifier), u2_verifier)
|
||||||
|
self.failUnless(IVerifierURI.providedBy(u2_verifier))
|
||||||
|
u2_verifier_fileuri = u2_verifier.get_filenode_uri()
|
||||||
|
self.failUnless(IVerifierURI.providedBy(u2_verifier_fileuri))
|
||||||
|
self.failUnlessEqual(u2_verifier_fileuri.to_string(),
|
||||||
|
fnuri.get_verify_cap().to_string())
|
||||||
|
self.failUnless(str(u2_verifier))
|
||||||
|
|
||||||
|
def test_literal(self):
|
||||||
|
u1 = uri.LiteralDirectoryURI("data")
|
||||||
|
self.failUnless(str(u1))
|
||||||
|
u1s = u1.to_string()
|
||||||
|
self.failUnlessEqual(u1.to_string(), "URI:DIR2-LIT:mrqxiyi")
|
||||||
|
self.failUnless(u1.is_readonly())
|
||||||
|
self.failIf(u1.is_mutable())
|
||||||
|
self.failUnless(IURI.providedBy(u1))
|
||||||
|
self.failIf(IFileURI.providedBy(u1))
|
||||||
|
self.failUnless(IDirnodeURI.providedBy(u1))
|
||||||
|
self.failUnlessEqual(u1.get_verify_cap(), None)
|
||||||
|
@ -48,6 +48,7 @@ class _BaseURI:
|
|||||||
class CHKFileURI(_BaseURI):
|
class CHKFileURI(_BaseURI):
|
||||||
implements(IURI, IImmutableFileURI)
|
implements(IURI, IImmutableFileURI)
|
||||||
|
|
||||||
|
BASE_STRING='URI:CHK:'
|
||||||
STRING_RE=re.compile('^URI:CHK:'+BASE32STR_128bits+':'+
|
STRING_RE=re.compile('^URI:CHK:'+BASE32STR_128bits+':'+
|
||||||
BASE32STR_256bits+':'+NUMBER+':'+NUMBER+':'+NUMBER+
|
BASE32STR_256bits+':'+NUMBER+':'+NUMBER+':'+NUMBER+
|
||||||
'$')
|
'$')
|
||||||
@ -159,6 +160,7 @@ class CHKFileVerifierURI(_BaseURI):
|
|||||||
class LiteralFileURI(_BaseURI):
|
class LiteralFileURI(_BaseURI):
|
||||||
implements(IURI, IImmutableFileURI)
|
implements(IURI, IImmutableFileURI)
|
||||||
|
|
||||||
|
BASE_STRING='URI:LIT:'
|
||||||
STRING_RE=re.compile('^URI:LIT:'+base32.BASE32STR_anybytes+'$')
|
STRING_RE=re.compile('^URI:LIT:'+base32.BASE32STR_anybytes+'$')
|
||||||
HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'LIT'+SEP+base32.BASE32STR_anybytes+'$')
|
HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'LIT'+SEP+base32.BASE32STR_anybytes+'$')
|
||||||
|
|
||||||
@ -422,6 +424,44 @@ class ReadonlyDirectoryURI(_DirectoryBaseURI):
|
|||||||
def get_readonly(self):
|
def get_readonly(self):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
class _ImmutableDirectoryBaseURI(_DirectoryBaseURI):
|
||||||
|
def __init__(self, filenode_uri=None):
|
||||||
|
if filenode_uri:
|
||||||
|
assert isinstance(filenode_uri, self.INNER_URI_CLASS), filenode_uri
|
||||||
|
_DirectoryBaseURI.__init__(self, filenode_uri)
|
||||||
|
|
||||||
|
def is_mutable(self):
|
||||||
|
return False
|
||||||
|
|
||||||
|
def is_readonly(self):
|
||||||
|
return True
|
||||||
|
|
||||||
|
def get_readonly(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
class ImmutableDirectoryURI(_ImmutableDirectoryBaseURI):
|
||||||
|
BASE_STRING='URI:DIR2-CHK:'
|
||||||
|
BASE_STRING_RE=re.compile('^'+BASE_STRING)
|
||||||
|
BASE_HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'DIR2-CHK'+SEP)
|
||||||
|
INNER_URI_CLASS=CHKFileURI
|
||||||
|
def get_verify_cap(self):
|
||||||
|
vcap = self._filenode_uri.get_verify_cap()
|
||||||
|
return ImmutableDirectoryURIVerifier(vcap)
|
||||||
|
|
||||||
|
|
||||||
|
class LiteralDirectoryURI(_ImmutableDirectoryBaseURI):
|
||||||
|
BASE_STRING='URI:DIR2-LIT:'
|
||||||
|
BASE_STRING_RE=re.compile('^'+BASE_STRING)
|
||||||
|
BASE_HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'DIR2-LIT'+SEP)
|
||||||
|
INNER_URI_CLASS=LiteralFileURI
|
||||||
|
def __init__(self, data=None):
|
||||||
|
filenode_uri = LiteralFileURI(data)
|
||||||
|
_ImmutableDirectoryBaseURI.__init__(self, filenode_uri)
|
||||||
|
def get_verify_cap(self):
|
||||||
|
# LIT caps have no verifier, since they aren't distributed
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
class DirectoryURIVerifier(_DirectoryBaseURI):
|
class DirectoryURIVerifier(_DirectoryBaseURI):
|
||||||
implements(IVerifierURI)
|
implements(IVerifierURI)
|
||||||
|
|
||||||
@ -438,6 +478,13 @@ class DirectoryURIVerifier(_DirectoryBaseURI):
|
|||||||
def get_filenode_uri(self):
|
def get_filenode_uri(self):
|
||||||
return self._filenode_uri
|
return self._filenode_uri
|
||||||
|
|
||||||
|
class ImmutableDirectoryURIVerifier(DirectoryURIVerifier):
|
||||||
|
implements(IVerifierURI)
|
||||||
|
BASE_STRING='URI:DIR2-CHK-Verifier:'
|
||||||
|
BASE_STRING_RE=re.compile('^'+BASE_STRING)
|
||||||
|
BASE_HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'DIR2-CHK-VERIFIER'+SEP)
|
||||||
|
INNER_URI_CLASS=CHKFileVerifierURI
|
||||||
|
|
||||||
class UnknownURI:
|
class UnknownURI:
|
||||||
def __init__(self, uri):
|
def __init__(self, uri):
|
||||||
self._uri = uri
|
self._uri = uri
|
||||||
@ -465,6 +512,10 @@ def from_string(s):
|
|||||||
return ReadonlyDirectoryURI.init_from_string(s)
|
return ReadonlyDirectoryURI.init_from_string(s)
|
||||||
elif s.startswith('URI:DIR2-Verifier:'):
|
elif s.startswith('URI:DIR2-Verifier:'):
|
||||||
return DirectoryURIVerifier.init_from_string(s)
|
return DirectoryURIVerifier.init_from_string(s)
|
||||||
|
elif s.startswith('URI:DIR2-CHK:'):
|
||||||
|
return ImmutableDirectoryURI.init_from_string(s)
|
||||||
|
elif s.startswith('URI:DIR2-LIT:'):
|
||||||
|
return LiteralDirectoryURI.init_from_string(s)
|
||||||
return UnknownURI(s)
|
return UnknownURI(s)
|
||||||
|
|
||||||
def is_uri(s):
|
def is_uri(s):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user