def confirm_install(self, msg): """We need to check something with the user before continuing with the install. @raise download.DownloadAborted: if the user cancels""" yield print(msg, file=sys.stderr) while True: sys.stderr.write(_("Install [Y/N] ")) i = support.raw_input() if not i: continue if i in 'Nn': raise download.DownloadAborted() if i in 'Yy': break
def confirm_import_feed(self, pending, valid_sigs): """Sub-classes should override this method to interact with the user about new feeds. If multiple feeds need confirmation, L{trust.TrustMgr.confirm_keys} will only invoke one instance of this method at a time. @param pending: the new feed to be imported @type pending: L{PendingFeed} @param valid_sigs: maps signatures to a list of fetchers collecting information about the key @type valid_sigs: {L{gpg.ValidSig} : L{fetch.KeyInfoFetcher}} @since: 0.42""" from zeroinstall.injector import trust assert valid_sigs domain = trust.domain_from_url(pending.url) # Ask on stderr, because we may be writing XML to stdout print(_("Feed: %s") % pending.url, file=sys.stderr) print(_("The feed is correctly signed with the following keys:"), file=sys.stderr) for x in valid_sigs: print("-", x, file=sys.stderr) def text(parent): text = "" for node in parent.childNodes: if node.nodeType == node.TEXT_NODE: text = text + node.data return text shown = set() key_info_fetchers = valid_sigs.values() while key_info_fetchers: old_kfs = key_info_fetchers key_info_fetchers = [] for kf in old_kfs: infos = set(kf.info) - shown if infos: if len(valid_sigs) > 1: print("%s: " % kf.fingerprint) for key_info in infos: print("-", text(key_info), file=sys.stderr) shown.add(key_info) if kf.blocker: key_info_fetchers.append(kf) if key_info_fetchers: for kf in key_info_fetchers: print(kf.status, file=sys.stderr) stdin = tasks.InputBlocker(0, 'console') blockers = [kf.blocker for kf in key_info_fetchers] + [stdin] yield blockers for b in blockers: try: tasks.check(b) except Exception as ex: logger.warning(_("Failed to get key info: %s"), ex) if stdin.happened: print(_("Skipping remaining key lookups due to input from user"), file=sys.stderr) break if not shown: print(_("Warning: Nothing known about this key!"), file=sys.stderr) if len(valid_sigs) == 1: print(_("Do you want to trust this key to sign feeds from '%s'?") % domain, file=sys.stderr) else: print(_("Do you want to trust all of these keys to sign feeds from '%s'?") % domain, file=sys.stderr) while True: print(_("Trust [Y/N] "), end=' ', file=sys.stderr) i = support.raw_input() if not i: continue if i in 'Nn': raise NoTrustedKeys(_('Not signed with a trusted key')) if i in 'Yy': break trust.trust_db._dry_run = self.dry_run for key in valid_sigs: print(_("Trusting %(key_fingerprint)s for %(domain)s") % {'key_fingerprint': key.fingerprint, 'domain': domain}, file=sys.stderr) trust.trust_db.trust_key(key.fingerprint, domain)
def handle(config, options, args, add_ok = True, remove_ok = False): """@type add_ok: bool @type remove_ok: bool""" if len(args) == 2: iface = config.iface_cache.get_interface(model.canonical_iface_uri(args[0])) feed_url = model.canonical_iface_uri(args[1]) feed_import = find_feed_import(iface, feed_url) if feed_import: raise SafeException(_('Interface %(interface)s already has a feed %(feed)s') % {'interface': iface.uri, 'feed': feed_url}) iface.extra_feeds.append(model.Feed(feed_url, arch = None, user_override = True)) writer.save_interface(iface) return elif len(args) != 1: raise UsageError() x = args[0] print(_("Feed '%s':") % x + '\n') x = model.canonical_iface_uri(x) if options.offline: config.network_use = model.network_offline if config.network_use != model.network_offline and config.iface_cache.is_stale(x, config.freshness): blocker = config.fetcher.download_and_import_feed(x, config.iface_cache) print(_("Downloading feed; please wait...")) tasks.wait_for_blocker(blocker) print(_("Done")) candidate_interfaces = config.iface_cache.get_feed_targets(x) assert candidate_interfaces interfaces = [] for i in range(len(candidate_interfaces)): iface = candidate_interfaces[i] if find_feed_import(iface, x): if remove_ok: print(_("%(index)d) Remove as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri}) interfaces.append(iface) else: if add_ok: print(_("%(index)d) Add as feed for '%(uri)s'") % {'index': i + 1, 'uri': iface.uri}) interfaces.append(iface) if not interfaces: if remove_ok: raise SafeException(_("%(feed)s is not registered as a feed for %(interface)s") % {'feed': x, 'interface': candidate_interfaces[0]}) else: raise SafeException(_("%(feed)s already registered as a feed for %(interface)s") % {'feed': x, 'interface': candidate_interfaces[0]}) print() while True: try: i = raw_input(_('Enter a number, or CTRL-C to cancel [1]: ')).strip() except KeyboardInterrupt: print() raise SafeException(_("Aborted at user request.")) if i == '': i = 1 else: try: i = int(i) except ValueError: i = 0 if i > 0 and i <= len(interfaces): break print(_("Invalid number. Try again. (1 to %d)") % len(interfaces)) iface = interfaces[i - 1] feed_import = find_feed_import(iface, x) if feed_import: iface.extra_feeds.remove(feed_import) else: iface.extra_feeds.append(model.Feed(x, arch = None, user_override = True)) writer.save_interface(iface) print('\n' + _("Feed list for interface '%s' is now:") % iface.get_name()) if iface.extra_feeds: for f in iface.extra_feeds: print("- " + f.uri) else: print(_("(no feeds)"))
def confirm_import_feed(self, pending, valid_sigs): """Sub-classes should override this method to interact with the user about new feeds. If multiple feeds need confirmation, L{trust.TrustMgr.confirm_keys} will only invoke one instance of this method at a time. @param pending: the new feed to be imported @type pending: L{PendingFeed} @param valid_sigs: maps signatures to a list of fetchers collecting information about the key @type valid_sigs: {L{gpg.ValidSig} : L{fetch.KeyInfoFetcher}} @since: 0.42""" from zeroinstall.injector import trust assert valid_sigs domain = trust.domain_from_url(pending.url) # Ask on stderr, because we may be writing XML to stdout print(_("Feed: %s") % pending.url, file=sys.stderr) print(_("The feed is correctly signed with the following keys:"), file=sys.stderr) for x in valid_sigs: print("-", x, file=sys.stderr) def text(parent): text = "" for node in parent.childNodes: if node.nodeType == node.TEXT_NODE: text = text + node.data return text shown = set() key_info_fetchers = valid_sigs.values() while key_info_fetchers: old_kfs = key_info_fetchers key_info_fetchers = [] for kf in old_kfs: infos = set(kf.info) - shown if infos: if len(valid_sigs) > 1: print("%s: " % kf.fingerprint) for key_info in infos: print("-", text(key_info), file=sys.stderr) shown.add(key_info) if kf.blocker: key_info_fetchers.append(kf) if key_info_fetchers: for kf in key_info_fetchers: print(kf.status, file=sys.stderr) stdin = tasks.InputBlocker(0, 'console') blockers = [kf.blocker for kf in key_info_fetchers] + [stdin] yield blockers for b in blockers: try: tasks.check(b) except Exception as ex: logger.warning(_("Failed to get key info: %s"), ex) if stdin.happened: print(_("Skipping remaining key lookups due to input from user"), file=sys.stderr) break if not shown: print(_("Warning: Nothing known about this key!"), file=sys.stderr) if len(valid_sigs) == 1: print(_("Do you want to trust this key to sign feeds from '%s'?") % domain, file=sys.stderr) else: print(_("Do you want to trust all of these keys to sign feeds from '%s'?") % domain, file=sys.stderr) while True: print(_("Trust [Y/N] "), end=' ', file=sys.stderr) sys.stderr.flush() i = support.raw_input() if not i: continue if i in 'Nn': raise NoTrustedKeys(_('Not signed with a trusted key')) if i in 'Yy': break trust.trust_db._dry_run = self.dry_run for key in valid_sigs: print(_("Trusting %(key_fingerprint)s for %(domain)s") % {'key_fingerprint': key.fingerprint, 'domain': domain}, file=sys.stderr) trust.trust_db.trust_key(key.fingerprint, domain)