summaryrefslogtreecommitdiff
path: root/src/share/ma/setup
blob: 09c356c85bb3804c14ee8ca9fe451a44325dbe8d (plain)
  1. # -*-shell-script-*-
  2. # This should be sourced by bash (though we welcome changes to make it POSIX sh compliant)
  3. # Monkeysphere authentication setup subcommand
  4. #
  5. # The monkeysphere scripts are written by:
  6. # Jameson Rollins <jrollins@finestructure.net>
  7. # Jamie McClelland <jm@mayfirst.org>
  8. # Daniel Kahn Gillmor <dkg@fifthhorseman.net>
  9. #
  10. # They are Copyright 2009, and are all released under the GPL,
  11. # version 3 or later.
  12. setup() {
  13. # make all needed directories
  14. mkdir -p "${MADATADIR}"
  15. mkdir -p "${MATMPDIR}"
  16. mkdir -p "${GNUPGHOME_CORE}"
  17. chmod 700 "${GNUPGHOME_CORE}"
  18. mkdir -p "${GNUPGHOME_SPHERE}"
  19. chmod 700 "${GNUPGHOME_SPHERE}"
  20. mkdir -p "${MADATADIR}"/authorized_keys
  21. # deliberately replace the config files via truncation
  22. # FIXME: should we be dumping to tmp files and then moving atomically?
  23. log debug "write core gpg.conf..."
  24. cat >"${GNUPGHOME_CORE}"/gpg.conf <<EOF
  25. # Monkeysphere trust core GnuPG configuration
  26. # This file is maintained by the Monkeysphere software.
  27. # Edits will be overwritten.
  28. no-greeting
  29. list-options show-uid-validity
  30. EOF
  31. log debug "write sphere gpg.conf..."
  32. cat >"${GNUPGHOME_SPHERE}"/gpg.conf <<EOF
  33. # Monkeysphere trust sphere GnuPG configuration
  34. # This file is maintained by the Monkeysphere software.
  35. # Edits will be overwritten.
  36. no-greeting
  37. list-options show-uid-validity
  38. EOF
  39. # make sure the monkeysphere user owns everything in the sphere
  40. # gnupghome
  41. log debug "fix sphere gnupg home ownership..."
  42. chown -R "$MONKEYSPHERE_USER" "${GNUPGHOME_SPHERE}"
  43. chgrp -R "$MONKEYSPHERE_USER" "${GNUPGHOME_SPHERE}"
  44. # get fingerprint of core key. this should be empty on unconfigured systems.
  45. local CORE_FPR=$(core_fingerprint)
  46. log debug "core fingerprint: $CORE_FPR"
  47. if [ -z "$CORE_FPR" ] ; then
  48. log info "setting up Monkeysphere authentication trust core..."
  49. local CORE_UID=$(printf "Monkeysphere authentication trust core UID (random string: %s)" $(head -c21 </dev/urandom | base64))
  50. log debug "generating monkeysphere authentication trust core key ($CORE_KEYLENGTH bits)..."
  51. PEM2OPENPGP_USAGE_FLAGS=certify \
  52. PEM2OPENPGP_NEWKEY=$CORE_KEYLENGTH pem2openpgp "$CORE_UID" \
  53. | gpg_core --import \
  54. || failure "Could not import new key for Monkeysphere authentication trust core"
  55. # get fingerprint of core key. should definitely not be empty at this point
  56. CORE_FPR=$(core_fingerprint)
  57. log debug "core fingerprint: $CORE_FPR"
  58. if [ -z "$CORE_FPR" ] ; then
  59. failure "Failed to create Monkeysphere authentication trust core!"
  60. fi
  61. else
  62. log verbose "This system has already set up the Monkeysphere authentication trust core."
  63. fi
  64. # export the core key to the sphere keyring
  65. log debug "export core pub key to sphere keyring..."
  66. gpg_core --export | gpg_sphere --import
  67. # ensure that the authentication sphere checker has absolute ownertrust on the expected key.
  68. log debug "set ultimate owner trust on core key in gpg_sphere..."
  69. printf "%s:6:\n" "$CORE_FPR" | gpg_sphere --import-ownertrust
  70. gpg_sphere --export-ownertrust | log debug
  71. # check the owner trust
  72. log debug "check gpg_sphere owner trust set properly..."
  73. local ORIG_TRUST
  74. if ORIG_TRUST=$(gpg_sphere --export-ownertrust | grep '^[^#]') ; then
  75. if [ "${CORE_FPR}:6:" != "$ORIG_TRUST" ] ; then
  76. failure "Monkeysphere authentication trust sphere should explicitly trust the core. It does not have proper ownertrust settings."
  77. fi
  78. else
  79. failure "Could not get monkeysphere-authentication trust guidelines."
  80. fi
  81. # ensure that we're using the extended trust model (1), and that
  82. # our preferences are reasonable (i.e. 3 marginal OR 1 fully
  83. # trusted certifications are sufficient to grant full validity.
  84. log debug "checking trust level of core key..."
  85. local TRUST_LEVEL=$(gpg_sphere --with-colons --fixed-list-mode --list-keys \
  86. | head -n1 | grep "^tru:" | cut -d: -f3,6,7)
  87. log debug "sphere trust level of core: $TRUST_LEVEL"
  88. if [ "$TRUST_LEVEL" != '1:3:1' ] ; then
  89. failure "monkeysphere-authentication does not have the expected trust model settings."
  90. fi
  91. }