Stabilize auth flow and profile images

This commit is contained in:
Codex
2026-07-20 13:38:39 +09:00
parent 57caca8dc8
commit 5d3eee7a16
128 changed files with 28860 additions and 1468 deletions
+248
View File
@@ -0,0 +1,248 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
FLUTTER_DOCKER_SCRIPT="$ROOT_DIR/scripts/flutter-docker.sh"
HOST_ADB_SCRIPT="${TDC114_HOST_ADB_SCRIPT:-$ROOT_DIR/scripts/host-adb.sh}"
LOCAL_ENV_FILE="${TDC114_SMOKE_ENV_FILE:-$ROOT_DIR/scripts/.env.android-device.local}"
if [ -f "$LOCAL_ENV_FILE" ]; then
# shellcheck disable=SC1090
source "$LOCAL_ENV_FILE"
fi
ADB_SOCKET="${ADB_SERVER_SOCKET:-}"
DEVICE_ID="${TDC114_FLUTTER_DEVICE_ID:-}"
API_BASE="${TDC114_API_BASE:-}"
AUTH_API_BASE="${TDC114_AUTH_API_BASE:-}"
REVERSE_PORT="${TDC114_ANDROID_REVERSE_PORT:-5000}"
AUTH_REVERSE_PORT="${TDC114_AUTH_ANDROID_REVERSE_PORT:-5001}"
is_reverse_mode() {
[ "$API_BASE" = "http://127.0.0.1:${REVERSE_PORT}" ]
}
is_auth_reverse_mode() {
[ "$AUTH_API_BASE" = "http://127.0.0.1:${AUTH_REVERSE_PORT}" ]
}
print_header() {
echo "[android-device-preflight]"
if [ -n "$ADB_SOCKET" ]; then
echo "ADB server socket: $ADB_SOCKET"
else
echo "ADB server socket: default container adb server"
fi
if [ -n "$DEVICE_ID" ]; then
echo "Target device id: $DEVICE_ID"
else
echo "Target device id: first physical device in adb devices"
fi
if [ -n "$API_BASE" ]; then
echo "TDC114_API_BASE: $API_BASE"
if is_reverse_mode; then
echo "Connection mode: local adb-reverse"
else
echo "Connection mode: direct HTTPS/LAN"
fi
fi
if [ -n "$AUTH_API_BASE" ]; then
echo "TDC114_AUTH_API_BASE: $AUTH_API_BASE"
if is_auth_reverse_mode; then
echo "Auth connection mode: local adb-reverse"
else
echo "Auth connection mode: direct HTTPS/LAN"
fi
fi
echo
}
fail_with_help() {
local reason="$1"
print_header
echo "FAIL $reason"
echo
echo "Windows-side checklist:"
echo "1. Connect the Android phone by USB."
echo "2. Enable Developer options > USB debugging."
echo "3. Accept the RSA debugging prompt on the phone."
echo "4. In Windows PowerShell, run adb.exe devices and confirm the phone is device."
echo "5. If using local API through adb reverse, run adb reverse tcp:${REVERSE_PORT} tcp:${REVERSE_PORT} from the same ADB server path."
if is_auth_reverse_mode; then
echo " Also run adb reverse tcp:${AUTH_REVERSE_PORT} tcp:${AUTH_REVERSE_PORT} for the local auth server."
fi
echo "6. If using direct staging/production HTTPS mode, confirm TDC114_API_BASE points to the public app API host."
if [ -n "$ADB_SOCKET" ]; then
echo "7. If WSL reports connection refused to ${ADB_SOCKET}, recreate the Windows 5037 portproxy and firewall rule first."
fi
echo
echo "Recommended WSL command:"
echo " ADB_SERVER_SOCKET=tcp:<WINDOWS_HOST_IP>:5037 \\"
echo " TDC114_FLUTTER_DEVICE_ID=<PHYSICAL_DEVICE_ID> \\"
echo " TDC114_SMOKE_ENV_FILE=scripts/.env.android-device.local \\"
echo " ./scripts/manual-postlogin-run.sh"
}
fail_with_adb_help() {
local reason="$1"
print_header
echo "FAIL $reason"
echo
echo "WSL host-adb checklist:"
echo "1. Confirm $HOST_ADB_SCRIPT exists and is executable."
echo "2. If host adb is missing, run ./scripts/install-host-adb-from-docker.sh once."
echo "3. Confirm ADB_SERVER_SOCKET points to the Windows ADB server, usually tcp:172.21.128.1:5037."
echo "4. After host adb access recovers, rerun this script."
echo
echo "Recommended WSL command:"
echo " ADB_SERVER_SOCKET=tcp:172.21.128.1:5037 ./scripts/host-adb.sh devices"
}
if [ ! -x "$HOST_ADB_SCRIPT" ]; then
echo "Missing executable script: $HOST_ADB_SCRIPT" >&2
exit 1
fi
if [[ "$DEVICE_ID" == emulator-* ]]; then
fail_with_help "TDC114_FLUTTER_DEVICE_ID points to an emulator, not a physical Android device."
exit 1
fi
env_args=()
if [ -n "$ADB_SOCKET" ]; then
env_args+=("ADB_SERVER_SOCKET=$ADB_SOCKET")
fi
set +e
if [ "${#env_args[@]}" -gt 0 ]; then
OUTPUT="$(env "${env_args[@]}" "$HOST_ADB_SCRIPT" devices 2>&1)"
else
OUTPUT="$("$HOST_ADB_SCRIPT" devices 2>&1)"
fi
STATUS=$?
set -e
if [ "$STATUS" -ne 0 ]; then
if printf '%s\n' "$OUTPUT" | grep -Fq "Host adb is not available"; then
fail_with_adb_help "Host adb is not ready."
printf '%s\n' "$OUTPUT"
exit "$STATUS"
fi
fail_with_help "ADB devices command failed."
if printf '%s\n' "$OUTPUT" | grep -Fq "Connection refused"; then
echo
echo "Hint: Windows ADB itself may be alive, but WSL shared access to port 5037 is blocked."
echo "Rebuild portproxy: 0.0.0.0:5037 -> 127.0.0.1:5037, then retry."
fi
if printf '%s\n' "$OUTPUT" | grep -Fq "protocol fault (couldn't read status)"; then
echo
echo "Hint: Windows port 5037 may be owned by portproxy before adb.exe starts."
echo "In Windows Administrator PowerShell: delete the 5037 portproxy, start adb.exe, confirm adb.exe devices, then recreate the portproxy."
fi
if printf '%s\n' "$OUTPUT" | grep -Fq "failed to read response from server"; then
echo
echo "Hint: Windows adb.exe may be talking to a stale or non-ADB listener on port 5037."
echo "In Windows Administrator PowerShell: inspect netstat -ano | findstr 5037 before restarting adb.exe."
fi
printf '%s\n' "$OUTPUT"
exit "$STATUS"
fi
if [ -n "$DEVICE_ID" ]; then
DEVICE_PATTERN="^${DEVICE_ID}[[:space:]]+device$"
OFFLINE_PATTERN="^${DEVICE_ID}[[:space:]]+offline$"
UNAUTHORIZED_PATTERN="^${DEVICE_ID}[[:space:]]+unauthorized$"
else
DEVICE_PATTERN="^[[:alnum:]_.:-]+[[:space:]]+device$"
OFFLINE_PATTERN="^[[:alnum:]_.:-]+[[:space:]]+offline$"
UNAUTHORIZED_PATTERN="^[[:alnum:]_.:-]+[[:space:]]+unauthorized$"
fi
if [ -z "$DEVICE_ID" ]; then
DETECTED_UNAUTHORIZED_ID="$(printf '%s\n' "$OUTPUT" | awk '$2 == "unauthorized" && $1 !~ /^emulator-/ {print $1; exit}')"
if [ -n "$DETECTED_UNAUTHORIZED_ID" ]; then
fail_with_help "Physical Android device is unauthorized."
printf '%s\n' "$OUTPUT"
exit 1
fi
DETECTED_OFFLINE_ID="$(printf '%s\n' "$OUTPUT" | awk '$2 == "offline" && $1 !~ /^emulator-/ {print $1; exit}')"
if [ -n "$DETECTED_OFFLINE_ID" ]; then
fail_with_help "Physical Android device is offline."
printf '%s\n' "$OUTPUT"
exit 1
fi
DETECTED_DEVICE_ID="$(printf '%s\n' "$OUTPUT" | awk '$2 == "device" && $1 !~ /^emulator-/ {print $1; exit}')"
if [ -z "$DETECTED_DEVICE_ID" ]; then
fail_with_help "No usable physical Android device was detected."
printf '%s\n' "$OUTPUT"
exit 1
fi
DEVICE_ID="$DETECTED_DEVICE_ID"
else
if printf '%s\n' "$OUTPUT" | grep -Eq "$UNAUTHORIZED_PATTERN"; then
fail_with_help "Physical Android device is unauthorized."
printf '%s\n' "$OUTPUT"
exit 1
fi
if printf '%s\n' "$OUTPUT" | grep -Eq "$OFFLINE_PATTERN"; then
fail_with_help "Physical Android device is offline."
printf '%s\n' "$OUTPUT"
exit 1
fi
if ! printf '%s\n' "$OUTPUT" | grep -Eq "$DEVICE_PATTERN"; then
fail_with_help "No usable physical Android device was detected."
printf '%s\n' "$OUTPUT"
exit 1
fi
fi
if [ -z "$DEVICE_ID" ]; then
fail_with_help "No usable physical Android device was detected."
printf '%s\n' "$OUTPUT"
exit 1
fi
if is_reverse_mode || is_auth_reverse_mode; then
reverse_args=("adb")
if [ -n "$DEVICE_ID" ]; then
reverse_args+=("-s" "$DEVICE_ID")
fi
reverse_args+=("reverse" "--list")
set +e
if [ "${#env_args[@]}" -gt 0 ]; then
REVERSE_OUTPUT="$(env "${env_args[@]}" "$HOST_ADB_SCRIPT" "${reverse_args[@]:1}" 2>&1)"
else
REVERSE_OUTPUT="$("$HOST_ADB_SCRIPT" "${reverse_args[@]:1}" 2>&1)"
fi
REVERSE_STATUS=$?
set -e
if [ "$REVERSE_STATUS" -ne 0 ]; then
fail_with_help "adb reverse tcp:${REVERSE_PORT} tcp:${REVERSE_PORT} is not active."
printf '%s\n' "$OUTPUT"
printf '%s\n' "$REVERSE_OUTPUT"
exit 1
fi
if is_reverse_mode && ! printf '%s\n' "$REVERSE_OUTPUT" | grep -Fq "tcp:${REVERSE_PORT} tcp:${REVERSE_PORT}"; then
fail_with_help "adb reverse tcp:${REVERSE_PORT} tcp:${REVERSE_PORT} is not active."
printf '%s\n' "$OUTPUT"
printf '%s\n' "$REVERSE_OUTPUT"
exit 1
fi
if is_auth_reverse_mode && ! printf '%s\n' "$REVERSE_OUTPUT" | grep -Fq "tcp:${AUTH_REVERSE_PORT} tcp:${AUTH_REVERSE_PORT}"; then
fail_with_help "adb reverse tcp:${AUTH_REVERSE_PORT} tcp:${AUTH_REVERSE_PORT} is not active."
printf '%s\n' "$OUTPUT"
printf '%s\n' "$REVERSE_OUTPUT"
exit 1
fi
fi
print_header
echo "PASS Physical Android device is ready for Docker/WSL Flutter checks."
printf '%s\n' "$OUTPUT"