Skip to content
This repository has been archived by the owner on Feb 13, 2020. It is now read-only.

Commit

Permalink
Pulled up r7593 r7597 from trunk
Browse files Browse the repository at this point in the history
  • Loading branch information
m0rgen committed Jun 15, 2011
1 parent db61319 commit d1fc82c
Show file tree
Hide file tree
Showing 5 changed files with 83 additions and 23 deletions.
18 changes: 9 additions & 9 deletions twistedcaldav/directory/calendaruserproxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -596,12 +596,12 @@ def gotCachedMembers(members):

# Cache miss; compute members and update cache
def gotMembersFromDB(dbmembers):
members = set([row[0] for row in dbmembers])
members = set([row[0].encode("utf-8") for row in dbmembers])
d = self._memcacher.setMembers(principalUID, members)
d.addCallback(lambda _: members)
return d

d = self.query("select MEMBER from GROUPS where GROUPNAME = :1", (principalUID,))
d = self.query("select MEMBER from GROUPS where GROUPNAME = :1", (principalUID.decode("utf-8"),))
d.addCallback(gotMembersFromDB)
return d

Expand All @@ -621,12 +621,12 @@ def gotCachedMemberships(memberships):

# Cache miss; compute memberships and update cache
def gotMembershipsFromDB(dbmemberships):
memberships = set([row[0] for row in dbmemberships])
memberships = set([row[0].encode("utf-8") for row in dbmemberships])
d = self._memcacher.setMemberships(principalUID, memberships)
d.addCallback(lambda _: memberships)
return d

d = self.query("select GROUPNAME from GROUPS where MEMBER = :1", (principalUID,))
d = self.query("select GROUPNAME from GROUPS where MEMBER = :1", (principalUID.decode("utf-8"),))
d.addCallback(gotMembershipsFromDB)
return d

Expand All @@ -647,7 +647,7 @@ def _add_to_db(self, principalUID, members):
"""
insert into GROUPS (GROUPNAME, MEMBER)
values (:1, :2)
""", (principalUID, member,)
""", (principalUID.decode("utf-8"), member,)
)

def _add_to_db_one(self, principalUID, memberUID):
Expand All @@ -661,7 +661,7 @@ def _add_to_db_one(self, principalUID, memberUID):
"""
insert into GROUPS (GROUPNAME, MEMBER)
values (:1, :2)
""", (principalUID, memberUID,)
""", (principalUID.decode("utf-8"), memberUID.decode("utf-8"),)
)

def _delete_from_db(self, principalUID):
Expand All @@ -670,7 +670,7 @@ def _delete_from_db(self, principalUID):
@param principalUID: the UID of the group principal to remove.
"""
return self.execute("delete from GROUPS where GROUPNAME = :1", (principalUID,))
return self.execute("delete from GROUPS where GROUPNAME = :1", (principalUID.decode("utf-8"),))

def _delete_from_db_one(self, principalUID, memberUID):
"""
Expand All @@ -679,15 +679,15 @@ def _delete_from_db_one(self, principalUID, memberUID):
@param principalUID: the UID of the group principal to remove.
@param memberUID: the UID of the principal that is being removed as a member of this group.
"""
return self.execute("delete from GROUPS where GROUPNAME = :1 and MEMBER = :2", (principalUID, memberUID,))
return self.execute("delete from GROUPS where GROUPNAME = :1 and MEMBER = :2", (principalUID.decode("utf-8"), memberUID.decode("utf-8"),))

def _delete_from_db_member(self, principalUID):
"""
Deletes the specified member entry from the database.
@param principalUID: the UID of the member principal to remove.
"""
return self.execute("delete from GROUPS where MEMBER = :1", (principalUID,))
return self.execute("delete from GROUPS where MEMBER = :1", (principalUID.decode("utf-8"),))

def _db_version(self):
"""
Expand Down
15 changes: 15 additions & 0 deletions twistedcaldav/directory/test/test_proxyprincipaldb.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,21 @@ def test_normalDB(self):
self.assertEqual(membersA, set(("B", "C", "D",)))
self.assertEqual(membershipsB, set(("A",)))

@inlineCallbacks
def test_normalDBNonAscii(self):

# Get the DB
db_path = os.path.abspath(self.mktemp())
db = ProxySqliteDB(db_path)
principalID = "Test \xe4\xbd\x90\xe8\x97\xa4"
yield db.setGroupMembers(principalID, ("B", "C", "D",))

membersA = yield db.getMembers(principalID)
membershipsB = yield db.getMemberships("B")

self.assertEqual(membersA, set(("B", "C", "D",)))
self.assertEqual(membershipsB, set((principalID,)))

@inlineCallbacks
def test_DBIndexed(self):

Expand Down
34 changes: 26 additions & 8 deletions twistedcaldav/mail.py
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,18 @@ def _db_upgrade_data_tables(self, q, old_version):
# Service
#

class MailGatewayService(service.MultiService):

def startService(self):
"""
Purge old database tokens -- doing this in startService so that
it happens after we've shed privileges
"""
service.MultiService.startService(self)
if self.mailer is not None:
self.mailer.purge()


class MailGatewayServiceMaker(LoggingMixIn):
implements(IPlugin, service.IServiceMaker)

Expand All @@ -543,7 +555,7 @@ def makeService(self, options):
config.Memcached.MaxClients,
)

multiService = service.MultiService()
mailGatewayService = MailGatewayService()

settings = config.Scheduling['iMIP']
if settings['Enabled']:
Expand All @@ -560,18 +572,19 @@ def makeService(self, options):
# TODO: raise error?
self.log_error("Invalid iMIP type in configuration: %s" %
(mailType,))
return multiService

client.setServiceParent(multiService)
return mailGatewayService

client.setServiceParent(mailGatewayService)

