Source code for intranet.apps.auth.helpers
import logging
import re
from typing import Dict
import pexpect
from django.conf import settings
from django.utils import timezone
logger = logging.getLogger(__name__)
[docs]def change_password(form_data):
if form_data:
form_data["username"] = re.sub(r"\W", "", form_data["username"])
if (
form_data
and form_data["username"] == "unknown"
or form_data["old_password"] is None
or form_data["new_password"] is None
or form_data["new_password_confirm"] is None
):
return {"unable_to_set": True}
if form_data["new_password"] != form_data["new_password_confirm"]:
return {"unable_to_set": True, "password_match": False}
realm = settings.CSL_REALM
errors = []
try:
kinit = pexpect.spawnu("/usr/bin/kpasswd {}@{}".format(form_data["username"], realm), timeout=settings.KINIT_TIMEOUT)
match = kinit.expect([":", pexpect.EOF])
if match == 1:
return {"unable_to_set": True, "error": "User {} does not exist.".format(form_data["username"])}
kinit.sendline(form_data["old_password"])
kinit.expect([":", pexpect.EOF])
if match == 1:
return {"unable_to_set": True, "error": "Old password was incorrect."}
kinit.sendline(form_data["new_password"])
kinit.expect([":", pexpect.EOF])
if match == 1:
return {"unable_to_set": True}
kinit.sendline(form_data["new_password_confirm"])
kinit.expect(pexpect.EOF)
kinit.close()
exitstatus = kinit.exitstatus
except pexpect.TIMEOUT:
return {"unable_to_set": True, "errors": errors}
if exitstatus == 0:
return {"unable_to_set": False}
return {"unable_to_set": True}
[docs]def get_login_theme_name() -> str:
"""Get the name of the currently active login theme (e.g. "snow" or "piday").
Returns:
The name of the currently active login theme.
"""
today = timezone.localdate()
if today.month == 12 or today.month == 1:
# Snow
return "snow"
elif today.month == 3 and (14 <= today.day <= 16):
return "piday"
elif (today.month == 10 and 30 <= today.day <= 31) or (today.month == 11 and today.day == 1):
return "halloween"
return None
LOGIN_THEMES = {
"snow": {"js": "themes/snow/snow.js", "css": "themes/snow/snow.css"},
"piday": {"js": "themes/piday/piday.js", "css": "themes/piday/piday.css"},
"halloween": {"js": "themes/halloween/halloween.js", "css": "themes/halloween/halloween.css"},
}
[docs]def get_login_theme() -> Dict[str, Dict[str, str]]:
"""Load a custom login theme (e.g. snow)"""
return LOGIN_THEMES.get(get_login_theme_name(), {})