merge gitlab
This commit is contained in:
		
						commit
						e339b78e88
					
				
					 11 changed files with 181 additions and 62 deletions
				
			
		|  | @ -52,7 +52,7 @@ class API: | ||||||
| 
 | 
 | ||||||
|         config.reload() |         config.reload() | ||||||
| 
 | 
 | ||||||
|         if config.get('devmode', True): |         if config.get('dev_mode', True): | ||||||
|             self._developmentMode = True |             self._developmentMode = True | ||||||
|             logger.set_level(logger.LEVEL_DEBUG) |             logger.set_level(logger.LEVEL_DEBUG) | ||||||
|         else: |         else: | ||||||
|  | @ -65,12 +65,12 @@ class API: | ||||||
|         self._crypto = onionrcrypto.OnionrCrypto(self._core) |         self._crypto = onionrcrypto.OnionrCrypto(self._core) | ||||||
|         self._utils = onionrutils.OnionrUtils(self._core) |         self._utils = onionrutils.OnionrUtils(self._core) | ||||||
|         app = flask.Flask(__name__) |         app = flask.Flask(__name__) | ||||||
|         bindPort = int(config.get('client')['port']) |         bindPort = int(config.get('client.port', 59496)) | ||||||
|         self.bindPort = bindPort |         self.bindPort = bindPort | ||||||
|         self.clientToken = config.get('client')['client_hmac'] |         self.clientToken = config.get('client.hmac') | ||||||
|         self.timeBypassToken = base64.b16encode(os.urandom(32)).decode() |         self.timeBypassToken = base64.b16encode(os.urandom(32)).decode() | ||||||
| 
 | 
 | ||||||
|         self.i2pEnabled = config.get('i2p', {'host' : False})['host'] |         self.i2pEnabled = config.get('i2p.host', False) | ||||||
| 
 | 
 | ||||||
|         self.mimeType = 'text/plain' |         self.mimeType = 'text/plain' | ||||||
| 
 | 
 | ||||||
|  | @ -82,7 +82,7 @@ class API: | ||||||
|             self.host = '.'.join(hostOctets) |             self.host = '.'.join(hostOctets) | ||||||
|         else: |         else: | ||||||
|             self.host = '127.0.0.1' |             self.host = '127.0.0.1' | ||||||
|          | 
 | ||||||
|         with open('data/host.txt', 'w') as file: |         with open('data/host.txt', 'w') as file: | ||||||
|             file.write(self.host) |             file.write(self.host) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -75,7 +75,7 @@ class OnionrCommunicate: | ||||||
|         plugins.reload() |         plugins.reload() | ||||||
| 
 | 
 | ||||||
|         # Print nice header thing :) |         # Print nice header thing :) | ||||||
|         if config.get('display_header', True): |         if config.get('general.display_header', True): | ||||||
|             self.header() |             self.header() | ||||||
| 
 | 
 | ||||||
|         while True: |         while True: | ||||||
|  | @ -149,7 +149,7 @@ class OnionrCommunicate: | ||||||
| 
 | 
 | ||||||
|                         logger.info('Checking for callbacks with connection %s...' % data['id']) |                         logger.info('Checking for callbacks with connection %s...' % data['id']) | ||||||
| 
 | 
 | ||||||
|                         self.check_callbacks(data, config.get('dc_execcallbacks', True)) |                         self.check_callbacks(data, config.get('general.dc_execcallbacks', True)) | ||||||
| 
 | 
 | ||||||
|                         events.event('incoming_direct_connection', data = {'callback' : True, 'communicator' : self, 'data' : data}) |                         events.event('incoming_direct_connection', data = {'callback' : True, 'communicator' : self, 'data' : data}) | ||||||
|                     except Exception as e: |                     except Exception as e: | ||||||
|  | @ -349,7 +349,7 @@ class OnionrCommunicate: | ||||||
|             If yet another callback is requested, it can be put in the `callback` parameter. |             If yet another callback is requested, it can be put in the `callback` parameter. | ||||||
|         ''' |         ''' | ||||||
| 
 | 
 | ||||||
