# -*- coding: Latin-1 -*-
from twisted.internet import defer
from twisted.python import components
from twisted.python import failure
from twisted.spread import pb
class IWriteableZone(components.Interface):
def setRecord(self, name, record, owner=None):
"""Add a record to this zone.
@type name: C{str}
@param name: The name of the domain for which to add a record.
@type record: Any object implementing C{twisted.protocols.dns.IRecord}
@param record: The record to associate with this domain.
@type owner: C{str}
@param owner: The user to indicate owns this record (and thus will be
allowed to remove it later).
"""
def removeRecords(self, name):
"""Remove records for the given domain.
@type name: C{str}
@param name: The domain for which to remove records.
"""
class IReadableZone(components.Interface):
def getRecords(self, name):
"""Retrieve all records for a given domain.
@type name: C{str}
@param name: The domain for which to retrieve records.
@rtype: C{list} of objects implementing C{IRecord} or C{None}
"""
class IMappingZone(components.Interface):
"""
A zone which consists of a map of domain names to record information.
@type records: mapping
@ivar records: An object mapping lower-cased domain names to lists of
L{twisted.protocols.dns.IRecord} objects.
"""
class UpdateableAuthority:
"""A wrapper around IMappingZone authorities that allows modifications.
"""
__implements__ = (IWriteableZone, IReadableZone)
def __init__(self, authority):
"""
@type authority: An object implementing C{IMappingZone}
@param authority: The authority for which we will provide
updates.
"""
self.authority = authority
def setRecord(self, name, record):
self.authority.records.setdefault(name, []).append(record)
def removeRecords(self, name):
try:
del self.authority.records[name]
except KeyError:
pass
def getRecords(self, name):
return self.authority.records.get(name)
class IUser(components.Interface):
"""
@cvar name: This user's name.
"""
def __init__(self, control, name):
pass
ACCESS_DENIED = failure.Failure(Exception("DENIED"))
class User(pb.Perspective):
__implements__ = (IUser,)
def __init__(self, name, authority, domains=()):
self.name = name
self.auth = authority
self.domains = dict([(d.lower(), None) for d in domains])
def addDomain(self, name):
self.domains[name.lower()] = None
def removeDomain(self, name):
del self.domains[name.lower()]
def getDomains(self):
return self.domains.keys()
def remote_setRecord(self, name, record):
if name.lower() in self.domains:
return self.auth.setRecord(name, record)
return ACCESS_DENIED
def remote_removeRecords(self, name):
if name.lower() in self.domains:
return self.auth.removeRecords(name)
return ACCESS_DENIED
def remote_getRecords(self, name):
if name.lower() in self.domains:
return self.auth.getRecords(name)
return ACCESS_DENIED
syntax highlighted by Code2HTML, v. 0.9.1