* reset-password: rotate the admin credential in place instead of deleting auth.db * reset-password: fix the CI callers and error handling for the in-place rotation * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * reset-password: narrow the CI change to the jobs that read .bootstrap_password * reset-password: stop over-claiming what the reset revokes and when it takes effect * auth: bind token issuance to the credential version that was verified * auth: bind credential-creating writes to the version the request authenticated with * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * auth: bind the change-password and workflow-key writes to their own credential version * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * auth: read the credential version inside the transaction that validated it * data-recipe: answer 401 when a reset revokes the credential mid job start * Fix lint blocker and Windows path assertion for PR #7573 Drop the now-unused validate_api_key import from studio/backend/auth/authentication.py. Every call site moved to validate_api_key_with_credential, so the Source lint job's import-hoist gate flagged it as a blocker. The wrapper itself stays in storage.py; test_api_key_expiry.py still exercises it. Make test_run_reexec_forwards_resolved_frontend_on_public_launch compare against str(Path(...)) instead of a POSIX literal. _find_frontend_dist returns a Path, so on Windows the forwarded value is \fake\studio\frontend\dist and the assertion could never pass there. Pre-existing, surfaced by running unsloth_cli/tests on Windows. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Daniel Han <danielhanchen@gmail.com>
70 lines
1.9 KiB
Bash
Executable file
70 lines
1.9 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# Copyright 2026-present the Unsloth AI Inc. team. All rights reserved.
|
|
|
|
set -euo pipefail
|
|
|
|
port="${1:?usage: $0 PORT BROWSER [CHANNEL]}"
|
|
browser="${2:?usage: $0 PORT BROWSER [CHANNEL]}"
|
|
channel="${3:-}"
|
|
slug="$browser${channel:+-$channel}"
|
|
artifact_dir="logs/playwright-permissions-$slug"
|
|
server_log="logs/studio-permissions-$slug.log"
|
|
studio_home="${UNSLOTH_STUDIO_HOME:-$HOME/.unsloth/studio}"
|
|
set --
|
|
if [ -n "${STUDIO_PERMISSION_FRONTEND:-}" ]; then
|
|
set -- -f "$STUDIO_PERMISSION_FRONTEND"
|
|
fi
|
|
|
|
mkdir -p "$artifact_dir"
|
|
# Wipe (not reset-password): the boot below must re-seed a fresh .bootstrap_password.
|
|
rm -rf "$studio_home/auth"
|
|
UNSLOTH_API_ONLY=1 unsloth studio -H 127.0.0.1 -p "$port" "$@" \
|
|
>"$server_log" 2>&1 &
|
|
studio_pid=$!
|
|
|
|
cleanup() {
|
|
kill "$studio_pid" 2>/dev/null || true
|
|
wait "$studio_pid" 2>/dev/null || true
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
healthy=0
|
|
for _ in $(seq 1 180); do
|
|
if curl -fs "http://127.0.0.1:$port/api/health" >/dev/null; then
|
|
healthy=1
|
|
break
|
|
fi
|
|
if ! kill -0 "$studio_pid" 2>/dev/null; then
|
|
tail -100 "$server_log" || true
|
|
exit 1
|
|
fi
|
|
sleep 1
|
|
done
|
|
if [ "$healthy" -ne 1 ]; then
|
|
tail -100 "$server_log" || true
|
|
exit 1
|
|
fi
|
|
|
|
old_password=$(cat "$studio_home/auth/.bootstrap_password")
|
|
new_password="CIPerm-$(python -c 'import secrets; print(secrets.token_urlsafe(16))')"
|
|
if [ "${GITHUB_ACTIONS:-}" = "true" ]; then
|
|
echo "::add-mask::$old_password"
|
|
echo "::add-mask::$new_password"
|
|
fi
|
|
|
|
export BASE_URL="http://127.0.0.1:$port"
|
|
export STUDIO_OLD_PW="$old_password"
|
|
export STUDIO_NEW_PW="$new_password"
|
|
export STUDIO_UI_STRICT=1
|
|
export STUDIO_UI_PERMISSION_ONLY=1
|
|
export STUDIO_UI_WALL_TIMEOUT_S=240
|
|
export STUDIO_PLAYWRIGHT_BROWSER="$browser"
|
|
export PW_ART_DIR="$artifact_dir"
|
|
if [ -n "$channel" ]; then
|
|
export STUDIO_PLAYWRIGHT_CHANNEL="$channel"
|
|
else
|
|
unset STUDIO_PLAYWRIGHT_CHANNEL || true
|
|
fi
|
|
|
|
python tests/studio/playwright_chat_ui.py
|