diff --git a/shared/common.sh b/shared/common.sh index c270a6a7..f7551e82 100644 --- a/shared/common.sh +++ b/shared/common.sh @@ -83,8 +83,8 @@ safe_read() { nc_listen() { local port=$1 shift - # Detect if nc requires -p flag (busybox nc on Termux) - if nc --help 2>&1 | grep -q "BusyBox\|busybox" || nc --help 2>&1 | grep -q "\-p "; then + # BusyBox nc (Termux) requires -p flag; macOS/Linux do not + if nc --help 2>&1 | grep -q "BusyBox\|busybox"; then nc -l -p "$port" "$@" else nc -l "$port" "$@" @@ -229,37 +229,29 @@ get_openrouter_api_key_manual() { echo "$api_key" } -# Generate OAuth success response HTML -create_oauth_response_html() { - cat << 'HTML_EOF' -HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n

Authentication Successful!

Redirecting back to terminal...

This tab will close automatically

-HTML_EOF +# Write OAuth success response HTTP file (uses printf for macOS bash 3.x compat) +write_oauth_response_file() { + local dest="$1" + printf 'HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: close\r\n\r\n

Authentication Successful!

You can close this tab

' > "$dest" } # Start OAuth callback server in background, returns server PID +# $1=port $2=code_file $3=response_file (must already exist) start_oauth_server() { local port="$1" local code_file="$2" - local success_response=$(create_oauth_response_html) + local response_file="$3" ( while true; do - local response_file=$(mktemp) - echo -e "$success_response" > "$response_file" + request=$(nc_listen "$port" < "$response_file" 2>/dev/null | head -1) || break - local request=$(nc_listen "$port" < "$response_file" 2>/dev/null | head -1) - local nc_status=$? - rm -f "$response_file" - - if [[ $nc_status -ne 0 ]]; then - break - fi - - if [[ "$request" == *"/callback?code="* ]]; then - local code=$(echo "$request" | sed -n 's/.*code=\([^ &]*\).*/\1/p') - echo "$code" > "$code_file" - break - fi + case "$request" in + *"/callback?code="*) + echo "$request" | sed -n 's/.*code=\([^ &]*\).*/\1/p' > "$code_file" + break + ;; + esac done ) /dev/null; then @@ -648,7 +642,7 @@ generic_cloud_api() { sleep "$jitter" interval="$next_interval" - ((attempt++)) + attempt=$((attempt + 1)) continue fi @@ -678,7 +672,7 @@ generic_cloud_api() { sleep "$jitter" interval="$next_interval" - ((attempt++)) + attempt=$((attempt + 1)) continue fi @@ -769,7 +763,7 @@ generic_ssh_wait() { elapsed_time=$((elapsed_time + jitter)) interval="$next_interval" - ((attempt++)) + attempt=$((attempt + 1)) done log_error "$description failed after $max_attempts attempts (${elapsed_time}s elapsed)"