mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-02-20 09:46:18 +00:00
Add mutable field to t=json output for unknown nodes, when mutability is known
This commit is contained in:
parent
4560e021a9
commit
3e35959e9b
@ -556,7 +556,7 @@ GET /uri/$DIRCAP/[SUBDIRS../]FILENAME?t=json
|
||||
"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
|
||||
@ -575,7 +575,7 @@ GET /uri/$DIRCAP/[SUBDIRS../]FILENAME?t=json
|
||||
"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
|
||||
@ -602,7 +602,7 @@ GET /uri/$DIRCAP/[SUBDIRS../]FILENAME?t=json
|
||||
"mtime": 1202777696.7564139,
|
||||
"tahoe": {
|
||||
"linkcrtime": 1202777696.7564139,
|
||||
"linkmotime": 1202777696.7564139,
|
||||
"linkmotime": 1202777696.7564139
|
||||
} } } ],
|
||||
"subdir": [ "dirnode", {
|
||||
"rw_uri": rwuri,
|
||||
@ -612,7 +612,7 @@ GET /uri/$DIRCAP/[SUBDIRS../]FILENAME?t=json
|
||||
"mtime": 1202778111.2160511,
|
||||
"tahoe": {
|
||||
"linkcrtime": 1202777696.7564139,
|
||||
"linkmotime": 1202777696.7564139,
|
||||
"linkmotime": 1202777696.7564139
|
||||
} } } ]
|
||||
} } ]
|
||||
|
||||
@ -623,10 +623,39 @@ GET /uri/$DIRCAP/[SUBDIRS../]FILENAME?t=json
|
||||
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 ====
|
||||
|
||||
|
@ -146,6 +146,9 @@ class UnknownNode:
|
||||
# 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
|
||||
|
@ -13,7 +13,7 @@ from nevow.inevow import IRequest
|
||||
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
|
||||
@ -739,7 +739,7 @@ class DirectoryAsHTML(rend.Page):
|
||||
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"
|
||||
@ -1096,8 +1096,10 @@ class DeepCheckStreamer(dirnode.DeepStats):
|
||||
|
||||
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:
|
||||
@ -1161,24 +1163,30 @@ class UnknownNodeHandler(RenderMixin, rend.Page):
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user