(Steve Dougherty)
2013-05-31: Add --wot option to fn-create. Add --wot option to fn-create. Like --uri, but gets the insert URI from (LC)WoT based on a nickname supplied in place of "USK@."
diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py --- a/infocalypse/__init__.py +++ b/infocalypse/__init__.py @@ -68,10 +68,14 @@ USAGE EXAMPLES: hg fn-create --uri USK@/test.R1/0 +hg fn-create --wot nickname/test.R1/0 + Inserts the local hg repository into a new USK in Freenet, using the private key in your config file. You can use a full insert URI -value if you want. +value if you want, or --wot for inserting +under a WoT ID. It takes enough of a WoT +nickname required to be unambiguous. hg fn-push --uri USK@/test.R1/0 @@ -372,11 +376,91 @@ def infocalypse_create(ui_, repo, **opts """ Create a new Infocalypse repository in Freenet. """ params, stored_cfg = get_config_info(ui_, opts) - insert_uri = opts['uri'] - if insert_uri == '': - # REDFLAG: fix parameter definition so that it is required? - ui_.warn("Please set the insert URI with --uri.\n") + insert_uri = '' + if opts['uri'] != '' and opts['wot'] != '': + ui_.warn("Please specify only one of --uri or --wot.\n") return + elif opts['uri'] != '': + insert_uri = opts['uri'] + elif opts['wot'] != '': + # Expecting nick_prefix/repo_name.R<redundancy num>/edition/ + nick_prefix, repo_desc = opts['wot'].split('/', 1) + + ui_.status("Querying WoT for own identities.\n") + import fcp + node = fcp.FCPNode() + own_response =\ + node.fcpPluginMessage(async=False, + plugin_name="plugins.WebOfTrust.WebOfTrust", + plugin_params={'Message': + 'GetOwnIdentities'})[0] + + if own_response['header'] != 'FCPPluginReply' or\ + 'Replies.Message' not in own_response or\ + own_response['Replies.Message'] != 'OwnIdentities': + ui_.warn("Unexpected reply. Got {0}\n.".format(own_response)) + return + + # TODO: Does not support duplicate nicknames between own identities. + # Could support looking at identity to resolve further. + # TODO: Single function to resolve identity used for own and remote. + + # Find nicknames starting with the supplied nickname prefix. + prefix = 'Replies.Nickname' + nickname = None + id_num = 0 + for key in own_response.iterkeys(): + if key.startswith(prefix) and\ + own_response[key].startswith(nick_prefix): + if nickname is not None: + # More than one matched. + ui_.warn("Nickname prefix '{0}' is ambiguous.\n") + return + + nickname = own_response[key] + # Key is Replies.Nickname<number>, where number is used in + # the other attributes returned for that identity. + id_num = key[len(prefix):] + + if nickname is None: + ui_.warn("No nicknames start with '{0}'.\n".format(nick_prefix)) + return + + ui_.status("Using WoT identity '{0}'.\n".format(nickname)) + + insert_uri = own_response['Replies.InsertURI{0}'.format(id_num)] + + # LCWoT returns URIs with a "freenet:" prefix, and WoT does not. The + # rest of Infocalypse does not support the prefix. The local way to fix + # this is to remove it here, but the more flexible way that is also + # more work is to expand support to the rest of Infocalypse. + # TODO: More widespread support for "freenet:" URI prefix. + prefix = "freenet:" + if insert_uri.startswith(prefix): + insert_uri = insert_uri[len(prefix):] + + # URI is USK@key/WebOfTrust/<edition>, but we only want USK@key + insert_uri = insert_uri.split('/', 1)[0] + insert_uri += '/' + repo_desc + + # Add "vcs" context. No-op if the identity already has it. + msg_params = {'Message':'AddContext', + 'Identity': + own_response['Replies.Identity{0}'.format(id_num)], + 'Context': 'vcs'} + + vcs_response =\ + node.fcpPluginMessage(async=False, + plugin_name="plugins.WebOfTrust.WebOfTrust", + plugin_params=msg_params)[0] + + if vcs_response['header'] != 'FCPPluginReply' or\ + 'Replies.Message' not in vcs_response or\ + vcs_response['Replies.Message'] != 'ContextAdded': + ui_.warn("Failed to add context. Got {0}\n.".format(vcs_response)) + return + else: + ui_.warn("Please set the insert key with either --uri or --wot.\n") set_target_version(ui_, repo, opts, params, "Only inserting to version(s): %s\n") @@ -819,6 +903,7 @@ cmdtable = { "fn-create": (infocalypse_create, [('', 'uri', '', 'insert URI to create on'), + ('', 'wot', '', 'WoT nickname to create on'), ('r', 'rev', [],'maximum rev to push'),] + FCP_OPTS, "[options]"),