Module src.onionrblocks.onionrblacklist
Onionr - Private P2P Communication.
Handle maintenance of a blacklist database, for blocks and peers
Expand source code
"""Onionr - Private P2P Communication.
Handle maintenance of a blacklist database, for blocks and peers
"""
import sqlite3
import os
from onionrplugins.onionrevents import event
import onionrcrypto
from onionrutils import epoch, bytesconverter
from coredb import dbfiles
"""
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 <https://www.gnu.org/licenses/>.
"""
class OnionrBlackList:
def __init__(self):
self.blacklistDB = dbfiles.blacklist_db
if not os.path.exists(dbfiles.blacklist_db):
self.generateDB()
return
def inBlacklist(self, data):
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
retData = False
if not hashed.isalnum():
raise Exception("Hashed data is not alpha numeric")
if len(hashed) > 64:
raise Exception("Hashed data is too large")
for i in self._dbExecute("SELECT * FROM blacklist WHERE hash = ?", (hashed,)):
retData = True # this only executes if an entry is present by that hash
break
return retData
def _dbExecute(self, toExec, params = ()):
conn = sqlite3.connect(self.blacklistDB)
c = conn.cursor()
retData = c.execute(toExec, params)
conn.commit()
return retData
def deleteBeforeDate(self, date):
# TODO, delete blacklist entries before date
return
def deleteExpired(self, dataType=0):
"""Delete expired entries"""
deleteList = []
curTime = epoch.get_epoch()
try:
int(dataType)
except AttributeError:
raise TypeError("dataType must be int")
for i in self._dbExecute('SELECT * FROM blacklist WHERE dataType = ?', (dataType,)):
if i[1] == dataType:
if (curTime - i[2]) >= i[3]:
deleteList.append(i[0])
for thing in deleteList:
self._dbExecute("DELETE FROM blacklist WHERE hash = ?", (thing,))
def generateDB(self):
return
def clearDB(self):
self._dbExecute("""DELETE FROM blacklist;""")
def getList(self):
data = self._dbExecute('SELECT * FROM blacklist')
myList = []
for i in data:
myList.append(i[0])
return myList
def addToDB(self, data, dataType=0, expire=0):
"""Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses
0=block
1=peer
2=pubkey
"""
# we hash the data so we can remove data entirely from our node's disk
hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data))
event('blacklist_add', data={'data': data, 'hash': hashed})
if len(hashed) > 64:
raise Exception("Hashed data is too large")
if not hashed.isalnum():
raise Exception("Hashed data is not alpha numeric")
try:
int(dataType)
except ValueError:
raise Exception("dataType is not int")
try:
int(expire)
except ValueError:
raise Exception("expire is not int")
if self.inBlacklist(hashed):
return
insert = (hashed,)
blacklistDate = epoch.get_epoch()
try:
self._dbExecute("INSERT INTO blacklist (hash, dataType, blacklistDate, expire) VALUES(?, ?, ?, ?);", (str(hashed), dataType, blacklistDate, expire))
except sqlite3.IntegrityError:
pass
Classes
class OnionrBlackList
-
Expand source code
class OnionrBlackList: def __init__(self): self.blacklistDB = dbfiles.blacklist_db if not os.path.exists(dbfiles.blacklist_db): self.generateDB() return def inBlacklist(self, data): hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data)) retData = False if not hashed.isalnum(): raise Exception("Hashed data is not alpha numeric") if len(hashed) > 64: raise Exception("Hashed data is too large") for i in self._dbExecute("SELECT * FROM blacklist WHERE hash = ?", (hashed,)): retData = True # this only executes if an entry is present by that hash break return retData def _dbExecute(self, toExec, params = ()): conn = sqlite3.connect(self.blacklistDB) c = conn.cursor() retData = c.execute(toExec, params) conn.commit() return retData def deleteBeforeDate(self, date): # TODO, delete blacklist entries before date return def deleteExpired(self, dataType=0): """Delete expired entries""" deleteList = [] curTime = epoch.get_epoch() try: int(dataType) except AttributeError: raise TypeError("dataType must be int") for i in self._dbExecute('SELECT * FROM blacklist WHERE dataType = ?', (dataType,)): if i[1] == dataType: if (curTime - i[2]) >= i[3]: deleteList.append(i[0]) for thing in deleteList: self._dbExecute("DELETE FROM blacklist WHERE hash = ?", (thing,)) def generateDB(self): return def clearDB(self): self._dbExecute("""DELETE FROM blacklist;""") def getList(self): data = self._dbExecute('SELECT * FROM blacklist') myList = [] for i in data: myList.append(i[0]) return myList def addToDB(self, data, dataType=0, expire=0): """Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses 0=block 1=peer 2=pubkey """ # we hash the data so we can remove data entirely from our node's disk hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data)) event('blacklist_add', data={'data': data, 'hash': hashed}) if len(hashed) > 64: raise Exception("Hashed data is too large") if not hashed.isalnum(): raise Exception("Hashed data is not alpha numeric") try: int(dataType) except ValueError: raise Exception("dataType is not int") try: int(expire) except ValueError: raise Exception("expire is not int") if self.inBlacklist(hashed): return insert = (hashed,) blacklistDate = epoch.get_epoch() try: self._dbExecute("INSERT INTO blacklist (hash, dataType, blacklistDate, expire) VALUES(?, ?, ?, ?);", (str(hashed), dataType, blacklistDate, expire)) except sqlite3.IntegrityError: pass
Methods
def addToDB(self, data, dataType=0, expire=0)
-
Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses 0=block 1=peer 2=pubkey
Expand source code
def addToDB(self, data, dataType=0, expire=0): """Add to the blacklist. Intended to be block hash, block data, peers, or transport addresses 0=block 1=peer 2=pubkey """ # we hash the data so we can remove data entirely from our node's disk hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data)) event('blacklist_add', data={'data': data, 'hash': hashed}) if len(hashed) > 64: raise Exception("Hashed data is too large") if not hashed.isalnum(): raise Exception("Hashed data is not alpha numeric") try: int(dataType) except ValueError: raise Exception("dataType is not int") try: int(expire) except ValueError: raise Exception("expire is not int") if self.inBlacklist(hashed): return insert = (hashed,) blacklistDate = epoch.get_epoch() try: self._dbExecute("INSERT INTO blacklist (hash, dataType, blacklistDate, expire) VALUES(?, ?, ?, ?);", (str(hashed), dataType, blacklistDate, expire)) except sqlite3.IntegrityError: pass
def clearDB(self)
-
Expand source code
def clearDB(self): self._dbExecute("""DELETE FROM blacklist;""")
def deleteBeforeDate(self, date)
-
Expand source code
def deleteBeforeDate(self, date): # TODO, delete blacklist entries before date return
def deleteExpired(self, dataType=0)
-
Delete expired entries
Expand source code
def deleteExpired(self, dataType=0): """Delete expired entries""" deleteList = [] curTime = epoch.get_epoch() try: int(dataType) except AttributeError: raise TypeError("dataType must be int") for i in self._dbExecute('SELECT * FROM blacklist WHERE dataType = ?', (dataType,)): if i[1] == dataType: if (curTime - i[2]) >= i[3]: deleteList.append(i[0]) for thing in deleteList: self._dbExecute("DELETE FROM blacklist WHERE hash = ?", (thing,))
def generateDB(self)
-
Expand source code
def generateDB(self): return
def getList(self)
-
Expand source code
def getList(self): data = self._dbExecute('SELECT * FROM blacklist') myList = [] for i in data: myList.append(i[0]) return myList
def inBlacklist(self, data)
-
Expand source code
def inBlacklist(self, data): hashed = bytesconverter.bytes_to_str(onionrcrypto.hashers.sha3_hash(data)) retData = False if not hashed.isalnum(): raise Exception("Hashed data is not alpha numeric") if len(hashed) > 64: raise Exception("Hashed data is too large") for i in self._dbExecute("SELECT * FROM blacklist WHERE hash = ?", (hashed,)): retData = True # this only executes if an entry is present by that hash break return retData