"ro_uri": file_uri,
"verify_uri": verify_uri,
"size": bytes,
- "mutable": false,
+ "mutable": false
} ]
If it is a capability to a directory followed by a path from that directory
"mtime": 1202777696.7564139,
"tahoe": {
"linkcrtime": 1202777696.7564139,
- "linkmotime": 1202777696.7564139,
+ "linkmotime": 1202777696.7564139
} } } ]
If it is a directory, then it includes information about the children of
"mtime": 1202777696.7564139,
"tahoe": {
"linkcrtime": 1202777696.7564139,
- "linkmotime": 1202777696.7564139,
+ "linkmotime": 1202777696.7564139
} } } ],
"subdir": [ "dirnode", {
"rw_uri": rwuri,
"mtime": 1202778111.2160511,
"tahoe": {
"linkcrtime": 1202777696.7564139,
- "linkmotime": 1202777696.7564139,
+ "linkmotime": 1202777696.7564139
} } } ]
} } ]
entry of the child is omitted, and the directory view includes the metadata
that is stored on the directory edge).
- Then the rw_uri field will be present in the information about a directory
+ The rw_uri field will be present in the information about a directory
if and only if you have read-write access to that directory. The verify_uri
field will be present if and only if the object has a verify-cap
(non-distributed LIT files do not have verify-caps).
+
+ If the cap is of an unknown format, then the file size and verify_uri will
+ not be available:
+
+ GET /uri/$UNKNOWNCAP?t=json :
+
+ [ "unknown", {
+ "rw_uri": unknown_write_uri,
+ "ro_uri": unknown_read_uri
+ } ]
+
+ GET /uri/$DIRCAP/[SUBDIRS../]UNKNOWNCHILDNAME?t=json :
+
+ [ "unknown", {
+ "rw_uri": unknown_write_uri,
+ "ro_uri": unknown_read_uri,
+ "mutable": true,
+ "metadata": {
+ "ctime": 1202777696.7564139,
+ "mtime": 1202777696.7564139,
+ "tahoe": {
+ "linkcrtime": 1202777696.7564139,
+ "linkmotime": 1202777696.7564139
+ } } } ]
+
+ As in the case of file nodes, the metadata will only be present when the
+ capability is to a directory followed by a path. The "mutable" field is also
+ not always present; when it is absent, the mutability of the object is not
+ known.
==== About the metadata ====
# immutable (or even read-only), provided that no error was detected.
return not self.error and not self.rw_uri
+ def is_alleged_immutable(self):
+ return not self.error and not self.rw_uri and (not self.ro_uri or self.ro_uri.startswith(ALLEGED_IMMUTABLE_PREFIX))
+
def raise_error(self):
if self.error is not None:
raise self.error
from foolscap.api import fireEventually
from allmydata.util import base32, time_format
-from allmydata.uri import from_string_dirnode, ALLEGED_IMMUTABLE_PREFIX
+from allmydata.uri import from_string_dirnode
from allmydata.interfaces import IDirectoryNode, IFileNode, IFilesystemNode, \
IImmutableFileNode, IMutableFileNode, ExistingChildError, \
NoSuchChildError, EmptyPathnameComponentError
ctx.fillSlots("filename", html.escape(name))
if target.get_write_uri() is not None:
unknowntype = "?"
- elif not self.node.is_mutable() or target.get_readonly_uri().startswith(ALLEGED_IMMUTABLE_PREFIX):
+ elif not self.node.is_mutable() or target.is_alleged_immutable():
unknowntype = "?-IMM"
else:
unknowntype = "?-RO"
if IDirectoryNode.providedBy(node):
data["type"] = "directory"
- else:
+ elif IFileNode.providedBy(node):
data["type"] = "file"
+ else:
+ data["type"] = "unknown"
v = node.get_verify_cap()
if v:
if t == "info":
return MoreInfo(self.node)
if t == "json":
+ is_parent_known_immutable = self.parentnode and not self.parentnode.is_mutable()
if self.parentnode and self.name:
d = self.parentnode.get_metadata_for(self.name)
else:
d = defer.succeed(None)
- d.addCallback(lambda md: UnknownJSONMetadata(ctx, self.node, md))
+ d.addCallback(lambda md: UnknownJSONMetadata(ctx, self.node, md, is_parent_known_immutable))
return d
raise WebError("GET unknown URI type: can only do t=info and t=json, not t=%s.\n"
"Using a webapi server that supports a later version of Tahoe "
"may help." % t)
-def UnknownJSONMetadata(ctx, filenode, edge_metadata):
- rw_uri = filenode.get_write_uri()
- ro_uri = filenode.get_readonly_uri()
+def UnknownJSONMetadata(ctx, node, edge_metadata, is_parent_known_immutable):
+ rw_uri = node.get_write_uri()
+ ro_uri = node.get_readonly_uri()
data = ("unknown", {})
if ro_uri:
data[1]['ro_uri'] = ro_uri
if rw_uri:
data[1]['rw_uri'] = rw_uri
+ data[1]['mutable'] = True
+ elif is_parent_known_immutable or node.is_alleged_immutable():
+ data[1]['mutable'] = False
+ # else we don't know whether it is mutable.
+
if edge_metadata is not None:
data[1]['metadata'] = edge_metadata
return text_plain(simplejson.dumps(data, indent=1) + "\n", ctx)