add no-tty, quiet, and no-greeting to gpg wrapper invocations to supress as much...
[monkeysphere.git] / src / share / ma / setup
index 764fdb8080ddc13d8b7b3a885386495302bed174..6969d71dd4954f59b2905c28e95612218494db2e 100644 (file)
 # version 3 or later.
 
 setup() {
 # version 3 or later.
 
 setup() {
-    # make the core and the sphere:
-    mkdir -p ${SYSDATADIR}/authentication
-    mkdir -p ${GNUPGHOME_SPHERE}
-    mkdir -p ${GNUPGHOME_CORE}
+    # make all needed directories
+    mkdir -p "${MADATADIR}"
+    mkdir -p "${MATMPDIR}"
+    mkdir -p "${GNUPGHOME_CORE}"
+    chmod 700 "${GNUPGHOME_CORE}"
+    mkdir -p "${GNUPGHOME_SPHERE}"
+    chmod 700 "${GNUPGHOME_SPHERE}"
+    mkdir -p "${MADATADIR}"/authorized_keys
 
     # deliberately replace the config files via truncation
     # FIXME: should we be dumping to tmp files and then moving atomically?
 
     # deliberately replace the config files via truncation
     # FIXME: should we be dumping to tmp files and then moving atomically?
-    cat >${GNUPGHOME_CORE}/gpg.conf <<EOF
+    log debug "writing core gpg.conf..."
+    cat >"${GNUPGHOME_CORE}"/gpg.conf <<EOF
 # Monkeysphere trust core GnuPG configuration
 # This file is maintained by the Monkeysphere software.
 # Edits will be overwritten.
 no-greeting
 list-options show-uid-validity
 EOF
 # Monkeysphere trust core GnuPG configuration
 # This file is maintained by the Monkeysphere software.
 # Edits will be overwritten.
 no-greeting
 list-options show-uid-validity
 EOF
-    
-    cat >${GNUPGHOME_SPHERE}/gpg.conf <<EOF
+
+    log debug "writing sphere gpg.conf..."
+    cat >"${GNUPGHOME_SPHERE}"/gpg.conf <<EOF
 # Monkeysphere trust sphere GnuPG configuration
 # This file is maintained by the Monkeysphere software.
 # Edits will be overwritten.
 no-greeting
 # Monkeysphere trust sphere GnuPG configuration
 # This file is maintained by the Monkeysphere software.
 # Edits will be overwritten.
 no-greeting
-primary-keyring ${GNUPGHOME_SPHERE}/pubring.gpg
-keyring ${GNUPGHOME_CORE}/pubring.gpg
-
 list-options show-uid-validity
 EOF
 
 list-options show-uid-validity
 EOF
 
-    local CORE_FPR=$(gpg_core --with-colons --fixed-list-mode --fingerprint --list-secret-key | grep ^fpr: | cut -f10 -d: )
+    # make sure the monkeysphere user owns everything in the sphere
+    # gnupghome
+    log debuf "fixing sphere gnupg home ownership..."
+    chown -R "$MONKEYSPHERE_USER" "${GNUPGHOME_SPHERE}"
+    chgrp -R "$MONKEYSPHERE_USER" "${GNUPGHOME_SPHERE}"
+
+    # get fingerprint of core key.  this should be empty on unconfigured systems.
+    local CORE_FPR=$(core_fingerprint)
+    log debug "core fingerprint: $CORE_FPR"
 
     if [ -z "$CORE_FPR" ] ; then
 
     if [ -z "$CORE_FPR" ] ; then
-       log info "Setting up Monkeysphere authentication trust core"
+       log info "setting up Monkeysphere authentication trust core..."
 
        local CORE_UID=$(printf "Monkeysphere authentication trust core UID (random string: %s)" $(head -c21 </dev/urandom | base64))
     
 
        local CORE_UID=$(printf "Monkeysphere authentication trust core UID (random string: %s)" $(head -c21 </dev/urandom | base64))
     
-       local TMPLOC=$(mktemp -d ${MATMPDIR}/tmp.XXXXXXXXXX) || failure "Could not create temporary directory!"
-       ssh-keygen -q -b 2048 -t rsa -N'' "${TMPLOC}/authkey" || failure "Could not generate new key for Monkeysphere authentication trust core"
-
-       # FIXME: pem2openpgp currently sets the A flag and a short
-       # expiration date.  We should set the C flag and no expiration
-       # date.
-       < "${TMPLOC}/authkey" pem2openpgp "$CORE_UID" | gpg --import || failure "Could not import new key for Monkeysphere authentication trust core"
+       log debug "generating monkeysphere authentication trust core key ($CORE_KEYLENGTH bits)..."
+       PEM2OPENPGP_USAGE_FLAGS=certify \
+           PEM2OPENPGP_NEWKEY=$CORE_KEYLENGTH pem2openpgp "$CORE_UID" \
+           | gpg_core --import \
+           || failure "Could not import new key for Monkeysphere authentication trust core"
 
 
-       then
-           CORE_FPR=$(gpg_core --with-colons --fixed-list-mode --fingerprint --list-secret-key | grep ^fpr: | cut -f10 -d: )
-           if [ -z "$CORE_FPR" ] ; then
-               failure "Failed to find fingerprint of Monkeysphere authentication trust core!"
-           fi
-       else
+       # get fingerprint of core key.  should definitely not be empty at this point
+       CORE_FPR=$(core_fingerprint)
+       log debug "core fingerprint: $CORE_FPR"
+       if [ -z "$CORE_FPR" ] ; then
            failure "Failed to create Monkeysphere authentication trust core!"
        fi
        
     else 
            failure "Failed to create Monkeysphere authentication trust core!"
        fi
        
     else 
-       log verbose "This system has already set up the Monkeysphere authentication trust core"
+       log verbose "Monkeysphere authentication trust core already exists."
     fi
 
     fi
 
+    # export the core key to the sphere keyring
+    log debug "exporting core pub key to sphere keyring..."
+    gpg_core --export | gpg_sphere "--import"
 
     # ensure that the authentication sphere checker has absolute ownertrust on the expected key.
 
     # ensure that the authentication sphere checker has absolute ownertrust on the expected key.
-    printf "%s:6:\n" "$CORE_FPR" | gpg_sphere --import-ownertrust
+    log debug "setting ultimate owner trust on core key in gpg_sphere..."
+    printf "%s:6:\n" "$CORE_FPR" | gpg_sphere "--import-ownertrust"
+    gpg_sphere "--export-ownertrust"
+
+    # check the owner trust
+    log debug "checking gpg_sphere owner trust set properly..."
     local ORIG_TRUST
     local ORIG_TRUST
-    if ORIG_TRUST=$(gpg_sphere --export-ownertrust | grep '^[^#]') ; then
-       if [ "$CORE_FPR:6:" != "$ORIG_TRUST" ] ; then
+    if ORIG_TRUST=$(gpg_sphere "--export-ownertrust" | grep '^[^#]') ; then
+       if [ "${CORE_FPR}:6:" != "$ORIG_TRUST" ] ; then
            failure "Monkeysphere authentication trust sphere should explicitly trust the core.  It does not have proper ownertrust settings."
        fi
     else
            failure "Monkeysphere authentication trust sphere should explicitly trust the core.  It does not have proper ownertrust settings."
        fi
     else
-       failure "Could not get monkeysphere-authentication trust guidleines."
+       failure "Could not get monkeysphere-authentication trust guidelines."
+       # FIXME: what does this mean?  should we suggest how to fix?
     fi
 
     # ensure that we're using the extended trust model (1), and that
     # our preferences are reasonable (i.e. 3 marginal OR 1 fully
     # trusted certifications are sufficient to grant full validity.
     fi
 
     # ensure that we're using the extended trust model (1), and that
     # our preferences are reasonable (i.e. 3 marginal OR 1 fully
     # trusted certifications are sufficient to grant full validity.
-    if [ "1:3:1" != $(gpg_sphere --with-colons --fixed-list-mode --list-keys | head -n1 | grep ^tru: cut -f3,6,7 -d:) ] ; then
-       failure "monkeysphere-preference does not have the expected trust model settings"
+    log debug "checking trust model for authentication ..."
+    local TRUST_MODEL=$(gpg_sphere "--with-colons --fixed-list-mode --list-keys" \
+       | head -n1 | grep "^tru:" | cut -d: -f3,6,7)
+    log debug "sphere trust model: $TRUST_MODEL"
+    if [ "$TRUST_MODEL" != '1:3:1' ] ; then
+       failure "monkeysphere-authentication does not have the expected trust model settings."
+       # FIXME: what does this mean?  should we suggest how to fix?
     fi
 }
     fi
 }