diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py index 806f7b82af6e4c910493bba60432cc254ff79b5e..0a5a58b344eedbf0fdf25260927e2720c7a60a00 100644 --- a/src/_zkapauthorizer/_storage_server.py +++ b/src/_zkapauthorizer/_storage_server.py @@ -33,7 +33,9 @@ from struct import calcsize, unpack import attr from allmydata.interfaces import RIStorageServer, TestAndWriteVectorsForShares from allmydata.storage.common import storage_index_to_dir +from allmydata.storage.immutable import ShareFile from allmydata.storage.lease import LeaseInfo +from allmydata.storage.mutable import MutableShareFile from allmydata.storage.server import StorageServer from allmydata.storage.shares import get_share_file from allmydata.util.base32 import b2a @@ -721,7 +723,7 @@ def get_storage_index_share_size(sharepath): # From src/allmydata/storage/immutable.py # # The share file has the following layout: - # 0x00: share file version number, four bytes, current version is 1 + # 0x00: share file version number, four bytes, current version is 2 # 0x04: share data length, four bytes big-endian = A # See Footnote 1 below. # 0x08: number of leases, four bytes big-endian # 0x0c: beginning of share data (see immutable.layout.WriteBucketProxy) @@ -756,12 +758,14 @@ def get_storage_index_share_size(sharepath): version, _, number_of_leases = unpack(header_format, header) - if version != 1: - raise ValueError( - "Cannot interpret version {} share file.".format(version), - ) + if version in (1, 2): + # Version 1 and 2 don't differ in a way that changes the size + # calculation. + return share_file_size - header_size - (number_of_leases * (4 + 32 + 32 + 4)) - return share_file_size - header_size - (number_of_leases * (4 + 32 + 32 + 4)) + raise ValueError( + "Cannot interpret version {} share file.".format(version), + ) def stat_bucket(storage_server, storage_index, sharepath): @@ -824,10 +828,14 @@ def get_stat(sharepath): # Figure out if it is a storage index or a slot. with open(sharepath, "rb") as share_file: magic = share_file.read(32) - if magic == "Tahoe mutable container v1\n" + "\x75\x09\x44\x03\x8e": + if len(magic) < 32: + raise ValueError("Share file has short header") + if ShareFile.is_valid_header(magic): + return stat_bucket + elif MutableShareFile.is_valid_header(magic): return stat_slot else: - return stat_bucket + raise ValueError("Cannot interpret share header {!r}".format(magic)) def add_leases_for_writev(storage_server, storage_index, secrets, tw_vectors, now):