diff --git a/src/allmydata/test/test_web.py b/src/allmydata/test/test_web.py
index 2f7437a20..6b363c574 100644
--- a/src/allmydata/test/test_web.py
+++ b/src/allmydata/test/test_web.py
@@ -3256,13 +3256,16 @@ class Grid(GridTestMixin, WebErrorMixin, unittest.TestCase, ShouldFailMixin):
# make sure directory listing tolerates unknown nodes
d.addCallback(lambda ign: self.GET(self.rooturl))
- def _check_directory_html(res):
- self.failUnlessIn("
%s | " % (str(name),), res)
+ def _check_directory_html(res, expected_type_suffix):
+ pattern = re.compile(r'\?%s | [ \t\n\r]*'
+ '%s | ' % (expected_type_suffix, str(name)),
+ re.DOTALL)
+ self.failUnless(re.search(pattern, res), res)
# find the More Info link for name, should be relative
mo = re.search(r'More Info', res)
info_url = mo.group(1)
self.failUnlessEqual(info_url, "%s?t=info" % (str(name),))
- d.addCallback(_check_directory_html)
+ d.addCallback(_check_directory_html, "-IMM" if immutable else "")
d.addCallback(lambda ign: self.GET(self.rooturl+"?t=json"))
def _check_directory_json(res, expect_rw_uri):
@@ -3320,7 +3323,7 @@ class Grid(GridTestMixin, WebErrorMixin, unittest.TestCase, ShouldFailMixin):
# rendered too. This version will not have future_write_uri, whether
# or not future_node was immutable.
d.addCallback(lambda ign: self.GET(self.rourl))
- d.addCallback(_check_directory_html)
+ d.addCallback(_check_directory_html, "-IMM" if immutable else "-RO")
d.addCallback(lambda ign: self.GET(self.rourl+"?t=json"))
d.addCallback(_check_directory_json, expect_rw_uri=False)
diff --git a/src/allmydata/web/directory.py b/src/allmydata/web/directory.py
index c6a38ffd5..f046c7fc7 100644
--- a/src/allmydata/web/directory.py
+++ b/src/allmydata/web/directory.py
@@ -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
+from allmydata.uri import from_string_dirnode, ALLEGED_IMMUTABLE_PREFIX
from allmydata.interfaces import IDirectoryNode, IFileNode, IFilesystemNode, \
IImmutableFileNode, IMutableFileNode, ExistingChildError, \
NoSuchChildError, EmptyPathnameComponentError
@@ -737,7 +737,13 @@ class DirectoryAsHTML(rend.Page):
else:
# unknown
ctx.fillSlots("filename", html.escape(name))
- ctx.fillSlots("type", "?")
+ if target.get_write_uri() is not None:
+ unknowntype = "?"
+ elif not self.node.is_mutable() or target.get_readonly_uri().startswith(ALLEGED_IMMUTABLE_PREFIX):
+ unknowntype = "?-IMM"
+ else:
+ unknowntype = "?-RO"
+ ctx.fillSlots("type", unknowntype)
ctx.fillSlots("size", "-")
# use a directory-relative info link, so we can extract both the
# writecap and the readcap