Files
GIA/utilities/prosody/auth_django.py

88 lines
2.2 KiB
Python
Executable File

import argparse
import os
import sys
import django
LOG_PATH = os.environ.get("AUTH_DEBUG_LOG", "/tmp/auth_debug.log")
def log(data):
try:
with open(LOG_PATH, "a") as f:
f.write(f"{data}\n")
except Exception:
pass
# Set up Django environment
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") # Adjust if needed
django.setup()
from django.contrib.auth import authenticate # noqa: E402
from django.contrib.auth.models import User # noqa: E402
def check_credentials(username, password):
"""Authenticate user via Django"""
user = authenticate(username=username, password=password)
return user is not None and user.is_active
def _handle_line(line: str) -> str:
parts = line.split(":")
if len(parts) < 3:
return "0"
command, username, domain = parts[:3]
_ = domain
password = ":".join(parts[3:]) if len(parts) > 3 else None
if command == "auth":
return "1" if (password and check_credentials(username, password)) else "0"
if command == "isuser":
return "1" if User.objects.filter(username=username).exists() else "0"
if command == "setpass":
return "0"
return "0"
def _readline() -> tuple[str | None, bool]:
raw = sys.stdin.readline()
if raw == "":
return None, True
return raw.rstrip("\r\n"), False
def main(*, once: bool = False):
"""Process authentication requests from Prosody."""
while True:
try:
line, eof = _readline()
if eof:
break
if line is None:
break
if line == "":
if once:
print("0", flush=True)
return
continue
result = _handle_line(line)
print(result, flush=True)
if once:
return
except Exception as e:
log(f"Error: {str(e)}")
print("0", flush=True)
if once:
return
if __name__ == "__main__":
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("--once", action="store_true")
args, _unknown = parser.parse_known_args()
main(once=bool(args.once))