4 from zope.interface import implements
5 from twisted.internet import defer
6 from twisted.python import log as twisted_log
8 from allmydata.interfaces import IFileNode, IFilesystemNode
9 from allmydata.util import base32
10 from allmydata.util.encodingutil import quote_output
13 class FileProhibited(Exception):
14 """This client has been configured to prohibit access to this object."""
15 def __init__(self, reason):
16 Exception.__init__(self, "Access Prohibited: %s" % quote_output(reason, encoding='utf-8', quotemarks=False))
21 def __init__(self, blacklist_fn):
22 self.blacklist_fn = blacklist_fn
23 self.last_mtime = None
25 self.read_blacklist() # sets .last_mtime and .entries
27 def read_blacklist(self):
29 current_mtime = os.stat(self.blacklist_fn).st_mtime
30 except EnvironmentError:
31 # unreadable blacklist file means no blacklist
35 if self.last_mtime is None or current_mtime > self.last_mtime:
37 for line in open(self.blacklist_fn, "r").readlines():
39 if not line or line.startswith("#"):
41 si_s, reason = line.split(None, 1)
42 si = base32.a2b(si_s) # must be valid base32
43 self.entries[si] = reason
44 self.last_mtime = current_mtime
46 twisted_log.err(e, "unparseable blacklist file")
49 def check_storageindex(self, si):
51 reason = self.entries.get(si, None)
52 if reason is not None:
53 # log this to logs/twistd.log, since web logs go there too
54 twisted_log.msg("blacklist prohibited access to SI %s: %s" %
55 (base32.b2a(si), reason))
62 def __init__(self, wrapped_node, reason):
63 assert IFilesystemNode.providedBy(wrapped_node), wrapped_node
64 self.wrapped_node = wrapped_node
68 return self.wrapped_node.get_cap()
70 def get_readcap(self):
71 return self.wrapped_node.get_readcap()
73 def is_readonly(self):
74 return self.wrapped_node.is_readonly()
77 return self.wrapped_node.is_mutable()
80 return self.wrapped_node.is_unknown()
82 def is_allowed_in_immutable_directory(self):
83 return self.wrapped_node.is_allowed_in_immutable_directory()
85 def is_alleged_immutable(self):
86 return self.wrapped_node.is_alleged_immutable()
88 def raise_error(self):
89 # We don't raise an exception here because that would prevent the node from being listed.
93 return self.wrapped_node.get_uri()
95 def get_write_uri(self):
96 return self.wrapped_node.get_write_uri()
98 def get_readonly_uri(self):
99 return self.wrapped_node.get_readonly_uri()
101 def get_storage_index(self):
102 return self.wrapped_node.get_storage_index()
104 def get_verify_cap(self):
105 return self.wrapped_node.get_verify_cap()
107 def get_repair_cap(self):
108 return self.wrapped_node.get_repair_cap()
113 def get_current_size(self):
114 return defer.succeed(None)
116 def get_size_of_best_version(self):
117 return defer.succeed(None)
119 def check(self, monitor, verify, add_lease):
120 return defer.succeed(None)
122 def check_and_repair(self, monitor, verify, add_lease):
123 return defer.succeed(None)
125 def get_version(self):
128 # Omitting any of these methods would fail safe; they are just to ensure correct error reporting.
130 def get_best_readable_version(self):
131 raise FileProhibited(self.reason)
133 def download_best_version(self):
134 raise FileProhibited(self.reason)
136 def get_best_mutable_version(self):
137 raise FileProhibited(self.reason)
139 def overwrite(self, new_contents):
140 raise FileProhibited(self.reason)
142 def modify(self, modifier_cb):
143 raise FileProhibited(self.reason)
145 def get_servermap(self, mode):
146 raise FileProhibited(self.reason)
148 def download_version(self, servermap, version):
149 raise FileProhibited(self.reason)
151 def upload(self, new_contents, servermap):
152 raise FileProhibited(self.reason)
154 def get_writekey(self):
155 raise FileProhibited(self.reason)
157 def read(self, consumer, offset=0, size=None):
158 raise FileProhibited(self.reason)