Fix gettransports

master
Kevin Froman 2020-04-14 22:40:31 -05:00
parent 039d791b90
commit 026901ce90
7 changed files with 91 additions and 59 deletions

View File

@ -9,7 +9,6 @@ def detect_disk_access(info):
whitelist = [identify_home(), 'onionr/src/', '/site-packages/', '/usr/lib64/'] whitelist = [identify_home(), 'onionr/src/', '/site-packages/', '/usr/lib64/']
for item in whitelist: for item in whitelist:
if item in info[0]: if item in info[0]:
return return

View File

@ -1,9 +1,16 @@
''' """Onionr - Private P2P Communication.
Onionr - Private P2P Communication
Public endpoints to get block data and lists Public endpoints to get block data and lists
''' """
''' from flask import Response, abort
import config
from onionrutils import bytesconverter, stringvalidators
from coredb import blockmetadb
from utils import reconstructhash
from onionrblocks import BlockList
from .. import apiutils
"""
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
@ -16,13 +23,9 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
''' """
from flask import Response, abort
import config
from onionrutils import bytesconverter, stringvalidators
from coredb import blockmetadb
from utils import reconstructhash
from .. import apiutils
def get_public_block_list(publicAPI, request): def get_public_block_list(publicAPI, request):
# Provide a list of our blocks, with a date offset # Provide a list of our blocks, with a date offset
dateAdjust = request.args.get('date') dateAdjust = request.args.get('date')
@ -37,15 +40,16 @@ def get_public_block_list(publicAPI, request):
share_list += '%s\n' % (reconstructhash.deconstruct_hash(b),) share_list += '%s\n' % (reconstructhash.deconstruct_hash(b),)
return Response(share_list) return Response(share_list)
def get_block_data(publicAPI, data): def get_block_data(publicAPI, data):
'''data is the block hash in hex''' """data is the block hash in hex"""
resp = '' resp = ''
if stringvalidators.validate_hash(data): if stringvalidators.validate_hash(data):
if not config.get('general.hide_created_blocks', True) or data not in publicAPI.hideBlocks: if not config.get('general.hide_created_blocks', True) or data not in publicAPI.hideBlocks:
if data in blockmetadb.get_block_list(): if data in publicAPI._too_many.get(BlockList).get():
block = apiutils.GetBlockData().get_block_data(data, raw=True, decrypt=False) block = apiutils.GetBlockData().get_block_data(data, raw=True, decrypt=False)
try: try:
block = block.encode() # Encode in case data is binary block = block.encode('utf-8') # Encode in case data is binary
except AttributeError: except AttributeError:
if len(block) == 0: if len(block) == 0:
abort(404) abort(404)

View File

@ -32,9 +32,11 @@ class PublicAPISecurity:
"""Validate request has the correct hostname""" """Validate request has the correct hostname"""
# If high security level, deny requests to public # If high security level, deny requests to public
# (HS should be disabled anyway for Tor, but might not be for I2P) # (HS should be disabled anyway for Tor, but might not be for I2P)
g.is_onionr_client = False
transports = gettransports.get() transports = gettransports.get()
if public_api.config.get('general.security_level', default=1) > 0: if public_api.config.get('general.security_level', default=1) > 0:
abort(403) abort(403)
if request.host not in transports: if request.host not in transports:
# Abort conn if wrong HTTP hostname, to prevent DNS rebinding # Abort conn if wrong HTTP hostname, to prevent DNS rebinding
abort(403) abort(403)
@ -57,10 +59,12 @@ class PublicAPISecurity:
NON_NETWORK_HEADERS = ('Content-Security-Policy', 'X-Frame-Options', NON_NETWORK_HEADERS = ('Content-Security-Policy', 'X-Frame-Options',
'X-Content-Type-Options', 'Feature-Policy', 'X-Content-Type-Options', 'Feature-Policy',
'Clear-Site-Data', 'Referrer-Policy') 'Clear-Site-Data', 'Referrer-Policy')
try: try:
if g.is_onionr_client: if g.is_onionr_client:
for header in NON_NETWORK_HEADERS: del resp.headers[header] for header in NON_NETWORK_HEADERS: del resp.headers[header]
except AttributeError: except AttributeError:
abort(403) abort(403)
public_api.lastRequest = epoch.get_rounded_epoch(roundS=5) public_api.lastRequest = epoch.get_rounded_epoch(roundS=5)
return resp return resp

View File

@ -52,7 +52,7 @@ def learn_services(lan_client):
if 'onionr' not in service_ips: if 'onionr' not in service_ips:
continue continue
service_ips = service_ips.replace('onionr-', '').split('-') service_ips = service_ips.replace('onionr-', '').split('-')
print(service_ips)
port = 0 port = 0
for service in service_ips: for service in service_ips:
try: try:

View File

@ -1,9 +1,11 @@
''' """Onionr - Private P2P Communication.
Onionr - Private P2P Communication
Output raw data to file or terminal Output raw data to file or terminal
''' """
''' import sys
import os
from . import settings, colors
"""
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
@ -16,14 +18,14 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
''' """
import sys, os
from . import settings, colors
colors = colors.Colors colors = colors.Colors
def raw(data, fd = sys.stdout, terminal = False): def raw(data, fd = sys.stdout, terminal = False):
''' """
Outputs raw data to console without formatting Outputs raw data to console without formatting
''' """
if terminal and (settings.get_settings() & settings.OUTPUT_TO_CONSOLE): if terminal and (settings.get_settings() & settings.OUTPUT_TO_CONSOLE):
try: try:
@ -33,8 +35,14 @@ def raw(data, fd = sys.stdout, terminal = False):
if settings.get_settings() & settings.OUTPUT_TO_FILE: if settings.get_settings() & settings.OUTPUT_TO_FILE:
fdata = '' fdata = ''
try: try:
with open(settings._outputfile, 'r') as file: for _ in range(5):
fdata = file.read() try:
with open(settings._outputfile, 'r') as file:
fdata = file.read()
except UnicodeDecodeError:
pass
else:
break
except FileNotFoundError: except FileNotFoundError:
pass pass
fdata = fdata + '\n' + data fdata = fdata + '\n' + data
@ -43,4 +51,4 @@ def raw(data, fd = sys.stdout, terminal = False):
fdata.pop(0) fdata.pop(0)
fdata = '\n'.join(fdata) fdata = '\n'.join(fdata)
with open(settings._outputfile, 'w') as file: with open(settings._outputfile, 'w') as file:
file.write(fdata) file.write(fdata)

View File

@ -1,9 +1,18 @@
''' """Onionr - Private P2P Communication.
Onionr - Private P2P Communication
Proof of work module Proof of work module
''' """
''' import multiprocessing, time, math, threading, binascii, sys, json
import nacl.encoding, nacl.hash, nacl.utils
import config
import logger
from onionrblocks import onionrblockapi, storagecounter
from onionrutils import bytesconverter
from onionrcrypto import hashers
from .blocknoncestart import BLOCK_NONCE_START_INT
"""
This program is free software: you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
@ -16,31 +25,22 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
''' """
import multiprocessing, time, math, threading, binascii, sys, json
import nacl.encoding, nacl.hash, nacl.utils
import config, logger
from onionrblocks import onionrblockapi, storagecounter
from onionrutils import bytesconverter
from onionrcrypto import hashers
from .blocknoncestart import BLOCK_NONCE_START_INT
config.reload() config.reload()
def getDifficultyModifier(): def getDifficultyModifier():
'''returns the difficulty modifier for block storage based """returns the difficulty modifier for block storage based
on a variety of factors, currently only disk use. on a variety of factors, currently only disk use.
''' """
percentUse = storagecounter.StorageCounter().get_percent() percentUse = storagecounter.StorageCounter().get_percent()
difficultyIncrease = math.floor(4 * percentUse) # difficulty increase is a step function difficultyIncrease = math.floor(4 * percentUse) # difficulty increase is a step function
return difficultyIncrease return difficultyIncrease
def getDifficultyForNewBlock(data): def getDifficultyForNewBlock(data):
''' """
Get difficulty for block. Accepts size in integer, Block instance, or str/bytes full block contents Get difficulty for block. Accepts size in integer, Block instance, or str/bytes full block contents
''' """
if isinstance(data, onionrblockapi.Block): if isinstance(data, onionrblockapi.Block):
dataSizeInBytes = len(bytesconverter.str_to_bytes(data.getRaw())) dataSizeInBytes = len(bytesconverter.str_to_bytes(data.getRaw()))
else: else:
@ -54,15 +54,15 @@ def getDifficultyForNewBlock(data):
return retData return retData
def getHashDifficulty(h: str): def getHashDifficulty(h: str):
''' """
Return the amount of leading zeroes in a hex hash string (hexHash) Return the amount of leading zeroes in a hex hash string (hexHash)
''' """
return len(h) - len(h.lstrip('0')) return len(h) - len(h.lstrip('0'))
def hashMeetsDifficulty(hexHash): def hashMeetsDifficulty(hexHash):
''' """
Return bool for a hash string to see if it meets pow difficulty defined in config Return bool for a hash string to see if it meets pow difficulty defined in config
''' """
hashDifficulty = getHashDifficulty(hexHash) hashDifficulty = getHashDifficulty(hexHash)
try: try:
@ -138,9 +138,9 @@ class POW:
self.difficulty = newDiff self.difficulty = newDiff
def getResult(self): def getResult(self):
''' """
Returns the result then sets to false, useful to automatically clear the result Returns the result then sets to false, useful to automatically clear the result
''' """
try: try:
retVal = self.result retVal = self.result
@ -151,9 +151,9 @@ class POW:
return retVal return retVal
def waitForResult(self): def waitForResult(self):
''' """
Returns the result only when it has been found, False if not running and not found Returns the result only when it has been found, False if not running and not found
''' """
result = False result = False
try: try:
while True: while True:

View File

@ -21,11 +21,28 @@ import filepaths
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
files = [filepaths.tor_hs_address_file] files = []
class _GetTor:
def __init__(self):
self.tor_hs = None
def get(self):
if self.tor_hs is None:
try:
with open(filepaths.tor_hs_address_file, 'r') as transport_file:
self.tor_hs = transport_file.read().strip()
if not self.tor_hs:
self.tor_hs = None
except FileNotFoundError:
pass
return self.tor_hs
_tor_getter = _GetTor()
def get(): def get():
transports = [] transports = [_tor_getter.get()]
for file in files: for file in files:
try: try:
with open(file, 'r') as transport_file: with open(file, 'r') as transport_file: