[tahoe-dev] [tahoe-lafs] #833: reject mutable children when *reading* an immutable dirnode
tahoe-lafs
trac at allmydata.org
Mon Jan 25 22:24:18 PST 2010
#833: reject mutable children when *reading* an immutable dirnode
--------------------------------------------------------------------------------------------------+
Reporter: warner | Owner: kevan
Type: defect | Status: assigned
Priority: critical | Milestone: 1.6.0
Component: code-dirnodes | Version: 1.5.0
Keywords: integrity forward-compatibility backward-compatibility confidentiality review-needed | Launchpad_bug:
--------------------------------------------------------------------------------------------------+
Comment(by davidsarah):
> interfaces.py looks okay, but I was a bit confused when I read "...and
then used" at the end of MustBeDeepImmutableError and MustBeReadOnlyError.
This is possibly me being dense after work, but maybe you could clarify
the context in which those are being used to trigger that error?
An UnknownNode may have one of these error objects in its .error property.
They will only be thrown if node.raise_error() is called. This happens
when we try to put the node into a directory (besides tests, the relevant
calls to raise_error are in dirnode.py and nodemaker.py).
> The docstring for {{{strip_prefix_for_ro}}} should be inside the
function, not before it.
OK.
> In the {{{__init__}}} method of UnknownNode, you say {{{if x is not
None:}}} instead of {{{if x}}}. I'm assuming that that's to deal with
empty string arguments/other arguments that evaluate to False in a
comparison?
Yes. I'll recheck what happens to falsy URIs.
{{{
> if given_ro_uri is not None:
> read_cap = uri.from_string(given_ro_uri,
> deep_immutable=deep_immutable, name=name)
> if isinstance(read_cap, uri.UnknownURI):
> self.error = read_cap.get_error()
> if self.error:
> assert self.rw_uri is None and self.ro_uri is None
> return
}}}
> How does this know the difference between an UnknownURI that is an
UnknownURI because we don't know what it is, and an UnknownURI that is
unknown because we know what it is but it is prefixed with something that
makes it nonsensical?
In either case, isinstance(read_cap, uri.UnknownURI) will be true. But
only in the latter case will read_cap.get_error() be truthy.
{{{
> if deep_immutable:
> assert self.rw_uri is None
...
}}}
> What is this assertion meant to do? I don't think that anything so far
in the code would have assigned anything other than none to self.rw_uri. I
don't suppose that it hurts to have it there, aside from maybe meaning
that the calling code needs to be more complicated if it wants to handle
all of the error conditions that UnknownNode can enter. It also serves as
self-documentation, I guess.
It's intended as documentation. I normally use asserts only for
documentation, not for validity checks.
> Any reason for implementing {{{is_unknown}}} in {{{_BaseURI}}}? Is it
anything that might need to be added to the {{{IURI}}} interface?
No, I'll remove that. (I originally had an is_unknown method on URIs but
changed to using isinstance(..., UnknownURI).)
> What about {{{is_readonly}}}, {{{is_mutable}}}, {{{get_readonly}}},
{{{get_verify_cap}}}, which were added to a number of URIs in uri.py.
Should they be added to one of the URI interfaces?
The existing code was inconsistent; it had these methods for some URI
classes and not others. They were already declared in IURI.
> The spacing on your changes to SSKVerifierURI is inconsistent with your
changes in the other URI classes.
Fixed.
> I didn't see any problems in nodemaker.py or dirnode.py.
> If you're correcting things in webapi.txt, you might try replacing
Tahoe with Tahoe-LAFS, which (I gather) is more correct. But maybe that's
out of scope for this ticket.
Out of scope (there are > 60 uses of "Tahoe" in webapi.txt!)
> I think it would be easier to read if you changed the from_string_
methods in uri.py to use explicit named keyword arguments instead of the
**kwargs form.
Will do.
--
Ticket URL: <http://allmydata.org/trac/tahoe/ticket/833#comment:49>
tahoe-lafs <http://allmydata.org>
secure decentralized file storage grid
More information about the tahoe-dev
mailing list