(Steve Dougherty)
2013-06-04: Refactor own identity resolution into module. Refactor own identity resolution into module.
diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py --- a/infocalypse/__init__.py +++ b/infocalypse/__init__.py @@ -386,49 +386,13 @@ def infocalypse_create(ui_, repo, **opts # 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)) + import wot + attributes = wot.resolve_own_identity(ui_, nick_prefix) + if attributes is None: + # Something went wrong; the function already printed an error. 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)] + insert_uri = attributes['InsertURI'] # 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 @@ -445,10 +409,11 @@ def infocalypse_create(ui_, repo, **opts # Add "vcs" context. No-op if the identity already has it. msg_params = {'Message':'AddContext', - 'Identity': - own_response['Replies.Identity{0}'.format(id_num)], + 'Identity': attributes['Identity'], 'Context': 'vcs'} + import fcp + node = fcp.FCPNode() vcs_response =\ node.fcpPluginMessage(async=False, plugin_name="plugins.WebOfTrust.WebOfTrust", diff --git a/infocalypse/wot.py b/infocalypse/wot.py new file mode 100644 --- /dev/null +++ b/infocalypse/wot.py @@ -0,0 +1,64 @@ +import fcp + +# Support for querying WoT for own identities and identities meeting various +# criteria. + +def resolve_own_identity(ui, nickname_prefix=None): + """ + Mercurial ui for status updates and error messages. + Nickname prefix should be enough to not be ambiguous. + # TODO: Does not support duplicate nicknames between own identities. + # Could support looking at identity to resolve further. + + Returns a dictionary of the nickname, insert and request URIs, + and identity that match the given criteria. + In the case of an error prints a message and returns None. + """ + ui.status("Querying WoT for own identities.\n") + 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: Single function to resolve identity used for own and remote? + # Not preferable if the flag leads to two different code paths. + + # Find nicknames starting with the supplied nickname prefix. + prefix = 'Replies.Nickname' + nickname = None + id_num = -1 + for key in own_response.iterkeys(): + if key.startswith(prefix) and\ + own_response[key].startswith(nickname_prefix): + if nickname is not None: + # More than one matched. + ui.warn("Prefix '{0}' is ambiguous.\n", nickname_prefix) + 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(nickname_prefix)) + return + + # Return properties for the selected identity. (by number) + results = {} + for item in [ 'Nickname', 'InsertURI','RequestURI', 'Identity' ]: + results[item] = own_response['Replies.{0}{1}'.format(item, id_num)] + + # LCWoT also puts these things as properties, which would be nicer to + # depend on and would allow just returning all properties for the identity. + #property_prefix = "Replies.Properties{0}".format(id_num) + + return results