enable use of hkps (closes: MS #1749)
[monkeysphere.git] / src / share / ma / setup
index a829a9845294dce1a614cc1707486f4ec3a0fad9..f965487d513dece3e1bb313778f65f2fc46404d0 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
+    log debug "checking authentication directory structure..."
+    mkdir -p "${MADATADIR}"
+    chmod 0750 "${MADATADIR}"
+    chgrp "$MONKEYSPHERE_GROUP" "${MADATADIR}"
+    mkdir -p "${MATMPDIR}"
+    chmod 0750 "${MATMPDIR}"
+    chgrp "$MONKEYSPHERE_GROUP" "${MATMPDIR}"
+    mkdir -p "${GNUPGHOME_CORE}"
+    chmod 0700 "${GNUPGHOME_CORE}"
+    mkdir -p "${GNUPGHOME_SPHERE}"
+    chmod 0700 "${GNUPGHOME_SPHERE}"
+    mkdir -p "${SYSDATADIR}"/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
 # 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
 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
 list-options show-uid-validity
+keyserver-options ca-cert-file=${SYSCONFIGDIR}/monkeysphere-authentication-x509-anchors.crt
 EOF
 
 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 debug "fixing sphere gnupg home ownership..."
+    chown "$MONKEYSPHERE_USER:$MONKEYSPHERE_GROUP" "${GNUPGHOME_SPHERE}" "${GNUPGHOME_SPHERE}"/gpg.conf
+
+    # 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 | base64))
+       local CORE_UID=$(printf "Monkeysphere authentication trust core UID (random string: %s)" $(dd if=/dev/urandom bs=21 count=1 2>/dev/null | perl -MMIME::Base64 -ne 'print encode_base64($_)'))
     
     
-       if gpg_core --gen-key --batch <<EOF
-Key-Type: RSA
-Key-Length: 4096
-Key-Usage: certify
-Name-Real: $CORE_UID
+       printf "generating monkeysphere authentication trust core key:\nsize: %d bits\nuid: '%s'\n" "$CORE_KEYLENGTH" "$CORE_UID" | log debug
+       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"
 
 
-%commit
-%echo done
-EOF
-       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" 2>&1 | log verbose
+    gpg_sphere "--export-ownertrust" 2>&1 | log debug
+
+    # 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" 2>/dev/null \
+       | 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
 }