diff --git a/requirements-x86-all-plugins.txt b/requirements-x86-all-plugins.txt index a5db0ee9..9bd919d6 100644 --- a/requirements-x86-all-plugins.txt +++ b/requirements-x86-all-plugins.txt @@ -75,6 +75,7 @@ cffi==1.15.1 \ --hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0 # via # -r static-data/official-plugins/wot/requirements.in + # cryptography # pynacl cheroot==8.6.0 \ --hash=sha256:366adf6e7cac9555486c2d1be6297993022eff6f8c4655c1443268cca3f08e25 \ @@ -84,6 +85,34 @@ cherrypy==18.8.0 \ --hash=sha256:9b48cfba8a2f16d5b6419cc657e6d51db005ba35c5e3824e4728bb03bbc7ef9b \ --hash=sha256:b56097025dc78a76a59db551b3a82871c6b3a0107b80b12ff759e4c0b3b947ce # via -r static-data/official-plugins/rpc/requirements.in +cryptography==38.0.1 \ + --hash=sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a \ + --hash=sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f \ + --hash=sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0 \ + --hash=sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407 \ + --hash=sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7 \ + --hash=sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6 \ + --hash=sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153 \ + --hash=sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750 \ + --hash=sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad \ + --hash=sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6 \ + --hash=sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b \ + --hash=sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5 \ + --hash=sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a \ + --hash=sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d \ + --hash=sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d \ + --hash=sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294 \ + --hash=sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0 \ + --hash=sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a \ + --hash=sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac \ + --hash=sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61 \ + --hash=sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013 \ + --hash=sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e \ + --hash=sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb \ + --hash=sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9 \ + --hash=sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd \ + --hash=sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818 + # via secretstorage filenuke==0.0.0 \ --hash=sha256:147011c0125121469cae0a8a7f4df399f470e54aa29a08f2d2c099bf0118dcee \ --hash=sha256:c55535dcecfdb27c5f4ce664d46e115950b5429763b5db75c198053646177f8f @@ -95,7 +124,9 @@ inflect==6.0.0 \ jaraco-classes==3.2.2 \ --hash=sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594 \ --hash=sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647 - # via jaraco-collections + # via + # jaraco-collections + # keyring jaraco-collections==3.5.2 \ --hash=sha256:072b93eb35f9e48508485755534e66a34ef1cc84af291fd27f39b44d4c0dd2c3 \ --hash=sha256:1ca12fa4b7067dfc8d7f791c1a8660d970a2bf2f80536ba0aa5cbb71fe1261f1 @@ -115,6 +146,12 @@ jaraco-text==3.9.1 \ --hash=sha256:3ca615c4135e151d21206075ec4aface8a2fbc3e68437fe709a6541428a635f9 \ --hash=sha256:d57cd4448a588020318425e04194e897f96fc23b92b82ff9308a24d5cbf2b3fb # via jaraco-collections +jeepney==0.8.0 \ + --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ + --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 + # via + # keyring + # secretstorage json-rpc==1.13.0 \ --hash=sha256:84b45058e5ba95f49c7b6afcf7e03ab86bee89bf2c01f3ad8dd41fe114fc1f84 \ --hash=sha256:def0dbcf5b7084fc31d677f2f5990d988d06497f2f47f13024274cfb2d5d7589 @@ -123,6 +160,10 @@ kasten==3.0.0 \ --hash=sha256:52894af46d6e1339f0d5fa8961892b292f99176848bce11877fe4a435b6782e5 \ --hash=sha256:b22ebdc5f475c2ef9ab74abc36552add0b37732a7ce2be6bd7977ee41b2163b4 # via onionrblocks +keyring==23.9.3 \ + --hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \ + --hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5 + # via -r static-data/official-plugins/wot/requirements.in mimcvdf==1.2.1 \ --hash=sha256:7c837c46cfb9dce4ba895bc706a69646d4d5185c66aeaa333b5cfaa9a7d06dc4 # via kasten @@ -300,6 +341,10 @@ pytz==2022.2.1 \ --hash=sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197 \ --hash=sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5 # via tempora +secretstorage==3.3.3 \ + --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ + --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 + # via keyring six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 diff --git a/src/onionrcommands/parser/arguments.py b/src/onionrcommands/parser/arguments.py index a4cf2280..21425955 100644 --- a/src/onionrcommands/parser/arguments.py +++ b/src/onionrcommands/parser/arguments.py @@ -35,7 +35,7 @@ def get_arguments() -> dict: ('version',): version.version, ('start', 'daemon'): daemonlaunch.start, ('stop', 'kill'): daemonlaunch.kill_daemon, - ('resetplugins', 'reset-plugins'): resetplugins.reset + ('resetplugins', 'reset-plugins', 'updateplugins', 'update-plugins'): resetplugins.reset } return args diff --git a/static-data/official-plugins/wot/main.py b/static-data/official-plugins/wot/main.py index d43a961a..431e54b5 100644 --- a/static-data/official-plugins/wot/main.py +++ b/static-data/official-plugins/wot/main.py @@ -4,15 +4,18 @@ Web of Trust Plugin """ import sys import os +import base64 import locale from time import sleep +import traceback from typing import Set, TYPE_CHECKING -from threading import Thread, local + +import keyring.errors +from nacl.signing import SigningKey from gossip.peerset import gossip_peer_set from logger import log as logging import config -import onionrplugins from onionrplugins.pluginapis import plugin_apis locale.setlocale(locale.LC_ALL, '') @@ -35,7 +38,7 @@ along with this program. If not, see . """ plugin_name = 'wot' PLUGIN_VERSION = '0.0.1' -from wot.identity import identities +from wot.identity import Identity, identities from wot import wotkeyring from cli import main_ui from onionrplugins import plugin_apis @@ -46,7 +49,13 @@ from wot.loadfromblocks import load_identities_from_blocks def on_init(api, data=None): def load_identity_from_config(identity_name: str): - identity_base85_key = config.get('wot.identity.{identity_name}') + identity_base85_key = config.get('wot.identity.{identity_name}', '') + if not identity_base85_key: + raise KeyError('Identity not found in config') + key = SigningKey(base64.base85decode(identity_base85_key)) + identity = identities.Identity(identity_name, key) + return identity + logging.info( f"Web of Trust Plugin v{PLUGIN_VERSION} enabled") @@ -61,22 +70,59 @@ def on_init(api, data=None): # load active identity, from there load our trust graph active_identity = config.get('wot.active_identity_name', '') - if active_identity: + if not active_identity: try: script = sys.argv[0] + ' ' except IndexError: script = '' logging.info( - "Generate a web of trust identity with '{script}wot new" + + f"Generate a web of trust identity with '{script}wot new" + "' and restart Onionr") return - if config.get('wot.use_system_keyring', True): - iden = wotkeyring.get_identity_by_name(active_identity) - else: - # load from file + + try: iden = load_identity_from_config(active_identity) + except KeyError: + try: + iden = wotkeyring.get_identity_by_name(active_identity) + except KeyError: + logging.error( + "Active identity's private key not found in config or keyring") + return - + logging.info('Loaded active identity: ' + iden.name) def on_wot_cmd(api, data=None): - main_ui() + def _create_new_iden(): + iden = Identity( + SigningKey.generate(), + input('Enter a name for your identity: ')) + try: + wotkeyring.set_identity(iden) + except keyring.errors.NoKeyringError: + logging.warn( + "Could not use secure keyring to store your WOT " + + "private key, using config.") + logging.info("Using config file to store identity private key") + config.set( + 'wot.identity.{iden.name}', + base64.b85encode( + bytes(iden.private_key)).decode('utf-8'), savefile=True) + config.set( + 'wot.active_identity_name', iden.name, savefile=True) + logging.info( + 'Identity created and automatically set as active. ' + + 'Restart Onionr to use it.') + try: + cmd = sys.argv[2] + except IndexError: + cmd = '' + + match cmd: + case 'new': + try: + _create_new_iden() + except KeyboardInterrupt: + pass + case '': + main_ui() diff --git a/static-data/official-plugins/wot/wot/wotkeyring/__init__.py b/static-data/official-plugins/wot/wot/wotkeyring/__init__.py index 144f71c9..7072fb58 100644 --- a/static-data/official-plugins/wot/wot/wotkeyring/__init__.py +++ b/static-data/official-plugins/wot/wot/wotkeyring/__init__.py @@ -1,18 +1,22 @@ +import base64 import keyring -from identity import Identity +from wot.identity import Identity def get_identity_by_name(name: str) -> 'Identity': iden_key = keyring.get_credential('onionr.wot', name) + iden_key = base64.b85decode(iden_key) + if not iden_key: raise KeyError('Identity not found') return Identity(iden_key, name) -def set_identity_by_name(identity: 'Identity', name: str) -> None: +def set_identity(identity: 'Identity') -> None: + name = identity.name if identity.private_key: - keyring.set_credential('onionr.wot', name, identity.private_key) + keyring.set_password('onionr.wot', name, base64.b85encode(bytes(identity.private_key))) else: raise ValueError('Cannot set identity with no private key')