geändert: .gitignore
geändert: main.py gelöscht: requirments.txt root/
This commit is contained in:
parent
396237b48a
commit
85f7dc8569
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
*.png
|
*.png
|
||||||
|
config.json
|
||||||
|
webEPC.log
|
||||||
|
259
main.py
259
main.py
@ -1,25 +1,246 @@
|
|||||||
import uuid
|
import sqlite3
|
||||||
import qrcode
|
import logging
|
||||||
import time
|
|
||||||
import os
|
import os
|
||||||
|
import http.server
|
||||||
|
import time
|
||||||
|
import json
|
||||||
|
import qrcode
|
||||||
|
import base64
|
||||||
|
import threading
|
||||||
|
from urllib.parse import parse_qs
|
||||||
|
from io import BytesIO
|
||||||
|
|
||||||
os.system("clear")
|
LOG_LEVEL_SCREEN = logging.DEBUG
|
||||||
# Questionig to where to put the payment
|
LOG_LEVEL_FILE = logging.DEBUG
|
||||||
amount=float(input("Please enter the amount which you like to send in EURO: "))
|
|
||||||
receiver=input("Who is the receiver: ")
|
|
||||||
bic=input("Please Input the BIC of the receiver(optional): ")
|
|
||||||
iban=input("Please also input the IBAN of the receiver: ")
|
|
||||||
usecase=input("Please input what the money will be used for: ")
|
|
||||||
char=input("Please input the char reference-char(optional): ")
|
|
||||||
reference=input("Please input the reference-number(optional): ")
|
|
||||||
|
|
||||||
# Processing
|
|
||||||
localtime1=time.localtime()
|
|
||||||
qrcodedata = ("BCD\n002\n1\nSCT\n%s\n%s\n%s\nEUR%s\n%s\n%s\n%s %s.%s.%s %s:%s:%s"%(bic,receiver,iban,amount,char,reference,usecase,localtime1.tm_mday,localtime1.tm_mon,localtime1.tm_year,localtime1.tm_hour,localtime1.tm_min,localtime1.tm_sec))
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Copyright 2022 Tarek Poltermann
|
||||||
|
"""
|
||||||
|
|
||||||
|
def generate_config(name="", iban="", bic="", usecase=""):
|
||||||
|
new_config = {
|
||||||
|
"name": name,
|
||||||
|
"iban": iban.replace(" ", ""),
|
||||||
|
"bic": bic,
|
||||||
|
"usecase": usecase
|
||||||
|
}
|
||||||
|
|
||||||
|
with open(os.path.join(os.getcwd(), "config.json"), "w") as config_file:
|
||||||
|
config_file.write(json.dumps(new_config))
|
||||||
|
|
||||||
|
|
||||||
|
class IBANCheck:
|
||||||
|
letter_dic = {"A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15, "G": 16, "H": 17, "I": 18, "J": 19, "K": 20,
|
||||||
|
"L": 21, "M": 22, "N": 23, "O": 24, "P": 25, "Q": 26, "R": 27, "S": 28, "T": 29, "U": 30, "V": 31,
|
||||||
|
"W": 32, "X": 33, "Y": 34, "Z": 35,
|
||||||
|
"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}
|
||||||
|
|
||||||
|
letters = {ord(k): str(v) for k, v in letter_dic.items()}
|
||||||
|
|
||||||
|
|
||||||
|
def check_validation_chars_iban(self, iban):
|
||||||
|
zeros_iban = iban[:2] + '00' + iban[4:]
|
||||||
|
iban_inverted = zeros_iban[4:] + zeros_iban[:4]
|
||||||
|
iban_numbered = iban_inverted.translate(self.letters)
|
||||||
|
|
||||||
|
verification_chars = 98 - (int(iban_numbered) % 97)
|
||||||
|
|
||||||
|
if verification_chars < 10:
|
||||||
|
verification_chars = '{:02}'.format(int(verification_chars))
|
||||||
|
return verification_chars
|
||||||
|
|
||||||
|
|
||||||
|
def validate_iban(self, iban):
|
||||||
|
iban_inverted = iban[4:] + iban[:4]
|
||||||
|
iban_numbered = iban_inverted.translate(self.letters)
|
||||||
|
|
||||||
|
return int(iban_numbered) % 97
|
||||||
|
|
||||||
|
|
||||||
|
class DatabaseManager:
|
||||||
|
def __init__(self, db_file):
|
||||||
|
self.logger = logging.getLogger("webEPC.Webserver")
|
||||||
|
|
||||||
|
class ServerHandler(http.server.SimpleHTTPRequestHandler):
|
||||||
|
logger = logging.getLogger('webEPC.Webserver')
|
||||||
|
allowed_paths = ["/favicon.ico",
|
||||||
|
"/",
|
||||||
|
"/css/global.css",
|
||||||
|
"/settings"]
|
||||||
|
mapping = {
|
||||||
|
"/settings": "settings.html",
|
||||||
|
"/": "index.html",
|
||||||
|
"/css/global.css": "css/global.css",
|
||||||
|
"/favicon.ico": "favicon.ico",
|
||||||
|
}
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
directory = os.path.join(os.getcwd(), "root")
|
||||||
|
super().__init__(*args, **kwargs, directory=directory)
|
||||||
|
|
||||||
|
def log_message(self, format, *args):
|
||||||
|
self.logger.info("IP: %s - HTTP Code: %s - %s" % (self.client_address[0], args[1], args[0]))
|
||||||
|
|
||||||
|
def do_404(self):
|
||||||
|
body = b"404"
|
||||||
|
self.send_response(404)
|
||||||
|
self.send_header('Content-Type', 'text/html')
|
||||||
|
self.send_header('Content-Length', str(len(body)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(body)
|
||||||
|
|
||||||
|
def do_GET(self):
|
||||||
|
if self.path[-1:] == "/" and self.path != "/":
|
||||||
|
self.path = self.path[:-1]
|
||||||
|
|
||||||
|
if self.path in self.allowed_paths:
|
||||||
|
body = open(os.path.join(os.getcwd(), "root", self.mapping[self.path]), "rb").read()
|
||||||
|
|
||||||
|
if self.path == "/settings":
|
||||||
|
with open(os.path.join(os.getcwd(), "config.json")) as config_file:
|
||||||
|
config_json = json.loads(config_file.read())
|
||||||
|
|
||||||
|
body = body.replace(b"{{ name }}", config_json["name"].encode("utf-8"))
|
||||||
|
body = body.replace(b"{{ iban }}", config_json["iban"].encode("utf-8"))
|
||||||
|
body = body.replace(b"{{ bic }}", config_json["bic"].encode("utf-8"))
|
||||||
|
body = body.replace(b"{{ usecase }}", config_json["usecase"].encode("utf-8"))
|
||||||
|
|
||||||
|
self.send_response(200)
|
||||||
|
if self.mapping[self.path][-5:] == ".html":
|
||||||
|
self.send_header('Content-Type', 'text/html')
|
||||||
|
elif self.path[-4:] == ".css":
|
||||||
|
self.send_header('Content-Type', 'text/css')
|
||||||
|
elif self.path[-3:] == ".js":
|
||||||
|
self.send_header('Content-Type', 'application/javascript')
|
||||||
|
elif self.path[-4:] == ".ico":
|
||||||
|
self.send_header('Content-Type', 'image/x-icon')
|
||||||
|
else:
|
||||||
|
self.send_header('Content-Type', 'text/plain')
|
||||||
|
self.send_header('Content-Length', str(len(body)))
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(body)
|
||||||
|
else:
|
||||||
|
self.do_404()
|
||||||
|
|
||||||
|
def do_POST(self):
|
||||||
|
content_length = int(self.headers['Content-Length'])
|
||||||
|
post = self.rfile.read(content_length)
|
||||||
|
decoded_post = parse_qs(post.decode("utf-8"))
|
||||||
|
self.logger.info("Server got POST request from " + self.client_address[0] + " Action: " + decoded_post["action"][0])
|
||||||
|
action = decoded_post["action"][0]
|
||||||
|
|
||||||
|
body = open(os.path.join(os.getcwd(), "root", "message.html"), "rb").read()
|
||||||
|
|
||||||
|
if action == "price-input":
|
||||||
|
price = str(float(decoded_post["price"][0])).replace(",", ".")
|
||||||
|
localtime = time.localtime()
|
||||||
|
|
||||||
|
with open(os.path.join(os.getcwd(), "config.json")) as config_file:
|
||||||
|
config_json = json.loads(config_file.read())
|
||||||
|
|
||||||
|
if config_json["bic"] != "" and config_json["name"] != "" and config_json["iban"] != "" and config_json["usecase"] != "":
|
||||||
|
qrcodedata = ("BCD\n002\n1\nSCT\n%s\n%s\n%s\nEUR%s\n%s\n%s\n%s %s.%s.%s %s:%s:%s" % (
|
||||||
|
config_json["bic"],
|
||||||
|
config_json["name"],
|
||||||
|
config_json["iban"],
|
||||||
|
price,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
config_json["usecase"],
|
||||||
|
localtime.tm_mday,
|
||||||
|
localtime.tm_mon,
|
||||||
|
localtime.tm_year,
|
||||||
|
localtime.tm_hour,
|
||||||
|
localtime.tm_min,
|
||||||
|
localtime.tm_sec
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
temp_io = BytesIO()
|
||||||
img = qrcode.make(qrcodedata)
|
img = qrcode.make(qrcodedata)
|
||||||
|
img.save(temp_io, format="PNG")
|
||||||
|
img_base64 = base64.b64encode(temp_io.getvalue())
|
||||||
|
|
||||||
qruuid=uuid.uuid4()
|
body = open(os.path.join(os.getcwd(), "root", "qrcode.html"), "rb").read()
|
||||||
img.save("%s.png"%(qruuid))
|
body = body.replace(b"{{ base64qrcode }}", img_base64)
|
||||||
os.system("clear")
|
else:
|
||||||
print ("%s.png"%(qruuid))
|
body = open(os.path.join(os.getcwd(), "root", "message.html"), "rb").read()
|
||||||
|
body = body.replace(b"{{ message }}", bytes("Keine Einstellungen hinterlegt.", "utf-8"))
|
||||||
|
|
||||||
|
elif action == "save-settings":
|
||||||
|
iban = decoded_post["iban"][0]
|
||||||
|
iban_failed = False
|
||||||
|
iban_checker = IBANCheck()
|
||||||
|
if iban_checker.check_validation_chars_iban(iban) == int(iban[2:4]):
|
||||||
|
if iban_checker.validate_iban(iban) == 1:
|
||||||
|
generate_config(decoded_post["name"][0], decoded_post["iban"][0], decoded_post["bic"][0], decoded_post["usecase"][0])
|
||||||
|
body = open(os.path.join(os.getcwd(), "root", "message.html"), "rb").read()
|
||||||
|
body = body.replace(b"{{ message }}", bytes("Einstellungen gespeichert.", "utf-8"))
|
||||||
|
else:
|
||||||
|
iban_failed = True
|
||||||
|
else:
|
||||||
|
iban_failed = True
|
||||||
|
|
||||||
|
if iban_failed:
|
||||||
|
body = open(os.path.join(os.getcwd(), "root", "message.html"), "rb").read()
|
||||||
|
body = body.replace(b"{{ message }}", bytes("IBAN ist ungültig.", "utf-8"))
|
||||||
|
|
||||||
|
else:
|
||||||
|
body = open(os.path.join(os.getcwd(), "root", "error.html"), "rb").read()
|
||||||
|
body = body.replace(b"{{ message }}", bytes("Ein Fehler ist aufgetreten.", "utf-8"))
|
||||||
|
|
||||||
|
body = body.replace(b"{{ path }}", bytes(self.path, "utf-8"))
|
||||||
|
self.send_response(200)
|
||||||
|
self.send_header('Content-type', 'text/html')
|
||||||
|
self.end_headers()
|
||||||
|
self.wfile.write(body)
|
||||||
|
|
||||||
|
|
||||||
|
class EPC:
|
||||||
|
def __init__(self, port=8000, listen="0.0.0.0"):
|
||||||
|
self.logger = logging.getLogger("webEPC.Webserver")
|
||||||
|
self.port = port
|
||||||
|
self.listen = listen
|
||||||
|
self.httpd = None
|
||||||
|
|
||||||
|
if not os.path.exists(os.path.join(os.getcwd(), "config.json")):
|
||||||
|
self.logger.info("Generating new config file...")
|
||||||
|
generate_config()
|
||||||
|
|
||||||
|
self.logger.info("Starting Webserver...")
|
||||||
|
self.logger.info("Port: %s" % str(self.port))
|
||||||
|
self.logger.info("Listen on: %s" % str(self.listen))
|
||||||
|
self.logger.info("Open: http://%s:%s" % ("localhost", str(self.port)))
|
||||||
|
|
||||||
|
self.handler = ServerHandler
|
||||||
|
|
||||||
|
self.httpd = http.server.HTTPServer((self.listen, self.port), self.handler)
|
||||||
|
self.httpd.serve_forever()
|
||||||
|
|
||||||
|
self.shutdown_thread = threading.Thread(target=self.shutdown_webserver_thread)
|
||||||
|
self.shutdown_thread.start()
|
||||||
|
|
||||||
|
def shutdown_webserver_thread(self):
|
||||||
|
while True:
|
||||||
|
time.sleep(0.1)
|
||||||
|
if not threading.main_thread().is_alive():
|
||||||
|
logging.getLogger("webEPC.Webserver").info("Shutting down Webserver...")
|
||||||
|
self.httpd.shutdown()
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
logger = logging.getLogger('webEPC')
|
||||||
|
logger.setLevel(logging.DEBUG)
|
||||||
|
logger.propagate = False
|
||||||
|
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
||||||
|
log_file_handler = logging.FileHandler('webEPC.log')
|
||||||
|
log_file_handler.setLevel(LOG_LEVEL_FILE)
|
||||||
|
log_file_handler.setFormatter(formatter)
|
||||||
|
logger.addHandler(log_file_handler)
|
||||||
|
log_stream_handler = logging.StreamHandler()
|
||||||
|
log_stream_handler.setLevel(LOG_LEVEL_SCREEN)
|
||||||
|
log_stream_handler.setFormatter(formatter)
|
||||||
|
logger.addHandler(log_stream_handler)
|
||||||
|
EPC(8083, "0.0.0.0")
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
qrcode
|
|
||||||
image
|
|
||||||
uuid
|
|
Loading…
x
Reference in New Issue
Block a user