NODEDC_TASKMANAGER/plane-src/apps/api/plane/authentication/views/nodedc_logout.py

81 lines
2.7 KiB
Python

import os
from django.contrib.auth import logout
from django.conf import settings
from django.http import HttpResponse, HttpResponseRedirect
from django.utils import timezone
from django.views import View
from plane.authentication.utils.host import user_ip
from plane.db.models import User
def get_nodedc_global_logout_url():
value = os.environ.get("PLANE_NODEDC_GLOBAL_LOGOUT_URL", "").strip()
return value or None
def get_logout_redirect_url(default_url):
return get_nodedc_global_logout_url() or default_url
def logout_current_user(request):
if request.user and request.user.is_authenticated:
try:
user = User.objects.get(pk=request.user.id)
user.last_logout_ip = user_ip(request=request)
user.last_logout_time = timezone.now()
user.save()
except Exception:
pass
logout(request)
def clear_nodedc_auth_cookies(response, request=None):
cookie_names = (
getattr(settings, "SESSION_COOKIE_NAME", "session-id"),
getattr(settings, "CSRF_COOKIE_NAME", "csrftoken"),
getattr(settings, "ADMIN_SESSION_COOKIE_NAME", "admin-session-id"),
"sessionid",
"session-id",
"csrftoken",
)
domain = getattr(settings, "SESSION_COOKIE_DOMAIN", None) or getattr(settings, "CSRF_COOKIE_DOMAIN", None)
if request is not None:
host = request.get_host().split(":", 1)[0].lower()
for suffix in (".local.nodedc", ".local.notdc", ".notdc.ru", ".nodedc.ru"):
if host.endswith(suffix):
domain = domain or suffix
break
for cookie_name in filter(None, cookie_names):
response.delete_cookie(cookie_name, path="/")
if domain:
session_cookie_name = getattr(settings, "SESSION_COOKIE_NAME", "session-id")
response["Set-Cookie"] = (
f'{session_cookie_name}=""; Domain={domain}; expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/'
)
response["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0"
response["Clear-Site-Data"] = '"cookies", "storage"'
response["Pragma"] = "no-cache"
return response
class NodeDCFrontChannelLogoutEndpoint(View):
def get(self, request):
logout_current_user(request)
response = HttpResponse(
"<!doctype html><html><head><meta charset='utf-8'></head><body>NODE.DC Task session closed.</body></html>",
content_type="text/html",
)
return clear_nodedc_auth_cookies(response, request)
def post(self, request):
logout_current_user(request)
response = HttpResponseRedirect(get_logout_redirect_url("/"))
return clear_nodedc_auth_cookies(response, request)