This repository has been archived on 2026-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
RepApp/repapp/one_time_login/api.py

64 lines
1.8 KiB
Python

import os
import datetime
import random
import logging
from hashlib import sha256
from django.conf import settings
from django.contrib import messages
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _
from .models import OneTimeLogin
logger = logging.getLogger(__name__)
def create_one_time_login(user, url) -> str:
"""
create_one_time_login creates a one time login object for guest user logins.
"""
secret = sha256(
f'{user.email}{url}{datetime.datetime.now()}{random.randint(0,9999999)}'.encode(
'utf-8')
).hexdigest()
secret_hash = sha256(secret.encode('utf-8')).hexdigest()
otl = OneTimeLogin(
secret=secret_hash,
user=user,
url=url,
)
otl.save()
return secret
def send_one_time_login_mail(secret, mail, request):
"""
Send a mail with a one time login link.
"""
url = request.build_absolute_uri(
f'/onetimelogin/{secret}/')
subject = render_to_string('one_time_login/mail_subject.txt', {
'organization': settings.ORGANIZATION,
}).replace('\n', '')
html = render_to_string('one_time_login/mail_content.html', {
'link': url,
'organization': settings.ORGANIZATION,
})
text = render_to_string('one_time_login/mail_content.html', {
'link': url,
'organization': settings.ORGANIZATION,
})
send_ok = send_mail(
subject=subject,
message=text,
from_email=os.getenv("DJANGO_SENDER_ADDRESS", ""),
recipient_list=[mail],
fail_silently=True,
html_message=html
)
if send_ok > 0:
messages.add_message(request, messages.INFO, _(
'A new login link was sent by mail.'))