Files
Hotel-Booking/Backend/venv/lib/python3.12/site-packages/safety/tool/auth.py
Iliyan Angelov 62c1fe5951 updates
2025-12-01 06:50:10 +02:00

69 lines
1.8 KiB
Python

import base64
import json
import typer
from urllib.parse import urlsplit, urlunsplit
from safety.tool.constants import (
NPMJS_PUBLIC_REPOSITORY_URL,
PYPI_PUBLIC_REPOSITORY_URL,
)
from typing import Optional, Literal
def index_credentials(ctx: typer.Context) -> str:
"""
Returns the index credentials for the current context.
This should be used together with user:index_credential for index
basic auth.
Args:
ctx (typer.Context): The context.
Returns:
str: The index credentials.
"""
api_key = None
token = None
if auth := getattr(ctx.obj, "auth", None):
client = auth.client
token = client.token.get("access_token") if client.token else None
api_key = client.api_key
auth_envelop = json.dumps(
{
"version": "1.0",
"access_token": token,
"api_key": api_key,
"project_id": ctx.obj.project.id if ctx.obj.project else None,
}
)
return base64.urlsafe_b64encode(auth_envelop.encode("utf-8")).decode("utf-8")
def build_index_url(
ctx: typer.Context, index_url: Optional[str], index_type: Literal["pypi", "npm"]
) -> str:
"""
Builds the index URL for the current context.
"""
if index_url is None:
# TODO: Make this to select the index based on auth org or project
index_url = {
"pypi": PYPI_PUBLIC_REPOSITORY_URL,
"npm": NPMJS_PUBLIC_REPOSITORY_URL,
}[index_type]
url = urlsplit(index_url)
encoded_auth = index_credentials(ctx)
netloc = f"user:{encoded_auth}@{url.netloc}"
if type(url.netloc) is bytes:
url = url._replace(netloc=netloc.encode("utf-8"))
elif type(url.netloc) is str:
url = url._replace(netloc=netloc)
return urlunsplit(url)