ФУНКЦИИ - МЕЖПРОЕКТНАЯ КОММУНИКАЦИЯ: self-service workspace invite approval
This commit is contained in:
@@ -17,6 +17,10 @@ from django.views import View
|
||||
from plane.authentication.utils.host import base_host
|
||||
from plane.authentication.utils.login import user_login
|
||||
from plane.authentication.utils.redirection_path import get_redirection_path
|
||||
from plane.authentication.nodedc_workspace_join import (
|
||||
NodeDCWorkspaceInviteJoinError,
|
||||
accept_nodedc_workspace_invite_request_for_user,
|
||||
)
|
||||
from plane.authentication.views.nodedc_logout import get_nodedc_internal_token
|
||||
from plane.db.models import ExternalIdentityLink, Profile, User
|
||||
from plane.utils.path_validator import get_safe_redirect_url, validate_next_path
|
||||
@@ -24,6 +28,7 @@ from plane.utils.path_validator import get_safe_redirect_url, validate_next_path
|
||||
|
||||
OIDC_SESSION_KEY = "nodedc_oidc"
|
||||
OIDC_PROVIDER = "authentik"
|
||||
NODEDC_WORKSPACE_INVITE_ACCEPT_PREFIX = "/auth/nodedc/workspace-invite/accept/"
|
||||
DEFAULT_REQUIRED_GROUPS = "nodedc:superadmin,nodedc:taskmanager:admin,nodedc:taskmanager:user"
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -161,10 +166,45 @@ class NodeDCHandoffEndpoint(View):
|
||||
|
||||
user_login(request=request, user=user, is_app=True)
|
||||
|
||||
workspace_invite_redirect = resolve_nodedc_workspace_invite_accept_redirect(base_url, next_path, user)
|
||||
if workspace_invite_redirect is not None:
|
||||
return workspace_invite_redirect
|
||||
|
||||
path = next_path or get_redirection_path(user=user)
|
||||
return HttpResponseRedirect(get_safe_redirect_url(base_url=base_url, next_path=path, params={}))
|
||||
|
||||
|
||||
def resolve_nodedc_workspace_invite_accept_redirect(base_url, next_path, user):
|
||||
if not next_path.startswith(NODEDC_WORKSPACE_INVITE_ACCEPT_PREFIX):
|
||||
return None
|
||||
|
||||
request_id = next_path.removeprefix(NODEDC_WORKSPACE_INVITE_ACCEPT_PREFIX).strip("/")
|
||||
|
||||
try:
|
||||
result = accept_nodedc_workspace_invite_request_for_user(request_id, user)
|
||||
except NodeDCWorkspaceInviteJoinError as error:
|
||||
logger.warning(
|
||||
"NODEDC managed workspace invite accept failed: code=%s user_id=%s request_id=%s",
|
||||
error.code,
|
||||
user.id,
|
||||
request_id,
|
||||
)
|
||||
return oidc_error_redirect(base_url, "", error.code)
|
||||
except Exception:
|
||||
logger.exception(
|
||||
"NODEDC managed workspace invite accept crashed: user_id=%s request_id=%s",
|
||||
user.id,
|
||||
request_id,
|
||||
)
|
||||
return oidc_error_redirect(base_url, "", "workspace_invite_accept_failed")
|
||||
|
||||
workspace_slug = result.get("workspaceSlug")
|
||||
if not workspace_slug:
|
||||
return oidc_error_redirect(base_url, "", "workspace_invite_redirect_missing")
|
||||
|
||||
return HttpResponseRedirect(f"{base_url.rstrip('/')}/{workspace_slug}/")
|
||||
|
||||
|
||||
def get_oidc_config():
|
||||
issuer = os.environ.get("PLANE_OIDC_ISSUER", "").strip()
|
||||
client_id = os.environ.get("PLANE_OIDC_CLIENT_ID", "").strip()
|
||||
|
||||
Reference in New Issue
Block a user