nfsn-send
9067dadd
 #!/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