diff --git a/README.md b/README.md
index ee96efd4..024b6118 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@
# About
-Onionr is a decentralized, peer-to-peer communication and storage network, designed to be anonymous and resistant to (meta)data analysis, spam, and corruption.
+Onionr is a decentralized, peer-to-peer communication network, designed to be anonymous and resistant to (meta)data analysis, spam, and corruption.
Onionr stores data in independent packages referred to as 'blocks'. The blocks are synced to all other nodes in the network. Blocks and user IDs cannot be easily proven to have been created by a particular user. Even if there is enough evidence to believe that a specific user created a block, nodes still operate behind Tor or I2P and as such cannot be trivially unmasked.
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 00000000..343c6c17
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,3 @@
+# Onionr Documentation
+
+The Onionr [whitepaper](whitepaper.md) is the best place to start both for users and developers.
diff --git a/onionr/onionr.py b/onionr/onionr.py
index fe06457d..befbf439 100755
--- a/onionr/onionr.py
+++ b/onionr/onionr.py
@@ -27,8 +27,14 @@ ONIONR_VERSION_TUPLE = tuple(ONIONR_VERSION.split('.')) # (MAJOR, MINOR, VERSION
API_VERSION = '0' # increments of 1; only change when something fundamental about how the API works changes. This way other nodes know how to communicate without learning too much information about you.
MIN_PY_VERSION = 6
if sys.version_info[0] == 2 or sys.version_info[1] < MIN_PY_VERSION:
- sys.stderr.write('Error, Onionr requires Python 3.%s+' % (MIN_PY_VERSION,))
+ sys.stderr.write('Error, Onionr requires Python 3.%s+\n' % (MIN_PY_VERSION,))
sys.exit(1)
+
+from utils import detectoptimization
+if detectoptimization.detect_optimization():
+ sys.stderr.write('Error, Onionr cannot be run in optimized mode\n')
+ sys.exit(1)
+
import os, base64, random, shutil, time, platform, signal
from threading import Thread
import api, core, config, logger, onionrplugins as plugins, onionrevents as events
diff --git a/onionr/onionrcommands/onionrstatistics.py b/onionr/onionrcommands/onionrstatistics.py
index 83d62baa..c01c5e1b 100755
--- a/onionr/onionrcommands/onionrstatistics.py
+++ b/onionr/onionrcommands/onionrstatistics.py
@@ -18,10 +18,11 @@
along with this program. If not, see .
'''
import os, uuid, time
-import logger, onionrutils
+import logger
from onionrblockapi import Block
import onionr
from onionrutils import checkcommunicator, mnemonickeys
+from utils import sizeutils
def show_stats(o_inst):
try:
@@ -34,9 +35,9 @@ def show_stats(o_inst):
# file and folder size stats
'div1' : True, # this creates a solid line across the screen, a div
- 'Total Block Size' : onionrutils.humanSize(onionrutils.size(o_inst.dataDir + 'blocks/')),
- 'Total Plugin Size' : onionrutils.humanSize(onionrutils.size(o_inst.dataDir + 'plugins/')),
- 'Log File Size' : onionrutils.humanSize(onionrutils.size(o_inst.dataDir + 'output.log')),
+ 'Total Block Size' : sizeutils.human_size(sizeutils.size(o_inst.dataDir + 'blocks/')),
+ 'Total Plugin Size' : sizeutils.human_size(sizeutils.size(o_inst.dataDir + 'plugins/')),
+ 'Log File Size' : sizeutils.human_size(sizeutils.size(o_inst.dataDir + 'output.log')),
# count stats
'div2' : True,
@@ -80,7 +81,7 @@ def show_stats(o_inst):
logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True)
logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True)
except Exception as e:
- logger.error('Failed to generate statistics table.', error = e, timestamp = False, terminal=True)
+ logger.error('Failed to generate statistics table. ' + str(e), error = e, timestamp = False, terminal=True)
def show_details(o_inst):
details = {
diff --git a/onionr/utils/detectoptimization.py b/onionr/utils/detectoptimization.py
new file mode 100755
index 00000000..20570242
--- /dev/null
+++ b/onionr/utils/detectoptimization.py
@@ -0,0 +1,27 @@
+'''
+ Onionr - Private P2P Communication
+
+ Detect if Python is being run in optimized mode or not, which has security considerations for assert statements
+'''
+'''
+ 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 .
+'''
+
+def detect_optimization():
+ '''Returns true if Python is run in optimized mode (-o), based on optimization ignoring assert statements'''
+ try:
+ assert True is False
+ except AssertionError:
+ return False
+ return True
\ No newline at end of file