X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=src%2Fmonkeysphere;h=da5f406165469e942654c5865a99f66ea80cc3d6;hb=98dbe4834e52014acd968b96b9ad5f7dce9aa1af;hp=f959a386f56b82ef0f1e51079ff31bd0ae78a862;hpb=df0e87db1b2f8a8c762d1a1f9ce3c7cd22845b46;p=monkeysphere.git diff --git a/src/monkeysphere b/src/monkeysphere index f959a38..da5f406 100755 --- a/src/monkeysphere +++ b/src/monkeysphere @@ -1,21 +1,27 @@ -#!/bin/bash +#!/usr/bin/env bash -# monkeysphere: MonkeySphere client tool +# monkeysphere: Monkeysphere client tool # # The monkeysphere scripts are written by: # Jameson Rollins +# Jamie McClelland +# Daniel Kahn Gillmor +# Micah Anderson # -# They are Copyright 2008, and are all released under the GPL, version 3 +# They are Copyright 2008-2009, 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 +SYSSHAREDIR=${MONKEYSPHERE_SYSSHAREDIR:-"/usr/share/monkeysphere"} +export SYSSHAREDIR +. "${SYSSHAREDIR}/common" || exit 1 -# date in UTF format if needed +# sharedir for host functions +MSHAREDIR="${SYSSHAREDIR}/m" + +# UTC date in ISO 8601 format if needed DATE=$(date -u '+%FT%T') # unset some environment variables that could screw things up @@ -32,151 +38,27 @@ umask 077 ######################################################################## usage() { - cat <&2 usage: $PGRM [options] [args] -MonkeySphere client tool. +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 + import-subkey (i) import existing ssh key as gpg subkey + --keyfile (-f) FILE key file to import + --expire (-e) EXPIRE date to expire + gen-subkey (g) [KEYID] generate an authentication subkey --length (-l) BITS key length in bits (2048) --expire (-e) EXPIRE date to expire + ssh-proxycommand monkeysphere ssh ProxyCommand + subkey-to-ssh-agent (s) store authentication subkey in ssh-agent + version (v) show version number help (h,?) this help EOF } -# generate a subkey with the 'a' usage flags set -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 </dev/null; then - ssh-askpass "Please enter your passphrase for $keyID: " > "$fifoDir/pass" - else - read -s -p "Please enter your passphrase for $keyID: " PASS - echo "$PASS" > "$fifoDir/pass" - fi - rm -rf "$fifoDir" - wait - log "done." -} - ######################################################################## # MAIN ######################################################################## @@ -189,10 +71,10 @@ unset HASH_KNOWN_HOSTS unset AUTHORIZED_KEYS # load global config -[ -r "${ETC}/monkeysphere.conf" ] && . "${ETC}/monkeysphere.conf" +[ -r "${SYSCONFIGDIR}/monkeysphere.conf" ] && . "${SYSCONFIGDIR}/monkeysphere.conf" # set monkeysphere home directory -MONKEYSPHERE_HOME=${MONKEYSPHERE_HOME:="${HOME}/.config/monkeysphere"} +MONKEYSPHERE_HOME=${MONKEYSPHERE_HOME:="${HOME}/.monkeysphere"} mkdir -p -m 0700 "$MONKEYSPHERE_HOME" # load local config @@ -200,6 +82,7 @@ mkdir -p -m 0700 "$MONKEYSPHERE_HOME" # set empty config variables with ones from the environment, or from # config file, or with defaults +LOG_LEVEL=${MONKEYSPHERE_LOG_LEVEL:=${LOG_LEVEL:="INFO"}} GNUPGHOME=${MONKEYSPHERE_GNUPGHOME:=${GNUPGHOME:="${HOME}/.gnupg"}} KEYSERVER=${MONKEYSPHERE_KEYSERVER:="$KEYSERVER"} # if keyserver not specified in env or monkeysphere.conf, @@ -225,6 +108,7 @@ REQUIRED_USER_KEY_CAPABILITY=${MONKEYSPHERE_REQUIRED_USER_KEY_CAPABILITY:="a"} # permissions export GNUPGHOME mkdir -p -m 0700 "$GNUPGHOME" +export LOG_LEVEL # get subcommand COMMAND="$1" @@ -235,10 +119,12 @@ case $COMMAND in 'update-known_hosts'|'update-known-hosts'|'k') MODE='known_hosts' + # touch the known_hosts file so that the file permission check + # below won't fail upon not finding the file + (umask 0022 && touch "$KNOWN_HOSTS") + # check permissions on the known_hosts file path - if ! check_key_file_permissions "$USER" "$KNOWN_HOSTS" ; then - failure "Improper permissions on known_hosts file path." - fi + check_key_file_permissions "$USER" "$KNOWN_HOSTS" || failure # if hosts are specified on the command line, process just # those hosts @@ -251,7 +137,7 @@ case $COMMAND in else # exit if the known_hosts file does not exist if [ ! -e "$KNOWN_HOSTS" ] ; then - log "known_hosts file '$KNOWN_HOSTS' does not exist." + log error "known_hosts file '$KNOWN_HOSTS' does not exist." exit fi @@ -264,18 +150,14 @@ case $COMMAND in MODE='authorized_keys' # check permissions on the authorized_user_ids file path - if ! check_key_file_permissions "$USER" "$AUTHORIZED_USER_IDS" ; then - failure "Improper permissions on authorized_user_ids file path." - fi + check_key_file_permissions "$USER" "$AUTHORIZED_USER_IDS" || failure # check permissions on the authorized_keys file path - if ! check_key_file_permissions "$USER" "$AUTHORIZED_KEYS" ; then - failure "Improper permissions on authorized_keys file path." - fi + check_key_file_permissions "$USER" "$AUTHORIZED_KEYS" || failure # exit if the authorized_user_ids file is empty if [ ! -e "$AUTHORIZED_USER_IDS" ] ; then - log "authorized_user_ids file '$AUTHORIZED_USER_IDS' does not exist." + log error "authorized_user_ids file '$AUTHORIZED_USER_IDS' does not exist." exit fi @@ -284,11 +166,31 @@ case $COMMAND in RETURN="$?" ;; + 'import-subkey'|'i') + source "${MSHAREDIR}/import_subkey" + import_subkey "$@" + ;; + 'gen-subkey'|'g') + source "${MSHAREDIR}/gen_subkey" gen_subkey "$@" ;; - 'help'|'h'|'?') + 'ssh-proxycommand'|'p') + source "${MSHAREDIR}/ssh_proxycommand" + ssh_proxycommand "$@" + ;; + + 'subkey-to-ssh-agent'|'s') + source "${MSHAREDIR}/subkey_to_ssh_agent" + subkey_to_ssh_agent "$@" + ;; + + 'version'|'v') + echo "$VERSION" + ;; + + '--help'|'help'|'-h'|'h'|'?') usage ;;