|         if config.get('dc_response', True): |         if config.get('general.dc_response', True): | ||||||
|             data['id'] = identifier |             data['id'] = identifier | ||||||
|             data['sender'] = open('data/hs/hostname').read() |             data['sender'] = open('data/hs/hostname').read() | ||||||
|             data['callback'] = True |             data['callback'] = True | ||||||
|  | @ -768,7 +768,7 @@ class OnionrCommunicate: | ||||||
| shouldRun = False | shouldRun = False | ||||||
| debug = True | debug = True | ||||||
| developmentMode = False | developmentMode = False | ||||||
| if config.get('devmode', True): | if config.get('general.dev_mode', True): | ||||||
|     developmentMode = True |     developmentMode = True | ||||||
| try: | try: | ||||||
|     if sys.argv[1] == 'run': |     if sys.argv[1] == 'run': | ||||||
|  |  | ||||||
|  | @ -25,6 +25,8 @@ from defusedxml import minidom | ||||||
| 
 | 
 | ||||||
| class OnionrCommunicatorDaemon: | class OnionrCommunicatorDaemon: | ||||||
|     def __init__(self, debug, developmentMode): |     def __init__(self, debug, developmentMode): | ||||||
|  |         logger.warn('New (unstable) communicator is being used.') | ||||||
|  | 
 | ||||||
|         self.timers = [] |         self.timers = [] | ||||||
|         self._core = core.Core() |         self._core = core.Core() | ||||||
|         self.nistSaltTimestamp = 0 |         self.nistSaltTimestamp = 0 | ||||||
|  | @ -48,7 +50,7 @@ class OnionrCommunicatorDaemon: | ||||||
|         plugins.reload() |         plugins.reload() | ||||||
| 
 | 
 | ||||||
|         # Print nice header thing :) |         # Print nice header thing :) | ||||||
|         if config.get('display_header', True): |         if config.get('general.display_header', True): | ||||||
|             self.header() |             self.header() | ||||||
| 
 | 
 | ||||||
|         if debug or developmentMode: |         if debug or developmentMode: | ||||||
|  | @ -217,7 +219,7 @@ class OnionrCommunicatorDaemon: | ||||||
|                 # only to stdout, not file or log or anything |                 # only to stdout, not file or log or anything | ||||||
|                 print(file.read().decode().replace('P', logger.colors.fg.pink).replace('W', logger.colors.reset + logger.colors.bold).replace('G', logger.colors.fg.green).replace('\n', logger.colors.reset + '\n')) |                 print(file.read().decode().replace('P', logger.colors.fg.pink).replace('W', logger.colors.reset + logger.colors.bold).replace('G', logger.colors.fg.green).replace('\n', logger.colors.reset + '\n')) | ||||||
|                 logger.info(logger.colors.fg.lightgreen + '-> ' + str(message) + logger.colors.reset + logger.colors.fg.lightgreen + ' <-\n') |                 logger.info(logger.colors.fg.lightgreen + '-> ' + str(message) + logger.colors.reset + logger.colors.fg.lightgreen + ' <-\n') | ||||||
|      | 
 | ||||||
| class OnionrCommunicatorTimers: | class OnionrCommunicatorTimers: | ||||||
|     def __init__(self, daemonInstance, timerFunction, frequency, makeThread=True, threadAmount=1, maxThreads=5): |     def __init__(self, daemonInstance, timerFunction, frequency, makeThread=True, threadAmount=1, maxThreads=5): | ||||||
|         self.timerFunction = timerFunction |         self.timerFunction = timerFunction | ||||||
|  | @ -255,7 +257,7 @@ class OnionrCommunicatorTimers: | ||||||
| shouldRun = False | shouldRun = False | ||||||
| debug = True | debug = True | ||||||
| developmentMode = False | developmentMode = False | ||||||
| if config.get('devmode', True): | if config.get('general.dev_mode', True): | ||||||
|     developmentMode = True |     developmentMode = True | ||||||
| try: | try: | ||||||
|     if sys.argv[1] == 'run': |     if sys.argv[1] == 'run': | ||||||
|  | @ -269,4 +271,4 @@ if shouldRun: | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
|         pass |         pass | ||||||
|     except Exception as e: |     except Exception as e: | ||||||
|         logger.error('Error occured in Communicator', error = e, timestamp = False) |         logger.error('Error occured in Communicator', error = e, timestamp = False) | ||||||
|  |  | ||||||
|  | @ -28,9 +28,20 @@ def get(key, default = None): | ||||||
|         Gets the key from configuration, or returns `default` |         Gets the key from configuration, or returns `default` | ||||||
|     ''' |     ''' | ||||||
| 
 | 
 | ||||||
