Esempio n. 1
0
        def when_authenticated(result):
            log.msg('otter.auth.cache.populate')
            self._cache[tenant_id] = (self._reactor.seconds(), result)

            waiters = self._waiters.pop(tenant_id, [])
            for waiter in waiters:
                waiter.callback(result)

            return result
Esempio n. 2
0
        def when_authenticated(result):
            log.msg('otter.auth.cache.populate')
            self._cache[tenant_id] = (self._reactor.seconds(), result)

            waiters = self._waiters.pop(tenant_id, [])
            for waiter in waiters:
                waiter.callback(result)

            return result
Esempio n. 3
0
    def authenticate_tenant(self, tenant_id):
        """
        see :meth:`IAuthenticator.authenticate_tenant`
        """
        log = self._log.bind(tenant_id=tenant_id)

        if tenant_id in self._cache:
            (created, data) = self._cache[tenant_id]
            now = self._reactor.seconds()

            if now - created <= self._ttl:
                log.msg('otter.auth.cache.hit', age=now - created)
                return succeed(data)

            log.msg('otter.auth.cache.expired', age=now - created)

        if tenant_id in self._waiters:
            d = Deferred()
            self._waiters[tenant_id].append(d)
            log.msg('otter.auth.cache.waiting',
                    waiters=len(self._waiters[tenant_id]))
            return d

        def when_authenticated(result):
            log.msg('otter.auth.cache.populate')
            self._cache[tenant_id] = (self._reactor.seconds(), result)

            waiters = self._waiters.pop(tenant_id, [])
            for waiter in waiters:
                waiter.callback(result)

            return result

        def when_auth_fails(failure):
            waiters = self._waiters.pop(tenant_id, [])
            for waiter in waiters:
                waiter.errback(failure)

            return failure

        log.msg('otter.auth.cache.miss')
        self._waiters[tenant_id] = []
        d = self._authenticator.authenticate_tenant(tenant_id)
        d.addCallback(when_authenticated)
        d.addErrback(when_auth_fails)

        return d
Esempio n. 4
0
    def authenticate_tenant(self, tenant_id):
        """
        see :meth:`IAuthenticator.authenticate_tenant`
        """
        log = self._log.bind(tenant_id=tenant_id)

        if tenant_id in self._cache:
            (created, data) = self._cache[tenant_id]
            now = self._reactor.seconds()

            if now - created <= self._ttl:
                log.msg('otter.auth.cache.hit', age=now - created)
                return succeed(data)

            log.msg('otter.auth.cache.expired', age=now - created)

        if tenant_id in self._waiters:
            d = Deferred()
            self._waiters[tenant_id].append(d)
            log.msg('otter.auth.cache.waiting',
                    waiters=len(self._waiters[tenant_id]))
            return d

        def when_authenticated(result):
            log.msg('otter.auth.cache.populate')
            self._cache[tenant_id] = (self._reactor.seconds(), result)

            waiters = self._waiters.pop(tenant_id, [])
            for waiter in waiters:
                waiter.callback(result)

            return result

        def when_auth_fails(failure):
            waiters = self._waiters.pop(tenant_id, [])
            for waiter in waiters:
                waiter.errback(failure)

            return failure

        log.msg('otter.auth.cache.miss')
        self._waiters[tenant_id] = []
        d = self._authenticator.authenticate_tenant(tenant_id)
        d.addCallback(when_authenticated)
        d.addErrback(when_auth_fails)

        return d