Merge commit 'mlcastle/master'
authorJameson Graef Rollins <jrollins@phys.columbia.edu>
Sat, 21 Jun 2008 16:36:15 +0000 (12:36 -0400)
committerJameson Graef Rollins <jrollins@phys.columbia.edu>
Sat, 21 Jun 2008 16:36:15 +0000 (12:36 -0400)
14 files changed:
debian/changelog
debian/monkeysphere.dirs
doc/TODO
doc/george/changelog
doc/george/user-id-configuration
etc/monkeysphere-server.conf
man/man1/monkeysphere-ssh-proxycommand.1
man/man1/monkeysphere.1
man/man8/monkeysphere-server.8
src/common
src/monkeysphere
src/monkeysphere-server
src/monkeysphere-ssh-proxycommand
src/seckey2sshagent

index d326473910d4de683eb02830f31e4cf9732e94a8..2133d2d6018404e38e61a918d9ce602b5d37ec25 100644 (file)
@@ -1,11 +1,20 @@
 monkeysphere (0.2-1) UNRELEASED; urgency=low
 
-  * NOT YET RELEASED
-  * 
+  [ Daniel Kahn Gillmor ]
+  * NOT YET RELEASED (switch to "experimental" when ready to release)
 
- -- Daniel Kahn Gillmor <dkg-debian.org@fifthhorseman.net>  Thu, 19 Jun 2008 04:03:45 -0400
+  [ Jameson Graef Rollins ]
+  * Add AUTHORIZED_USER_IDS config variable for server, which defaults to
+    %h/.config/monkeysphere/authorized_user_ids, instead of
+    /etc/monkeysphere/authorized_user_ids.
+  * Remove {update,remove}-userids functions, since we decided they
+    weren't useful enough to be worth maintaining.
+  * Better handling of unknown users in server update-users
+  * Add file locking when modifying known_hosts or authorized_keys
 
-monkeysphere (0.1-1) unstable; urgency=low
+ -- Jameson Graef Rollins <jrollins@phys.columbia.edu>  Fri, 20 Jun 2008 00:43:44 -0400
+
+monkeysphere (0.1-1) experimental; urgency=low
 
   * First release of debian package for monkeysphere.
   * This is experimental -- please report bugs!
index bc8abcf0f51ee7d3dcd1ae7a9b70f464b62c78b1..6e9089952ab4095b9bc12d9163cc9aeeacf7299e 100644 (file)
@@ -2,4 +2,3 @@ usr/share/monkeysphere
 var/cache/monkeysphere
 var/cache/monkeysphere/authorized_keys
 etc/monkeysphere
-etc/monkeysphere/authorized_user_ids
index 5cd9be9cb8784521e652237e484e53fe7376a399..a82f031dd96dbe61048e638cf875a856e1125eca 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
@@ -26,37 +26,22 @@ Streamline host key generation, publication, verification.  See
    doc/george/host-key-publication for what dkg went through on
    2008-06-19
 
-Streamline authorized_user_ids setup (including question of where
-   authorized_user_ids files should go).  See
-   doc/george/user-id-configuration for what dkg went through on
-   2008-06-19
-
 Ensure that authorized_user_ids are under as tight control as ssh
    expects from authorized_keys: we don't want monkeysphere to be a
    weak link in the filesystem.
 
-What happens when there are no entries in the authorized_user_ids file
-   for a user?  /var/cache/monkeysphere/authorized_keys/$USER.tmp
-   seems like it gets created and then left there.
-
 What happens when a user account has no corresponding
    /etc/monkeysphere/authorized_user_ids/$USER file?  What gets placed
    in /var/cache/monkeysphere/authorized_keys/$USER?  It looks
    currently untouched, which could mean bad things for such a user.
