blob: 28d08a110dab331aafb1d786aa2c1c832a841f2a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#!/usr/bin/env bash
set -euo pipefail
CLIENT_ID="Ov23li8tweQw6odWQebz"
ENV_FILE="$(cd "$(dirname "$0")/.." && pwd)/.env.dispatch"
# Parse form-encoded key=value pairs
parse() {
local key="$1" data="$2"
local val
val=$(echo "$data" | sed -n "s/.*${key}=\([^&]*\).*/\1/p")
python3 -c "import sys,urllib.parse; print(urllib.parse.unquote(sys.stdin.read().strip()))" <<< "$val"
}
echo "=== GitHub Copilot OAuth ==="
echo ""
# Step 1: Request device code
echo "Requesting device code..."
RESP=$(curl -s https://github.com/login/device/code \
-d "client_id=$CLIENT_ID" \
-d "scope=read:user")
DEVICE_CODE=$(parse "device_code" "$RESP")
if [ -z "$DEVICE_CODE" ]; then
echo "Failed to get device code: $RESP"
exit 1
fi
USER_CODE=$(parse "user_code" "$RESP")
VERIF_URI=$(parse "verification_uri" "$RESP")
INTERVAL=$(parse "interval" "$RESP")
INTERVAL=${INTERVAL:-5}
echo ""
echo "Open this URL and enter the code:"
echo " $VERIF_URI"
echo " Code: $USER_CODE"
echo ""
echo "Waiting for you to authorize..."
# Step 2: Poll for access token
TOKEN=""
ATTEMPTS=0
while [ -z "$TOKEN" ] && [ $ATTEMPTS -lt 60 ]; do
sleep "$INTERVAL"
ATTEMPTS=$((ATTEMPTS + 1))
TOKEN_RESP=$(curl -s https://github.com/login/oauth/access_token \
-d "client_id=$CLIENT_ID" \
-d "device_code=$DEVICE_CODE" \
-d "grant_type=urn:ietf:params:oauth:grant-type:device_code")
TOKEN=$(parse "access_token" "$TOKEN_RESP" || true)
ERROR=$(parse "error" "$TOKEN_RESP" || true)
if [ "$ERROR" = "authorization_pending" ]; then
continue
elif [ "$ERROR" = "slow_down" ]; then
INTERVAL=$((INTERVAL + 5))
continue
elif [ -n "$ERROR" ]; then
echo "Error: $ERROR"
exit 1
fi
done
if [ -z "$TOKEN" ]; then
echo "Timed out waiting for authorization."
exit 1
fi
# Step 3: Write to .env.dispatch
mkdir -p "$(dirname "$ENV_FILE")"
if [ -f "$ENV_FILE" ] && grep -q "^COPILOT_TOKEN=" "$ENV_FILE" 2>/dev/null; then
sed -i "s/^COPILOT_TOKEN=.*/COPILOT_TOKEN=$TOKEN/" "$ENV_FILE"
else
echo "COPILOT_TOKEN=$TOKEN" >> "$ENV_FILE"
fi
echo ""
echo "Token saved to .env.dispatch"
echo "Ready — run: docker compose up"
|