Add openpgpg2pem.
[monkeysphere.git] / src / monkeysphere
index 36ecf9335b7b5732ad2e4cf266e112bd3ea9f117..cf7752adac72385cb58c8dc370b2dbda63269ac7 100755 (executable)
@@ -3,7 +3,7 @@
 # monkeysphere: Monkeysphere client tool
 #
 # The monkeysphere scripts are written by:
-# Jameson Rollins <jrollins@fifthhorseman.net>
+# Jameson Rollins <jrollins@finestructure.net>
 # Jamie McClelland <jm@mayfirst.org>
 # Daniel Kahn Gillmor <dkg@fifthhorseman.net>
 # Micah Anderson <micah@riseup.net>
@@ -16,7 +16,7 @@ set -e
 
 PGRM=$(basename $0)
 
-SYSSHAREDIR=${MONKEYSPHERE_SYSSHAREDIR:-"/usr/share/monkeysphere"}
+SYSSHAREDIR=${MONKEYSPHERE_SYSSHAREDIR:-"__SYSSHAREDIR_PREFIX__/share/monkeysphere"}
 export SYSSHAREDIR
 . "${SYSSHAREDIR}/defaultenv"
 . "${SYSSHAREDIR}/common"
@@ -48,9 +48,9 @@ subcommands:
  ssh-proxycommand HOST [PORT]        monkeysphere ssh ProxyCommand
    --no-connect                        do not make TCP connection to host
  subkey-to-ssh-agent (s)             store authentication subkey in ssh-agent
- sshfpr (f) KEYID                    output ssh fingerprint of gpg key
 
- keys-from-userid (u) USERID         output valid keys for user id literal
+ keys-for-userid (u) USERID          output valid ssh keys for given user id
+ sshfprs-for-userid USERID           output ssh fingerprints for given user id
  gen-subkey (g) [KEYID]              generate an authentication subkey
    --length (-l) BITS                  key length in bits (2048)
 
@@ -62,24 +62,13 @@ EOF
 
 # user gpg command to define common options
 gpg_user() {
-    gpg --no-greeting --quiet --no-tty "$@"
+    LC_ALL=C gpg --fixed-list-mode --no-greeting --quiet --no-tty "$@"
 }
 
 # output the ssh fingerprint of a gpg key
 gpg_ssh_fingerprint() {
     keyid="$1"
-    local tmpfile=$(mktemp)
-
-    # trap to remove tmp file if break
-    trap "rm -f $tmpfile" EXIT
-
-    # use temporary file, since ssh-keygen won't accept keys on stdin
-    gpg_user --export "$keyid" | openpgp2ssh "$keyid" >"$tmpfile"
-    ssh-keygen -l -f "$tmpfile" | awk '{ print $1, $2, $4 }'
-
-    # remove the tmp file
-    trap - EXIT
-    rm -rf "$tmpfile"
+    gpg_user --export "$keyid" --no-armor | "$SYSSHAREDIR/keytrans" openpgp2sshfpr "$keyid"
 }
 
 # take a secret key ID and check that only zero or one ID is provided,
@@ -89,10 +78,10 @@ check_gpg_sec_key_id() {
 
     case "$#" in
        0)
-           gpgSecOut=$(gpg_user --fixed-list-mode --list-secret-keys --with-colons 2>/dev/null | egrep '^sec:')
+           gpgSecOut=$(gpg_user --list-secret-keys --with-colons 2>/dev/null | egrep '^sec:')
            ;;
        1)
-           gpgSecOut=$(gpg_user --fixed-list-mode --list-secret-keys --with-colons "$1" | egrep '^sec:') || failure
+           gpgSecOut=$(gpg_user --list-secret-keys --with-colons "$1" | egrep '^sec:') || failure
            ;;
        *)
            failure "You must specify only a single primary key ID."
