예제 #1
0
    def testAvatarStoreState(self):
        """
        You can only pass an 'avatars' argument if it doesn't already have an
        account in it.  Some accounts want to have their stores in slightly odd
        places (like offering.py) but you can't have two accounts added which
        both point to the same store.
        """
        dbdir = FilePath(self.mktemp())
        s = Store(dbdir)
        ls = userbase.LoginSystem(store=s)
        dependency.installOn(ls, s)
        acc = ls.addAccount('alice', 'dom.ain', 'password')

        # this is allowed, if weird
        unrelatedAccount = ls.addAccount(
            'elseice', 'dom.ain', 'password',
            avatars=SubStore.createNew(s, ('crazy', 'what')))

        # this is not allowed.
        self.assertRaises(errors.DuplicateUniqueItem,
                          ls.addAccount,
                          'bob', 'ain.dom', 'xpassword',
                          avatars=acc.avatars)

        # Make sure that our stupid call to addAccount did not corrupt
        # anything, because we are stupid
        self.assertEqual(acc.avatars.open().query(userbase.LoginAccount).count(), 1)
예제 #2
0
    def testGetLoginMethods(self):
        """
        Test L{userbase.getLoginMethods}
        """
        dbdir = FilePath(self.mktemp())
        s = Store(dbdir)
        ls = userbase.LoginSystem(store=s)
        dependency.installOn(ls, s)

        acc = ls.addAccount('username', 'dom.ain', 'password', protocol='speech')
        ss = acc.avatars.open()

        for protocol in (None, 'speech'):
            self.assertEqual(list(userbase.getAccountNames(ss, protocol)),
                              [('username', 'dom.ain')])

        # defaults to ANY_PROTOCOL
        acc.addLoginMethod('username2', 'dom.ain')

        # check that searching for protocol=speech also gives us the
        # ANY_PROTOCOL LoginMethod
        for protocol in (None, 'speech'):
            self.assertEqual(sorted(userbase.getAccountNames(ss, protocol)),
                              [('username', 'dom.ain'),
                               ('username2', 'dom.ain')])
예제 #3
0
    def testPolicy(self):
        """
        Test that only internal or verified L{userbase.LoginMethod}s with
        protocol=email are considered candidates for from addresses
        """
        s = store.Store(self.mktemp())
        ls = userbase.LoginSystem(store=s)
        installOn(ls, s)

        acc = ls.addAccount('username',
                            'dom.ain',
                            'password',
                            protocol=u'not email')
        ss = acc.avatars.open()

        # not verified or internal, should explode
        self.assertRaises(RuntimeError,
                          lambda: smtpout._getFromAddressFromStore(ss))

        # ANY_PROTOCOL
        acc.addLoginMethod(u'yeah', u'x.z', internal=True)

        # should work
        self.assertEquals('[email protected]', smtpout._getFromAddressFromStore(ss))

        ss.findUnique(
            userbase.LoginMethod,
            userbase.LoginMethod.localpart == u'yeah').deleteFromStore()

        # external, verified
        acc.addLoginMethod(u'yeah', u'z.a', internal=False, verified=True)

        # should work
        self.assertEquals('[email protected]', smtpout._getFromAddressFromStore(ss))
예제 #4
0
    def testUserLoginMethodCreator(self):
        dbdir = FilePath(self.mktemp())
        s = Store(dbdir)
        ls = userbase.LoginSystem(store=s)
        acc = ls.addAccount('username', 'example.com', 'password')
        ss = acc.avatars.open()
        subStoreLoginAccount = ss.findUnique(userbase.LoginAccount)

        # Do everything twice to make sure repeated calls don't corrupt state
        # somehow
        for i in [0, 1]:
            subStoreLoginAccount.addLoginMethod(
                localpart='anothername',
                domain='example.org',
                verified=True,
                protocol='test',
                internal=False)

            loginMethods = s.query(
                userbase.LoginMethod, sort=userbase.LoginMethod.storeID.ascending)

            subStoreLoginMethods = ss.query(
                userbase.LoginMethod, sort=userbase.LoginMethod.storeID.ascending)

            self.assertEqual(loginMethods.count(), 2)

            self.assertEqual(
                [pvals(m) for m in loginMethods],
                [pvals(m) for m in subStoreLoginMethods])
