progress in removing core

master
Kevin Froman 2019-07-18 23:59:44 -05:00
parent dbbefafd19
commit 08d3e3a231
18 changed files with 77 additions and 74 deletions

View File

@ -15,3 +15,5 @@ tor_hs_address_file = home + 'hs/hostname'
run_check_file = home + '.runcheck'
data_nonce_file = home + 'block-nonces.dat'
keys_file = home + 'keys.txt'

View File

@ -19,13 +19,11 @@
'''
import json, threading
from flask import Blueprint, Response, request
import core
import onionrblocks
ib = Blueprint('insertblock', __name__)
@ib.route('/insertblock', methods=['POST'])
def client_api_insert_block():
c = core.Core()
encrypt = False
bData = request.get_json(force=True)
message = bData['message']
@ -59,5 +57,5 @@ def client_api_insert_block():
meta = json.loads(bData['meta'])
except KeyError:
pass
threading.Thread(target=c.insertBlock, args=(message,), kwargs={'header': bType, 'encryptType': encryptType, 'sign':sign, 'asymPeer': to, 'meta': meta}).start()
threading.Thread(target=onionrblocks.insert.insert_block, args=(message,), kwargs={'header': bType, 'encryptType': encryptType, 'sign':sign, 'asymPeer': to, 'meta': meta}).start()
return Response('success')

View File

@ -32,7 +32,7 @@ def handle_announce(clientAPI, request):
powHash = ''
randomData = ''
newNode = ''
ourAdder = clientAPI._core.hsAddress.encode()
ourAdder = clientAPI.hsAddress.encode()
try:
newNode = request.form['node'].encode()
except KeyError:
@ -45,17 +45,17 @@ def handle_announce(clientAPI, request):
except KeyError:
logger.warn('No random data specified for upload')
else:
nodes = newNode + clientAPI._core.hsAddress.encode()
nodes = clientAPI._core._crypto.blake2bHash(nodes)
powHash = clientAPI._core._crypto.blake2bHash(randomData + nodes)
nodes = newNode + clientAPI.hsAddress.encode()
nodes = clientAPI.crypto.blake2bHash(nodes)
powHash = clientAPI.crypto.blake2bHash(randomData + nodes)
try:
powHash = powHash.decode()
except AttributeError:
pass
if powHash.startswith('0' * onionrvalues.OnionrValues().announce_pow):
newNode = bytesconverter.bytes_to_str(newNode)
if stringvalidators.validate_transport(newNode) and not newNode in clientAPI._core.onionrInst.communicatorInst.newPeers:
clientAPI._core.onionrInst.communicatorInst.newPeers.append(newNode)
if stringvalidators.validate_transport(newNode) and not newNode in clientAPI.onionrInst.communicatorInst.newPeers:
clientAPI.onionrInst.communicatorInst.newPeers.append(newNode)
resp = 'Success'
else:
logger.warn(newNode.decode() + ' failed to meet POW: ' + powHash)

View File

@ -19,10 +19,11 @@
'''
from flask import Response, Blueprint, request, send_from_directory, abort
from . import getblocks, upload, announce
from coredb import keydb
class PublicEndpoints:
def __init__(self, public_api):
client_API = public_api.clientAPI
config = client_API._core.config
config = client_API.config
public_endpoints_bp = Blueprint('publicendpoints', __name__)
self.public_endpoints_bp = public_endpoints_bp
@ -61,7 +62,7 @@ class PublicEndpoints:
@public_endpoints_bp.route('/pex')
def peer_exchange():
response = ','.join(client_API._core.listAdders(recent=3600))
response = ','.join(keydb.listkeys.list_adders(recent=3600))
if len(response) == 0:
response = ''
return Response(response)

View File

@ -26,7 +26,7 @@ def get_public_block_list(clientAPI, publicAPI, request):
# Provide a list of our blocks, with a date offset
dateAdjust = request.args.get('date')
bList = blockmetadb.get_block_list(dateRec=dateAdjust)
if clientAPI._core.config.get('general.hide_created_blocks', True):
if clientAPI.config.get('general.hide_created_blocks', True):
for b in publicAPI.hideBlocks:
if b in bList:
# Don't share blocks we created if they haven't been *uploaded* yet, makes it harder to find who created a block
@ -37,7 +37,7 @@ def get_block_data(clientAPI, publicAPI, data):
'''data is the block hash in hex'''
resp = ''
if stringvalidators.validate_hash(data):
if not clientAPI._core.config.get('general.hide_created_blocks', True) or data not in publicAPI.hideBlocks:
if not clientAPI.config.get('general.hide_created_blocks', True) or data not in publicAPI.hideBlocks:
if data in blockmetadb.get_block_list():
block = clientAPI.getBlockData(data, raw=True)
try:

