Allow for specification of whether to check keyserver.
authorJameson Graef Rollins <jrollins@phys.columbia.edu>
Mon, 16 Jun 2008 18:07:33 +0000 (14:07 -0400)
committerJameson Graef Rollins <jrollins@phys.columbia.edu>
Mon, 16 Jun 2008 18:19:14 +0000 (14:19 -0400)
Update proxy command to check keyserver if host not found in known_hosts.

src/common
src/monkeysphere
src/monkeysphere-ssh-proxycommand

index 8d8e5063258910ebb75f7fe032ff3a438648cc84..471e75a6143aa23138602c1d2ef85d65802d80fb 100644 (file)
@@ -43,12 +43,22 @@ cutline() {
 # FIXME: need to figure out how to retrieve all matching keys
 # (not just first 5)
 gpg_fetch_userid() {
-    local id
-    id="$1"
-    echo 1,2,3,4,5 | \
-       gpg --quiet --batch --command-fd 0 --with-colons \
-       --keyserver "$KEYSERVER" \
-       --search ="$id" >/dev/null 2>&1
+    local userID
+
+    userID="$1"
+
+    # if CHECK_KEYSERVER variable set, check the keyserver
+    # for the user ID
+    if [ "CHECK_KEYSERVER" ] ; then
+       echo 1,2,3,4,5 | \
+           gpg --quiet --batch --command-fd 0 --with-colons \
+           --keyserver "$KEYSERVER" \
+           --search ="$userID" >/dev/null 2>&1
+
+    # otherwise just return true
+    else
+       return
+    fi
 }
 
 # check that characters are in a string (in an AND fashion).
@@ -117,7 +127,7 @@ gpg2authorized_keys() {
 
     gpg --export "$keyID" | \
        openpgp2ssh "$keyID" | tr -d '\n'
-    echo " MonkeySphere${DATE}:${userID}"
+    echo " MonkeySphere${DATE}: ${userID}"
 }
 
 # userid and key policy checking
@@ -296,18 +306,23 @@ update_userid() {
 
     log "processing userid: '$userID'"
 
+    # return 1 if there is no output of the user ID processing
+    # ie. no key was found
     keyCachePath=$(process_user_id "$userID" "$cacheDir")
-
     if [ -z "$keyCachePath" ] ; then
        return 1
     fi
+
+    # check if user ID is in the authorized_user_ids file
     if ! grep -q "^${userID}\$" "$AUTHORIZED_USER_IDS" ; then
        read -p "user ID not currently authorized.  authorize? [Y|n]: " OK; OK=${OK:=Y}
        if [ ${OK/y/Y} = 'Y' ] ; then
+           # add if specified
            log -n "adding user ID to authorized_user_ids file... "
            echo "$userID" >> "$AUTHORIZED_USER_IDS"
            echo "done."
        else
+           # else do nothing
            log "authorized_user_ids file untouched."
        fi
     fi
@@ -340,7 +355,7 @@ process_host() {
     host="$1"
     cacheDir="$2"
 
-    log "processing host: '$host'"
+    log "processing host: $host"
 
     keyCachePath=$(process_user_id "ssh://${host}" "$cacheDir")
     if [ $? = 0 ] ; then
@@ -353,18 +368,15 @@ process_host() {
 # go through line-by-line, extract each host, and process with the
 # host processing function
 process_known_hosts() {
-    local knownHosts
     local cacheDir
     local hosts
     local host
 
-    knownHosts="$1"
-    cacheDir="$2"
+    cacheDir="$1"
 
     # take all the hosts from the known_hosts file (first field),
     # grep out all the hashed hosts (lines starting with '|')...
-    cut -d ' ' -f 1 "$knownHosts" | \
-    grep -v '^|.*$' | \
+    meat "$USER_KNOWN_HOSTS" | cut -d ' ' -f 1 | grep -v '^|.*$' | \
     while IFS=, read -r -a hosts ; do
        # ...and process each host
        for host in ${hosts[*]} ; do
index 23ebd63d0eedb8404a229e95853ac1f71e931b1f..79bc352c9a06fbbeea60aea838b79c7ae2b553f3 100755 (executable)
@@ -157,7 +157,7 @@ case $COMMAND in
                failure "known_hosts file '$USER_KNOWN_HOSTS' is empty."
            fi
            log "processing known_hosts file..."
-           process_known_hosts "$USER_KNOWN_HOSTS" "$hostKeysCacheDir"
+           process_known_hosts "$hostKeysCacheDir"
        fi
        ;;
 
index 417d0131d4ad61d82e77f437806590c460d336b4..ec162ab8c62985d92bf82eb0e8a0eccb120abc6b 100755 (executable)
 HOST="$1"
 PORT="$2"
 
+usage() {
+cat <<EOF >&2
+usage: ssh -o ProxyCommand="$(basename $0) %h %p" ...
+EOF
+}
+
+log() {
+    echo "$@" >&2
+}
+
+if [ -z "$HOST" ] ; then
+    log "host must be specified."
+    usage
+    exit 1
+fi
+if [ -z "$PORT" ] ; then
+    log "port must be specified."
+    usage
+    exit 1
+fi
+
+# check for the host key in the known_hosts file
+hostKey=$(ssh-keygen -F "$HOST")
+
+# if the host key is not found in the known_hosts file,
+# check the keyserver
+if [ -z "$hostKey" ] ; then
+    CHECK_KEYSERVER="true"
+fi
+
 # update the known_hosts file for the host
 monkeysphere update-known-hosts "$HOST"