def __init__(self, soledad_proxy, keymanager_proxy, signaler=None): """ Constructor for the Soledad component. :param soledad_proxy: proxy to pass around a Soledad object. :type soledad_proxy: zope.ProxyBase :param keymanager_proxy: proxy to pass around a Keymanager object. :type keymanager_proxy: zope.ProxyBase :param signaler: Object in charge of handling communication back to the frontend :type signaler: Signaler """ self.key = "soledad" self._soledad_proxy = soledad_proxy self._keymanager_proxy = keymanager_proxy self._signaler = signaler self._soledad_bootstrapper = SoledadBootstrapper(signaler) self._soledad_defer = None
def __init__(self, soledad_proxy, keymanager_proxy, signaler=None): """ Constructor for the Soledad component. :param soledad_proxy: proxy to pass around a Soledad object. :type soledad_proxy: zope.ProxyBase :param keymanager_proxy: proxy to pass around a Keymanager object. :type keymanager_proxy: zope.ProxyBase :param signaler: Object in charge of handling communication back to the frontend :type signaler: Signaler """ self.key = "soledad" self._soledad_proxy = soledad_proxy self._keymanager_proxy = keymanager_proxy self._signaler = signaler self._soledad_bootstrapper = SoledadBootstrapper(signaler) self._soledad_defer = None
class Soledad(object): """ Interfaces with setup of Soledad. """ zope.interface.implements(ILEAPComponent) def __init__(self, soledad_proxy, keymanager_proxy, signaler=None): """ Constructor for the Soledad component. :param soledad_proxy: proxy to pass around a Soledad object. :type soledad_proxy: zope.ProxyBase :param keymanager_proxy: proxy to pass around a Keymanager object. :type keymanager_proxy: zope.ProxyBase :param signaler: Object in charge of handling communication back to the frontend :type signaler: Signaler """ self.key = "soledad" self._soledad_proxy = soledad_proxy self._keymanager_proxy = keymanager_proxy self._signaler = signaler self._soledad_bootstrapper = SoledadBootstrapper(signaler) self._soledad_defer = None self._service_tokens = {} def bootstrap(self, username, domain, password): """ Bootstrap Soledad with the user credentials. Signals: soledad_download_config soledad_gen_key :param user: user's login :type user: unicode :param domain: the domain that we are using. :type domain: unicode :param password: user's password :type password: unicode """ provider_config = ProviderConfig.get_provider_config(domain) if provider_config is not None: sb = self._soledad_bootstrapper self._soledad_defer = sb.run_soledad_setup_checks( provider_config, username, password, download_if_needed=True) self._soledad_defer.addCallback(self._set_proxies_cb) self._soledad_defer.addCallback(self._set_service_tokens_cb) self._soledad_defer.addCallback(self._write_tokens_file, username, domain) else: if self._signaler is not None: self._signaler.signal(self._signaler.soledad_bootstrap_failed) logger.error("Could not load provider configuration.") return self._soledad_defer def _set_service_tokens_cb(self, result): def register_service_token(token, service): self._service_tokens[service] = token if self._signaler is not None: self._signaler.signal( self._signaler.soledad_got_service_token, (service, token)) sol = self._soledad_bootstrapper.soledad d = sol.get_or_create_service_token('mail_auth') d.addCallback(register_service_token, 'mail_auth') d.addCallback(lambda _: result) return d def _write_tokens_file(self, result, username, domain): tokens_folder = os.path.join(tempfile.gettempdir(), "bitmask_tokens") if os.path.exists(tokens_folder): try: shutil.rmtree(tokens_folder) except OSError as e: logger.error("Can't remove tokens folder %s: %s" % (tokens_folder, e)) return os.mkdir(tokens_folder, 0700) tokens_path = os.path.join(tokens_folder, "%s@%s.json" % (username, domain)) with open(tokens_path, 'w') as ftokens: json.dump(self._service_tokens, ftokens) return result def _set_proxies_cb(self, _): """ Update the soledad and keymanager proxies to reference the ones created in the bootstrapper. """ zope.proxy.setProxiedObject(self._soledad_proxy, self._soledad_bootstrapper.soledad) zope.proxy.setProxiedObject(self._keymanager_proxy, self._soledad_bootstrapper.keymanager) def get_service_token(self, service): """ Get an authentication token for a given service. """ return self._service_tokens.get(service, '') def load_offline(self, username, password, uuid): """ Load the soledad database in offline mode. :param username: full user id (user@provider) :type username: str or unicode :param password: the soledad passphrase :type password: unicode :param uuid: the user uuid :type uuid: str or unicode Signals: Signaler.soledad_offline_finished Signaler.soledad_offline_failed """ d = self._soledad_bootstrapper.load_offline_soledad( username, password, uuid) d.addCallback(self._set_proxies_cb) def cancel_bootstrap(self): """ Cancel the ongoing soledad bootstrap (if any). """ if self._soledad_defer is not None: logger.debug("Cancelling soledad defer.") self._soledad_defer.cancel() self._soledad_defer = None def close(self): """ Close soledad database. """ if not zope.proxy.sameProxiedObjects(self._soledad_proxy, None): self._soledad_proxy.close() zope.proxy.setProxiedObject(self._soledad_proxy, None) def _change_password_ok(self, _): """ Password change callback. """ if self._signaler is not None: self._signaler.signal(self._signaler.soledad_password_change_ok) def _change_password_error(self, failure): """ Password change errback. :param failure: failure object containing problem. :type failure: twisted.python.failure.Failure """ if failure.check(NoStorageSecret): logger.error("No storage secret for password change in Soledad.") if failure.check(PassphraseTooShort): logger.error("Passphrase too short.") if self._signaler is not None: self._signaler.signal(self._signaler.soledad_password_change_error) def change_password(self, new_password): """ Change the database's password. :param new_password: the new password. :type new_password: unicode :returns: a defer to interact with. :rtype: twisted.internet.defer.Deferred """ d = threads.deferToThread(self._soledad_proxy.change_passphrase, new_password) d.addCallback(self._change_password_ok) d.addErrback(self._change_password_error)
class Soledad(object): """ Interfaces with setup of Soledad. """ zope.interface.implements(ILEAPComponent) def __init__(self, soledad_proxy, keymanager_proxy, signaler=None): """ Constructor for the Soledad component. :param soledad_proxy: proxy to pass around a Soledad object. :type soledad_proxy: zope.ProxyBase :param keymanager_proxy: proxy to pass around a Keymanager object. :type keymanager_proxy: zope.ProxyBase :param signaler: Object in charge of handling communication back to the frontend :type signaler: Signaler """ self.key = "soledad" self._soledad_proxy = soledad_proxy self._keymanager_proxy = keymanager_proxy self._signaler = signaler self._soledad_bootstrapper = SoledadBootstrapper(signaler) self._soledad_defer = None def bootstrap(self, username, domain, password): """ Bootstrap Soledad with the user credentials. Signals: soledad_download_config soledad_gen_key :param user: user's login :type user: unicode :param domain: the domain that we are using. :type domain: unicode :param password: user's password :type password: unicode """ provider_config = ProviderConfig.get_provider_config(domain) if provider_config is not None: sb = self._soledad_bootstrapper self._soledad_defer = sb.run_soledad_setup_checks( provider_config, username, password, download_if_needed=True) self._soledad_defer.addCallback(self._set_proxies_cb) else: if self._signaler is not None: self._signaler.signal(self._signaler.soledad_bootstrap_failed) logger.error("Could not load provider configuration.") return self._soledad_defer def _set_proxies_cb(self, _): """ Update the soledad and keymanager proxies to reference the ones created in the bootstrapper. """ zope.proxy.setProxiedObject(self._soledad_proxy, self._soledad_bootstrapper.soledad) zope.proxy.setProxiedObject(self._keymanager_proxy, self._soledad_bootstrapper.keymanager) def load_offline(self, username, password, uuid): """ Load the soledad database in offline mode. :param username: full user id (user@provider) :type username: str or unicode :param password: the soledad passphrase :type password: unicode :param uuid: the user uuid :type uuid: str or unicode Signals: Signaler.soledad_offline_finished Signaler.soledad_offline_failed """ d = self._soledad_bootstrapper.load_offline_soledad( username, password, uuid) d.addCallback(self._set_proxies_cb) def cancel_bootstrap(self): """ Cancel the ongoing soledad bootstrap (if any). """ if self._soledad_defer is not None: logger.debug("Cancelling soledad defer.") self._soledad_defer.cancel() self._soledad_defer = None def close(self): """ Close soledad database. """ if not zope.proxy.sameProxiedObjects(self._soledad_proxy, None): self._soledad_proxy.close() zope.proxy.setProxiedObject(self._soledad_proxy, None) def _change_password_ok(self, _): """ Password change callback. """ if self._signaler is not None: self._signaler.signal(self._signaler.soledad_password_change_ok) def _change_password_error(self, failure): """ Password change errback. :param failure: failure object containing problem. :type failure: twisted.python.failure.Failure """ if failure.check(NoStorageSecret): logger.error("No storage secret for password change in Soledad.") if failure.check(PassphraseTooShort): logger.error("Passphrase too short.") if self._signaler is not None: self._signaler.signal(self._signaler.soledad_password_change_error) def change_password(self, new_password): """ Change the database's password. :param new_password: the new password. :type new_password: unicode :returns: a defer to interact with. :rtype: twisted.internet.defer.Deferred """ d = threads.deferToThread(self._soledad_proxy.change_passphrase, new_password) d.addCallback(self._change_password_ok) d.addErrback(self._change_password_error)
class Soledad(object): """ Interfaces with setup of Soledad. """ zope.interface.implements(ILEAPComponent) def __init__(self, soledad_proxy, keymanager_proxy, signaler=None): """ Constructor for the Soledad component. :param soledad_proxy: proxy to pass around a Soledad object. :type soledad_proxy: zope.ProxyBase :param keymanager_proxy: proxy to pass around a Keymanager object. :type keymanager_proxy: zope.ProxyBase :param signaler: Object in charge of handling communication back to the frontend :type signaler: Signaler """ self.key = "soledad" self._soledad_proxy = soledad_proxy self._keymanager_proxy = keymanager_proxy self._signaler = signaler self._soledad_bootstrapper = SoledadBootstrapper(signaler) self._soledad_defer = None def bootstrap(self, username, domain, password): """ Bootstrap Soledad with the user credentials. Signals: soledad_download_config soledad_gen_key :param user: user's login :type user: unicode :param domain: the domain that we are using. :type domain: unicode :param password: user's password :type password: unicode """ provider_config = ProviderConfig.get_provider_config(domain) if provider_config is not None: self._soledad_defer = threads.deferToThread( self._soledad_bootstrapper.run_soledad_setup_checks, provider_config, username, password, download_if_needed=True) self._soledad_defer.addCallback(self._set_proxies_cb) else: if self._signaler is not None: self._signaler.signal(self._signaler.SOLEDAD_BOOTSTRAP_FAILED) logger.error("Could not load provider configuration.") return self._soledad_defer def _set_proxies_cb(self, _): """ Update the soledad and keymanager proxies to reference the ones created in the bootstrapper. """ zope.proxy.setProxiedObject(self._soledad_proxy, self._soledad_bootstrapper.soledad) zope.proxy.setProxiedObject(self._keymanager_proxy, self._soledad_bootstrapper.keymanager) def load_offline(self, username, password, uuid): """ Load the soledad database in offline mode. :param username: full user id (user@provider) :type username: str or unicode :param password: the soledad passphrase :type password: unicode :param uuid: the user uuid :type uuid: str or unicode Signals: Signaler.soledad_offline_finished Signaler.soledad_offline_failed """ self._soledad_bootstrapper.load_offline_soledad( username, password, uuid) def cancel_bootstrap(self): """ Cancel the ongoing soledad bootstrap (if any). """ if self._soledad_defer is not None: logger.debug("Cancelling soledad defer.") self._soledad_defer.cancel() self._soledad_defer = None zope.proxy.setProxiedObject(self._soledad_proxy, None) def close(self): """ Close soledad database. """ if not zope.proxy.sameProxiedObjects(self._soledad_proxy, None): self._soledad_proxy.close() zope.proxy.setProxiedObject(self._soledad_proxy, None) def _change_password_ok(self, _): """ Password change callback. """ if self._signaler is not None: self._signaler.signal(self._signaler.SOLEDAD_PASSWORD_CHANGE_OK) def _change_password_error(self, failure): """ Password change errback. :param failure: failure object containing problem. :type failure: twisted.python.failure.Failure """ if failure.check(NoStorageSecret): logger.error("No storage secret for password change in Soledad.") if failure.check(PassphraseTooShort): logger.error("Passphrase too short.") if self._signaler is not None: self._signaler.signal(self._signaler.SOLEDAD_PASSWORD_CHANGE_ERROR) def change_password(self, new_password): """ Change the database's password. :param new_password: the new password. :type new_password: unicode :returns: a defer to interact with. :rtype: twisted.internet.defer.Deferred """ d = threads.deferToThread(self._soledad_proxy.change_passphrase, new_password) d.addCallback(self._change_password_ok) d.addErrback(self._change_password_error)