|     if is_set(key): |     key = str(key).split('.') | ||||||
|         return get_config()[key] |     data = _config | ||||||
|     return default | 
 | ||||||
|  |     last = key.pop() | ||||||
|  | 
 | ||||||
|  |     for item in key: | ||||||
|  |         if (not item in data) or (not type(data[item]) == dict): | ||||||
|  |             return default | ||||||
|  |         data = data[item] | ||||||
|  | 
 | ||||||
|  |     if not last in data: | ||||||
|  |         return default | ||||||
|  | 
 | ||||||
|  |     return data[last] | ||||||
| 
 | 
 | ||||||
| def set(key, value = None, savefile = False): | def set(key, value = None, savefile = False): | ||||||
|     ''' |     ''' | ||||||
|  | @ -38,16 +49,40 @@ def set(key, value = None, savefile = False): | ||||||
|     ''' |     ''' | ||||||
| 
 | 
 | ||||||
|     global _config |     global _config | ||||||
|  | 
 | ||||||
|  |     key = str(key).split('.') | ||||||
|  |     data = _config | ||||||
|  | 
 | ||||||
|  |     last = key.pop() | ||||||
|  | 
 | ||||||
|  |     for item in key: | ||||||
|  |         if (not item in data) or (not type(data[item]) == dict): | ||||||
|  |             data[item] = dict() | ||||||
|  |         data = data[item] | ||||||
|  | 
 | ||||||
|     if value is None: |     if value is None: | ||||||
|         del _config[key] |         del data[last] | ||||||
|     else: |     else: | ||||||
|         _config[key] = value |         data[last] = value | ||||||
| 
 | 
 | ||||||
|     if savefile: |     if savefile: | ||||||
|         save() |         save() | ||||||
| 
 | 
 | ||||||
| def is_set(key): | def is_set(key): | ||||||
|     return key in get_config() and not get_config()[key] is None |     key = str(key).split('.') | ||||||
|  |     data = _config | ||||||
|  | 
 | ||||||
|  |     last = key.pop() | ||||||
|  | 
 | ||||||
|  |     for item in key: | ||||||
|  |         if (not item in data) or (not type(data[item]) == dict): | ||||||
|  |             return False | ||||||
|  |         data = data[item] | ||||||
|  | 
 | ||||||
|  |     if not last in data: | ||||||
|  |         return False | ||||||
|  | 
 | ||||||
|  |     return True | ||||||
| 
 | 
 | ||||||
| def check(): | def check(): | ||||||
|     ''' |     ''' | ||||||
|  | @ -71,7 +106,7 @@ def save(): | ||||||
|     check() |     check() | ||||||
|     try: |     try: | ||||||
|         with open(get_config_file(), 'w', encoding="utf8") as configfile: |         with open(get_config_file(), 'w', encoding="utf8") as configfile: | ||||||
|             json.dump(get_config(), configfile, indent=2, sort_keys=True) |             json.dump(get_config(), configfile, indent=2) | ||||||
|     except: |     except: | ||||||
|         logger.warn('Failed to write to configuration file.') |         logger.warn('Failed to write to configuration file.') | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -110,7 +110,7 @@ class Core: | ||||||
|         ''' |         ''' | ||||||
|             Add an address to the address database (only tor currently) |             Add an address to the address database (only tor currently) | ||||||
|         ''' |         ''' | ||||||
|         if address == config.get('i2p', {'ownAddr' : None})['ownAddr']: |         if address == config.get('i2p.ownAddr', None): | ||||||
| 
 | 
 | ||||||
