Skip to content

ccproxy.auth.oauth.templates

ccproxy.auth.oauth.templates

Centralized HTML templates for OAuth responses.

OAuthProvider

Bases: Enum

OAuth provider types.

OAuthTemplates

Centralized HTML templates for OAuth responses.

This class provides consistent HTML responses across all OAuth providers, reducing code duplication and ensuring a uniform user experience.

success classmethod

success(provider=GENERIC, auto_close_seconds=3, **kwargs)

Generate success HTML response.

Parameters:

Name Type Description Default
provider OAuthProvider

OAuth provider name

GENERIC
auto_close_seconds int

Seconds before auto-closing window

3
**kwargs Any

Additional template variables

{}

Returns:

Type Description
HTMLResponse

HTML response for successful authentication

Source code in ccproxy/auth/oauth/templates.py
@classmethod
def success(
    cls,
    provider: OAuthProvider = OAuthProvider.GENERIC,
    auto_close_seconds: int = 3,
    **kwargs: Any,
) -> HTMLResponse:
    """Generate success HTML response.

    Args:
        provider: OAuth provider name
        auto_close_seconds: Seconds before auto-closing window
        **kwargs: Additional template variables

    Returns:
        HTML response for successful authentication
    """
    content = cls._SUCCESS_CONTENT.format(provider=provider.value, **kwargs)

    script = cls._AUTO_CLOSE_SCRIPT.format(
        seconds=auto_close_seconds, milliseconds=auto_close_seconds * 1000
    )

    html = cls._BASE_TEMPLATE.format(
        title="Authentication Successful",
        header_color="#10b981",
        content=content,
        script=script,
    )

    return HTMLResponse(content=html, status_code=200)

error classmethod

error(
    error_message,
    title="Authentication Failed",
    error_detail=None,
    status_code=400,
    auto_close_seconds=5,
    **kwargs,
)

Generate error HTML response.

Parameters:

Name Type Description Default
error_message str

Main error message to display

required
title str

Page and header title

'Authentication Failed'
error_detail str | None

Optional detailed error information

None
status_code int

HTTP status code

400
auto_close_seconds int

Seconds before auto-closing window

5
**kwargs Any

Additional template variables

{}

Returns:

Type Description
HTMLResponse

HTML response for failed authentication

Source code in ccproxy/auth/oauth/templates.py
@classmethod
def error(
    cls,
    error_message: str,
    title: str = "Authentication Failed",
    error_detail: str | None = None,
    status_code: int = 400,
    auto_close_seconds: int = 5,
    **kwargs: Any,
) -> HTMLResponse:
    """Generate error HTML response.

    Args:
        error_message: Main error message to display
        title: Page and header title
        error_detail: Optional detailed error information
        status_code: HTTP status code
        auto_close_seconds: Seconds before auto-closing window
        **kwargs: Additional template variables

    Returns:
        HTML response for failed authentication
    """
    error_detail_html = ""
    if error_detail:
        # Sanitize error detail to prevent XSS
        safe_detail = cls._sanitize_html(error_detail)
        error_detail_html = f'<div class="error-detail">{safe_detail}</div>'

    content = cls._ERROR_CONTENT.format(
        title=title,
        message=error_message,
        error_detail=error_detail_html,
        **kwargs,
    )

    script = cls._AUTO_CLOSE_SCRIPT.format(
        seconds=auto_close_seconds, milliseconds=auto_close_seconds * 1000
    )

    html = cls._BASE_TEMPLATE.format(
        title=title, header_color="#ef4444", content=content, script=script
    )

    return HTMLResponse(content=html, status_code=status_code)

callback_error classmethod

callback_error(
    error=None,
    error_description=None,
    provider=GENERIC,
    **kwargs,
)

Generate error response for OAuth callback errors.

Parameters:

Name Type Description Default
error str | None

OAuth error code

None
error_description str | None

OAuth error description

None
provider OAuthProvider

OAuth provider name

GENERIC
**kwargs Any

Additional template variables

{}

Returns:

Type Description
HTMLResponse

HTML response for callback errors

Source code in ccproxy/auth/oauth/templates.py
@classmethod
def callback_error(
    cls,
    error: str | None = None,
    error_description: str | None = None,
    provider: OAuthProvider = OAuthProvider.GENERIC,
    **kwargs: Any,
) -> HTMLResponse:
    """Generate error response for OAuth callback errors.

    Args:
        error: OAuth error code
        error_description: OAuth error description
        provider: OAuth provider name
        **kwargs: Additional template variables

    Returns:
        HTML response for callback errors
    """
    if error == "access_denied":
        return cls.error(
            error_message=f"You denied access to {provider.value}.",
            title="Access Denied",
            error_detail=error_description,
            **kwargs,
        )
    elif error == "invalid_request":
        return cls.error(
            error_message="The authentication request was invalid.",
            title="Invalid Request",
            error_detail=error_description
            or "The OAuth request parameters were incorrect.",
            **kwargs,
        )
    elif error == "unauthorized_client":
        return cls.error(
            error_message="This application is not authorized.",
            title="Unauthorized Application",
            error_detail=error_description
            or "The client is not authorized to use this grant type.",
            **kwargs,
        )
    elif error == "unsupported_response_type":
        return cls.error(
            error_message="The authorization server does not support this response type.",
            title="Unsupported Response Type",
            error_detail=error_description,
            **kwargs,
        )
    elif error == "invalid_scope":
        return cls.error(
            error_message="The requested scope is invalid or unknown.",
            title="Invalid Scope",
            error_detail=error_description,
            **kwargs,
        )
    elif error == "server_error":
        return cls.error(
            error_message=f"The {provider.value} server encountered an error.",
            title="Server Error",
            error_detail=error_description or "Please try again later.",
            status_code=500,
            **kwargs,
        )
    elif error == "temporarily_unavailable":
        return cls.error(
            error_message=f"The {provider.value} service is temporarily unavailable.",
            title="Service Unavailable",
            error_detail=error_description or "Please try again later.",
            status_code=503,
            **kwargs,
        )
    else:
        # Generic error
        return cls.error(
            error_message=error_description
            or error
            or "An unknown error occurred.",
            title="Authentication Error",
            error_detail=f"Error code: {error}" if error else None,
            **kwargs,
        )