From 78410fe209a53df4f505902008494042a52ea018 Mon Sep 17 00:00:00 2001 From: Evan Niederwerfer Date: Sun, 19 Jan 2025 18:32:43 -0500 Subject: [PATCH] Add py files --- codelistener.py | 72 +++++++++++++++++++++++++++++++++++++++++++++++++ sendmail.py | 65 ++++++++++++++++++++++++++++++++++++++++++++ verification.py | 55 +++++++++++++++++++++++++++++++++++++ 3 files changed, 192 insertions(+) create mode 100644 codelistener.py create mode 100644 sendmail.py create mode 100644 verification.py diff --git a/codelistener.py b/codelistener.py new file mode 100644 index 0000000..1e9f58f --- /dev/null +++ b/codelistener.py @@ -0,0 +1,72 @@ +from http.server import BaseHTTPRequestHandler, HTTPServer +from socket import * +import requests +from sendmail import mail +from verification import otp + +class MyRequestHandler(BaseHTTPRequestHandler): + def do_GET(self): + self.send_response(200) + self.send_header("Content-type", "text/html") + if self.path == '/': + self.path = '/pages/index.html' + try: + file_to_open = open(self.path[1:]).read() + self.send_response(200) + except: + file_to_open = "File Not Found" + self.send_response(404) + self.end_headers() + self.wfile.write(bytes(file_to_open, 'utf-8')) + + def do_POST(self): + + # getting the content length from the header information and then rfile is the POST request, with content_length being the number of bytes it needs to grab (optional for if you want to grab less bytes for whatever reason) + content_length = int(self.headers['Content-Length']) + data_input = bytes.decode(self.rfile.read(content_length)) + + if (data_input.startswith("email=")): + data_str = str(data_input.replace('%40', '@')) + formatted = data_str.replace('email=', '') + mail.send(formatted, mail.gen_code(formatted)) + self.path = '/pages/otp.html' + try: + file_to_open = open(self.path[1:]).read() + self.send_response(200) + except: + file_to_open = "File Not Found" + self.send_response(404) + self.end_headers() + self.wfile.write(bytes(file_to_open, 'utf-8')) + if (data_input.startswith("verifEmail=")): + data_str = str(data_input.replace('%40', '@')) + + # get email + formatted_verifemail = data_str.replace('verifEmail=', '') + formatted_verifnums = formatted_verifemail.replace('&verifOtp=', '') + email = formatted_verifnums[:-4] + + #get otp code + otp_code = data_str[-4:] + + print(email) + print(otp) + if (otp.authenticate(email, otp_code)): + print("OK!") + else: + print("BAD!") + + + + + + +Handler = MyRequestHandler + + +hostName = "localhost" +serverPort = 8080 + +server = HTTPServer((hostName, serverPort), Handler) + +server.serve_forever() diff --git a/sendmail.py b/sendmail.py new file mode 100644 index 0000000..e37ba86 --- /dev/null +++ b/sendmail.py @@ -0,0 +1,65 @@ +import smtplib +from smtplib import * +from email.message import EmailMessage +from random import randrange +import sqlite3 +from datetime import datetime, timedelta +from verification import otp + +class mail: + + def __init__(self, email): + self.email = email + + def add_db(email, code): + conn = sqlite3.connect('otp.db') + cursor = conn.cursor() + + insert_email = "INSERT OR IGNORE INTO sessions (email) VALUES (?)" + insert_code = "UPDATE sessions SET code = ? WHERE email = ?" + insert_datedel = "UPDATE sessions SET datedel = ? WHERE email = ?" + + cursor.execute(insert_email, (email, )) + cursor.execute(insert_code, (code, email, )) + cursor.execute(insert_datedel, (datetime.now() + timedelta(minutes=5), email, )) + + + conn.commit() + conn.close() + return True + + def gen_code(email): + if (otp.check_code(email)): + code = randrange(1000, 9999) + mail.add_db(email, code) + return code + else: + print("Code already in progress!") + + def send(email, code): + try: + smtpObj = smtplib.SMTP_SSL('mail.__server__.com', 465) + + # Identify yourself to an ESMTP server using EHLO + smtpObj.ehlo() + + # Login to the server (if required) + smtpObj.login('username', 'passwd') + + # Send an email + msg = EmailMessage() + msg.set_content(f'You have requested a verification code. Your code is {code}. This code expires in 5 minutes.') + + msg['Subject'] = 'UWP Community Verification Code' + msg['From'] = "" + msg['To'] = email + + smtpObj.send_message(msg) + + # Quit the SMTP session + smtpObj.quit() + except SMTPResponseException as e: + print(e) + + + diff --git a/verification.py b/verification.py new file mode 100644 index 0000000..01a9280 --- /dev/null +++ b/verification.py @@ -0,0 +1,55 @@ +import sqlite3 +from datetime import datetime, timedelta + +class otp: + + def connection(): + try: + conn = sqlite3.connect('otp.db') + cursor = conn.cursor() + cursor.execute('''CREATE TABLE IF NOT EXISTS sessions (email text UNIQUE, code integer, datedel text)''') + conn.commit() + conn.close() + return True + except: + return False + + + def check_code(email): + if (otp.connection()): + exists = '''SELECT email FROM sessions WHERE email = ? LIMIT 1''' + conn = sqlite3.connect('otp.db') + cursor = conn.cursor() + cursor.execute(exists, (email, )) + result = cursor.fetchone() + if (result == None): + conn.close() + else: + past_sql = '''SELECT datedel FROM sessions WHERE email = ? LIMIT 1''' + cursor.execute(past_sql, (email, )) + fetch_past = cursor.fetchone() + past = fetch_past[0] + present = datetime.now() + if (str(present) > past): + del_sql = '''DELETE FROM sessions WHERE email = ?''' + cursor.execute(del_sql, (email, )) + conn.commit() + conn.close() + return False + return True + + def authenticate(email, user_otp): + if (otp.check_code(email)): + conn = sqlite3.connect('otp.db') + cursor = conn.cursor() + match_sql = '''SELECT code FROM sessions WHERE email = ? LIMIT 1''' + cursor.execute(match_sql, (email, )) + fetch_otp = cursor.fetchone() + print(fetch_otp[0]) + print(user_otp) + if (str(fetch_otp[0]) == str(user_otp)): + conn.close() + return True + else: + conn.close() + return False