+   - if authorized_user_ids is empty, then the user's authorized_keys
+     file will be also, unless the user-controlled authorized_keys file
+     is added.  I believe this is expected, correct behavior.
 
 Consider the default permissions for
    /var/cache/monkeysphere/authorized_keys/* (and indeed the whole
    directory path leading up to that)
 
-What should happen when an admin does 
-   "monkeysphere-server update-users not_an_existent_user"?
-   currently, it adds
-   /etc/monkeysphere/authorized_user_ids/not_an_existent_user, which
-   seems rather wrong.
-
-is /var/cache/monkeysphere/authorized_keys/$USER.tmp guaranteed to
-   avoid collisions?  Why not use a real mktemp file?
-
 As an administrator, how do i reverse the effect of a
    "monkeysphere-server trust-keys" that i later decide i should not
    have run?
index 381fa0f0fdb03e3a1833178a576fbeb22a5395ed..22807d1410a5cd4c6d3bb2a26b486268b736e2de 100644 (file)
@@ -7,6 +7,30 @@
 *  changes to this system                                                   *
 ******************************************************************************
 
+2008-06-20 - micah
+       * Commented out the 'export SSHD_OOM_ADJUST=-17' from the
+       /etc/init.d/ssh initscript, and the 'SSHD_OOM_ADJUST=-17' from
+       /etc/default/ssh in order to make this error go away:
+       "error writing /proc/self/oom_adj: Operation not permitted"
+       (c.f. Debian #487325)
+         
+200r-06-20 - dkg
+       * touched /etc/environment to get rid of some spurious auth.log
+       entries.
+       * turned up sshd's LogLevel from INFO to DEBUG
+       
+2008-06-19 - dkg
+       * installed rsync (for maintaining a public apt repo)
+       
+       * configured mathopd to listen on port 80, serving /srv/www as /
+       and /srv/apt as /debian.  We've got nothing in /srv/www at the
+       moment, though.
+
+       * installed lsof and psmisc as sysadmin utilities.  sorry for the
+       bloat!
+
+       * installed strace to try to figure out why onak is segfaulting.
+       
 2008-06-19 - dkg
        * removed etch sources, switched "testing" to "lenny", added
        lenny/updates, removed all contrib and non-free.
index d42bfbd1c05730299d0be6dfa0d8dc03b7013ec2..9a7f4d209ea66e139a58088c80014901aa363b98 100644 (file)
@@ -33,13 +33,6 @@ and then modified /etc/ssh/sshd_config with:
 
 Some outstanding questions:
 
- * why are the authorized_user_ids stored in /etc/ and not in people's
-   home directories?
-
- * why are authorized_user_ids managed with a special sub-command of
-   monkeysphere-server, instead of just being hand-managed files, the
-   way that authorized_keys are in stock openssh?
-
  * Should we ship a scheduled monkeysphere-server update-users cron
    job automatically?
 
index 3915bf46f4168d7c1a25e89148920c75566e3f66..847e8795ea4c53f0825a4f64262c761c5f364218 100644 (file)
 #   a = authentication
 #REQUIRED_USER_KEY_CAPABILITY="a"
 
+# Path to authorized_user_ids file to process to create
+# authorized_keys file.  '%h' will be replaced by the home directory
+# of the user, and %u will be replaced by the username of the user.
+# For purely admin-controlled authorized_user_ids, you might put them
+# in /etc/monkeysphere/authorized_user_ids/%u
+#AUTHORIZED_USER_IDS="%h/.config/monkeysphere/authorized_user_ids"
+
 # Whether to add user controlled authorized_keys file to
 # monkeysphere-generated authorized_keys file.  Should be path to file
 # where '%h' will be replaced by the home directory of the user.
 # To not add any user-controlled file, put "-"
-#USER_CONTROLLED_AUTHORIZED_KEYS=%h/.ssh/authorized_keys
+#USER_CONTROLLED_AUTHORIZED_KEYS="%h/.ssh/authorized_keys"
index 5fabb91af5dce22ac09e4601549eb63bcac561d1..c4196f2b4afbd392272e8dffa40856ec6ebcb9a9 100644 (file)
@@ -18,17 +18,29 @@ or by adding the following line to your ~/.ssh/config script:
 
 .B ProxyCommand monkeysphere-ssh-proxycommand %h %p
 
-The script is very simple, and can easily be incorporated into other
-ProxyCommand scripts.  It first tests to see if the host is in the
-known_hosts file.  If it's not, the CHECK_KEYSERVER variable is set to
-true and "update-known_hosts" is run for the host to check for a host
-key for that host.  If the host is found in the known_hosts file,
-CHECK_KEYSERVER is set to false and "update-known_hosts" is run to
-update from the local keychain.
+The script can easily be incorporated into other ProxyCommand scripts
+by calling it with the "--no-connect" option, ie:
 
-Run the following command for more info:
+.B monkeysphere-ssh-proxycommand --no-connect "$HOST" "$PORT"
 
-.B less $(which monkeysphere-ssh-proxycommand)
+This will run everything but will not exec netcat to make the tcp
+connection to the host.
+
+.SH KEYSERVER CHECKING
+
+The proxy command has a fairly nuanced policy for when keyservers are
+queried when processing host.  If the host userID is not found in
+either the user's keyring or in the known_hosts file, then the
+keyserver is queried for the host userID.  If the host userID is found
+in the user's keyring, then the keyserver is not checked.  This is
+because...  If the host userID is not found in the user's keyring, but
+the host is listed in the known_hosts file, then defered check is
+scheduled.
+
+.SH ENVIRONMENT VARIABLES
+
+.TP
+KEYSERVER The keyserver to query.
 
 .SH AUTHOR
 
index f36d69eb700de5f2f7386ce0e9266463856402a9..30e35bba3a5fc7732b52bae70ee3b5935ba77ff6 100644 (file)
@@ -33,20 +33,6 @@ is done.  If no hosts are specified, all hosts listed in the
 known_hosts file will be processed.  `k' may be used in place of
 `update-known_hosts'.
 .TP
-.B update-userids [USERID]...
-Add/update a user ID to the authorized_user_ids file.  The user IDs
-specified should be exact matches to OpenPGP user IDs.  For each
-specified user ID, gpg will be queried for a key associated with that
-user ID, querying a keyserver if specified.  If a key is found, the
-user ID will be added to the user's authorized_user_ids file (if it
-wasn't already present).  `u' may be used in place of
-`update-userids'.
-.TP
-.B remove-userids [USERID]...
-Remove a user ID from the authorized_user_ids file.  The user IDs
-specified should be exact matches to OpenPGP user IDs.  `r' may be
-used in place of `remove-userids'.
-.TP
 .B update-authorized_keys
 Update the monkeysphere authorized_keys file.  For each user ID in the
 user's authorized_user_ids file, gpg will be queried for keys
@@ -78,9 +64,7 @@ specification for the host, ie. "ssh://host.full.domain".
 GPG keys are considered acceptable if the following criteria are met:
 .TP
 .B capability
-For host keys, the key must have both the "authentication" ("a") and
-"encrypt" ("e") capability flags.  For user keys, the key must have
-the "authentication" ("a") capability flag.
+The key must have the "authentication" ("a") usage flag set.
 .TP
 .B validity
 The key must be "fully" valid, and must not be expired or revoked.
@@ -97,9 +81,6 @@ System-wide monkeysphere config file.
 ~/.config/monkeysphere/authorized_user_ids
 OpenPGP user IDs associated with keys that will be checked for
 addition to the authorized_keys file.
-.TP
-~/.config/monkeysphere/authorized_keys
-Monkeysphere generated authorized_keys file.
 
 .SH AUTHOR
 
index 28149fb470dc2ab3b17b0eedf29942e0f247eb78..3073adc698ca28a69432afcd3e1484acadae3bbf 100644 (file)
@@ -23,7 +23,8 @@ be used for authentication of ssh connections.
 .TP
 .B update-users [USER]...
 Update the admin-controlled authorized_keys files for user.  For each
-user specified, update the user's authorized_keys file in
+user specified, user ID's listed in the user's authorized_user_ids
+file are processed, and the user's authorized_keys file in
 /var/cache/monkeysphere/authorized_keys/USER.  See `man monkeysphere'
 for more info.  If the USER_CONTROLLED_AUTHORIZED_KEYS variable is
 set, then a user-controlled authorized_keys file (usually
@@ -46,14 +47,6 @@ of `publish-key'.
 Mark key specified with key IDs with full owner trust.  `t' may be used
 in place of `trust-keys'.
 .TP
-.B update-user-userids USER USERID...
-Add/update a user ID to the authorized_user_ids file for USER.  `u' may
-be used in place of `update-user-userids'.
-.TP
-.B remove-user-userids USER USERID...
-Remove a user ID from the authorized_user_ids file for USER.  `r' may
-be used in place of `remove-user-userids'.
-.TP
 .B help
 Output a brief usage summary.  `h' or `?' may be used in place of
 `help'.
index c39506d729a14503ebc992adbb92fc3d3e1ae256..c90fdd09c0d861e07328e41748fc3912994fe2e0 100644 (file)
@@ -18,10 +18,17 @@ ETC="/etc/monkeysphere"
 export ETC
 CACHE="/var/cache/monkeysphere"
 export CACHE
+ERR=0
+export ERR
 
 ########################################################################
 ### UTILITY FUNCTIONS
 
+error() {
+    log "$1"
+    ERR=${2:-'1'}
+}
+
 failure() {
     echo "$1" >&2
     exit ${2:-'1'}
@@ -29,12 +36,12 @@ failure() {
 
 # write output to stderr
 log() {
-    echo -n "ms: " 1>&2
-    echo "$@" 1>&2
+    echo -n "ms: " >&2
+    echo "$@" >&2
 }
 
 loge() {
-    echo "$@" 1>&2
+    echo "$@" >&2
 }
 
 # cut out all comments(#) and blank lines from standard input
@@ -85,6 +92,25 @@ remove_line() {
     fi
 }
 
+# translate ssh-style path variables %h and %u
+translate_ssh_variables() {
+    local uname
+    local home
+
+    uname="$1"
+    path="$2"
+
+    # get the user's home directory
+    userHome=$(getent passwd "$uname" | cut -d: -f6)
+
+    # translate '%u' to user name
+    path=${path/\%u/"$uname"}
+    # translate '%h' to user home directory
+    path=${path/\%h/"$userHome"}
+
+    echo "$path"
+}
+
 ### CONVERTION UTILITIES
 
 # output the ssh key for a given key ID
@@ -351,110 +377,79 @@ process_user_id() {
     done
 }
 
-# update the cache for userid, and prompt to add file to
-# authorized_user_ids file if the userid is found in gpg
-# and not already in file.
-update_userid() {
-    local userID
-
-    userID="$1"
-
-    log "processing userid: '$userID'"
-
-    # process the user ID to pull it from keyserver
-    process_user_id "$userID" | grep -q "^0 "
-
-    # 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"
-           loge "done."
-       else
-           # else do nothing
-           log " authorized_user_ids file untouched."
-       fi
-    fi
-}
-
-# remove a userid from the authorized_user_ids file
-remove_userid() {
-    local userID
-
-    userID="$1"
-
-    log "processing userid: '$userID'"
-
-    # check if user ID is in the authorized_user_ids file
-    if ! grep -q "^${userID}\$" "$AUTHORIZED_USER_IDS" ; then
-       log " user ID not currently authorized."
-       return 1
-    fi
-
-    # remove user ID from file
-    log -n " removing user ID '$userID'... "
-    remove_line "$AUTHORIZED_USER_IDS" "^${userID}$"
-    loge "done."
-}
-
-# process a host in known_host file
-process_host_known_hosts() {
+# process hosts in the known_host file
+process_hosts_known_hosts() {
     local host
     local userID
     local ok
     local keyid
     local tmpfile
 
-    host="$1"
-    userID="ssh://${host}"
-
-    log "processing host: $host"
-
-    process_user_id "ssh://${host}" | \
-    while read -r ok keyid ; do
-       sshKey=$(gpg2ssh "$keyid")
-       # remove the old host key line
-       remove_line "$KNOWN_HOSTS" "$sshKey"
-       # if key OK, add new host line
-       if [ "$ok" -eq '0' ] ; then
-           # hash if specified
-           if [ "$HASH_KNOWN_HOSTS" = 'true' ] ; then
-               # FIXME: this is really hackish cause ssh-keygen won't
-               # hash from stdin to stdout
-               tmpfile=$(mktemp)
-               ssh2known_hosts "$host" "$sshKey" > "$tmpfile"
-               ssh-keygen -H -f "$tmpfile" 2> /dev/null
-               cat "$tmpfile" >> "$KNOWN_HOSTS"
-               rm -f "$tmpfile" "${tmpfile}.old"
-           else
-               ssh2known_hosts "$host" "$sshKey" >> "$KNOWN_HOSTS"
+    # create a lockfile on known_hosts
+    lockfile-create "$KNOWN_HOSTS"
+
+    for host ; do
+       log "processing host: $host"
+
+       userID="ssh://${host}"
+
+       process_user_id "ssh://${host}" | \
+       while read -r ok keyid ; do
+           sshKey=$(gpg2ssh "$keyid")
+           # remove the old host key line
+           remove_line "$KNOWN_HOSTS" "$sshKey"
+           # if key OK, add new host line
+           if [ "$ok" -eq '0' ] ; then
+               # hash if specified
+               if [ "$HASH_KNOWN_HOSTS" = 'true' ] ; then
+                   # FIXME: this is really hackish cause ssh-keygen won't
+                   # hash from stdin to stdout
+                   tmpfile=$(mktemp)
+                   ssh2known_hosts "$host" "$sshKey" > "$tmpfile"
+                   ssh-keygen -H -f "$tmpfile" 2> /dev/null
+                   cat "$tmpfile" >> "$KNOWN_HOSTS"
+                   rm -f "$tmpfile" "${tmpfile}.old"
+               else
+                   ssh2known_hosts "$host" "$sshKey" >> "$KNOWN_HOSTS"
+               fi
            fi
-       fi
+       done
+       # touch the lockfile, for good measure.
+       lockfile-touch --oneshot "$KNOWN_HOSTS"
     done
+
+    # remove the lockfile
+    lockfile-remove "$KNOWN_HOSTS"
 }
 
-# process a uid in an authorized_keys file
-process_uid_authorized_keys() {
+# process uids for the authorized_keys file
+process_uids_authorized_keys() {
     local userID
     local ok
     local keyid
 
-    userID="$1"
+    # create a lockfile on authorized_keys
+    lockfile-create "$AUTHORIZED_KEYS"
 
-    log "processing user ID: $userID"
+    for userID ; do
+       log "processing user ID: $userID"
 
-    process_user_id "$userID" | \
-    while read -r ok keyid ; do
-       sshKey=$(gpg2ssh "$keyid")
-       # remove the old host key line
-       remove_line "$AUTHORIZED_KEYS" "$sshKey"
-       # if key OK, add new host line
-       if [ "$ok" -eq '0' ] ; then
-           ssh2authorized_keys "$userID" "$sshKey" >> "$AUTHORIZED_KEYS"
-       fi
+       process_user_id "$userID" | \
+       while read -r ok keyid ; do
+           sshKey=$(gpg2ssh "$keyid")
+           # remove the old host key line
+           remove_line "$AUTHORIZED_KEYS" "$sshKey"
+           # if key OK, add new host line
+           if [ "$ok" -eq '0' ] ; then
+               ssh2authorized_keys "$userID" "$sshKey" >> "$AUTHORIZED_KEYS"
+           fi
+       done
+       # touch the lockfile, for good measure.
+       lockfile-touch --oneshot "$AUTHORIZED_KEYS"
     done
+
+    # remove the lockfile
+    lockfile-remove "$AUTHORIZED_KEYS"
 }
 
 # process known_hosts file
@@ -469,10 +464,7 @@ process_known_hosts() {
     cat "$KNOWN_HOSTS" | meat | \
        cut -d ' ' -f 1 | grep -v '^|.*$' | \
     while IFS=, read -r -a hosts ; do
-       # and process each host
-       for host in ${hosts[*]} ; do
-           process_host_known_hosts "$host"
-       done
+       process_hosts_known_hosts ${hosts[@]}
     done
 }
 
@@ -480,9 +472,11 @@ process_known_hosts() {
 process_authorized_user_ids() {
     local userid
 
-    cat "$AUTHORIZED_USER_IDS" | meat | \
+    authorizedUserIDs="$1"
+
+    cat "$authorizedUserIDs" | meat | \
     while read -r userid ; do
-       process_uid_authorized_keys "$userid"
+       process_uids_authorized_keys "$userid"
     done
 }
 
index a6cecfd63de025c3b4195842bf6c431f33ecf5c1..58f0fdc632edaeb8f7aa679b24dbfa6e6c81809c 100755 (executable)
@@ -35,8 +35,6 @@ MonkeySphere client tool.
 
 subcommands:
   update-known_hosts (k) [HOST]...  update known_hosts file
-  update-userids (u) [USERID]...    add/update user IDs
-  remove-userids (r) [USERID]...    remove user IDs
   update-authorized_keys (a)        update authorized_keys file
   gen-subkey (g) KEYID              generate an 'a' capable subkey
   help (h,?)                        this help
@@ -142,12 +140,9 @@ case $COMMAND in
         # if hosts are specified on the command line, process just
         # those hosts
        if [ "$1" ] ; then
-            for host ; do
-               process_host_known_hosts "$host"
-           done
-           log "known_hosts file updated."
+           process_hosts_known_hosts "$@"
 
-        # otherwise, if no hosts are specified, process every user
+        # otherwise, if no hosts are specified, process every host
         # in the user's known_hosts file
        else
            if [ ! -s "$KNOWN_HOSTS" ] ; then
@@ -155,30 +150,9 @@ case $COMMAND in
            fi
            log "processing known_hosts file..."
            process_known_hosts
-           log "known_hosts file updated."
        fi
-       ;;
 
-    'update-userids'|'update-userid'|'u')
-       if [ -z "$1" ] ; then
-           failure "you must specify at least one userid."
-       fi
-       for userID ; do
-           update_userid "$userID"
-       done
-       log "Run the following to update your monkeysphere authorized_keys file:"
-       log "$PGRM update-authorized_keys"
-       ;;
-
-    'remove-userids'|'remove-userid'|'r')
-       if [ -z "$1" ] ; then
-           failure "you must specify at least one userid."
-       fi
-       for userID ; do
-           remove_userid "$userID"
-       done
-       log "Run the following to update your monkeysphere authorized_keys file:"
-       log "$PGRM update-authorized_keys"
+       log "known_hosts file updated."
        ;;
 
     'update-authorized_keys'|'update-authorized-keys'|'a')
@@ -191,7 +165,7 @@ case $COMMAND in
 
        # process authorized_user_ids file
        log "processing authorized_user_ids file..."
-       process_authorized_user_ids
+       process_authorized_user_ids "$AUTHORIZED_USER_IDS"
        log "authorized_keys file updated."
        ;;
 
index 96a1070ea173f917d098cd711cc6f80b6abddf64..693c062d5554fd858a8671e1fb303536d86a6f4c 100755 (executable)
@@ -31,14 +31,11 @@ usage: $PGRM <subcommand> [args]
 MonkeySphere server admin tool.
 
 subcommands:
+  update-users (s) [USER]...            update users authorized_keys files
   gen-key (g) [HOSTNAME]                generate gpg key for the server
   show-fingerprint (f)                  show server's host key fingerprint
   publish-key (p)                       publish server key to keyserver
   trust-keys (t) KEYID...               mark keyids as trusted
-
-  update-users (s) [USER]...            update users authorized_keys files
-  update-user-userids (u) USER UID...   add/update user IDs for a user
-  remove-user-userids (r) USER UID...   remove user IDs for a user
   help (h,?)                            this help
 
 EOF
@@ -139,6 +136,7 @@ GNUPGHOME=${GNUPGHOME:-"${MS_HOME}/gnupg"}
 KEYSERVER=${KEYSERVER:-"subkeys.pgp.net"}
 CHECK_KEYSERVER=${CHECK_KEYSERVER:="true"}
 REQUIRED_USER_KEY_CAPABILITY=${REQUIRED_USER_KEY_CAPABILITY:-"a"}
+AUTHORIZED_USER_IDS=${AUTHORIZED_USER_IDS:-"%h/.config/monkeysphere/authorized_user_ids"}
 USER_CONTROLLED_AUTHORIZED_KEYS=${USER_CONTROLLED_AUTHORIZED_KEYS:-"%h/.ssh/authorized_keys"}
 
 export GNUPGHOME
@@ -153,40 +151,50 @@ mkdir -p "${CACHE}/authorized_keys"
 case $COMMAND in
     'update-users'|'update-user'|'s')
        if [ "$1" ] ; then
+           # get users from command line
            unames="$@"
        else
-           unames=$(ls -1 "${MS_HOME}/authorized_user_ids")
+           # or just look at all users if none specified
+           unames=$(getent passwd | cut -d: -f1)
        fi
 
+       # loop over users
        for uname in $unames ; do
            MODE="authorized_keys"
 
+           # check all specified users exist
+           if ! getent passwd "$uname" >/dev/null ; then
+               error "----- unknown user '$uname' -----"
+               continue
+           fi
+
+           # set authorized_user_ids variable,
+           # translate ssh-style path variables
+           authorizedUserIDs=$(translate_ssh_variables "$uname" "$AUTHORIZED_USER_IDS")
+
+           # skip user if authorized_user_ids file does not exist
+           if [ ! -f "$authorizedUserIDs" ] ; then
+               continue
+           fi
+
            log "----- user: $uname -----"
 
-           # set variables for the user
-           AUTHORIZED_USER_IDS="${MS_HOME}/authorized_user_ids/${uname}"
            # temporary authorized_keys file
-           AUTHORIZED_KEYS="${CACHE}/authorized_keys/${uname}.tmp"
-
-            # make sure user's authorized_user_ids file exists
-           touch "$AUTHORIZED_USER_IDS"
-           # make sure the authorized_keys file exists and is clear
-           > "$AUTHORIZED_KEYS"
+           AUTHORIZED_KEYS=$(mktemp)
 
            # skip if the user's authorized_user_ids file is empty
-           if [ ! -s "$AUTHORIZED_USER_IDS" ] ; then
-               log "authorized_user_ids file for '$uname' is empty."
+           if [ ! -s "$authorizedUserIDs" ] ; then
+               log "authorized_user_ids file '$authorizedUserIDs' is empty."
                continue
            fi
 
            # process authorized_user_ids file
            log "processing authorized_user_ids file..."
-           process_authorized_user_ids
+           process_authorized_user_ids "$authorizedUserIDs"
 
            # add user-controlled authorized_keys file path if specified
            if [ "$USER_CONTROLLED_AUTHORIZED_KEYS" != '-' ] ; then
-               userHome=$(getent passwd "$uname" | cut -d: -f6)
-               userAuthorizedKeys=${USER_CONTROLLED_AUTHORIZED_KEYS/\%h/"$userHome"}
+               userAuthorizedKeys=$(translate_ssh_variables "$uname" "$USER_CONTROLLED_AUTHORIZED_KEYS")
                if [ -f "$userAuthorizedKeys" ] ; then
                    log -n "adding user's authorized_keys file... "
                    cat "$userAuthorizedKeys" >> "$AUTHORIZED_KEYS"
@@ -195,12 +203,10 @@ case $COMMAND in
            fi
 
            # move the temp authorized_keys file into place
-           mv -f "${CACHE}/authorized_keys/${uname}.tmp" "${CACHE}/authorized_keys/${uname}"
+           mv -f "$AUTHORIZED_KEYS" "${CACHE}/authorized_keys/${uname}"
 
            log "authorized_keys file updated."
        done
-
-       log "----- done. -----"
        ;;
 
     'gen-key'|'g')
@@ -226,56 +232,6 @@ case $COMMAND in
        done
        ;;
 
-    'update-user-userids'|'update-user-userid'|'u')
-       uname="$1"
-       shift
-       if [ -z "$uname" ] ; then
-           failure "You must specify user."
-       fi
-       if [ -z "$1" ] ; then
-           failure "You must specify at least one user ID."
-       fi
-
-       # set variables for the user
-       AUTHORIZED_USER_IDS="$MS_HOME"/authorized_user_ids/"$uname"
-
-        # make sure user's authorized_user_ids file exists
-       touch "$AUTHORIZED_USER_IDS"
-
-       # process the user IDs
-       for userID ; do
-           update_userid "$userID"
-       done
-
-       log "Run the following to update user's authorized_keys file:"
-       log "$PGRM update-users $uname"
-       ;;
-
-    'remove-user-userids'|'remove-user-userid'|'r')
-       uname="$1"
-       shift
-       if [ -z "$uname" ] ; then
-           failure "You must specify user."
-       fi
-       if [ -z "$1" ] ; then
-           failure "You must specify at least one user ID."
-       fi
-
-       # set variables for the user
-       AUTHORIZED_USER_IDS="$MS_HOME"/authorized_user_ids/"$uname"
-
-        # make sure user's authorized_user_ids file exists
-       touch "$AUTHORIZED_USER_IDS"
-
-       # process the user IDs
-       for userID ; do
-           remove_userid "$userID"
-       done
-
-       log "Run the following to update user's authorized_keys file:"
-       log "$PGRM update-users $uname"
-       ;;
-
     'help'|'h'|'?')
         usage
         ;;
@@ -285,3 +241,5 @@ case $COMMAND in
 Type '$PGRM help' for usage."
         ;;
 esac
+
+exit "$ERR"
index 4cbcd5138bda3a5904eb3741c5a64993c67d0484..f4d4b0d9affb8835ae812e22c9fa58f5388c3fbf 100755 (executable)
@@ -49,7 +49,7 @@ if [ "$PORT" != '22' ] ; then
 fi
 
 # if the host is in the gpg keyring...
-if gpg --list-key ="${URI}" >/dev/null ; then
+if gpg --list-key ="${URI}" 2>&1 >/dev/null ; then
     # do not check the keyserver
     CHECK_KEYSERVER="false"
 # if the host is NOT in the keyring...
index 0e8d69526a360fa7710d753d3d93d8928e7b1175..d8e9b79ac2e86da91cf156de986a8434135e7b37 100755 (executable)
@@ -1,5 +1,20 @@
 #!/bin/sh
 
+# seckey2sshagent: this is a hack of a script to cope with the fact
+# that openpgp2ssh currently cannot support encrypted secret keys.
+
+# the basic operating principal is: 
+
+# export the secret key in encrypted format to a new keyring
+
+# remove the passphrase in that keyring
+
+# use that keyring with openpgp2ssh
+
+# Authors: Daniel Kahn Gillmor <dkg@fifthhorseman.net>,
+#          Jameson Rollins <jrollins@fifthhorseman.net>
+
+
 cleanup() {
     echo -n "removing temp gpg home... "
     rm -rf $FOO