home *** CD-ROM | disk | FTP | other *** search
- # -*-shell-script-*-
- # This should be sourced by bash (though we welcome changes to make it POSIX sh compliant)
-
- # Monkeysphere authentication setup subcommand
- #
- # The monkeysphere scripts are written by:
- # Jameson Rollins <jrollins@finestructure.net>
- # Jamie McClelland <jm@mayfirst.org>
- # Daniel Kahn Gillmor <dkg@fifthhorseman.net>
- #
- # They are Copyright 2009, and are all released under the GPL,
- # version 3 or later.
-
- setup() {
- # 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?
- 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
- EOF
-
- KEYSERVER_OPTIONS=""
- for anchorfile in "${SYSCONFIGDIR}/monkeysphere-authentication-x509-anchors.crt" "${SYSCONFIGDIR}/monkeysphere-x509-anchors.crt"; do
- if [ -z "$KEYSERVER_OPTIONS" ] && [ -r "$anchorfile" ] ; then
- KEYSERVER_OPTIONS="keyserver-options ca-cert-file=$anchorfile"
- log debug "using $anchorfile for keyserver X.509 anchor"
- fi
- done
-
- 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
- list-options show-uid-validity
- ${KEYSERVER_OPTIONS}
- EOF
-
- # 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
- log info "setting up Monkeysphere authentication trust core..."
-
- 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($_)'))
-
- 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"
-
- # 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
- log verbose "Monkeysphere authentication trust core already exists."
- 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.
- 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
- 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 "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.
- log debug "checking trust model for authentication ..."
- local TRUST_MODEL=$(gpg_sphere "--with-colons --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
- }
-