#!/bin/bash # monkeysphere: MonkeySphere client tool # # The monkeysphere scripts are written by: # Jameson Rollins # # They are Copyright 2008, and are all released under the GPL, version 3 # or later. ######################################################################## PGRM=$(basename $0) SHARE=${MONKEYSPHERE_SHARE:-"/usr/share/monkeysphere"} export SHARE . "${SHARE}/common" || exit 1 # date in UTF format if needed DATE=$(date -u '+%FT%T') # unset some environment variables that could screw things up unset GREP_OPTIONS # default return code RETURN=0 # set the file creation mask to be only owner rw umask 077 ######################################################################## # FUNCTIONS ######################################################################## usage() { cat < [options] [args] MonkeySphere client tool. subcommands: update-known_hosts (k) [HOST]... update known_hosts file update-authorized_keys (a) update authorized_keys file gen-subkey (g) KEYID generate an 'a' capable subkey -l|--length BITS key length in bits (2048) -e|--expire EXPIRE date to expire help (h,?) this help EOF } # generate a subkey with the 'a' usage flags set # FIXME: this needs some tweaking to clean it up gen_subkey(){ local keyLength local keyExpire local keyID local gpgOut local userID # set default key parameter values keyLength= keyExpire= # get options TEMP=$(getopt -o l:e: -l length:,expire: -n "$PGRM" -- "$@") if [ $? != 0 ] ; then exit 1 fi # Note the quotes around `$TEMP': they are essential! eval set -- "$TEMP" while true ; do case "$1" in -l|--length) keyLength="$2" shift 2 ;; -e|--expire) keyExpire="$2" shift 2 ;; --) shift ;; *) break ;; esac done if [ -z "$1" ] ; then # find all secret keys keyID=$(gpg --with-colons --list-secret-keys | grep ^sec | cut -f5 -d:) # if multiple sec keys exist, fail if (( $(echo "$keyID" | wc -l) > 1 )) ; then echo "Multiple secret keys found:" echo "$keyID" failure "Please specify which primary key to use." fi else keyID="$1" fi if [ -z "$keyID" ] ; then failure "You have no secret key available. You should create an OpenPGP key before joining the monkeysphere. You can do this with: gpg --gen-key" fi # get key output, and fail if not found gpgOut=$(gpg --quiet --fixed-list-mode --list-secret-keys --with-colons \ "$keyID") || failure # fail if multiple sec lines are returned, which means the id # given is not unique if [ $(echo "$gpgOut" | grep '^sec:' | wc -l) -gt '1' ] ; then failure "Key ID '$keyID' is not unique." fi # prompt if an authentication subkey already exists if echo "$gpgOut" | egrep "^(sec|ssb):" | cut -d: -f 12 | grep -q a ; then echo "An authentication subkey already exists for key '$keyID'." read -p "Are you sure you would like to generate another one? (y/N) " OK; OK=${OK:N} if [ "${OK/y/Y}" != 'Y' ] ; then failure "aborting." fi fi # set subkey defaults # prompt about key expiration if not specified if [ -z "$keyExpire" ] ; then cat < = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years EOF while [ -z "$keyExpire" ] ; do read -p "Key is valid for? (0) " keyExpire if ! test_gpg_expire ${keyExpire:=0} ; then echo "invalid value" unset keyExpire fi done elif ! test_gpg_expire "$keyExpire" ; then failure "invalid key expiration value '$keyExpire'." fi # generate the list of commands that will be passed to edit-key editCommands=$(cat <