Move to /var/lib/monkeysphere instead of /var/cache/monkeysphere.
[monkeysphere.git] / src / monkeysphere-server
index e099a74a86fdbf7e1f59ea63230dfc30b0bc961e..a198c33c762e7dd005f7c2f80e164cc662c6d7b2 100755 (executable)
 ########################################################################
 PGRM=$(basename $0)
 
-SHAREDIR=${SHAREDIR:-"/usr/share/monkeysphere"}
-export SHAREDIR
-. "${SHAREDIR}/common"
+SHARE=${SHARE:-"/usr/share/monkeysphere"}
+export SHARE
+. "${SHARE}/common"
+
+VARLIB="/var/lib/monkeysphere"
+export VARLIB
 
 # date in UTF format if needed
 DATE=$(date -u '+%FT%T')
@@ -21,7 +24,7 @@ DATE=$(date -u '+%FT%T')
 # unset some environment variables that could screw things up
 GREP_OPTIONS=
 
-# assuming other problems don't crop up, we'll return 0 as success
+# default return code
 ERR=0
 
 ########################################################################
@@ -49,8 +52,9 @@ gen_key() {
     local hostName
 
     hostName=${1:-$(hostname --fqdn)}
-    service=${SERVICE:-"ssh"}
-    userID="${service}://${hostName}"
+
+    SERVICE=${SERVICE:-"ssh"}
+    userID="${SERVICE}://${hostName}"
 
     if gpg --list-key ="$userID" > /dev/null 2>&1 ; then
        failure "Key for '$userID' already exists"
@@ -154,21 +158,20 @@ MS_CONF=${MS_CONF:-"$MS_HOME"/monkeysphere-server.conf}
 [ -e "$MS_CONF" ] && . "$MS_CONF"
 
 # set empty config variable with defaults
-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"}
+RAW_AUTHORIZED_KEYS=${RAW_AUTHORIZED_KEYS:-"%h/.ssh/authorized_keys"}
 
-export GNUPGHOME
+# other variables
+REQUIRED_USER_KEY_CAPABILITY=${REQUIRED_USER_KEY_CAPABILITY:-"a"}
+GNUPGHOME_HOST=${GNUPGHOME_HOST:-"${VARLIB}/gnupg-host"}
+GNUPGHOME_AUTHENTICATION=${GNUPGHOME_AUTHENTICATION:-"${VARLIB}/gnupg-authentication"}
 
-# make sure the monkeysphere home directory exists
-mkdir -p "${MS_HOME}/authorized_user_ids"
-# make sure gpg home exists with proper permissions
+# set default GNUPGHOME, and make sure the directory exists
+GNUPGHOME="$GNUPGHOME_HOST"
+export GNUPGHOME
 mkdir -p -m 0700 "$GNUPGHOME"
-# make sure the authorized_keys directory exists
-mkdir -p "${CACHE}/authorized_keys"
 
 case $COMMAND in
     'update-users'|'update-user'|'u')
@@ -180,25 +183,32 @@ case $COMMAND in
            unames=$(getent passwd | cut -d: -f1)
        fi
 
+       # set mode
+       MODE="authorized_keys"
+
+        # make sure the authorized_keys directory exists
+       mkdir -p "${VARLIB}/authorized_keys"
+
+       # set GNUPGHOME, and make sure the directory exists
+       GNUPGHOME="$GNUPGHOME_AUTHENTICATION"
+       export GNUPGHOME
+       mkdir -p -m 0700 "$GNUPGHOME"
+
        # 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
+           # set authorized_user_ids and raw authorized_keys variables,
+           # translating ssh-style path variables
            authorizedUserIDs=$(translate_ssh_variables "$uname" "$AUTHORIZED_USER_IDS")
+           rawAuthorizedKeys=$(translate_ssh_variables "$uname" "$RAW_AUTHORIZED_KEYS")
 
-           # skip user if authorized_user_ids file does not exist
-           if [ ! -f "$authorizedUserIDs" ] ; then
-               #FIXME: what about a user with no authorized_user_ids
-               # file, but with an authorized_keys file when
-               # USER_CONTROLLED_AUTHORIZED_KEYS is set?
+           # if neither is found, skip user
+           if [ ! -s "$authorizedUserIDs" -a ! -s "$rawAuthorizedKeys" ] ; then
                continue
            fi
 
@@ -207,41 +217,42 @@ case $COMMAND in
            # temporary authorized_keys file
            AUTHORIZED_KEYS=$(mktemp)
 
-           # skip if the user's authorized_user_ids file is empty
-           if [ ! -s "$authorizedUserIDs" ] ; then
-               log "authorized_user_ids file '$authorizedUserIDs' is empty."
-               #FIXME: what about a user with an empty
-               # authorized_user_ids file, but with an
-               # authorized_keys file when
-               # USER_CONTROLLED_AUTHORIZED_KEYS is set?
-               continue
-           fi
+           # trap to delete file on exit
+           trap "rm -f $AUTHORIZE_KEYS" EXIT
 
            # process authorized_user_ids file
-           log "processing authorized_user_ids file..."
-           process_authorized_user_ids "$authorizedUserIDs"
+           if [ -s "$authorizedUserIDs" ] ; then
+               log "processing authorized_user_ids file..."
+               process_authorized_user_ids "$authorizedUserIDs"
+           fi
 
            # add user-controlled authorized_keys file path if specified
-           if [ "$USER_CONTROLLED_AUTHORIZED_KEYS" != '-' ] ; then
-               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"
+           if [ "$RAW_AUTHORIZED_KEYS" != '-' ] ; then
+               if [ -s "$rawAuthorizedKeys" ] ; then
+                   log -n "adding raw authorized_keys file... "
+                   cat "$rawAuthorizedKeys" >> "$AUTHORIZED_KEYS"
                    loge "done."
                fi
            fi
 
-            # openssh appears to check the contents of the
-            # authorized_keys file as the user in question, so the file
-            # must be readable by that user at least.
-            # FIXME: is there a better way to do this?
-            chgrp $(getent passwd "$uname" | cut -f4 -d:) "$AUTHORIZED_KEYS"
-            chmod g+r "$AUTHORIZED_KEYS"
+           # if the resulting authorized_keys file is not empty, move
+           # the temp authorized_keys file into place
+           if [ -s "$AUTHORIZED_KEYS" ] ; then
+               # openssh appears to check the contents of the
+                # authorized_keys file as the user in question, so the
+                # file must be readable by that user at least.
+               # FIXME: is there a better way to do this?
+               chgrp $(getent passwd "$uname" | cut -f4 -d:) "$AUTHORIZED_KEYS"
+               chmod g+r "$AUTHORIZED_KEYS"
+
+               mv -f "$AUTHORIZED_KEYS" "${VARLIB}/authorized_keys/${uname}"
 
-           # move the temp authorized_keys file into place
-           mv -f "$AUTHORIZED_KEYS" "${CACHE}/authorized_keys/${uname}"
+               log "authorized_keys file updated."
 
-           log "authorized_keys file updated."
+           # else destroy it
+           else
+               rm -f "$AUTHORIZED_KEYS"
+           fi
        done
        ;;