Module src.onionrutils.localcommand
Onionr - Private P2P Communication
send a command to the local API server
Expand source code
"""
    Onionr - Private P2P Communication
    send a command to the local API server
"""
import urllib, time
import json
import functools
from typing import TYPE_CHECKING, Callable
import requests
import logger, config, deadsimplekv
from . import getclientapiserver
import filepaths
"""
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program. If not, see <https://www.gnu.org/licenses/>.
"""
config.reload()
cache = deadsimplekv.DeadSimpleKV(filepaths.cached_storage, refresh_seconds=1000)
def get_hostname():
    hostname = ''
    waited = 0
    maxWait = 3
    while True:
        if cache.get('client_api') is None:
            try:
                hostname = getclientapiserver.get_client_API_server()
            except FileNotFoundError:
                hostname = False
            else:
                cache.put('hostname', hostname)
                cache.flush()
        else:
            hostname = cache.get('hostname')
        if hostname == '' or hostname is None:
            time.sleep(1)
            if waited == maxWait:
                return False
        else:
            return hostname
def local_command(command, data='', silent = True, post=False,
                  postData = {}, maxWait=20,
                  is_json=False
                  ):
    """
        Send a command to the local http API server, securely. Intended for local clients, DO NOT USE for remote peers.
    """
    # TODO: URL encode parameters, just as an extra measure. May not be needed, but should be added regardless.
    hostname = get_hostname()
    if hostname == False: return False
    if data != '':
        data = '&data=' + urllib.parse.quote_plus(data)
    payload = 'http://%s/%s%s' % (hostname, command, data)
    if not config.get('client.webpassword'):
        config.reload()
    try:
        if post:
            if is_json:
                ret_data = requests.post(
                    payload,
                    json=postData,
                    headers={'token': config.get('client.webpassword'),
                             'Connection': 'close'},
                    timeout=(maxWait, maxWait)).text
            else:
                ret_data = requests.post(
                    payload,
                    data=postData,
                    headers={'token': config.get('client.webpassword'),
                             'Connection': 'close'},
                    timeout=(maxWait, maxWait)).text
        else:
            ret_data = requests.get(payload, headers={'token': config.get('client.webpassword'), 'Connection':'close'}, timeout=(maxWait, maxWait)).text
    except Exception as error:
        if not silent:
            logger.error('Failed to make local request (command: %s):%s' % (command, error), terminal=True)
        ret_data = False
    return ret_dataFunctions
- def get_hostname()
- 
Expand source codedef get_hostname(): hostname = '' waited = 0 maxWait = 3 while True: if cache.get('client_api') is None: try: hostname = getclientapiserver.get_client_API_server() except FileNotFoundError: hostname = False else: cache.put('hostname', hostname) cache.flush() else: hostname = cache.get('hostname') if hostname == '' or hostname is None: time.sleep(1) if waited == maxWait: return False else: return hostname
- def local_command(command, data='', silent=True, post=False, postData={}, maxWait=20, is_json=False)
- 
Send a command to the local http API server, securely. Intended for local clients, DO NOT USE for remote peers. Expand source codedef local_command(command, data='', silent = True, post=False, postData = {}, maxWait=20, is_json=False ): """ Send a command to the local http API server, securely. Intended for local clients, DO NOT USE for remote peers. """ # TODO: URL encode parameters, just as an extra measure. May not be needed, but should be added regardless. hostname = get_hostname() if hostname == False: return False if data != '': data = '&data=' + urllib.parse.quote_plus(data) payload = 'http://%s/%s%s' % (hostname, command, data) if not config.get('client.webpassword'): config.reload() try: if post: if is_json: ret_data = requests.post( payload, json=postData, headers={'token': config.get('client.webpassword'), 'Connection': 'close'}, timeout=(maxWait, maxWait)).text else: ret_data = requests.post( payload, data=postData, headers={'token': config.get('client.webpassword'), 'Connection': 'close'}, timeout=(maxWait, maxWait)).text else: ret_data = requests.get(payload, headers={'token': config.get('client.webpassword'), 'Connection':'close'}, timeout=(maxWait, maxWait)).text except Exception as error: if not silent: logger.error('Failed to make local request (command: %s):%s' % (command, error), terminal=True) ret_data = False return ret_data