Changeset f47672d in trunk for src/allmydata


Ignore:
Timestamp:
2009-11-04T18:13:51Z (16 years ago)
Author:
Brian Warner <warner@…>
Branches:
master
Children:
131e05b
Parents:
9733201
git-author:
Brian Warner <warner@…> (2009-11-04 17:24:53)
git-committer:
Brian Warner <warner@…> (2009-11-04 18:13:51)
Message:

add parser for immutable directory caps: DIR2-CHK, DIR2-LIT, DIR2-CHK-Verifier

Location:
src/allmydata
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/allmydata/test/test_uri.py

    r9733201 rf47672d  
    332332            self.failUnlessEqual(v._filenode_uri,
    333333                                 u1.get_verify_cap()._filenode_uri)
     334
     335    def test_immutable(self):
     336        readkey = "\x01" * 16
     337        uri_extension_hash = hashutil.uri_extension_hash("stuff")
     338        needed_shares = 3
     339        total_shares = 10
     340        size = 1234
     341
     342        fnuri = uri.CHKFileURI(key=readkey,
     343                               uri_extension_hash=uri_extension_hash,
     344                               needed_shares=needed_shares,
     345                               total_shares=total_shares,
     346                               size=size)
     347        fncap = fnuri.to_string()
     348        self.failUnlessEqual(fncap, "URI:CHK:aeaqcaibaeaqcaibaeaqcaibae:nf3nimquen7aeqm36ekgxomalstenpkvsdmf6fplj7swdatbv5oa:3:10:1234")
     349        u1 = uri.ImmutableDirectoryURI(fnuri)
     350        self.failUnless(u1.is_readonly())
     351        self.failIf(u1.is_mutable())
     352        self.failUnless(IURI.providedBy(u1))
     353        self.failIf(IFileURI.providedBy(u1))
     354        self.failUnless(IDirnodeURI.providedBy(u1))
     355        self.failUnless("DirectoryURI" in str(u1))
     356        u1_filenode = u1.get_filenode_uri()
     357        self.failIf(u1_filenode.is_mutable())
     358        self.failUnless(u1_filenode.is_readonly())
     359        self.failUnlessEqual(u1_filenode.to_string(), fncap)
     360        self.failUnless(str(u1))
     361
     362        u2 = uri.from_string(u1.to_string())
     363        self.failUnlessEqual(u1.to_string(), u2.to_string())
     364        self.failUnless(u2.is_readonly())
     365        self.failIf(u2.is_mutable())
     366        self.failUnless(IURI.providedBy(u2))
     367        self.failIf(IFileURI.providedBy(u2))
     368        self.failUnless(IDirnodeURI.providedBy(u2))
     369
     370        u3 = u2.get_readonly()
     371        self.failUnlessEqual(u3.to_string(), u2.to_string())
     372        self.failUnless(str(u3))
     373
     374        u2_verifier = u2.get_verify_cap()
     375        self.failUnless(isinstance(u2_verifier,
     376                                   uri.ImmutableDirectoryURIVerifier), u2_verifier)
     377        self.failUnless(IVerifierURI.providedBy(u2_verifier))
     378        u2_verifier_fileuri = u2_verifier.get_filenode_uri()
     379        self.failUnless(IVerifierURI.providedBy(u2_verifier_fileuri))
     380        self.failUnlessEqual(u2_verifier_fileuri.to_string(),
     381                             fnuri.get_verify_cap().to_string())
     382        self.failUnless(str(u2_verifier))
     383
     384    def test_literal(self):
     385        u1 = uri.LiteralDirectoryURI("data")
     386        self.failUnless(str(u1))
     387        u1s = u1.to_string()
     388        self.failUnlessEqual(u1.to_string(), "URI:DIR2-LIT:mrqxiyi")
     389        self.failUnless(u1.is_readonly())
     390        self.failIf(u1.is_mutable())
     391        self.failUnless(IURI.providedBy(u1))
     392        self.failIf(IFileURI.providedBy(u1))
     393        self.failUnless(IDirnodeURI.providedBy(u1))
     394        self.failUnlessEqual(u1.get_verify_cap(), None)
  • TabularUnified src/allmydata/uri.py

    r9733201 rf47672d  
    4949    implements(IURI, IImmutableFileURI)
    5050
     51    BASE_STRING='URI:CHK:'
    5152    STRING_RE=re.compile('^URI:CHK:'+BASE32STR_128bits+':'+
    5253                         BASE32STR_256bits+':'+NUMBER+':'+NUMBER+':'+NUMBER+
     
    160161    implements(IURI, IImmutableFileURI)
    161162
     163    BASE_STRING='URI:LIT:'
    162164    STRING_RE=re.compile('^URI:LIT:'+base32.BASE32STR_anybytes+'$')
    163165    HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'LIT'+SEP+base32.BASE32STR_anybytes+'$')
     
    423425        return self
    424426
     427class _ImmutableDirectoryBaseURI(_DirectoryBaseURI):
     428    def __init__(self, filenode_uri=None):
     429        if filenode_uri:
     430            assert isinstance(filenode_uri, self.INNER_URI_CLASS), filenode_uri
     431        _DirectoryBaseURI.__init__(self, filenode_uri)
     432
     433    def is_mutable(self):
     434        return False
     435
     436    def is_readonly(self):
     437        return True
     438
     439    def get_readonly(self):
     440        return self
     441
     442class ImmutableDirectoryURI(_ImmutableDirectoryBaseURI):
     443    BASE_STRING='URI:DIR2-CHK:'
     444    BASE_STRING_RE=re.compile('^'+BASE_STRING)
     445    BASE_HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'DIR2-CHK'+SEP)
     446    INNER_URI_CLASS=CHKFileURI
     447    def get_verify_cap(self):
     448        vcap = self._filenode_uri.get_verify_cap()
     449        return ImmutableDirectoryURIVerifier(vcap)
     450
     451
     452class LiteralDirectoryURI(_ImmutableDirectoryBaseURI):
     453    BASE_STRING='URI:DIR2-LIT:'
     454    BASE_STRING_RE=re.compile('^'+BASE_STRING)
     455    BASE_HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'DIR2-LIT'+SEP)
     456    INNER_URI_CLASS=LiteralFileURI
     457    def __init__(self, data=None):
     458        filenode_uri = LiteralFileURI(data)
     459        _ImmutableDirectoryBaseURI.__init__(self, filenode_uri)
     460    def get_verify_cap(self):
     461        # LIT caps have no verifier, since they aren't distributed
     462        return None
     463
     464
    425465class DirectoryURIVerifier(_DirectoryBaseURI):
    426466    implements(IVerifierURI)
     
    438478    def get_filenode_uri(self):
    439479        return self._filenode_uri
     480
     481class ImmutableDirectoryURIVerifier(DirectoryURIVerifier):
     482    implements(IVerifierURI)
     483    BASE_STRING='URI:DIR2-CHK-Verifier:'
     484    BASE_STRING_RE=re.compile('^'+BASE_STRING)
     485    BASE_HUMAN_RE=re.compile('^'+OPTIONALHTTPLEAD+'URI'+SEP+'DIR2-CHK-VERIFIER'+SEP)
     486    INNER_URI_CLASS=CHKFileVerifierURI
    440487
    441488class UnknownURI:
     
    466513    elif s.startswith('URI:DIR2-Verifier:'):
    467514        return DirectoryURIVerifier.init_from_string(s)
     515    elif s.startswith('URI:DIR2-CHK:'):
     516        return ImmutableDirectoryURI.init_from_string(s)
     517    elif s.startswith('URI:DIR2-LIT:'):
     518        return LiteralDirectoryURI.init_from_string(s)
    468519    return UnknownURI(s)
    469520
Note: See TracChangeset for help on using the changeset viewer.