|             return False |             return False | ||||||
|         if self._utils.validateID(address): |         if self._utils.validateID(address): | ||||||
|  |  | ||||||
|  | @ -67,22 +67,22 @@ class Onionr: | ||||||
|             config.set_config(json.loads(open('static-data/default_config.json').read())) # this is the default config, it will be overwritten if a config file already exists. Else, it saves it |             config.set_config(json.loads(open('static-data/default_config.json').read())) # this is the default config, it will be overwritten if a config file already exists. Else, it saves it | ||||||
|         else: |         else: | ||||||
|             # the default config file doesn't exist, try hardcoded config |             # the default config file doesn't exist, try hardcoded config | ||||||
|             config.set_config({'devmode': True, 'log': {'file': {'output': True, 'path': 'data/output.log'}, 'console': {'output': True, 'color': True}}}) |             config.set_config({'dev_mode': True, 'log': {'file': {'output': True, 'path': 'data/output.log'}, 'console': {'output': True, 'color': True}}}) | ||||||
|         if not data_exists: |         if not data_exists: | ||||||
|             config.save() |             config.save() | ||||||
|         config.reload() # this will read the configuration file into memory |         config.reload() # this will read the configuration file into memory | ||||||
| 
 | 
 | ||||||
|         settings = 0b000 |         settings = 0b000 | ||||||
|         if config.get('log', {'console': {'color': True}})['console']['color']: |         if config.get('log.console.color', True): | ||||||
|             settings = settings | logger.USE_ANSI |             settings = settings | logger.USE_ANSI | ||||||
|         if config.get('log', {'console': {'output': True}})['console']['output']: |         if config.get('log.console.output', True): | ||||||
|             settings = settings | logger.OUTPUT_TO_CONSOLE |             settings = settings | logger.OUTPUT_TO_CONSOLE | ||||||
|         if config.get('log', {'file': {'output': True}})['file']['output']: |         if config.get('log.file.output', True): | ||||||
|             settings = settings | logger.OUTPUT_TO_FILE |             settings = settings | logger.OUTPUT_TO_FILE | ||||||
|             logger.set_file(config.get('log', {'file': {'path': 'data/output.log'}})['file']['path']) |             logger.set_file(config.get('log.file.path', '/tmp/onionr.log')) | ||||||
|         logger.set_settings(settings) |         logger.set_settings(settings) | ||||||
| 
 | 
 | ||||||
|         if str(config.get('devmode', True)).lower() == 'true': |         if str(config.get('general.dev_mode', True)).lower() == 'true': | ||||||
|             self._developmentMode = True |             self._developmentMode = True | ||||||
|             logger.set_level(logger.LEVEL_DEBUG) |             logger.set_level(logger.LEVEL_DEBUG) | ||||||
|         else: |         else: | ||||||
|  | @ -149,7 +149,7 @@ class Onionr: | ||||||
|                     randomPort = random.randint(1024, 65535) |                     randomPort = random.randint(1024, 65535) | ||||||
|                     if self.onionrUtils.checkPort(randomPort): |                     if self.onionrUtils.checkPort(randomPort): | ||||||
|                         break |                         break | ||||||
|             config.set('client', {'participate': 'true', 'client_hmac': base64.b16encode(os.urandom(32)).decode('utf-8'), 'port': randomPort, 'api_version': API_VERSION}, True) |             config.set('client', {'participate': 'true', 'hmac': base64.b16encode(os.urandom(32)).decode('utf-8'), 'port': randomPort, 'api_version': API_VERSION}, True) | ||||||
| 
 | 
 | ||||||
