81 lines
2.7 KiB
Python
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)
|