uri.py: get keys and index from the URI instance

This commit is contained in:
Brian Warner 2007-07-21 17:45:00 -07:00
parent 9cac3261a7
commit 2bc3c163b6
2 changed files with 36 additions and 26 deletions

View File

@ -32,14 +32,12 @@ class VirtualDriveServer(service.MultiService, Referenceable):
if offer_public_root: if offer_public_root:
rootfile = os.path.join(self._basedir, "root") rootfile = os.path.join(self._basedir, "root")
if not os.path.exists(rootfile): if not os.path.exists(rootfile):
write_key = hashutil.random_key() u = uri.DirnodeURI("fakefurl", hashutil.random_key())
(wk, we, rk, index) = \ self.create_directory(u.storage_index, u.write_enabler)
hashutil.generate_dirnode_keys_from_writekey(write_key)
self.create_directory(index, we)
f = open(rootfile, "wb") f = open(rootfile, "wb")
f.write(wk) f.write(u.writekey)
f.close() f.close()
self._root = wk self._root = u.writekey
else: else:
f = open(rootfile, "rb") f = open(rootfile, "rb")
self._root = f.read() self._root = f.read()
@ -170,10 +168,11 @@ class ImmutableDirectoryNode:
self._client = client self._client = client
self._tub = client.tub self._tub = client.tub
self._rref = rref self._rref = rref
self._readkey = u.readkey self._readkey = u.readkey
self._writekey = None self._writekey = u.writekey
self._write_enabler = None self._write_enabler = u.write_enabler
self._index = hashutil.dir_index_hash(self._readkey) self._index = u.storage_index
self._mutable = False self._mutable = False
def dump(self): def dump(self):
@ -362,9 +361,7 @@ class ImmutableDirectoryNode:
def get_refresh_capability(self): def get_refresh_capability(self):
u = IDirnodeURI(self._uri).get_readonly() u = IDirnodeURI(self._uri).get_readonly()
rk = u.readkey return "DIR-REFRESH:%s" % idlib.b2a(u.storage_index)
wk, we, rk, index = hashutil.generate_dirnode_keys_from_readkey(rk)
return "DIR-REFRESH:%s" % idlib.b2a(index)
def get_child_at_path(self, path): def get_child_at_path(self, path):
if not path: if not path:
@ -386,26 +383,24 @@ class MutableDirectoryNode(ImmutableDirectoryNode):
def __init__(self, myuri, client, rref): def __init__(self, myuri, client, rref):
u = IDirnodeURI(myuri) u = IDirnodeURI(myuri)
assert not u.is_readonly() assert not u.is_readonly()
self._writekey = u.writekey
self._write_enabler = hashutil.dir_write_enabler_hash(u.writekey)
readkey = hashutil.dir_read_key_hash(u.writekey)
self._uri = u.to_string() self._uri = u.to_string()
self._client = client self._client = client
self._tub = client.tub self._tub = client.tub
self._rref = rref self._rref = rref
self._readkey = readkey
self._index = hashutil.dir_index_hash(self._readkey) self._readkey = u.readkey
self._writekey = u.writekey
self._write_enabler = u.write_enabler
self._index = u.storage_index
self._mutable = True self._mutable = True
def create_directory(client, furl): def create_directory(client, furl):
write_key = hashutil.random_key() u = uri.DirnodeURI(furl, hashutil.random_key())
(wk, we, rk, index) = \
hashutil.generate_dirnode_keys_from_writekey(write_key)
u = uri.DirnodeURI(furl, wk)
d = client.tub.getReference(furl) d = client.tub.getReference(furl)
def _got_vdrive_server(vdrive_server): def _got_vdrive_server(vdrive_server):
node = MutableDirectoryNode(u, client, vdrive_server) node = MutableDirectoryNode(u, client, vdrive_server)
d2 = vdrive_server.callRemote("create_directory", index, we) d2 = vdrive_server.callRemote("create_directory",
u.storage_index, u.write_enabler)
d2.addCallback(lambda res: node) d2.addCallback(lambda res: node)
return d2 return d2
d.addCallback(_got_vdrive_server) d.addCallback(_got_vdrive_server)

View File

@ -114,6 +114,7 @@ class DirnodeURI(_BaseURI):
assert writekey is not None assert writekey is not None
self.furl = furl self.furl = furl
self.writekey = writekey self.writekey = writekey
self._derive_values()
def init_from_string(self, uri): def init_from_string(self, uri):
# URI:DIR:furl:key # URI:DIR:furl:key
@ -124,8 +125,16 @@ class DirnodeURI(_BaseURI):
colon = uri.rindex(":") colon = uri.rindex(":")
self.furl = uri[:colon] self.furl = uri[:colon]
self.writekey = idlib.a2b(uri[colon+1:]) self.writekey = idlib.a2b(uri[colon+1:])
self._derive_values()
return self return self
def _derive_values(self):
wk, we, rk, index = \
hashutil.generate_dirnode_keys_from_writekey(self.writekey)
self.write_enabler = we
self.readkey = rk
self.storage_index = index
def to_string(self): def to_string(self):
return "URI:DIR:%s:%s" % (self.furl, idlib.b2a(self.writekey)) return "URI:DIR:%s:%s" % (self.furl, idlib.b2a(self.writekey))
@ -134,10 +143,7 @@ class DirnodeURI(_BaseURI):
def is_mutable(self): def is_mutable(self):
return True return True
def get_readonly(self): def get_readonly(self):
u = ReadOnlyDirnodeURI() return ReadOnlyDirnodeURI(self.furl, self.readkey)
u.furl = self.furl
u.readkey = hashutil.dir_read_key_hash(self.writekey)
return u
class ReadOnlyDirnodeURI(_BaseURI): class ReadOnlyDirnodeURI(_BaseURI):
implements(IURI, IDirnodeURI) implements(IURI, IDirnodeURI)
@ -148,6 +154,7 @@ class ReadOnlyDirnodeURI(_BaseURI):
assert readkey is not None assert readkey is not None
self.furl = furl self.furl = furl
self.readkey = readkey self.readkey = readkey
self._derive_values()
def init_from_string(self, uri): def init_from_string(self, uri):
# URI:DIR-RO:furl:key # URI:DIR-RO:furl:key
@ -158,8 +165,16 @@ class ReadOnlyDirnodeURI(_BaseURI):
colon = uri.rindex(":") colon = uri.rindex(":")
self.furl = uri[:colon] self.furl = uri[:colon]
self.readkey = idlib.a2b(uri[colon+1:]) self.readkey = idlib.a2b(uri[colon+1:])
self._derive_values()
return self return self
def _derive_values(self):
wk, we, rk, index = \
hashutil.generate_dirnode_keys_from_readkey(self.readkey)
self.writekey = wk # None
self.write_enabler = we # None
self.storage_index = index
def to_string(self): def to_string(self):
return "URI:DIR-RO:%s:%s" % (self.furl, idlib.b2a(self.readkey)) return "URI:DIR-RO:%s:%s" % (self.furl, idlib.b2a(self.readkey))