Adding WOT API to RPC to enable 3rd party apps like merkato
This commit is contained in:
parent
4572f255fb
commit
9501d73546
@ -5,8 +5,7 @@ Default example plugin for devs or to test blocks
|
||||
import sys
|
||||
import os
|
||||
import locale
|
||||
from threading import Thread
|
||||
from time import sleep
|
||||
from secrets import randbelow
|
||||
|
||||
import cherrypy
|
||||
|
||||
@ -14,8 +13,11 @@ locale.setlocale(locale.LC_ALL, '')
|
||||
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
|
||||
# import after path insert
|
||||
|
||||
from logger import log as logging
|
||||
from utils import identifyhome
|
||||
from onionrthreads import add_onionr_thread
|
||||
import config
|
||||
from onionrplugins.pluginapis import plugin_apis
|
||||
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
@ -45,6 +47,9 @@ jsonrpc.manager.json = ujson
|
||||
# RPC modules map Onionr APIs to the RPC dispacher
|
||||
from rpc import blocks, pluginrpcmethods
|
||||
|
||||
from rpc.addmodule import add_module_to_api
|
||||
|
||||
plugin_apis['rpc.add_module_to_api'] = add_module_to_api
|
||||
|
||||
class OnionrRPC(object):
|
||||
@cherrypy.expose
|
||||
@ -58,16 +63,37 @@ class OnionrRPC(object):
|
||||
|
||||
|
||||
def on_afterinit(api, data=None):
|
||||
def ping():
|
||||
return "pong"
|
||||
dispatcher['ping'] = ping
|
||||
pluginrpcmethods.add_plugin_rpc_methods()
|
||||
|
||||
|
||||
def _gen_random_loopback():
|
||||
return f'127.{randbelow(256)}.{randbelow(256)}.{randbelow(256)}'
|
||||
|
||||
|
||||
def on_init(api, data=None):
|
||||
config = {
|
||||
#'server.socket_file': socket_file_path,
|
||||
'server.socket_port': 0,
|
||||
bind_config = {}
|
||||
if config.get('rpc.use_sock_file', True, save=True):
|
||||
bind_config['server.socket_file'] = config.get(
|
||||
'rpc.sock_file_path', socket_file_path, save=True)
|
||||
# create base dir if it doesn't exist
|
||||
os.makedirs(
|
||||
os.path.dirname(config.get('rpc.sock_file_path', socket_file_path)), exist_ok=True)
|
||||
else:
|
||||
# Set default bind TCP address, if not set
|
||||
# We use a random loopback address to avoid browser side channel attacks
|
||||
# and let the OS pick a port (0)
|
||||
bind_config['server.socket_host'] = config.get(
|
||||
'rpc.bind_host', _gen_random_loopback(), save=True)
|
||||
bind_config['server.socket_port'] = config.get('rpc.bind_port', 0)
|
||||
cherrpy_config = bind_config | {
|
||||
'engine.autoreload.on': False
|
||||
}
|
||||
cherrypy.config.update(config)
|
||||
cherrypy.config.update(cherrpy_config)
|
||||
|
||||
logging.info("Starting RPC Server")
|
||||
|
||||
add_onionr_thread(
|
||||
cherrypy.quickstart, 5, 'OnionrRPCServer',
|
||||
|
11
static-data/official-plugins/rpc/rpc/addmodule.py
Normal file
11
static-data/official-plugins/rpc/rpc/addmodule.py
Normal file
@ -0,0 +1,11 @@
|
||||
from types import ModuleType
|
||||
from jsonrpc import dispatcher
|
||||
|
||||
|
||||
def add_module_to_api(module: ModuleType):
|
||||
prefix = f"{module.__name__}."
|
||||
for attr in dir(module):
|
||||
attr = getattr(module, attr)
|
||||
if callable(attr):
|
||||
if hasattr(attr, 'json_compatible'):
|
||||
dispatcher[prefix + attr.__name__] = attr
|
@ -5,4 +5,8 @@ from onionrplugins.pluginapis import plugin_apis
|
||||
|
||||
def add_plugin_rpc_methods():
|
||||
for method in plugin_apis:
|
||||
dispatcher[method] = plugin_apis[method]
|
||||
try:
|
||||
if plugin_apis[method].json_compatible:
|
||||
dispatcher[method] = plugin_apis[method]
|
||||
except AttributeError:
|
||||
pass
|
@ -1 +1,31 @@
|
||||
import tty
|
||||
import tty
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
def do_quit(): raise KeyboardInterrupt
|
||||
|
||||
def list_idens():
|
||||
print('Listing identities')
|
||||
|
||||
|
||||
main_menu = {
|
||||
'l': (list_idens, 'list identities'),
|
||||
'q': (do_quit, 'quit CLI')
|
||||
}
|
||||
|
||||
def main_ui():
|
||||
tty.setraw(sys.stdin)
|
||||
|
||||
while True:
|
||||
# move cursor to the beginning
|
||||
print('\r', end='')
|
||||
key = sys.stdin.read(1)
|
||||
try:
|
||||
main_menu[key][1]()
|
||||
except KeyError:
|
||||
pass
|
||||
except KeyboardInterrupt:
|
||||
break
|
||||
|
||||
|
||||
subprocess.Popen(['reset'], stdout=subprocess.PIPE)
|
||||
|
@ -37,15 +37,16 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
plugin_name = 'wot'
|
||||
PLUGIN_VERSION = '0.0.1'
|
||||
from wot.identity import identities
|
||||
from cli import main_ui
|
||||
from onionrplugins import plugin_apis
|
||||
|
||||
import wot
|
||||
from wot.loadfromblocks import load_identities_from_blocks
|
||||
from wot.identity import get_distance
|
||||
|
||||
|
||||
def on_init(api, data=None):
|
||||
logging.info(
|
||||
f"Web of Trust Plugin v{PLUGIN_VERSION} enabled")
|
||||
#onionrplugins.plugin_apis['wot'] = wot_test
|
||||
plugin_apis['wot.get_distance'] = get_distance
|
||||
|
||||
list(
|
||||
map(
|
||||
@ -53,6 +54,8 @@ def on_init(api, data=None):
|
||||
load_identities_from_blocks())
|
||||
)
|
||||
|
||||
plugin_apis['rpc.add_module_to_api'](wot)
|
||||
|
||||
|
||||
def on_wot_cmd(api, data=None):
|
||||
return
|
||||
main_ui()
|
||||
|
@ -5,4 +5,5 @@ from typing import TYPE_CHECKING, Set
|
||||
from .identity import Identity
|
||||
from .getbykey import get_identity_by_key
|
||||
from .identity import identities
|
||||
from .identity.identityset import serialize_identity_set
|
||||
|
||||
|
@ -17,3 +17,5 @@ def get_identity_by_key(
|
||||
if bytes(identity.key) == bytes(key):
|
||||
return identity
|
||||
raise KeyError("Identity not found")
|
||||
|
||||
get_identity_by_key
|
@ -27,4 +27,12 @@ class IdentitySet(set):
|
||||
|
||||
# Set of identites within N-distance trust
|
||||
|
||||
identities = IdentitySet()
|
||||
identities = IdentitySet()
|
||||
|
||||
def serialize_identity_set():
|
||||
serialized_idens = []
|
||||
for identity in list(identities):
|
||||
serialized_idens.append(identity.serialize())
|
||||
return serialized_idens
|
||||
|
||||
serialize_identity_set.json_compatible = True
|
Loading…
Reference in New Issue
Block a user