# Set up /inbox -- server POSTs to it to send out iMIP invites
IScheduleService(settings, mailer).setServiceParent(multiService)
IScheduleService(settings, mailer).setServiceParent(mailGatewayService)

else:
mailer = None
self.log_info("Mail Gateway Service not enabled")

return multiService
mailGatewayService.mailer = mailer
return mailGatewayService


class IScheduleService(service.MultiService, LoggingMixIn):
Expand Down Expand Up @@ -609,9 +622,14 @@ def __init__(self, dataRoot=None):
if dataRoot is None:
dataRoot = config.DataRoot
self.db = MailGatewayTokensDatabase(dataRoot)
days = config.Scheduling['iMIP']['InvitationDaysToLive']
self.days = config.Scheduling['iMIP']['InvitationDaysToLive']

def purge(self):
"""
Purge old database tokens
"""
self.db.purgeOldTokens(datetime.date.today() -
datetime.timedelta(days=days))
datetime.timedelta(days=self.days))

def checkDSN(self, message):
# returns (isDSN, Action, icalendar attachment)
Expand Down
12 changes: 6 additions & 6 deletions twistedcaldav/notify.py
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ def publishNode(self, nodeName, lock=True):
iq = IQ(self.xmlStream)
pubsubElement = iq.addElement('pubsub', defaultUri=self.pubsubNS)
publishElement = pubsubElement.addElement('publish')
publishElement['node'] = nodeName
publishElement['node'] = nodeName.decode("utf-8")
if self.settings["NodeConfiguration"]["pubsub#deliver_payloads"] == '1':
itemElement = publishElement.addElement('item')
itemElement.addElement('plistfrag', defaultUri='plist-apple')
Expand Down Expand Up @@ -742,7 +742,7 @@ def createNode(self, nodeName, publish=True):
iq = IQ(self.xmlStream)
pubsubElement = iq.addElement('pubsub', defaultUri=self.pubsubNS)
child = pubsubElement.addElement('create')
child['node'] = nodeName
child['node'] = nodeName.decode("utf-8")
d = iq.send(to=self.settings['ServiceAddress'])
d.addCallback(self.createNodeSuccess, nodeName, publish)
d.addErrback(self.createNodeFailure, nodeName, publish)
Expand Down Expand Up @@ -794,7 +794,7 @@ def requestConfigurationForm(self, nodeName, publish):
child = iq.addElement('pubsub',
defaultUri=self.pubsubNS+"#owner")
child = child.addElement('configure')
child['node'] = nodeName
child['node'] = nodeName.decode("utf-8")
d = iq.send(to=self.settings['ServiceAddress'])
d.addCallback(self.requestConfigurationFormSuccess, nodeName,
publish)
Expand Down Expand Up @@ -829,7 +829,7 @@ def requestConfigurationFormSuccess(self, iq, nodeName, publish):
filledPubSub = filledIq.addElement('pubsub',
defaultUri=self.pubsubNS+"#owner")
filledConfigure = filledPubSub.addElement('configure')
filledConfigure['node'] = nodeName
filledConfigure['node'] = nodeName.decode("utf-8")
filledForm = filledConfigure.addElement('x',
defaultUri='jabber:x:data')
filledForm['type'] = 'submit'
Expand Down Expand Up @@ -859,7 +859,7 @@ def requestConfigurationFormSuccess(self, iq, nodeName, publish):
cancelPubSub = cancelIq.addElement('pubsub',
defaultUri=self.pubsubNS+"#owner")
cancelConfig = cancelPubSub.addElement('configure')
cancelConfig['node'] = nodeName
cancelConfig['node'] = nodeName.decode("utf-8")
cancelX = cancelConfig.addElement('x',
defaultUri='jabber:x:data')
cancelX['type'] = 'cancel'
Expand Down Expand Up @@ -940,7 +940,7 @@ def deleteNode(self, nodeName):
pubsubElement = iq.addElement('pubsub',
defaultUri=self.pubsubNS+"#owner")
publishElement = pubsubElement.addElement('delete')
publishElement['node'] = nodeName
publishElement['node'] = nodeName.decode("utf-8")
self.sendDebug("Deleting (%s)" % (nodeName,), iq)
d = iq.send(to=self.settings['ServiceAddress'])
d.addCallback(self.deleteNodeSuccess, nodeName)
Expand Down
27 changes: 27 additions & 0 deletions twistedcaldav/test/test_mail.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from twistedcaldav.mail import MailHandler
from twistedcaldav.mail import MailGatewayTokensDatabase
import os
import datetime


def echo(*args):
Expand All @@ -38,6 +39,32 @@ def setUp(self):
self.handler = MailHandler(dataRoot=":memory:")
self.dataDir = os.path.join(os.path.dirname(__file__), "data", "mail")


def test_purge(self):
"""
Ensure that purge( ) cleans out old tokens
"""

# Insert an "old" token
token = "test_token"
organizer = "[email protected]"
attendee = "[email protected]"
icaluid = "123"
pastDate = datetime.date(2009,1,1)
self.handler.db._db_execute(
"""
insert into TOKENS (TOKEN, ORGANIZER, ATTENDEE, ICALUID, DATESTAMP)
values (:1, :2, :3, :4, :5)
""", token, organizer, attendee, icaluid, pastDate
)
self.handler.db._db_commit()

# purge, and make sure we don't see that token anymore
self.handler.purge()
retrieved = self.handler.db.getToken(organizer, attendee, icaluid)
self.assertEquals(retrieved, None)


def test_iconPath(self):
iconPath = self.handler.getIconPath({'day':'1', 'month':'1'}, False, language='en')
iconDir = "/usr/share/caldavd/share/date_icons"
Expand Down

0 comments on commit d1fc82c

Please sign in to comment.