class RestrictedResource(resource.Resource):
default = True
def __init__(self, wrapped, rules):
resource.Resource.__init__(self)
self.wrapped = wrapped
self.rules = rules
def getChild(self, name, request):
if self.checkRequest(request):
return self.wrapped.getChild(name, request)
else:
return error.ForbiddenResource("Access denied")
def render(self, request):
if self.checkRequest(request, self.rules):
return self.wrapped.render(request)
else:
request.setResponseCode(403)
return 'Access denied'
def checkRequest(self, request, rules):
for (condition, rule) in rules:
if condition.check(self, request):
try:
c = rule.check
except AttributeError:
b = self.checkRequest(request, rule)
else:
b = c(self, request)
if b is not None:
return b
return self.default
def main():
from twisted.web import server
from twisted.web import static
from predicates import Contradiction, Tautology
from predicates import Address, MonthDay, UniqueHosts, Connections
rules = [
(Address == '127.0.0.1/255.255.255.255')(Tautology),
(Month == 10)(
(MonthDay == 29)(Contradiction),
(MonthDay == 30)(
(Address == '10.0.0.0/255.0.0.0')(UniqueHosts <= 512)
)
),
(Tautology)(Connections < 10)
]
site = server.Site(RestrictedResource(static.File('.'), rules))