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( "NODE.DC Task session closed.", 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)