View File

@ -30,7 +30,7 @@ def accept_upload(clientAPI, request):
else:
if sys.getsizeof(data) < 100000000:
try:
if blockimporter.importBlockFromData(data, clientAPI._core):
if blockimporter.importBlockFromData(data):
resp = 'success'
else:
logger.warn('Error encountered importing uploaded block')

View File

@ -19,7 +19,7 @@
'''
import base64
from flask import Blueprint, Response, request, abort
import core, onionrblockapi, onionrexceptions
import onionrblockapi, onionrexceptions
from onionrutils import stringvalidators
site_api = Blueprint('siteapi', __name__)

View File

@ -17,7 +17,6 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
'''
import core
from flask import Blueprint, Response, request, abort
from . import profiles

View File

@ -114,7 +114,6 @@ def get_commands(onionr_inst):
'import-blocks': importnewblocks.import_new_blocks,
'importblocks': importnewblocks.import_new_blocks,
'introduce': onionr_inst.onionrCore.introduceNode,
'pex': dopex.do_PEX,
'getpassword': onionr_inst.printWebPassword,
@ -158,7 +157,6 @@ cmd_help = {
'listconn': 'list connected peers',
'pex': 'exchange addresses with peers (done automatically)',
'blacklist-block': 'deletes a block by hash and permanently removes it from your node',
'introduce': 'Introduce your node to the public Onionr network',
'friend': '[add|remove] [public key/id]',
'add-id': 'Generate a new ID (key pair)',
'change-id': 'Change active ID',

View File

@ -20,16 +20,17 @@
import sys
import logger
from onionrutils import stringvalidators
from onionrstorage import removeblock
def ban_block(o_inst):
try:
ban = sys.argv[2]
except IndexError:
ban = logger.readline('Enter a block hash:')
if stringvalidators.validate_hash(ban):
if not o_inst.onionrCore._blacklist.inBlacklist(ban):
if not o_inst.blacklist.inBlacklist(ban):
try:
o_inst.onionrCore._blacklist.addToDB(ban)
o_inst.onionrCore.removeBlock(ban)
o_inst.blacklist.addToDB(ban)
removeblock.remove_block(ban)
except Exception as error:
logger.error('Could not blacklist block', error=error, terminal=True)
else:

View File

@ -24,10 +24,11 @@ import onionr, apiservers, logger, communicator
import onionrevents as events
from netcontroller import NetController
from onionrutils import localcommand
import filepaths
from coredb import daemonqueue
def _proper_shutdown(o_inst):
localcommand.local_command(o_inst.onionrCore, 'shutdown')
localcommand.local_command('shutdown')
sys.exit(1)
def daemon(o_inst):
@ -36,9 +37,9 @@ def daemon(o_inst):
'''
# remove runcheck if it exists
if os.path.isfile('%s/.runcheck' % (o_inst.onionrCore.dataDir,)):
if os.path.isfile(filepaths.run_check_file):
logger.debug('Runcheck file found on daemon start, deleting in advance.')
os.remove('%s/.runcheck' % (o_inst.onionrCore.dataDir,))
os.remove(filepaths.run_check_file)
Thread(target=apiservers.ClientAPI, args=(o_inst, o_inst.debug, onionr.API_VERSION), daemon=True).start()
Thread(target=apiservers.PublicAPI, args=[o_inst.getClientApi()], daemon=True).start()
@ -46,7 +47,7 @@ def daemon(o_inst):
apiHost = ''
while apiHost == '':
try:
with open(o_inst.onionrCore.publicApiHostFile, 'r') as hostFile:
with open(filepaths.public_API_host_file, 'r') as hostFile:
apiHost = hostFile.read()
except FileNotFoundError:
pass
@ -55,30 +56,30 @@ def daemon(o_inst):
logger.raw('', terminal=True)
# print nice header thing :)
if o_inst.onionrCore.config.get('general.display_header', True):
if o_inst.config.get('general.display_header', True):
o_inst.header()
o_inst.version(verbosity = 5, function = logger.info)
logger.debug('Python version %s' % platform.python_version())
if o_inst._developmentMode:
logger.warn('Development mode enabled', timestamp = False, terminal=True)
net = NetController(o_inst.onionrCore.config.get('client.public.port', 59497), apiServerIP=apiHost)
net = NetController(o_inst.config.get('client.public.port', 59497), apiServerIP=apiHost)
logger.info('Tor is starting...', terminal=True)
if not net.startTor():
localcommand.local_command(o_inst.onionrCore, 'shutdown')
localcommand.local_command('shutdown')
sys.exit(1)
if len(net.myID) > 0 and o_inst.onionrCore.config.get('general.security_level', 1) == 0:
if len(net.myID) > 0 and o_inst.config.get('general.security_level', 1) == 0:
logger.debug('Started .onion service: %s' % (logger.colors.underline + net.myID))
else:
logger.debug('.onion service disabled')
logger.info('Using public key: %s' % (logger.colors.underline + o_inst.onionrCore._crypto.pubKey[:52]), terminal=True)
logger.info('Using public key: %s' % (logger.colors.underline + o_inst._crypto.pubKey[:52]), terminal=True)
try:
time.sleep(1)
except KeyboardInterrupt:
_proper_shutdown(o_inst)
o_inst.onionrCore.torPort = net.socksPort
o_inst.torPort = net.socksPort
communicatorThread = Thread(target=communicator.startCommunicator, args=(o_inst, str(net.socksPort)), daemon=True)
communicatorThread.start()
@ -105,7 +106,7 @@ def daemon(o_inst):
signal.signal(signal.SIGINT, _ignore_sigint)
daemonqueue.daemon_queue_add('shutdown')
localcommand.local_command(o_inst.onionrCore, 'shutdown')
localcommand.local_command('shutdown')
net.killTor()
time.sleep(5) # Time to allow threads to finish, if not any "daemon" threads will be slaughtered http://docs.python.org/library/threading.html#threading.Thread.daemon
@ -123,7 +124,7 @@ def kill_daemon(o_inst):
logger.warn('Stopping the running daemon...', timestamp = False, terminal=True)
try:
events.event('daemon_stop', onionr = o_inst)
net = NetController(o_inst.onionrCore.config.get('client.port', 59496))
net = NetController(o_inst.config.get('client.port', 59496))
try:
daemonqueue.daemon_queue_qdd('shutdown')
except sqlite3.OperationalError:

View File

@ -22,6 +22,7 @@ import base64, sys, os
import logger
from onionrblockapi import Block
from onionrutils import stringvalidators
from onionrblocks import insert
def add_file(o_inst, singleBlock=False, blockType='bin'):
'''
Adds a file to the onionr network
@ -37,7 +38,7 @@ def add_file(o_inst, singleBlock=False, blockType='bin'):
logger.info('Adding file... this might take a long time.', terminal=True)
try:
with open(filename, 'rb') as singleFile:
blockhash = o_inst.onionrCore.insertBlock(base64.b64encode(singleFile.read()), header=blockType)
blockhash = insert.insert_block(base64.b64encode(singleFile.read()), header=blockType)
if len(blockhash) > 0:
logger.info('File %s saved in block %s' % (filename, blockhash), terminal=True)
except:
@ -66,5 +67,5 @@ def getFile(o_inst):
return
with open(fileName, 'wb') as myFile:
myFile.write(base64.b64decode(Block(bHash, core=o_inst.onionrCore).bcontent))
myFile.write(base64.b64decode(Block(bHash).bcontent))
return

View File

@ -19,18 +19,19 @@
'''
import sys
import logger
from coredb import keydb
def add_peer(o_inst):
try:
newPeer = sys.argv[2]
except IndexError:
pass
else:
if newPeer in o_inst.onionrCore.listPeers():
if newPeer in keydb.listkeys.list_peers():
logger.info('We already have that key', terminal=True)
return
logger.info("Adding peer: " + logger.colors.underline + newPeer, terminal=True)
try:
if o_inst.onionrCore.addPeer(newPeer):
if keydb.addkeys.add_peer(newPeer):
logger.info('Successfully added key', terminal=True)
except AssertionError:
logger.error('Failed to add key', terminal=True)
@ -43,7 +44,7 @@ def add_address(o_inst):
pass
else:
logger.info("Adding address: " + logger.colors.underline + newAddress, terminal=True)
if o_inst.onionrCore.addAddress(newAddress):
if keydb.addkeys.add_address(newAddress):
logger.info("Successfully added address.", terminal=True)
else:
logger.warn("Unable to add address.", terminal=True)

View File

@ -23,7 +23,9 @@ from onionrblockapi import Block
import onionr
from onionrutils import checkcommunicator, mnemonickeys
from utils import sizeutils
from coredb import blockmetadb, daemonqueue
from coredb import blockmetadb, daemonqueue, keydb
import onionrcrypto
crypto = onionrcrypto.OnionrCrypto()
def show_stats(o_inst):
try:
# define stats messages here
@ -31,7 +33,7 @@ def show_stats(o_inst):
signedBlocks = len(Block.getBlocks(signed = True))
messages = {
# info about local client
'Onionr Daemon Status' : ((logger.colors.fg.green + 'Online') if checkcommunicator.is_communicator_running(o_inst.onionrCore, timeout = 9) else logger.colors.fg.red + 'Offline'),
'Onionr Daemon Status' : ((logger.colors.fg.green + 'Online') if checkcommunicator.is_communicator_running(timeout = 9) else logger.colors.fg.red + 'Offline'),
# file and folder size stats
'div1' : True, # this creates a solid line across the screen, a div
@ -41,8 +43,8 @@ def show_stats(o_inst):
# count stats
'div2' : True,
'Known Peers' : str(max(len(o_inst.onionrCore.listPeers()) - 1, 0)),
'Enabled Plugins' : str(len(o_inst.onionrCore.config.get('plugins.enabled', list()))) + ' / ' + str(len(os.listdir(o_inst.dataDir + 'plugins/'))),
'Known Peers' : str(max(len(keydb.listkeys.list_peers()) - 1, 0)),
'Enabled Plugins' : str(len(o_inst.config.get('plugins.enabled', list()))) + ' / ' + str(len(os.listdir(o_inst.dataDir + 'plugins/'))),
'Stored Blocks' : str(totalBlocks),
'Percent Blocks Signed' : str(round(100 * signedBlocks / max(totalBlocks, 1), 2)) + '%'
}
@ -87,8 +89,8 @@ def show_details(o_inst):
details = {
'Node Address' : o_inst.get_hostname(),
'Web Password' : o_inst.getWebPassword(),
'Public Key' : o_inst.onionrCore._crypto.pubKey,
'Human-readable Public Key' : mnemonickeys.get_human_readable_ID(o_inst.onionrCore)
'Public Key' : crypto.pubKey,
'Human-readable Public Key' : mnemonickeys.get_human_readable_ID()
}
for detail in details:

View File

@ -22,10 +22,10 @@ import logger
from onionrutils import getclientapiserver
def open_home(o_inst):
try:
url = getclientapiserver.get_client_API_server(o_inst.onionrCore)
url = getclientapiserver.get_client_API_server()
except FileNotFoundError:
logger.error('Onionr seems to not be running (could not get api host)', terminal=True)
else:
url = 'http://%s/#%s' % (url, o_inst.onionrCore.config.get('client.webpassword'))
url = 'http://%s/#%s' % (url, o_inst.config.get('client.webpassword'))
logger.info('If Onionr does not open automatically, use this URL: ' + url, terminal=True)
webbrowser.open_new_tab(url)

View File

@ -28,25 +28,25 @@ def add_ID(o_inst):
sys.argv[2]
assert sys.argv[2] == 'true'
except (IndexError, AssertionError) as e:
newID = o_inst.onionrCore._crypto.keyManager.addKey()[0]
newID = o_inst.crypto.keyManager.addKey()[0]
else:
logger.warn('Deterministic keys require random and long passphrases.', terminal=True)
logger.warn('If a good passphrase is not used, your key can be easily stolen.', terminal=True)
logger.warn('You should use a series of hard to guess words, see this for reference: https://www.xkcd.com/936/', terminal=True)
pass1 = getpass.getpass(prompt='Enter at least %s characters: ' % (o_inst.onionrCore._crypto.deterministicRequirement,))
pass1 = getpass.getpass(prompt='Enter at least %s characters: ' % (o_inst.crypto.deterministicRequirement,))
pass2 = getpass.getpass(prompt='Confirm entry: ')
if o_inst.onionrCore._crypto.safeCompare(pass1, pass2):
if o_inst.crypto.safeCompare(pass1, pass2):
try:
logger.info('Generating deterministic key. This can take a while.', terminal=True)
newID, privKey = o_inst.onionrCore._crypto.generateDeterministic(pass1)
newID, privKey = o_inst.crypto.generateDeterministic(pass1)
except onionrexceptions.PasswordStrengthError:
logger.error('Passphrase must use at least %s characters.' % (o_inst.onionrCore._crypto.deterministicRequirement,), terminal=True)
logger.error('Passphrase must use at least %s characters.' % (o_inst.crypto.deterministicRequirement,), terminal=True)
sys.exit(1)
else:
logger.error('Passwords do not match.', terminal=True)
sys.exit(1)
try:
o_inst.onionrCore._crypto.keyManager.addKey(pubKey=newID,
o_inst.crypto.keyManager.addKey(pubKey=newID,
privKey=privKey)
except ValueError:
logger.error('That ID is already available, you can change to it with the change-id command.', terminal=True)
@ -61,9 +61,9 @@ def change_ID(o_inst):
logger.warn('Specify pubkey to use', terminal=True)
else:
if stringvalidators.validate_pub_key(key):
if key in o_inst.onionrCore._crypto.keyManager.getPubkeyList():
o_inst.onionrCore.config.set('general.public_key', key)
o_inst.onionrCore.config.save()
if key in o_inst.crypto.keyManager.getPubkeyList():
o_inst.config.set('general.public_key', key)
o_inst.config.save()
logger.info('Set active key to: %s' % (key,), terminal=True)
logger.info('Restart Onionr if it is running.', terminal=True)
else:
@ -82,22 +82,22 @@ def friend_command(o_inst):
action = action.lower()
if action == 'list':
# List out peers marked as our friend
for friend in contactmanager.ContactManager.list_friends(o_inst.onionrCore):
for friend in contactmanager.ContactManager.list_friends(o_inst.):
logger.info(friend.publicKey + ' - ' + friend.get_info('name'), terminal=True)
elif action in ('add', 'remove'):
try:
friend = sys.argv[3]
if not stringvalidators.validate_pub_key(friend):
raise onionrexceptions.InvalidPubkey('Public key is invalid')
if friend not in o_inst.onionrCore.listPeers():
if friend not in o_inst..listPeers():
raise onionrexceptions.KeyNotKnown
friend = onionrusers.OnionrUser(o_inst.onionrCore, friend)
friend = onionrusers.OnionrUser(o_inst., friend)
except IndexError:
logger.warn('Friend ID is required.', terminal=True)
action = 'error' # set to 'error' so that the finally block does not process anything
except onionrexceptions.KeyNotKnown:
o_inst.onionrCore.addPeer(friend)
friend = onionrusers.OnionrUser(o_inst.onionrCore, friend)
o_inst..addPeer(friend)
friend = onionrusers.OnionrUser(o_inst., friend)
finally:
if action == 'add':
friend.setTrust(1)

View File

@ -18,14 +18,13 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
'''
import os, shutil
import logger, core
import logger
from onionrutils import localcommand
def reset_tor():
c = core.Core()
tor_dir = c.dataDir + 'tordata'
if os.path.exists(tor_dir):
if localcommand.local_command(c, '/ping') == 'pong!':
if localcommand.local_command('/ping') == 'pong!':
logger.warn('Cannot delete Tor data while Onionr is running', terminal=True)
else:
shutil.rmtree(tor_dir)

View File

@ -22,14 +22,14 @@ import nacl.signing, nacl.encoding, nacl.public, nacl.hash, nacl.pwhash, nacl.ut
import unpaddedbase32
import logger, onionrproofs
from onionrutils import stringvalidators, epoch, bytesconverter
import onionrexceptions, keymanager, core, onionrutils
import filepaths
import onionrexceptions, keymanager, onionrutils
import config
config.reload()
class OnionrCrypto:
def __init__(self, coreInstance):
self._core = coreInstance
self._keyFile = self._core.dataDir + 'keys.txt'
def __init__(self):
self._keyFile = filepaths.keys_file
self.pubKey = None
self.privKey = None
self.secrets = secrets
@ -39,8 +39,8 @@ class OnionrCrypto:
# Load our own pub/priv Ed25519 keys, gen & save them if they don't exist
if os.path.exists(self._keyFile):
if len(self._core.config.get('general.public_key', '')) > 0:
self.pubKey = self._core.config.get('general.public_key')
if len(config.get('general.public_key', '')) > 0:
self.pubKey = config.get('general.public_key')
else:
self.pubKey = self.keyManager.getPubkeyList()[0]
self.privKey = self.keyManager.getPrivkey(self.pubKey)
@ -249,10 +249,10 @@ class OnionrCrypto:
except AttributeError:
pass
difficulty = onionrproofs.getDifficultyForNewBlock(blockContent, ourBlock=False, coreInst=self._core)
difficulty = onionrproofs.getDifficultyForNewBlock(blockContent, ourBlock=False)
if difficulty < int(self._core.config.get('general.minimum_block_pow')):
difficulty = int(self._core.config.get('general.minimum_block_pow'))
if difficulty < int(config.get('general.minimum_block_pow')):
difficulty = int(config.get('general.minimum_block_pow'))
mainHash = '0000000000000000000000000000000000000000000000000000000000000000'#nacl.hash.blake2b(nacl.utils.random()).decode()
puzzle = mainHash[:difficulty]