#!/bin/sh
set -euC
# nfsn-send METHOD REQUEST_URI [KEY VALUE]...
# nfsn-send "GET" "member/$member/sites"
# nfsn-send "POST" "dns/$domain/listRRs" \
# "name" "" \
# "type" "MX"
# Arguments.
method="$1" ; shift
request_uri="$1" ; shift
body=""
while [ "$#" -gt "0" ]
do
key="$1" ; shift
value="$1" ; shift
body="${body:-}${body:+"&"}$key=$(printf "%s" "$value" | jq -sRr '@uri')"
done
# Authentication.
login=""
api_key=""
for auth in "${NFSN_CREDENTIALS_PATH:-}" ".nfsn-api" "$HOME/.nfsn-api"
do
if [ -f "$auth" ]
then
login="$(jq -r '."login"' "$auth")"
api_key="$(jq -r '."api-key"' "$auth")"
break
fi
done
login="${NFSN_LOGIN:-"$login"}"
api_key="${NFSN_API_KEY:-"$api_key"}"
if [ -z "${login:-}" ] || [ -z "${api_key:-}" ]
then
>&2 printf "%s: %s\n" \
"$0" \
"Could not find authentication credentials."
exit 1
fi
# URL.
protocol="https"
host="api.nearlyfreespeech.net"
# protocol="http"
# host="localhost:8080"
# nc -l 8080 &
url="$protocol://$host/$request_uri"
# Data.
body_hash="$(
printf "%s" "$body" \
| sha1sum -b \
| cut -d ' ' -f 1
)"
timestamp="$(
date "+%s"
)"
salt="$(
< "/dev/urandom" \
tr -dc "a-zA-Z0-9" \
| head -c 16
)"
hash="$(
printf "%s" \
"$login;$timestamp;$salt;$api_key;$request_uri;$body_hash" \
| sha1sum -b \
| cut -d ' ' -f 1
)"
header="X-NFSN-Authentication: $login;$timestamp;$salt;$hash"
# Request.
response="$(
curl \
--silent \
--request "$method" \
--header "$header" \
--data-raw "$body" \
"$url"
)"
error="$(printf "%s\n" "$response" | jq -r '."error"?')"
debug="$(printf "%s\n" "$response" | jq -r '."debug"?')"
if [ -n "$error" ]
then
>&2 printf "%s" "$error"
if [ -n "$debug" ]
then
>&2 printf " %s" "$debug"
fi
>&2 printf "\n"
return 1
fi
if [ -n "$response" ]
then
printf "%s\n" "$response"
fi
|