59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
from email.message import EmailMessage
|
|
from email.utils import formataddr
|
|
import smtplib
|
|
import os
|
|
import ssl
|
|
from dotenv import load_dotenv
|
|
from fastapi import Response, status
|
|
from sqlmodel import Session, select
|
|
from cutt.db import Player, TokenDB, engine
|
|
from cutt.security import set_password_token
|
|
|
|
P = Player
|
|
|
|
load_dotenv()
|
|
|
|
|
|
def generate_password_link(user: Player):
|
|
with Session(engine) as session:
|
|
token = set_password_token(user)
|
|
if token:
|
|
session.add(TokenDB(token=token))
|
|
session.commit()
|
|
return f"https://cutt.0124816.xyz/setpassword?token={token}"
|
|
|
|
|
|
def send_forgotten_password_link(email: str):
|
|
with Session(engine) as session:
|
|
user = session.exec(
|
|
select(P).where(P.email == email, P.disabled != True)
|
|
).one_or_none()
|
|
if user and user.email:
|
|
link = generate_password_link(user)
|
|
msg = EmailMessage()
|
|
msg["Subject"] = "CUTT - reset password"
|
|
msg["From"] = "CUTT - cool ultimate team tool <cutt@0124816.xyz>"
|
|
msg["To"] = formataddr((user.display_name, user.email))
|
|
msg.set_content(
|
|
f"Hello {user.display_name},\nclick on the following link to set yourself a new password.\n\n{link}\n\nCheers,\nJulius"
|
|
)
|
|
with open("cutt/forgotten_password.html") as f:
|
|
html_body = (
|
|
f.read().replace("USER", user.display_name).replace("LINK", link)
|
|
)
|
|
msg.add_alternative(html_body, subtype="html")
|
|
context = ssl.create_default_context()
|
|
with smtplib.SMTP(
|
|
host=os.environ["SMTP_HOST"],
|
|
port=int(os.environ["SMTP_PORT"]),
|
|
timeout=20,
|
|
) as server:
|
|
server.starttls(context=context)
|
|
server.login(os.environ["SMTP_USER"], os.environ["SMTP_PASS"])
|
|
server.send_message(msg)
|
|
|
|
return Response(
|
|
"a link will be sent to this email, if it belongs to an existing user.",
|
|
status_code=status.HTTP_200_OK,
|
|
)
|