1# /login/'s steps (sign in, join from an invite, add a passkey, signed in)2# are panels whose head strips are lowercase chrome naming the forge by its3# name, never its domain; ssh commands on the page show the real host, to4# copy. The passkey step names who it is for once, in its head strip.5. "$(dirname "$0")/../lib.sh"6user dami7export FORGE_BASE_URL=https://forge.test FORGE_SSH=git@forge.test8private_server9# heads file: the head strips of the page, one per line.10heads() { grep -o '<header class="panel-head">.*</header>' "$1" | sed 's/<[^>]*>//g'; }11http -s "$PRIV/login/" >"$T/page"12eq "$(heads "$T/page")" "sign in13join forge14add a passkey for you"15has "$T/page" '<section class="panel" id="invite-part" hidden><header class="panel-head"><h2>join forge</h2></header>'16has "$T/page" '<section class="panel" id="enroll-part" hidden><header class="panel-head"><h2>add a passkey for <b id="enroll-user">you</b></h2></header>'17has "$T/page" '<code>ssh git@forge\.test passkey</code>'18lacks "$T/page" 'For <b|on forge\.test'19heads "$T/page" | grep -q 'forge\.test' && fail "a heading names the domain"20heads "$T/page" | grep -q '[A-Z]' && fail "a heading has capitals"2122code=$(ssh_as dami passkey | sed -n 's/^ .*#enroll=//p')23ok node "$T_HOME/test/authenticator.ts" enroll "$PRIV" "$code" "$T/dami.key"24c=$(node "$T_HOME/test/authenticator.ts" login "$PRIV" "$T/dami.key")25http -s -H "Cookie: __Host-forge=$c" "$PRIV/login/" >"$T/in"26eq "$(heads "$T/in")" "signed in as dami"2728# Without sign-in set up, still a panel.29stop_servers30unset FORGE_BASE_URL31private_server32http -s "$PRIV/login/" >"$T/off"33eq "$(heads "$T/off")" "sign in"