65 lines
1.8 KiB
Python
65 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.'))
|