예제 #5
0
    def setUp(self):
        self.clock = sip.clock = task.Clock()
        self.dbdir = self.mktemp()
        self.store = store.Store(self.dbdir)
        self.login = userbase.LoginSystem(store=self.store)
        installOn(self.login, self.store)
        account = self.login.addAccount('bob', 'proxy2.org', None)
        account2 = self.login.addAccount('alice', 'proxy1.org', None)
        us = self.us = account.avatars.open()
        installOn(FakeAvatar(store=us), us)
        us2 = self.us2 = account2.avatars.open()
        installOn(FakeAvatar(store=us2), us2)
        self.tq = TaskQueue(self.clock)
        self.uas = useragent.UserAgent.server(sip.IVoiceSystem(us), "10.0.0.2", FakeMediaController())
        self.uas2 = useragent.UserAgent.server(sip.IVoiceSystem(us2), "10.0.0.1", FakeMediaController())
        self.sip1 = sip.SIPTransport(self.uas, ["server.com"], 5060)
        self.sip1.startProtocol()
        self.sip2 = sip.SIPTransport(self.uas2, ["client.com"], 5060)
        self.sip2.startProtocol()

        self.svc = sipserver.SIPServer(store=self.store)
        self.svc.mediaController = FakeMediaController()
        portal = Portal(self.login, [self.login])
        self.svc.dispatcher = sip.SIPDispatcher(portal, sip.Proxy(portal))
        self.svc.transport = sip.SIPTransport(self.svc.dispatcher, sipserver.getHostnames(self.store), 5060)
        self.svc.dispatcher.start(self.svc.transport)
        dests = {('10.0.0.2', 5060): self.uas, ('10.0.0.1', 5060): self.uas2,
                 ('127.0.0.1', 5060): self.svc}
        self.messages = []
        self.sip1.sendMessage = lambda msg, dest: self.tq.addTask(dests[dest].transport.datagramReceived, str(msg.toString()), ("10.0.0.2", 5060))
        self.sip2.sendMessage = lambda msg, dest: self.tq.addTask(dests[dest].transport.datagramReceived, str(msg.toString()), ("10.0.0.1", 5060))
        self.svc.transport.sendMessage = lambda msg, dest: self.messages.append(msg) or self.tq.addTask(dests[dest].transport.datagramReceived, str(msg.toString()), ("127.0.0.1", 5060))
        useragent.Dialog.genTag = lambda self: "314159"
예제 #6
0
 def setUp(self):
     dbdir = self.mktemp()
     self.store = s = store.Store(dbdir)
     ls = userbase.LoginSystem(store=s)
     installOn(ls, s)
     acc = ls.addAccount('username', 'dom.ain', 'password')
     ss = acc.avatars.open()
     self.f = spam.Filter(store=ss)
예제 #7
0
 def installOn(self, other):
     # XXX check installation on other, not store
     for ls in self.store.query(userbase.LoginSystem):
         raise usage.UsageError("UserBase already installed")
     else:
         ls = userbase.LoginSystem(store=self.store)
         dependency.installOn(ls, other)
         return ls
예제 #8
0
 def setUp(self):
     """
     Create a store with a LoginSystem and a portal wrapped around it.
     """
     self.store = store.Store()
     installOn(userbase.LoginSystem(store=self.store), self.store)
     realm = portal.IRealm(self.store)
     checker = checkers.ICredentialsChecker(self.store)
     self.portal = portal.Portal(realm, [checker])
예제 #9
0
 def setUp(self):
     self.store = store.Store()
     self.ls = userbase.LoginSystem(store=self.store)
     self.admin = self.ls.addAccount(u'admin',
                                     u'localhost',
                                     None,
                                     internal=True,
                                     verified=True)
     self.substore = self.admin.avatars.open()
     self.sc = signup.SignupConfiguration(store=self.substore)
예제 #10
0
        def _speedup():
            l = userbase.LoginSystem(store=s)
            l.installOn(s)
            s.checkpoint()
            p = Portal(IRealm(s), [ICredentialsChecker(s)])

            a = l.addAccount(username, 'localhost', SECRET)
            gph = GarbageProtocolHandler(store=a.avatars.open(), garbage=0)
            gph.installOn(gph.store)
            return p, gph
예제 #11
0
    def testParallelLoginMethods(self):
        dbdir = self.mktemp()
        s = Store(dbdir)
        ls = userbase.LoginSystem(store=s)
        acc = ls.addAccount(u'username', u'example.com', u'password')
        ss = acc.avatars.open()

        loginMethods = s.query(userbase.LoginMethod)
        subStoreLoginMethods = ss.query(userbase.LoginMethod)

        self.assertEquals(loginMethods.count(), 1)
        self.assertEquals([pvals(m) for m in loginMethods],
                          [pvals(m) for m in subStoreLoginMethods])
예제 #12
0
    def testSystemAddress(self):
        """
        Test L{smtpout.FromAddress.findSystemAddress}
        """
        s = store.Store(self.mktemp())
        ls = userbase.LoginSystem(store=s)
        installOn(ls, s)

        acc = ls.addAccount('foo', 'host', 'password', protocol=u'email')
        ss = acc.avatars.open()

        fa = smtpout.FromAddress(store=ss)
        self.assertIdentical(smtpout.FromAddress.findSystemAddress(ss), fa)
        self.assertEquals(fa.address, 'foo@host')
