Merge commit 'jrollins/master'
[monkeysphere.git] / src / share / m / ssh_proxycommand
index 7239c7ad9d98a13fff4b84a59cda4cb77bd7c037..bd095889e528f61b0a75a503fcb5a12ba7942c57 100644 (file)
@@ -1,7 +1,7 @@
 # -*-shell-script-*-
 # This should be sourced by bash (though we welcome changes to make it POSIX sh compliant)
 
-# monkeysphere-ssh-proxycommand: MonkeySphere ssh ProxyCommand hook
+# Monkeysphere ssh-proxycommand subcommand
 #
 # The monkeysphere scripts are written by:
 # Jameson Rollins <jrollins@finestructure.net>
@@ -13,9 +13,7 @@
 # This is meant to be run as an ssh ProxyCommand to initiate a
 # monkeysphere known_hosts update before an ssh connection to host is
 # established.  Can be added to ~/.ssh/config as follows:
-#  ProxyCommand monkeysphere-ssh-proxycommand %h %p
-
-ssh_proxycommand() {
+#  ProxyCommand monkeysphere ssh-proxycommand %h %p
 
 # "marginal case" ouput in the case that there is not a full
 # validation path to the host
@@ -34,8 +32,10 @@ output_no_valid_key() {
 
     userID="ssh://${HOSTP}"
 
-    log "-------------------- Monkeysphere warning -------------------"
-    log "Monkeysphere found OpenPGP keys for this hostname, but none had full validity."
+    cat <<EOF | log info
+-------------------- Monkeysphere warning -------------------
+Monkeysphere found OpenPGP keys for this hostname, but none had full validity.
+EOF
 
     # retrieve the actual ssh key
     sshKeyOffered=$(ssh-keyscan -t rsa -p "$PORT" "$HOST" 2>/dev/null | awk '{ print $2, $3 }')
@@ -43,7 +43,7 @@ output_no_valid_key() {
     # found?
 
     # get the gpg info for userid
-    gpgOut=$(gpg --list-key --fixed-list-mode --with-colon \
+    gpgOut=$(gpg_user --list-key --fixed-list-mode --with-colon \
        --with-fingerprint --with-fingerprint \
        ="$userID" 2>/dev/null)
 
@@ -59,17 +59,19 @@ output_no_valid_key() {
                # if one of keys found matches the one offered by the
                # host, then output info
                if [ "$sshKeyGPG" = "$sshKeyOffered" ] ; then
-                   log "An OpenPGP key matching the ssh key offered by the host was found:"
-                   log
+                   cat <<EOF | log info
+An OpenPGP key matching the ssh key offered by the host was found:
 
-                   # do some crazy "Here Strings" redirection to get the key to
-                   # ssh-keygen, since it doesn't read from stdin cleanly
-                   sshFingerprint=$(ssh-keygen -l -f /dev/stdin \
-                       <<<$(echo "$sshKeyGPG") | \
+EOF
+
+                   sshKeyGPGFile=$(msmktempfile)
+                   printf "%s" "$sshKeyGPG" >"$sshKeyGPGFile"
+                   sshFingerprint=$(ssh-keygen -l -f "$sshKeyGPGFile" | \
                        awk '{ print $2 }')
+                   rm -f "$sshKeyGPGFile"
 
                    # get the sigs for the matching key
-                   gpgSigOut=$(gpg --check-sigs \
+                   gpgSigOut=$(gpg_user --check-sigs \
                        --list-options show-uid-validity \
                        "$keyid")
 
@@ -82,18 +84,23 @@ if (match($0,"^uid")) { ok=0; }
 if (match($0,"^uid.*'$userID'$")) { ok=1; print; }
 if (ok) { if (match($0,"^sig")) { print; } }
 }
-' >&2
-                   log
+' | log info
+                   echo | log info
 
                    # output the other user IDs for reference
                    if (echo "$gpgSigOut" | grep "^uid" | grep -v -q "$userID") ; then
-                       log "Other user IDs on this key:"
-                       echo "$gpgSigOut" | grep "^uid" | grep -v "$userID" >&2
-                       log
+                       cat <<EOF | log info
+Other user IDs on this key:
+
+EOF
+                       echo "$gpgSigOut" | grep "^uid" | grep -v "$userID" | log info
+                       echo | log info
                    fi
 
                    # output ssh fingerprint
-                   log "RSA key fingerprint is ${sshFingerprint}."
+                   cat <<EOF | log info
+RSA key fingerprint is ${sshFingerprint}.
+EOF
 
                    # this whole process is in a "while read"
                    # subshell.  the only way to get information out
@@ -110,22 +117,26 @@ if (ok) { if (match($0,"^sig")) { print; } }
     # if no key match was made (and the "while read" subshell returned
     # 1) output how many keys were found
     if (($? != 1)) ; then
-       log "None of the found keys matched the key offered by the host."
-       log "Run the following command for more info about the found keys:"
-       log "gpg --check-sigs --list-options show-uid-validity =${userID}"
+       cat <<EOF | log info
+None of the found keys matched the key offered by the host.
+Run the following command for more info about the found keys:
+gpg --check-sigs --list-options show-uid-validity =${userID}
+EOF
+
        # FIXME: should we do anything extra here if the retrieved
        # host key is actually in the known_hosts file and the ssh
        # connection will succeed?  Should the user be warned?
        # prompted?
     fi
 
-    log "-------------------- ssh continues below --------------------"
+    cat <<EOF | log info
+-------------------- ssh continues below --------------------
+EOF
 }
 
-########################################################################
 
-# export the monkeysphere log level
-export MONKEYSPHERE_LOG_LEVEL
+# the ssh proxycommand function itself
+ssh_proxycommand() {
 
 if [ "$1" = '--no-connect' ] ; then
     NO_CONNECT='true'
@@ -136,7 +147,7 @@ HOST="$1"
 PORT="$2"
 
 if [ -z "$HOST" ] ; then
-    log "Host not specified."
+    log error "Host not specified."
     usage
     exit 255
 fi
@@ -156,12 +167,13 @@ URI="ssh://${HOSTP}"
 # intentionally different than that of running monkeyesphere normally,
 # and keyserver checking is intentionally done under certain
 # circumstances.  This can be overridden by setting the
-# MONKEYSPHERE_CHECK_KEYSERVER environment variable.
+# MONKEYSPHERE_CHECK_KEYSERVER environment variable, or by setting the
+# CHECK_KEYSERVER variable in the monkeysphere.conf file.
 
 # if the host is in the gpg keyring...
-if gpg --list-key ="${URI}" 2>&1 >/dev/null ; then
+if gpg_user --list-key ="${URI}" 2>&1 >/dev/null ; then
     # do not check the keyserver
-    CHECK_KEYSERVER="false"
+    CHECK_KEYSERVER=${CHECK_KEYSERVER:="false"}
 
 # if the host is NOT in the keyring...
 else
@@ -174,20 +186,21 @@ else
        # FIXME: more nuanced checking should be done here to properly
        # take into consideration hosts that join monkeysphere by
        # converting an existing and known ssh key
-       CHECK_KEYSERVER="false"
+       CHECK_KEYSERVER=${CHECK_KEYSERVER:="false"}
 
     # if the host key is not found in the known_hosts file...
     else
        # check the keyserver
-       CHECK_KEYSERVER="true"
+       CHECK_KEYSERVER=${CHECK_KEYSERVER:="true"}
     fi
 fi
-# set and export the variable for use by monkeysphere
-MONKEYSPHERE_CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:="$CHECK_KEYSERVER"}
-export MONKEYSPHERE_CHECK_KEYSERVER
+
+# finally look in the MONKEYSPHERE_ environment variable for a
+# CHECK_KEYSERVER setting to override all else
+CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=$CHECK_KEYSERVER}
 
 # update the known_hosts file for the host
-monkeysphere update-known_hosts "$HOSTP"
+update_known_hosts "$HOSTP"
 
 # output on depending on the return of the update-known_hosts
 # subcommand, which is (ultimately) the return code of the