onionr can now run from relative dirs and lots of bug fixes
parent
5f22387af6
commit
f99ff27006
|
@ -1,4 +1,6 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
ORIG_ONIONR_RUN_DIR=`pwd`
|
||||||
|
export ORIG_ONIONR_RUN_DIR
|
||||||
cd "$(dirname "$0")"
|
cd "$(dirname "$0")"
|
||||||
cd onionr/
|
cd onionr/
|
||||||
./__init__.py "$@"
|
./__init__.py "$@"
|
||||||
|
|
|
@ -108,7 +108,7 @@ class OnionrCommunicatorDaemon:
|
||||||
# Timers to periodically lookup new blocks and download them
|
# Timers to periodically lookup new blocks and download them
|
||||||
lookup_blocks_timer = OnionrCommunicatorTimers(self, lookupblocks.lookup_blocks_from_communicator, config.get('timers.lookupBlocks', 25), myArgs=[self], requiresPeer=True, maxThreads=1)
|
lookup_blocks_timer = OnionrCommunicatorTimers(self, lookupblocks.lookup_blocks_from_communicator, config.get('timers.lookupBlocks', 25), myArgs=[self], requiresPeer=True, maxThreads=1)
|
||||||
# The block download timer is accessed by the block lookup function to trigger faster download starts
|
# The block download timer is accessed by the block lookup function to trigger faster download starts
|
||||||
self.download_blocks_timer = OnionrCommunicatorTimers(self, self.getBlocks, config.get('timers.getBlocks', 30), requiresPeer=True, maxThreads=5)
|
self.download_blocks_timer = OnionrCommunicatorTimers(self, self.getBlocks, config.get('timers.getBlocks', 10), requiresPeer=True, maxThreads=5)
|
||||||
|
|
||||||
# Timer to reset the longest offline peer so contact can be attempted again
|
# Timer to reset the longest offline peer so contact can be attempted again
|
||||||
OnionrCommunicatorTimers(self, onlinepeers.clear_offline_peer, 58, myArgs=[self])
|
OnionrCommunicatorTimers(self, onlinepeers.clear_offline_peer, 58, myArgs=[self])
|
||||||
|
|
|
@ -29,6 +29,7 @@ DEVELOPMENT_MODE = True
|
||||||
MAX_BLOCK_TYPE_LENGTH = 15
|
MAX_BLOCK_TYPE_LENGTH = 15
|
||||||
MAX_BLOCK_CLOCK_SKEW = 120
|
MAX_BLOCK_CLOCK_SKEW = 120
|
||||||
MAIN_PUBLIC_KEY_SIZE = 32
|
MAIN_PUBLIC_KEY_SIZE = 32
|
||||||
|
ORIG_RUN_DIR_ENV_VAR = 'ORIG_ONIONR_RUN_DIR'
|
||||||
|
|
||||||
# Begin OnionrValues migrated values
|
# Begin OnionrValues migrated values
|
||||||
ANNOUNCE_POW = 5
|
ANNOUNCE_POW = 5
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
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, Blueprint, request, send_from_directory, abort
|
from flask import Response, Blueprint, request, send_from_directory, abort
|
||||||
|
import unpaddedbase32
|
||||||
|
|
||||||
from httpapi import apiutils
|
from httpapi import apiutils
|
||||||
import onionrcrypto, config
|
import onionrcrypto, config
|
||||||
|
@ -111,6 +112,7 @@ class PrivateEndpoints:
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getHumanReadable/<name>')
|
@private_endpoints_bp.route('/getHumanReadable/<name>')
|
||||||
def getHumanReadable(name):
|
def getHumanReadable(name):
|
||||||
|
name = unpaddedbase32.repad(bytesconverter.str_to_bytes(name))
|
||||||
return Response(mnemonickeys.get_human_readable_ID(name))
|
return Response(mnemonickeys.get_human_readable_ID(name))
|
||||||
|
|
||||||
@private_endpoints_bp.route('/getBase32FromHumanReadable/<words>')
|
@private_endpoints_bp.route('/getBase32FromHumanReadable/<words>')
|
||||||
|
|
|
@ -124,8 +124,7 @@ class Block:
|
||||||
'''
|
'''
|
||||||
Verify if a block's signature is signed by its claimed signer
|
Verify if a block's signature is signed by its claimed signer
|
||||||
'''
|
'''
|
||||||
|
if self.signer is None or signing.ed_verify(data=self.signedData, key=self.signer, sig=self.signature, encodedData=True):
|
||||||
if signing.ed_verify(data=self.signedData, key=self.signer, sig=self.signature, encodedData=True):
|
|
||||||
self.validSig = True
|
self.validSig = True
|
||||||
else:
|
else:
|
||||||
self.validSig = False
|
self.validSig = False
|
||||||
|
|
|
@ -114,8 +114,9 @@ def insert_block(data: Union[str, bytes], header: str ='txt',
|
||||||
|
|
||||||
# compile metadata
|
# compile metadata
|
||||||
metadata['meta'] = jsonMeta
|
metadata['meta'] = jsonMeta
|
||||||
metadata['sig'] = signature
|
if len(signature) > 0: # I don't like not pattern
|
||||||
metadata['signer'] = signer
|
metadata['sig'] = signature
|
||||||
|
metadata['signer'] = signer
|
||||||
metadata['time'] = createTime
|
metadata['time'] = createTime
|
||||||
|
|
||||||
# ensure expire is integer and of sane length
|
# ensure expire is integer and of sane length
|
||||||
|
|
|
@ -21,8 +21,15 @@
|
||||||
import base64, sys, os
|
import base64, sys, os
|
||||||
import logger
|
import logger
|
||||||
from onionrblockapi import Block
|
from onionrblockapi import Block
|
||||||
|
import onionrexceptions
|
||||||
from onionrutils import stringvalidators
|
from onionrutils import stringvalidators
|
||||||
|
from etc import onionrvalues
|
||||||
from onionrblocks import insert
|
from onionrblocks import insert
|
||||||
|
_ORIG_DIR = onionrvalues.ORIG_RUN_DIR_ENV_VAR
|
||||||
|
|
||||||
|
def _get_dir(path: str)->str:
|
||||||
|
if not os.getenv(_ORIG_DIR) is None: return os.getenv(_ORIG_DIR) + '/' + path
|
||||||
|
else: return path
|
||||||
|
|
||||||
def add_html(singleBlock=True, blockType='html'):
|
def add_html(singleBlock=True, blockType='html'):
|
||||||
add_file(singleBlock, blockType)
|
add_file(singleBlock, blockType)
|
||||||
|
@ -35,13 +42,12 @@ def add_file(singleBlock=False, blockType='bin'):
|
||||||
if len(sys.argv) >= 3:
|
if len(sys.argv) >= 3:
|
||||||
filename = sys.argv[2]
|
filename = sys.argv[2]
|
||||||
contents = None
|
contents = None
|
||||||
|
if not os.path.exists(_get_dir(filename)):
|
||||||
if not os.path.exists(filename):
|
|
||||||
logger.error('That file does not exist. Improper path (specify full path)?', terminal=True)
|
logger.error('That file does not exist. Improper path (specify full path)?', terminal=True)
|
||||||
return
|
return
|
||||||
logger.info('Adding file... this might take a long time.', terminal=True)
|
logger.info('Adding file... this might take a long time.', terminal=True)
|
||||||
try:
|
try:
|
||||||
with open(filename, 'rb') as singleFile:
|
with open(_get_dir(filename), 'rb') as singleFile:
|
||||||
blockhash = insert(base64.b64encode(singleFile.read()), header=blockType)
|
blockhash = insert(base64.b64encode(singleFile.read()), header=blockType)
|
||||||
if len(blockhash) > 0:
|
if len(blockhash) > 0:
|
||||||
logger.info('File %s saved in block %s' % (filename, blockhash), terminal=True)
|
logger.info('File %s saved in block %s' % (filename, blockhash), terminal=True)
|
||||||
|
@ -55,7 +61,7 @@ def get_file():
|
||||||
Get a file from onionr blocks
|
Get a file from onionr blocks
|
||||||
'''
|
'''
|
||||||
try:
|
try:
|
||||||
fileName = sys.argv[2]
|
fileName = _get_dir(sys.argv[2])
|
||||||
bHash = sys.argv[3]
|
bHash = sys.argv[3]
|
||||||
except IndexError:
|
except IndexError:
|
||||||
logger.error("Syntax %s %s" % (sys.argv[0], '/path/to/filename <blockhash>'), terminal=True)
|
logger.error("Syntax %s %s" % (sys.argv[0], '/path/to/filename <blockhash>'), terminal=True)
|
||||||
|
@ -70,6 +76,9 @@ def get_file():
|
||||||
logger.error('Block hash is invalid', terminal=True)
|
logger.error('Block hash is invalid', terminal=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
with open(fileName, 'wb') as myFile:
|
try:
|
||||||
myFile.write(base64.b64decode(Block(bHash).bcontent))
|
with open(fileName, 'wb') as myFile:
|
||||||
|
myFile.write(base64.b64decode(Block(bHash).bcontent))
|
||||||
|
except onionrexceptions.NoDataAvailable:
|
||||||
|
logger.error('That block is not available. Trying again later may work.', terminal=True)
|
||||||
return
|
return
|
|
@ -31,6 +31,7 @@ def soft_reset():
|
||||||
path = filepaths.block_data_location
|
path = filepaths.block_data_location
|
||||||
shutil.rmtree(path)
|
shutil.rmtree(path)
|
||||||
os.remove(dbfiles.block_meta_db)
|
os.remove(dbfiles.block_meta_db)
|
||||||
|
os.remove(filepaths.upload_list)
|
||||||
logger.info("Soft reset Onionr", terminal=True)
|
logger.info("Soft reset Onionr", terminal=True)
|
||||||
|
|
||||||
soft_reset.onionr_help = "Deletes Onionr blocks and their associated metadata, except for any exported block files."
|
soft_reset.onionr_help = "Deletes Onionr blocks and their associated metadata, except for any exported block files."
|
|
@ -4,6 +4,7 @@ import unpaddedbase32
|
||||||
import nacl.encoding, nacl.signing, nacl.exceptions
|
import nacl.encoding, nacl.signing, nacl.exceptions
|
||||||
|
|
||||||
from onionrutils import bytesconverter
|
from onionrutils import bytesconverter
|
||||||
|
from onionrutils import mnemonickeys
|
||||||
import logger
|
import logger
|
||||||
def ed_sign(data, key, encodeResult=False):
|
def ed_sign(data, key, encodeResult=False):
|
||||||
'''Ed25519 sign data'''
|
'''Ed25519 sign data'''
|
||||||
|
|
|
@ -59,7 +59,7 @@
|
||||||
Mail
|
Mail
|
||||||
</h1>
|
</h1>
|
||||||
<h2 class="subtitle">
|
<h2 class="subtitle">
|
||||||
Send email style messages
|
Private and safe messages
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="column is-7">
|
<div class="column is-7">
|
||||||
|
|
|
@ -26,6 +26,7 @@ threadContent = {}
|
||||||
replyBtn = document.getElementById('replyBtn')
|
replyBtn = document.getElementById('replyBtn')
|
||||||
addUnknownContact = document.getElementById('addUnknownContact')
|
addUnknownContact = document.getElementById('addUnknownContact')
|
||||||
noInbox = document.getElementById('noInbox')
|
noInbox = document.getElementById('noInbox')
|
||||||
|
humanReadableCache = {}
|
||||||
|
|
||||||
function addContact(pubkey, friendName){
|
function addContact(pubkey, friendName){
|
||||||
fetch('/friends/add/' + pubkey, {
|
fetch('/friends/add/' + pubkey, {
|
||||||
|
@ -61,7 +62,14 @@ function openReply(bHash, quote, subject){
|
||||||
for (var x = 0; x < splitQuotes.length; x++){
|
for (var x = 0; x < splitQuotes.length; x++){
|
||||||
splitQuotes[x] = '> ' + splitQuotes[x]
|
splitQuotes[x] = '> ' + splitQuotes[x]
|
||||||
}
|
}
|
||||||
quote = '\n' + key.substring(0, 12) + ' wrote:' + '\n' + splitQuotes.join('\n')
|
|
||||||
|
if (typeof humanReadableCache[key] != 'undefined'){
|
||||||
|
document.getElementById('draftID').value = humanReadableCache[key]
|
||||||
|
quote = '\n' + humanReadableCache[key].split(' ').slice(0,3).join(' ') + ' wrote:\n' + splitQuotes.join('\n')
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
quote = '\n' + key.substring(0, 12) + ' wrote:' + '\n' + splitQuotes.join('\n')
|
||||||
|
}
|
||||||
document.getElementById('draftText').value = quote
|
document.getElementById('draftText').value = quote
|
||||||
setActiveTab('compose')
|
setActiveTab('compose')
|
||||||
}
|
}
|
||||||
|
@ -184,6 +192,7 @@ function loadInboxEntries(bHash){
|
||||||
entry.setAttribute('data-nameSet', false)
|
entry.setAttribute('data-nameSet', false)
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
loadHumanReadableToCache(resp['meta']['signer'])
|
||||||
senderInput.value = name
|
senderInput.value = name
|
||||||
entry.setAttribute('data-nameSet', true)
|
entry.setAttribute('data-nameSet', true)
|
||||||
}
|
}
|
||||||
|
@ -295,6 +304,7 @@ function getSentbox(){
|
||||||
sentDate.innerText = humanDate.substring(0, humanDate.indexOf('('))
|
sentDate.innerText = humanDate.substring(0, humanDate.indexOf('('))
|
||||||
if (resp[i]['name'] == null || resp[i]['name'].toLowerCase() == 'anonymous'){
|
if (resp[i]['name'] == null || resp[i]['name'].toLowerCase() == 'anonymous'){
|
||||||
toEl.value = resp[i]['peer']
|
toEl.value = resp[i]['peer']
|
||||||
|
setHumanReadableValue(toEl, resp[i]['peer'])
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
toEl.value = resp[i]['name']
|
toEl.value = resp[i]['name']
|
||||||
|
|
|
@ -1,10 +1,21 @@
|
||||||
function setHumanReadableValue(el, key){
|
function loadHumanReadableToCache(key){
|
||||||
fetch('/getHumanReadable/' + key, {
|
fetch('/getHumanReadable/' + key, {
|
||||||
headers: {
|
headers: {
|
||||||
"token": webpass
|
"token": webpass
|
||||||
}})
|
}})
|
||||||
.then((resp) => resp.text())
|
.then((resp) => resp.text())
|
||||||
.then(function(resp) {
|
.then(function(resp) {
|
||||||
el.value = resp
|
humanReadableCache[key] = resp
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function setHumanReadableValue(el, key){
|
||||||
|
if (typeof humanReadableCache[key] != 'undefined'){
|
||||||
|
el.value = humanReadableCache[key]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
setTimeout(function(){setHumanReadableValue(el, key)})
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue