184 lines
5.7 KiB
Bash
Executable File
184 lines
5.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
NSIGNER_BIN="${NSIGNER_BIN:-./build/nsigner}"
|
|
socket_name=""
|
|
|
|
if [[ ! -x "$NSIGNER_BIN" ]]; then
|
|
echo "[error] nsigner binary not found or not executable at: $NSIGNER_BIN"
|
|
echo " Build it first with: make dev"
|
|
exit 1
|
|
fi
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
-n|--name|--socket-name)
|
|
if [[ $# -lt 2 ]]; then
|
|
echo "[error] missing value for $1"
|
|
exit 1
|
|
fi
|
|
socket_name="$2"
|
|
shift 2
|
|
;;
|
|
-h|--help)
|
|
echo "Usage: $0 [-n|--name|--socket-name <socket_name>]"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "[error] unknown argument: $1"
|
|
echo "Usage: $0 [-n|--name|--socket-name <socket_name>]"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
echo "n_signer interactive smoke test"
|
|
echo "Using binary: $NSIGNER_BIN"
|
|
echo
|
|
|
|
if [[ -z "$socket_name" ]]; then
|
|
default_socket=""
|
|
if [[ -r /proc/net/unix ]]; then
|
|
default_socket="$(awk '/@nsigner_/ {sub(/^@/, "", $8); print $8; exit}' /proc/net/unix || true)"
|
|
fi
|
|
|
|
if [[ -n "$default_socket" ]]; then
|
|
read -r -p "Signer socket name (without @) [${default_socket}]: " socket_name
|
|
socket_name="${socket_name:-$default_socket}"
|
|
else
|
|
read -r -p "Signer socket name (without @, e.g. nsigner_hairy_dog): " socket_name
|
|
fi
|
|
fi
|
|
|
|
if [[ -z "${socket_name}" ]]; then
|
|
echo "[error] socket name is required"
|
|
exit 1
|
|
fi
|
|
|
|
run_request() {
|
|
local req="$1"
|
|
"$NSIGNER_BIN" --socket-name "$socket_name" client "$req" || true
|
|
}
|
|
|
|
extract_result_string() {
|
|
sed -n 's/.*"result":"\([^"]*\)".*/\1/p'
|
|
}
|
|
|
|
echo
|
|
echo "[1/7] get_public_key"
|
|
req_get='{"id":"1","method":"get_public_key","params":[]}'
|
|
resp_get="$(run_request "$req_get")"
|
|
echo "request : $req_get"
|
|
echo "response: $resp_get"
|
|
pubkey="$(printf '%s' "$resp_get" | sed -n 's/.*"result":"\([0-9a-fA-F]\{64\}\)".*/\1/p')"
|
|
if [[ -n "$pubkey" ]]; then
|
|
echo "pubkey : $pubkey"
|
|
else
|
|
echo "[warn] could not parse pubkey from response"
|
|
fi
|
|
|
|
echo
|
|
echo "[2/7] nostr_sign_event"
|
|
now_ts="$(date +%s)"
|
|
event_json='{"kind":1,"content":"hello from tests/test.sh","tags":[],"created_at":__TS__}'
|
|
event_json="${event_json/__TS__/${now_ts}}"
|
|
escaped_event_json="${event_json//\"/\\\"}"
|
|
req_sign="{\"id\":\"2\",\"method\":\"nostr_sign_event\",\"params\":[\"${escaped_event_json}\",{\"role\":\"main\"}]}"
|
|
resp_sign="$(run_request "$req_sign")"
|
|
echo "request : $req_sign"
|
|
echo "response: $resp_sign"
|
|
if printf '%s' "$resp_sign" | grep -q '"result"'; then
|
|
echo "[ok] nostr_sign_event returned result"
|
|
else
|
|
echo "[warn] nostr_sign_event did not return result"
|
|
fi
|
|
|
|
echo
|
|
echo "[3/7] nostr_sign_event with nostr_index=0"
|
|
req_sign_idx="{\"id\":\"3\",\"method\":\"nostr_sign_event\",\"params\":[\"${escaped_event_json}\",{\"nostr_index\":0}]}"
|
|
resp_sign_idx="$(run_request "$req_sign_idx")"
|
|
echo "request : $req_sign_idx"
|
|
echo "response: $resp_sign_idx"
|
|
|
|
echo
|
|
echo "[4/7] role selector error case (unknown role)"
|
|
req_bad_role='{"id":"4","method":"nostr_nostr_sign_event","params":["{}",{"role":"does_not_exist"}]}'
|
|
resp_bad_role="$(run_request "$req_bad_role")"
|
|
echo "request : $req_bad_role"
|
|
echo "response: $resp_bad_role"
|
|
if printf '%s' "$resp_bad_role" | grep -q '"message":"unknown_role"'; then
|
|
echo "[ok] unknown role error name is unknown_role"
|
|
else
|
|
echo "[warn] unknown role error name mismatch"
|
|
fi
|
|
|
|
echo
|
|
echo "[5/7] NIP-04 self round-trip"
|
|
if [[ -n "$pubkey" ]]; then
|
|
req_nip04_enc="{\"id\":\"5\",\"method\":\"nostr_nostr_nip04_encrypt\",\"params\":[\"${pubkey}\",\"hello_nip04_from_test_sh\"]}"
|
|
resp_nip04_enc="$(run_request "$req_nip04_enc")"
|
|
echo "request : $req_nip04_enc"
|
|
echo "response: $resp_nip04_enc"
|
|
cipher_nip04="$(printf '%s' "$resp_nip04_enc" | extract_result_string)"
|
|
if [[ -n "$cipher_nip04" ]]; then
|
|
req_nip04_dec="{\"id\":\"6\",\"method\":\"nostr_nostr_nip04_decrypt\",\"params\":[\"${pubkey}\",\"${cipher_nip04}\"]}"
|
|
resp_nip04_dec="$(run_request "$req_nip04_dec")"
|
|
echo "request : $req_nip04_dec"
|
|
echo "response: $resp_nip04_dec"
|
|
if printf '%s' "$resp_nip04_dec" | grep -q '"result":"hello_nip04_from_test_sh"'; then
|
|
echo "[ok] nip04 decrypt recovered plaintext"
|
|
else
|
|
echo "[warn] nip04 decrypt did not recover expected plaintext"
|
|
fi
|
|
else
|
|
echo "[warn] could not parse nip04 ciphertext"
|
|
fi
|
|
else
|
|
echo "[warn] skipping nip04 test (missing pubkey)"
|
|
fi
|
|
|
|
echo
|
|
echo "[6/7] NIP-44 self round-trip"
|
|
if [[ -n "$pubkey" ]]; then
|
|
req_nip44_enc="{\"id\":\"7\",\"method\":\"nostr_nostr_nip44_encrypt\",\"params\":[\"${pubkey}\",\"hello_nip44_from_test_sh\"]}"
|
|
resp_nip44_enc="$(run_request "$req_nip44_enc")"
|
|
echo "request : $req_nip44_enc"
|
|
echo "response: $resp_nip44_enc"
|
|
cipher_nip44="$(printf '%s' "$resp_nip44_enc" | extract_result_string)"
|
|
if [[ -n "$cipher_nip44" ]]; then
|
|
req_nip44_dec="{\"id\":\"8\",\"method\":\"nostr_nostr_nip44_decrypt\",\"params\":[\"${pubkey}\",\"${cipher_nip44}\"]}"
|
|
resp_nip44_dec="$(run_request "$req_nip44_dec")"
|
|
echo "request : $req_nip44_dec"
|
|
echo "response: $resp_nip44_dec"
|
|
if printf '%s' "$resp_nip44_dec" | grep -q '"result":"hello_nip44_from_test_sh"'; then
|
|
echo "[ok] nip44 decrypt recovered plaintext"
|
|
else
|
|
echo "[warn] nip44 decrypt did not recover expected plaintext"
|
|
fi
|
|
else
|
|
echo "[warn] could not parse nip44 ciphertext"
|
|
fi
|
|
else
|
|
echo "[warn] skipping nip44 test (missing pubkey)"
|
|
fi
|
|
|
|
echo
|
|
echo "[7/7] list currently running signers"
|
|
list_resp="$($NSIGNER_BIN list 2>&1 || true)"
|
|
echo "$list_resp"
|
|
if printf '%s' "$list_resp" | grep -q '^@nsigner'; then
|
|
echo "[ok] signer list contains nsigner entries"
|
|
else
|
|
echo "[warn] no @nsigner entries found"
|
|
fi
|
|
|
|
echo
|
|
echo "[extra] mnemonic startup input tests"
|
|
if [[ -x ./build/test_mnemonic_input ]]; then
|
|
./build/test_mnemonic_input || true
|
|
else
|
|
echo "[warn] build/test_mnemonic_input not found (run: make test-mnemonic-input)"
|
|
fi
|
|
|
|
echo
|
|
echo "Smoke test complete." |