domain validation

This commit is contained in:
9cfa 2023-03-13 22:12:44 +01:00
parent ba3ced4b8d
commit 435e7aae38
16 changed files with 18 additions and 34 deletions

View File

@ -45,7 +45,7 @@ rpcs = {
} }
DB = { DB = {
'host': 'localhost', 'host': '127.0.0.1',
'port': 3306, 'port': 3306,
'user': 'root', 'user': 'root',
'pass': 'xegh3kAJyDLaRu' 'pass': 'xegh3kAJyDLaRu'

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -34,6 +34,8 @@ def checksumCheck(method, address):
match method.lower(): match method.lower():
case 'btc': case 'btc':
return decodeBase58(address) if address[0] == '1' or address[0] == '3' else True if address[0:3] == 'bc1' and segwit_addr.decode("bc", address)[0] != None else False return decodeBase58(address) if address[0] == '1' or address[0] == '3' else True if address[0:3] == 'bc1' and segwit_addr.decode("bc", address)[0] != None else False
case 'btct':
return decodeBase58(address) if address[0] == '1' or address[0] == '3' else True if address[0:3] == 'tb1' and segwit_addr.decode("tb", address)[0] != None else False
case 'ltc': case 'ltc':
return decodeBase58(address) if address[0] == '3' or address[0] == 'M' or address[0] == 'L' else True if address[0:4] == 'ltc1' and segwit_addr.decode("ltc", address)[0] != None else False return decodeBase58(address) if address[0] == '3' or address[0] == 'M' or address[0] == 'L' else True if address[0:4] == 'ltc1' and segwit_addr.decode("ltc", address)[0] != None else False
case 'bch': case 'bch':
@ -45,14 +47,3 @@ def checksumCheck(method, address):
return decodeMonero(address) return decodeMonero(address)
case _: case _:
return False return False
def validDns(d):
try:
a = socket.gethostbyname(d)
except:
return False
# ip validation
if a.split('.')[0] in ['127', '0'] or '.'.join([a.split('.')[0], a.split('.')[1]]) == '192.168' or a in ['1.1.1.1','2.2.2.2', '3.3.3.3']:
return False
else:
return True

35
main.py
View File

@ -1,20 +1,21 @@
import time, socket, uvicorn
from typing import Optional, Union from typing import Optional, Union
from urllib.parse import urlparse
from fastapi import FastAPI, Request from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
import time, socket
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool from sqlalchemy.pool import QueuePool
import uvicorn
#local #local
from rpcs import RPCHost, RPCXMR from rpcs import RPCHost, RPCXMR
from models import Return from models import Return
from meta import Queue from meta import Queue
from functions import checksumCheck, validDns from functions import checksumCheck
import config import config
from dependencies.validate_url import UrlValidator
class ErrorException(Exception): class ErrorException(Exception):
def __init__(self, code: str, status: str, status_message: str): def __init__(self, code: str, status: str, status_message: str):
self.status = status self.status = status
@ -46,24 +47,16 @@ def receive(method: str, address: str, callback: Union[str, None] = None):
if method.lower() not in ['btc', 'btct', 'ltc', 'doge', 'zec', 'bch', 'xmr']: if method.lower() not in ['btc', 'btct', 'ltc', 'doge', 'zec', 'bch', 'xmr']:
raise ErrorException(code=422,status="error",status_message='Invalid method used') raise ErrorException(code=422,status="error",status_message='Invalid method used')
if checksumCheck(method.lower(), address) == False: if checksumCheck(method.lower(), address) == False:
raise ErrorException(code=422,status="error",status_message='Invalid Destination Address') raise ErrorException(code=422,status="error",status_message='Invalid destination address')
if callback: if callback:
try: if UrlValidator.validate(callback) != True:
data = urlparse(callback) raise ErrorException(code=422,status="error",status_message='Invalid callback')
#scheme validation callback_req_n = 1
if data.scheme == 'http' or data.scheme == 'https':
#domain validation
if validDns(data.netloc) != True:
raise ErrorException(code=422,status="error",status_message='Invalid callback: domain name does not resolve')
else:
raise ErrorException(code=422,status="error",status_message='Invalid callback: wrong url scheme, we accept http or https only')
except:
callback = 'None'
callback_req_n = 0
else: else:
callback = 'None' callback = 'None'
callback_req_n = 1 callback_req_n = 0
## RPC connection to Demons ## RPC connection to Demons
match method.upper(): match method.upper():
@ -114,13 +107,13 @@ def receive(method: str, address: str, callback: Union[str, None] = None):
if wallet: if wallet:
try: try:
q = Queue(txhash = 'None', time = int(time.time()), account = method.upper(), fee = config.fee['REGULAR'][method.upper()], ready = 0, confirmations =0, callbackurl = callback, generated_address = wallet, destination = address, balance_received = '0.00000000', callback_req = callback_req_n, ip = socket.gethostbyname(socket.gethostname()) , hostname = socket.gethostname(), merchantId = 'None', dateTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) q = Queue(txhash = 'None', time = int(time.time()), account = method.upper(), fee = config.fee['REGULAR'][method.upper()], ready = 0, confirmations =0, callbackurl = callback, generated_address = wallet, destination = address, balance_received = '0.00000000', callback_req = callback_req_n, ip = '', hostname = '', merchantId = 'None', dateTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
session.add(q) session.add(q)
session.commit() session.commit()
session.close() session.close()
except Exception as error: except Exception as error:
## notify admin about the error ## notify admin about the error
raise ErrorException(code=422,status="error",status_message='Invalid response from dbServer') raise ErrorException(code=422,status="error",status_message='Invalid response from dbServer:'+str(error))
else: else:
## notify admin about the error ## notify admin about the error
raise ErrorException(code=422,status="error",status_message='Invalid response from rpcServer') raise ErrorException(code=422,status="error",status_message='Invalid response from rpcServer')
@ -135,5 +128,5 @@ def receive(method: str, address: str, callback: Union[str, None] = None):
# Run # Run
if __name__ == '__main__': if __name__ == '__main__':
uvicorn.run('main:app', host='0.0.0.0') uvicorn.run('main:app', host='0.0.0.0', reload=True, debug=True)
#workers=4 (doesn't work with reload) #workers=4 (doesn't work with reload)

View File