|         self.cmds = { |         self.cmds = { | ||||||
|             '': self.showHelpSuggestion, |             '': self.showHelpSuggestion, | ||||||
|  | @ -262,7 +262,7 @@ class Onionr: | ||||||
|         self.onionrCore.daemonQueueAdd('connectedPeers') |         self.onionrCore.daemonQueueAdd('connectedPeers') | ||||||
| 
 | 
 | ||||||
|     def getWebPassword(self): |     def getWebPassword(self): | ||||||
|         return config.get('client')['client_hmac'] |         return config.get('client.hmac') | ||||||
| 
 | 
 | ||||||
|     def getHelp(self): |     def getHelp(self): | ||||||
|         return self.cmdhelp |         return self.cmdhelp | ||||||
|  | @ -534,12 +534,12 @@ class Onionr: | ||||||
| 
 | 
 | ||||||
|         logger.info('Do ' + logger.colors.bold + sys.argv[0] + ' --help' + logger.colors.reset + logger.colors.fg.green + ' for Onionr help.') |         logger.info('Do ' + logger.colors.bold + sys.argv[0] + ' --help' + logger.colors.reset + logger.colors.fg.green + ' for Onionr help.') | ||||||
| 
 | 
 | ||||||
|     def start(self, input = False): |     def start(self, input = False, override = False): | ||||||
|         ''' |         ''' | ||||||
|             Starts the Onionr daemon |             Starts the Onionr daemon | ||||||
|         ''' |         ''' | ||||||
| 
 | 
 | ||||||
|         if os.path.exists('.onionr-lock'): |         if os.path.exists('.onionr-lock') and not override: | ||||||
|             logger.fatal('Cannot start. Daemon is already running, or it did not exit cleanly.\n(if you are sure that there is not a daemon running, delete .onionr-lock & try again).') |             logger.fatal('Cannot start. Daemon is already running, or it did not exit cleanly.\n(if you are sure that there is not a daemon running, delete .onionr-lock & try again).') | ||||||
|         else: |         else: | ||||||
|             if not self.debug and not self._developmentMode: |             if not self.debug and not self._developmentMode: | ||||||
|  | @ -560,7 +560,7 @@ class Onionr: | ||||||
|         if not os.environ.get("WERKZEUG_RUN_MAIN") == "true": |         if not os.environ.get("WERKZEUG_RUN_MAIN") == "true": | ||||||
|             if self._developmentMode: |             if self._developmentMode: | ||||||
|                 logger.warn('DEVELOPMENT MODE ENABLED (THIS IS LESS SECURE!)', timestamp = False) |                 logger.warn('DEVELOPMENT MODE ENABLED (THIS IS LESS SECURE!)', timestamp = False) | ||||||
|             net = NetController(config.get('client')['port']) |             net = NetController(config.get('client.port', 59496)) | ||||||
|             logger.info('Tor is starting...') |             logger.info('Tor is starting...') | ||||||
|             if not net.startTor(): |             if not net.startTor(): | ||||||
|                 sys.exit(1) |                 sys.exit(1) | ||||||
|  | @ -568,7 +568,7 @@ class Onionr: | ||||||
|             logger.info('Our Public key: ' + self.onionrCore._crypto.pubKey) |             logger.info('Our Public key: ' + self.onionrCore._crypto.pubKey) | ||||||
|             time.sleep(1) |             time.sleep(1) | ||||||
|             try: |             try: | ||||||
|                 if config.get('newCommunicator'): |                 if config.get('general.newCommunicator', False): | ||||||
|                     communicatorDaemon = './communicator2.py' |                     communicatorDaemon = './communicator2.py' | ||||||
|                     logger.info('Using new communicator') |                     logger.info('Using new communicator') | ||||||
|             except NameError: |             except NameError: | ||||||
|  | @ -589,7 +589,7 @@ class Onionr: | ||||||
|         logger.warn('Killing the running daemon...', timestamp = False) |         logger.warn('Killing the running daemon...', timestamp = False) | ||||||
|         try: |         try: | ||||||
|             events.event('daemon_stop', onionr = self) |             events.event('daemon_stop', onionr = self) | ||||||
|             net = NetController(config.get('client')['port']) |             net = NetController(config.get('client.port', 59496)) | ||||||
|             try: |             try: | ||||||
|                 self.onionrUtils.localCommand('shutdown') |                 self.onionrUtils.localCommand('shutdown') | ||||||
|             except requests.exceptions.ConnectionError: |             except requests.exceptions.ConnectionError: | ||||||
|  | @ -628,7 +628,7 @@ class Onionr: | ||||||
|                 # count stats |                 # count stats | ||||||
|                 'div2' : True, |                 'div2' : True, | ||||||
|                 'Known Peers Count' : str(len(self.onionrCore.listPeers()) - 1), |                 'Known Peers Count' : str(len(self.onionrCore.listPeers()) - 1), | ||||||
|                 'Enabled Plugins Count' : str(len(config.get('plugins')['enabled'])) + ' / ' + str(len(os.listdir('data/plugins/'))), |                 'Enabled Plugins Count' : str(len(config.get('plugins.enabled', list()))) + ' / ' + str(len(os.listdir('data/plugins/'))), | ||||||
|                 'Known Blocks Count' : str(totalBlocks), |                 'Known Blocks Count' : str(totalBlocks), | ||||||
|                 'Percent Blocks Signed' : str(round(100 * signedBlocks / max(totalBlocks, 1), 2)) + '%' |                 'Percent Blocks Signed' : str(round(100 * signedBlocks / max(totalBlocks, 1), 2)) + '%' | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  | @ -18,10 +18,13 @@ | ||||||
|     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 core as onionrcore, logger | import core as onionrcore, logger, config | ||||||
| import json, os, datetime, base64 | import json, os, sys, datetime, base64 | ||||||
| 
 | 
 | ||||||
| class Block: | class Block: | ||||||
|  |     blockCacheOrder = list() # NEVER write your own code that writes to this! | ||||||
|  |     blockCache = dict() # should never be accessed directly, look at Block.getCache() | ||||||
|  | 
 | ||||||
|     def __init__(self, hash = None, core = None): |     def __init__(self, hash = None, core = None): | ||||||
|         ''' |         ''' | ||||||
|             Initializes Onionr |             Initializes Onionr | ||||||
|  | @ -43,6 +46,9 @@ class Block: | ||||||
|             self.hash = None |             self.hash = None | ||||||
|             self.core = None |             self.core = None | ||||||
|         else: |         else: | ||||||
|  |             if type(hash) == bytes: | ||||||
|  |                 hash = hash.decode() | ||||||
|  | 
 | ||||||
|             self.btype = '' |             self.btype = '' | ||||||
|             self.bcontent = '' |             self.bcontent = '' | ||||||
|             self.hash = hash |             self.hash = hash | ||||||
|  | @ -65,7 +71,8 @@ class Block: | ||||||
|         if self.getCore() is None: |         if self.getCore() is None: | ||||||
|             self.core = onionrcore.Core() |             self.core = onionrcore.Core() | ||||||
|         if not self.getHash() is None: |         if not self.getHash() is None: | ||||||
|             self.update() |             if not self.update(): | ||||||
|  |                 logger.debug('Failed to open block %s.' % self.getHash()) | ||||||
| 
 | 
 | ||||||
|     # logic |     # logic | ||||||
| 
 | 
 | ||||||
|  | @ -93,16 +100,23 @@ class Block: | ||||||
|             if blockdata is None: |             if blockdata is None: | ||||||
|                 filelocation = file |                 filelocation = file | ||||||
| 
 | 
 | ||||||
|  |                 readfile = True | ||||||
|  | 
 | ||||||
|                 if filelocation is None: |                 if filelocation is None: | ||||||
|                     if self.getHash() is None: |                     if self.getHash() is None: | ||||||
|                         return False |                         return False | ||||||
|                     try: |                     elif self.getHash() in Block.getCache(): | ||||||
|                         filelocation = 'data/blocks/%s.dat' % self.getHash().decode() |                         # get the block from cache, if it's in it | ||||||
|                     except AttributeError: |                         blockdata = Block.getCache(self.getHash()) | ||||||
|  |                         readfile = False | ||||||
|  | 
 | ||||||
|  |                     # read from file if it's still None | ||||||
|  |                     if blockdata is None: | ||||||
|                         filelocation = 'data/blocks/%s.dat' % self.getHash() |                         filelocation = 'data/blocks/%s.dat' % self.getHash() | ||||||
| 
 | 
 | ||||||
|                 with open(filelocation, 'rb') as f: |                 if readfile: | ||||||
|                     blockdata = f.read().decode('utf-8') |                     with open(filelocation, 'rb') as f: | ||||||
|  |                         blockdata = f.read().decode() | ||||||
| 
 | 
 | ||||||
|                 self.blockFile = filelocation |                 self.blockFile = filelocation | ||||||
|             else: |             else: | ||||||
|  | @ -126,6 +140,10 @@ class Block: | ||||||
|                 self.date = datetime.datetime.fromtimestamp(self.getDate()) |                 self.date = datetime.datetime.fromtimestamp(self.getDate()) | ||||||
| 
 | 
 | ||||||
|             self.valid = True |             self.valid = True | ||||||
|  | 
 | ||||||
|  |             if len(self.getRaw()) <= config.get('allocations.blockCache', 500000): | ||||||
|  |                 self.cache() | ||||||
|  | 
 | ||||||
|             return True |             return True | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             logger.error('Failed to update block data.', error = e, timestamp = False) |             logger.error('Failed to update block data.', error = e, timestamp = False) | ||||||
|  | @ -641,11 +659,54 @@ class Block: | ||||||
|             - (bool): whether or not the block file exists |             - (bool): whether or not the block file exists | ||||||
|         ''' |         ''' | ||||||
| 
 | 
 | ||||||
|  |         # no input data? scrap it. | ||||||
|         if hash is None: |         if hash is None: | ||||||
|             return False |             return False | ||||||
|         elif type(hash) == Block: | 
 | ||||||
|  |         if type(hash) == Block: | ||||||
|             blockfile = hash.getBlockFile() |             blockfile = hash.getBlockFile() | ||||||
|         else: |         else: | ||||||
|             blockfile = 'data/blocks/%s.dat' % hash |             blockfile = 'data/blocks/%s.dat' % hash | ||||||
| 
 | 
 | ||||||
|         return os.path.exists(blockfile) and os.path.isfile(blockfile) |         return os.path.exists(blockfile) and os.path.isfile(blockfile) | ||||||
|  | 
 | ||||||
|  |     def getCache(hash = None): | ||||||
|  |         # give a list of the hashes of the cached blocks | ||||||
|  |         if hash is None: | ||||||
|  |             return list(Block.blockCache.keys()) | ||||||
|  | 
 | ||||||
|  |         # if they inputted self or a Block, convert to hash | ||||||
|  |         if type(hash) == Block: | ||||||
|  |             hash = hash.getHash() | ||||||
|  | 
 | ||||||
|  |         # just to make sure someone didn't put in a bool or something lol | ||||||
|  |         hash = str(hash) | ||||||
|  | 
 | ||||||
|  |         # if it exists, return its content | ||||||
|  |         if hash in Block.getCache(): | ||||||
|  |             return Block.blockCache[hash] | ||||||
|  | 
 | ||||||
|  |         return None | ||||||
|  | 
 | ||||||
|  |     def cache(block, override = False): | ||||||
|  |         # why even bother if they're giving bad data? | ||||||
|  |         if not type(block) == Block: | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|  |         # only cache if written to file | ||||||
|  |         if block.getHash() is None: | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|  |         # if it's already cached, what are we here for? | ||||||
|  |         if block.getHash() in Block.getCache() and not override: | ||||||
|  |             return False | ||||||
|  | 
 | ||||||
|  |         # dump old cached blocks if the size exeeds the maximum | ||||||
|  |         if sys.getsizeof(Block.blockCacheOrder) >= config.get('allocations.blockCacheTotal', 50000000): # 50MB default cache size | ||||||
|  |             del Block.blockCache[blockCacheOrder.pop(0)] | ||||||
|  | 
 | ||||||
|  |         # cache block content | ||||||
|  |         Block.blockCache[block.getHash()] = block.getRaw() | ||||||
|  |         Block.blockCacheOrder.append(block.getHash()) | ||||||
|  | 
 | ||||||
|  |         return True | ||||||
|  |  | ||||||
|  | @ -18,7 +18,16 @@ | ||||||
|     along with this program.  If not, see <https://www.gnu.org/licenses/>. |     along with this program.  If not, see <https://www.gnu.org/licenses/>. | ||||||
| ''' | ''' | ||||||
| 
 | 
 | ||||||
|  | # general exceptions | ||||||
|  | class NotFound(Exception): | ||||||
|  |     pass | ||||||
|  | class Unknown(Exception): | ||||||
|  |     pass | ||||||
|  | class Invalid(Exception): | ||||||
|  |     pass | ||||||
|  | 
 | ||||||
|  | # network level exceptions | ||||||
| class MissingPort(Exception): | class MissingPort(Exception): | ||||||
|     pass |     pass | ||||||
| class InvalidAddress(Exception): | class InvalidAddress(Exception): | ||||||
|     pass |     pass | ||||||
|  |  | ||||||
|  | @ -64,9 +64,7 @@ def enable(name, onionr = None, start_event = True): | ||||||
|         enabled_plugins = get_enabled_plugins() |         enabled_plugins = get_enabled_plugins() | ||||||
|         if not name in enabled_plugins: |         if not name in enabled_plugins: | ||||||
|             enabled_plugins.append(name) |             enabled_plugins.append(name) | ||||||
|             config_plugins = config.get('plugins') |             config.set('plugins.enabled', enabled_plugins, True) | ||||||
|             config_plugins['enabled'] = enabled_plugins |  | ||||||
|             config.set('plugins', config_plugins, True) |  | ||||||
| 
 | 
 | ||||||
|             events.call(get_plugin(name), 'enable', onionr) |             events.call(get_plugin(name), 'enable', onionr) | ||||||
| 
 | 
 | ||||||
|  | @ -93,9 +91,7 @@ def disable(name, onionr = None, stop_event = True): | ||||||
|     if is_enabled(name): |     if is_enabled(name): | ||||||
|         enabled_plugins = get_enabled_plugins() |         enabled_plugins = get_enabled_plugins() | ||||||
|         enabled_plugins.remove(name) |         enabled_plugins.remove(name) | ||||||
|         config_plugins = config.get('plugins') |         config.set('plugins.enabled', enabled_plugins, True) | ||||||
|         config_plugins['enabled'] = enabled_plugins |  | ||||||
|         config.set('plugins', config_plugins, True) |  | ||||||
| 
 | 
 | ||||||
|     if exists(name): |     if exists(name): | ||||||
|         events.call(get_plugin(name), 'disable', onionr) |         events.call(get_plugin(name), 'disable', onionr) | ||||||
|  | @ -187,7 +183,7 @@ def get_enabled_plugins(): | ||||||
| 
 | 
 | ||||||
|     config.reload() |     config.reload() | ||||||
| 
 | 
 | ||||||
|     return config.get('plugins')['enabled'] |     return config.get('plugins.enabled', list()) | ||||||
| 
 | 
 | ||||||
| def is_enabled(name): | def is_enabled(name): | ||||||
|     ''' |     ''' | ||||||
|  |  | ||||||
|  | @ -177,7 +177,7 @@ class OnionrUtils: | ||||||
|         self.getTimeBypassToken() |         self.getTimeBypassToken() | ||||||
|         # TODO: URL encode parameters, just as an extra measure. May not be needed, but should be added regardless. |         # TODO: URL encode parameters, just as an extra measure. May not be needed, but should be added regardless. | ||||||
|         try: |         try: | ||||||
|             retData = requests.get('http://' + open('data/host.txt', 'r').read() + ':' + str(config.get('client')['port']) + '/client/?action=' + command + '&token=' + str(config.get('client')['client_hmac']) + '&timingToken=' + self.timingToken).text |             retData = requests.get('http://%s:%s/client/?action=%s&token=%s&timingToken=' % (open('data/host.txt', 'r').read(), config.get('client.port', 59496), command, config.get('client.hmac'), self.timingToken)).text | ||||||
|         except Exception as error: |         except Exception as error: | ||||||
|             if not silent: |             if not silent: | ||||||
|                 logger.error('Failed to make local request (command: %s).' % command, error=error) |                 logger.error('Failed to make local request (command: %s).' % command, error=error) | ||||||
|  |  | ||||||
|  | @ -1,8 +1,18 @@ | ||||||
| { | { | ||||||
|     "devmode": true, |     "general" : { | ||||||
|     "dc_response": true, |         "dev_mode": true, | ||||||
|  |         "display_header" : true, | ||||||
|  | 
 | ||||||
|  |         "newCommunicator": false, | ||||||
|  | 
 | ||||||
|  |         "dc_response": true, | ||||||
|  |         "dc_execcallbacks" : true | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|  |     "client" : { | ||||||
|  | 
 | ||||||
|  |     }, | ||||||
| 
 | 
 | ||||||
|     "display_header" : true, |  | ||||||
|     "log": { |     "log": { | ||||||
|         "file": { |         "file": { | ||||||
|             "output": true, |             "output": true, | ||||||
|  | @ -15,14 +25,20 @@ | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
| 
 | 
 | ||||||
|  |     "tor" : { | ||||||
|  | 
 | ||||||
|  |     }, | ||||||
|  | 
 | ||||||
|     "i2p":{ |     "i2p":{ | ||||||
| 	"host": false, |     	"host": false, | ||||||
|     "connect": true, |         "connect": true, | ||||||
|     "ownAddr": "" |         "ownAddr": "" | ||||||
|      }, |      }, | ||||||
|  | 
 | ||||||
|     "allocations":{ |     "allocations":{ | ||||||
|         "disk": 1000000000, |         "disk": 1000000000, | ||||||
|         "netTotal": 1000000000 |         "netTotal": 1000000000, | ||||||
|     }, |         "blockCache" : 5000000, | ||||||
|     "newCommunicator": false |         "blockCacheTotal" : 50000000 | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue