#!/bin/sh . ./config toot(){ curl -s -X POST -F in_reply_to_id=$reply -F status="$1" -F visibility='unlisted' -H "Authorization: Bearer $instance_token" https://$instance/api/v1/statuses } timeline_home(){ curl -s -H "Authorization: Bearer $instance_token" "https://$instance/api/v1/timelines/home?limit=40&max_id=$1" | jq -r '.[] | if .reblog then (["bump", .reblog.id, .reblog.account.acct] | join(" ")), .reblog.pleroma.content."text/plain", (.reblog.media_attachments[] | "attach", .url, .description // empty) else [.id, .account.acct], .pleroma.content."text/plain", (.media_attachments[] | "attach", .url, .description // empty) end | @text' } remote_ip=$SOCAT_PEERADDR die(){ rm access_granted/"$remote_ip" echo 'bye' pkill -P $PPID } mkdir -p -m 700 access_granted generator_session=$(zcat -f $system_dict | shuf -n 2 | tr -d "\n'") randpadding=$(head -c 8 /dev/urandom | base64) printf "$randpadding\t$generator_session\n" cat - | while read -r cmd mesg; do if [ "$cmd" = "reg" ]; then key=$(echo "$mesg" | cut -d' ' -f 2) session=$(echo "$mesg" | cut -d' ' -f 1) if [ "$session" = "$generator_session" ] && [ "$key" = "$pass_for_bbs" ]; then touch access_granted/"$remote_ip" echo hi $remote_ip else die break fi fi if [ ! -f access_granted/"$remote_ip" ]; then # Drop unregistred handshake die break fi # --- case $cmd in "post") toot "$mesg" | jq '.id, .errors' ;; "reply") reply_id=$(echo "$mesg" | cut -d' ' -f 1) status=$(echo "$mesg" | cut -d' ' -f 2-) reply=$reply_id toot "$status" | jq '.id, .errors' reply='' ;; "home") timeline_home "$mesg" ;; "reg") printf 'bbs > '; continue ;; "x") case $mesg in "http"*) w3m -dump -T text/html -cols 34 -o 'display_link_number=1' "$mesg" ;; *) echo 'only http(s)' ;; esac ;; *) die; break ;; esac printf 'bbs > ' done rm access_granted/"$remote_ip" echo 'session was close'