Ejemplo n.º 1
0
    def validateTo(self, user):
        recipient = str(user.dest)
        valid = yield self.isRecipientValid(recipient)
        if not valid:
            raise SMTPBadRcpt(user)
        swift_filesystem = SwiftFileSystem(self.swift_connection)
        path = '/smtp/%s/%s' % (recipient, uuid4())
        d, swift_file = swift_filesystem.startFileUpload(path)
        message = SwiftMessage(d, swift_file)

        @defer.inlineCallbacks
        def onUpload(ignored):
            if not self.rabbitmq_cluster or not self.queue_name:
                defer.returnValue(None)
            replica = yield self.rabbitmq_cluster.connect()
            yield replica.send(
                self.queue_name,
                json.dumps({
                    'username': self.swift_connection.username,
                    'path': path,
                    'origin': self.origin,
                    'recipient': recipient,
                    'subj': message.subject,
                    'gate': 'smtp'
                }))

        d.addCallback(onUpload)
        yield swift_file.started
        msg("Uploading %s" % path)
        defer.returnValue(lambda: message)
Ejemplo n.º 2
0
 def __init__(self, avatar):
     self.swiftconn = avatar.swiftconn
     self.swiftfilesystem = SwiftFileSystem(self.swiftconn)
     self.avatar = avatar
     self.rabbitmq_cluster = avatar.rabbitmq_cluster
     self.queue_name = avatar.queue_name
     self.conn = avatar.conn
     self.log_command('login')
Ejemplo n.º 3
0
 def prepare_path():
     swift_conn = yield swift_connect()
     swift_filesystem = SwiftFileSystem(swift_conn)
     try:
         yield swift_filesystem.get_container_listing('smtp', '/')
     except swift.NotFound:
         yield swift_filesystem.makeDirectory('/smtp/')
     defer.returnValue(None)
Ejemplo n.º 4
0
 def isRecipientValid(self, recipient):
     valid = self.recipients.get(recipient)
     if valid is not None:
         msg("Recipient %s is %svalid [cached]" %
             (recipient, "" if valid else "not "))
         defer.returnValue(valid)
     if not self.swift_connection:
         self.swift_connection = yield self.connectToSwift()
     swift_filesystem = SwiftFileSystem(self.swift_connection)
     try:
         yield swift_filesystem.getAttrs(''.join(['/smtp/', recipient]))
         valid = True
     except swift.NotFound:
         valid = False
     msg("Recipient %s is %svalid" % (recipient, "" if valid else "not "))
     self.recipients[recipient] = valid
     defer.returnValue(valid)
Ejemplo n.º 5
0
def remove_test_data(swift, prefix):
    swift_fs = SwiftFileSystem(swift)
    time.sleep(2)
    containers = yield swift_fs.get_account_listing()
    sem = defer.DeferredSemaphore(200)
    for container in containers:
        if container.startswith(prefix):
            while True:
                objs = yield list_all_objects(swift, container)
                dl = []
                for obj in objs:
                    dl.append(sem.run(
                        swift.delete_object, container, obj['name']))
                # Wait till all objects are done deleting
                yield DeferredList(dl, fireOnOneErrback=True)
                try:
                    # Delete the container
                    yield swift.delete_container(container)
                    break
                except Conflict:
                    # Retry listing if there are still objects
                    # (this can happen a lot since the container server isn't
                    # guarenteed to be consistent)
                    pass
Ejemplo n.º 6
0
 def __init__(self, swiftconn, rabbitmq_cluster, queue_name):
     self.swiftconn = swiftconn
     self.swiftfilesystem = SwiftFileSystem(self.swiftconn)
     self.log_command('login')
     self.rabbitmq_cluster = rabbitmq_cluster
     self.queue_name = queue_name
Ejemplo n.º 7
0
 def __init__(self, swiftconn):
     self.swiftconn = swiftconn
     self.swiftfilesystem = SwiftFileSystem(self.swiftconn)
     self.log_command('login')