Add py files

This commit is contained in:
Evan Niederwerfer 2025-01-19 18:32:43 -05:00
commit 78410fe209
3 changed files with 192 additions and 0 deletions

72
codelistener.py Normal file
View File

@ -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()

65
sendmail.py Normal file
View File

@ -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)

55
verification.py Normal file
View File

@ -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