예제 #13
0
    def setUp(self):
        self.dbdir = FilePath(self.mktemp())
        self.store = Store(self.dbdir)
        self.ls = userbase.LoginSystem(store=self.store)
        self.scheduler = IScheduler(self.store)

        self.account = self.ls.addAccount(
            self.localpart, self.domain, 'PASSWORD')

        self.accountStore = self.account.avatars.open()

        self.ss = IScheduler(self.accountStore)

        self.origdir = self.accountStore.dbdir
        self.destdir = FilePath(self.mktemp())
예제 #14
0
    def setUp(self):
        self.dbdir = self.mktemp()
        self.store = Store(self.dbdir)
        self.ls = userbase.LoginSystem(store=self.store)

        self.account = self.ls.addAccount(u'testuser', u'localhost',
                                          u'PASSWORD')

        accountStore = self.account.avatars.open()

        ThingThatMovesAround(store=accountStore,
                             superValue=self.IMPORTANT_VALUE)

        self.origdir = accountStore.dbdir
        self.destdir = FilePath(self.mktemp())
예제 #15
0
def createStore(testCase):
    """
    Create a new Store in a temporary directory retrieved from C{testCase}.
    Give it a LoginSystem and create an SSL certificate in its files directory.

    @param testCase: The L{unittest.TestCase} by which the returned Store will
    be used.

    @rtype: L{Store}
    """
    dbdir = testCase.mktemp()
    store = Store(dbdir)
    login = userbase.LoginSystem(store=store)
    installOn(login, store)
    certPath = store.newFilePath('server.pem')
    certcreate.main(['--filename', certPath.path, '--quiet'])
    return store
예제 #16
0
    def testAccountNames(self):
        dbdir = self.mktemp()
        s = Store(dbdir)
        ls = userbase.LoginSystem(store=s)
        ls.installOn(s)
        acc = ls.addAccount('username', 'dom.ain', 'password')
        ss = acc.avatars.open()

        self.assertEquals(list(userbase.getAccountNames(ss)),
                          [('username', 'dom.ain')])

        acc.addLoginMethod(u'nameuser', u'ain.dom')

        names = list(userbase.getAccountNames(ss))
        names.sort()
        self.assertEquals(names, [('nameuser', 'ain.dom'),
                                  ('username', 'dom.ain')])
예제 #17
0
    def setUp(self):
        self.dbdir = FilePath(self.mktemp())
        self.store = Store(self.dbdir)
        self.ls = userbase.LoginSystem(store=self.store)
        self.scheduler = Scheduler(store=self.store)
        dependency.installOn(self.scheduler, self.store)

        self.account = self.ls.addAccount(
            self.localpart, self.domain, u'PASSWORD')

        self.accountStore = self.account.avatars.open()

        self.ss = self.accountStore.findOrCreate(SubScheduler)
        dependency.installOn(self.ss, self.accountStore)

        self.origdir = self.accountStore.dbdir
        self.destdir = FilePath(self.mktemp())
예제 #18
0
 def setUp(self):
     self.dbdir = self.mktemp()
     self.store = store.Store(self.dbdir)
     self.login = userbase.LoginSystem(store=self.store)
     installOn(self.login, self.store)
     account = self.login.addAccount('bob', 'proxy2.org', None)
     us = account.avatars.open()
     installOn(FakeAvatar(store=us), us)
     self.uas = useragent.UserAgent.server(sip.IVoiceSystem(us), "127.0.0.2", FakeMediaController())
     self.sent = []
     self.sip = sip.SIPTransport(self.uas, ["server.com"], 5060)
     self.sip.startProtocol()
     self.sip.sendMessage = lambda dest, msg: self.sent.append((dest, msg))
     self.testMessages = []
     self.parser = sip.MessagesParser(self.testMessages.append)
     self.clock = sip.clock = task.Clock()
     #XXX this is probably not good
     useragent.Dialog.genTag = lambda self: "314159"
예제 #19
0
    def initializeStore():
        """
        Install site requirements for the MTA tests and create several users
        which will be used as the origin and destination of various test
        messages.
        """
        login = userbase.LoginSystem(store=s)
        installOn(login, s)

        for (localpart, domain, internal) in [
            ('testuser', 'localhost', True),
            ('testuser', 'example.com', False),
            ('administrator', 'localhost', True)]:

            account = login.addAccount(localpart, domain, None, internal=internal)
            subStore = account.avatars.open()
            def endow():
                installOn(Inbox(store=subStore), subStore)
                installOn(Composer(store=subStore), subStore)
            subStore.transact(endow)
예제 #20
0
 def setUp(self):
     self.store = Store()
     self.realm = userbase.LoginSystem(store=self.store)
     dependency.installOn(self.realm, self.store)
예제 #21
0
 def account():
     ls = userbase.LoginSystem(store=s)
     installOn(ls, s)
     acc = ls.addAccount('username', 'dom.ain', 'password')
     return acc.avatars.open()
예제 #22
0
 def setUp(self):
     self.store = Store()
     self.realm = userbase.LoginSystem(store=self.store)
     self.realm.installOn(self.store)