@@ -130,7 +119,7 @@ check_gpg_authentication_subkey() {
 
     # check that a valid authentication key does not already exist
     IFS=$'\n'
-    for line in $(gpg_user --fixed-list-mode --list-keys --with-colons "$keyID") ; do
+    for line in $(gpg_user --list-keys --with-colons "$keyID") ; do
        type=$(echo "$line" | cut -d: -f1)
        validity=$(echo "$line" | cut -d: -f2)
        usage=$(echo "$line" | cut -d: -f12)
@@ -146,7 +135,7 @@ check_gpg_authentication_subkey() {
        # if authentication key is valid, prompt to continue
        if [ "$validity" = 'u' ] ; then
            echo "A valid authentication key already exists for primary key '$keyID'." 1>&2
-           if [ "$PROMPT" = "true" ] ; then
+           if [ "$PROMPT" != "false" ] ; then
                printf "Are you sure you would like to generate another one? (y/N) " >&2
                read OK; OK=${OK:N}
                if [ "${OK/y/Y}" != 'Y' ] ; then
@@ -167,7 +156,7 @@ check_gpg_authentication_subkey() {
 # set unset default variables
 GNUPGHOME=${GNUPGHOME:="${HOME}/.gnupg"}
 KNOWN_HOSTS="${HOME}/.ssh/known_hosts"
-HASH_KNOWN_HOSTS="true"
+HASH_KNOWN_HOSTS="false"
 AUTHORIZED_KEYS="${HOME}/.ssh/authorized_keys"
 
 # unset the check keyserver variable, since that needs to have
@@ -217,9 +206,13 @@ mkdir -p -m 0700 "$GNUPGHOME"
 export LOG_LEVEL
 export LOG_PREFIX
 
+if [ "$#" -eq 0 ] ; then 
+    usage
+    failure "Please supply a subcommand."
+fi
+
 # get subcommand
 COMMAND="$1"
-[ "$COMMAND" ] || (usage; exit 1)
 shift
 
 case $COMMAND in
@@ -227,6 +220,8 @@ case $COMMAND in
        # whether or not to check keyservers
        CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=${CHECK_KEYSERVER:="true"}}
 
+       source "${MSHAREDIR}/update_known_hosts"
+
        # if hosts are specified on the command line, process just
        # those hosts
        if [ "$1" ] ; then
@@ -242,12 +237,11 @@ case $COMMAND in
     'update-authorized_keys'|'update-authorized-keys'|'a')
        # whether or not to check keyservers
        CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=${CHECK_KEYSERVER:="true"}}
-
-       # process authorized_user_ids file
-       process_authorized_user_ids "$AUTHORIZED_USER_IDS"
+       source "${MSHAREDIR}/update_authorized_keys"
+       update_authorized_keys
        ;;
 
-    'import-subkey'|'i')
+    'import-subkey'|'import'|'i')
        source "${MSHAREDIR}/import_subkey"
        import_subkey "$@"
        ;;
@@ -267,12 +261,28 @@ case $COMMAND in
        subkey_to_ssh_agent "$@"
        ;;
 
-    'sshfpr'|'f')
+    'sshfpr')
+       echo "Warning: 'sshfpr' is deprecated.  Please use 'sshfprs-for-userid' instead." >&2
        gpg_ssh_fingerprint "$@"
        ;;
 
-    'keys-from-userid'|'u')
-       keys_from_userid "$@"
+    'keys-for-userid'|'u')
+       CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=${CHECK_KEYSERVER:="true"}}
+       source "${MSHAREDIR}/keys_for_userid"
+       keys_for_userid "$@"
+       ;;
+
+    'sshfprs-for-userid')
+       CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=${CHECK_KEYSERVER:="true"}}
+       source "${MSHAREDIR}/keys_for_userid"
+       keys_for_userid "$@" | "$SYSSHAREDIR/keytrans" sshfpr
+       ;;
+
+    'keys-from-userid')
+       echo "Warning: 'keys-from-userid' is deprecated.  Please use 'keys-for-userid' instead." >&2
+       CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=${CHECK_KEYSERVER:="true"}}
+       source "${MSHAREDIR}/keys_for_userid"
+       keys_for_userid "$@"
        ;;
 
     'version'|'--version'|'v')
@@ -285,6 +295,6 @@ case $COMMAND in
 
     *)
         failure "Unknown command: '$COMMAND'
-Type '$PGRM help' for usage."
+Try '$PGRM help' for usage."
         ;;
 esac