mirror of
https://git.mills.io/saltyim/saltyim.git
synced 2024-07-08 11:01:20 +00:00
187 lines
3.5 KiB
Plaintext
187 lines
3.5 KiB
Plaintext
![]() |
#!/bin/sh
|
||
|
|
||
|
set -e
|
||
|
|
||
|
# Validate environment
|
||
|
if ! command -v msgbus > /dev/null; then
|
||
|
printf "missing msgbus command. Use: go install git.mills.io/prologic/msgbus/cmd/msgbus@master"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if ! command -v salty > /dev/null; then
|
||
|
printf "missing salty command. Use: go install go.mills.io/salty/cmd/salty@master"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if ! command -v salty-keygen > /dev/null; then
|
||
|
printf "missing salty-keygen command. Use: go install go.mills.io/salty/cmd/salty-keygen@master"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if [ -z "$SALTY_IDENTITY" ]; then
|
||
|
export SALTY_IDENTITY="$HOME/.config/salty/$USER.key"
|
||
|
fi
|
||
|
|
||
|
get_user () {
|
||
|
user=$(grep user: "$SALTY_IDENTITY" | awk '{print $3}')
|
||
|
if [ -z "$user" ]; then
|
||
|
user="$USER"
|
||
|
fi
|
||
|
echo "$user"
|
||
|
}
|
||
|
|
||
|
stream () {
|
||
|
if [ -z "$SALTY_IDENTITY" ]; then
|
||
|
echo "SALTY_IDENTITY not set"
|
||
|
return 2
|
||
|
fi
|
||
|
|
||
|
jq -r '.payload' | base64 -d | salty -i "$SALTY_IDENTITY" -d
|
||
|
}
|
||
|
|
||
|
lookup () {
|
||
|
if [ $# -lt 1 ]; then
|
||
|
printf "lookup takes 1 arugment %d given\n" "$#"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
user="$1"
|
||
|
nick="$(echo "$user" | awk -F@ '{ print $1 }')"
|
||
|
domain="$(echo "$user" | awk -F@ '{ print $2 }')"
|
||
|
|
||
|
curl -qsSL "https://$domain/.well-known/salty/${nick}.json"
|
||
|
}
|
||
|
|
||
|
readmsgs () {
|
||
|
topic="$1"
|
||
|
|
||
|
if [ -z "$topic" ]; then
|
||
|
topic=$(get_user)
|
||
|
fi
|
||
|
|
||
|
export SALTY_IDENTITY="$HOME/.config/salty/$topic.key"
|
||
|
if [ ! -f "$SALTY_IDENTITY" ]; then
|
||
|
echo "identity file missing for user $topic" >&2
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
msgbus sub "$topic" "$0"
|
||
|
}
|
||
|
|
||
|
sendmsg () {
|
||
|
if [ $# -lt 2 ]; then
|
||
|
printf "sendmsg requires 2 arguments %d provided" "$#"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
if [ -z "$SALTY_IDENTITY" ]; then
|
||
|
echo "SALTY_IDENTITY not set"
|
||
|
return 2
|
||
|
fi
|
||
|
|
||
|
user="$1"
|
||
|
message="$2"
|
||
|
|
||
|
salty_json="$(mktemp /tmp/salty.XXXXXX)"
|
||
|
|
||
|
lookup "$user" > "$salty_json"
|
||
|
|
||
|
endpoint="$(jq -r '.endpoint' < "$salty_json")"
|
||
|
topic="$(jq -r '.topic' < "$salty_json")"
|
||
|
key="$(jq -r '.key' < "$salty_json")"
|
||
|
|
||
|
rm "$salty_json"
|
||
|
|
||
|
message="[$(date +%FT%TZ)] <$(get_user)> $message"
|
||
|
|
||
|
echo "$message" \
|
||
|
| salty -i "$SALTY_IDENTITY" -r "$key" \
|
||
|
| msgbus -u "$endpoint" pub "$topic"
|
||
|
}
|
||
|
|
||
|
make_user () {
|
||
|
mkdir -p "$HOME/.config/salty"
|
||
|
|
||
|
if [ $# -lt 1 ]; then
|
||
|
user=$USER
|
||
|
else
|
||
|
user=$1
|
||
|
fi
|
||
|
|
||
|
identity_file="$HOME/.config/salty/$user.key"
|
||
|
|
||
|
if [ -f "$identity_file" ]; then
|
||
|
printf "user key already exists!"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
# Check for msgbus env.. probably can make it fallback to looking for a config file?
|
||
|
if [ -z "$MSGBUS_URI" ]; then
|
||
|
printf "missing MSGBUS_URI in environment"
|
||
|
return 1
|
||
|
fi
|
||
|
|
||
|
salty-keygen -o "$identity_file"
|
||
|
echo "# user: $user" >> "$identity_file"
|
||
|
|
||
|
pubkey=$(grep key: "$identity_file" | awk '{print $4}')
|
||
|
|
||
|
cat <<- EOF
|
||
|
Create this file in your webserver well-known folder. https://hostname.tld/.well-known/salty/$user.json
|
||
|
|
||
|
{
|
||
|
"endpoint": "$MSGBUS_URI",
|
||
|
"topic": "$user",
|
||
|
"key": "$pubkey"
|
||
|
}
|
||
|
|
||
|
EOF
|
||
|
}
|
||
|
|
||
|
show_help() {
|
||
|
printf "Usage: %s [options] <command> [arguments]\n" "$(basename "$0")"
|
||
|
printf "\n"
|
||
|
printf "Options:\n"
|
||
|
printf " -h/--help Show this help"
|
||
|
printf "\n"
|
||
|
printf "\n"
|
||
|
printf "Commands:\n"
|
||
|
printf " lookup nick@domain -- Lookup a user by nick@domain\n"
|
||
|
printf " read -- Reads your messages\n"
|
||
|
printf " send nick@domain message -- Sends a message to nick@domain\n"
|
||
|
}
|
||
|
|
||
|
# check if streaming
|
||
|
if [ ! -t 1 ]; then
|
||
|
stream
|
||
|
exit 0
|
||
|
fi
|
||
|
|
||
|
# Show Help
|
||
|
if [ $# -lt 1 ]; then
|
||
|
show_help
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
|
||
|
CMD=$1
|
||
|
shift
|
||
|
|
||
|
case $CMD in
|
||
|
-h|--help)
|
||
|
show_help
|
||
|
;;
|
||
|
send)
|
||
|
sendmsg "$@"
|
||
|
;;
|
||
|
read)
|
||
|
readmsgs "$@"
|
||
|
;;
|
||
|
lookup)
|
||
|
lookup "$@"
|
||
|
;;
|
||
|
make-user)
|
||
|
make_user "$@"
|
||
|
;;
|
||
|
esac
|