add keys-for-user subcommand to monkeysphere-authentication
authorJameson Rollins <jrollins@finestructure.net>
Sun, 4 Jul 2010 04:06:35 +0000 (00:06 -0400)
committerJameson Rollins <jrollins@finestructure.net>
Sun, 4 Jul 2010 04:13:02 +0000 (00:13 -0400)
This subcommand will output all valid key for a given user.  The
user's authorized_user_ids file will be read for OpenPGP user IDs, one
per line.  The ssh-formated RSA keys will be output to stdout.

Also included is a simple script that takes the user as it's one
argument and exec's this command.  This is something that would be
suitable for the proposed sshd AuthorizedKeysCommand.

Makefile
man/man8/monkeysphere-authentication.8
src/monkeysphere-authentication
src/monkeysphere-authentication-keys-for-user [new file with mode: 0755]
src/share/ma/keys_for_user [new file with mode: 0644]

index 9f5028aec19df8ded227c7280e820e1d35cfb45b..7662f7b54fd1fd7b2dc3ba9321a07aa99e4196b9 100755 (executable)
--- a/Makefile
+++ b/Makefile
@@ -42,6 +42,7 @@ install: all installman
        printf "Monkeysphere %s\n" $(MONKEYSPHERE_VERSION) > $(DESTDIR)$(PREFIX)/share/monkeysphere/VERSION
        install src/monkeysphere $(DESTDIR)$(PREFIX)/bin
        install src/monkeysphere-host src/monkeysphere-authentication $(DESTDIR)$(PREFIX)/sbin
+       install src/monkeysphere-authentication-keys-for-user $(DESTDIR)$(PREFIX)/share/monkeysphere
        install -m 0644 src/share/common $(DESTDIR)$(PREFIX)/share/monkeysphere
        install -m 0644 src/share/defaultenv $(DESTDIR)$(PREFIX)/share/monkeysphere
        install -m 0755 src/share/checkperms $(DESTDIR)$(PREFIX)/share/monkeysphere
index 7c126735c5d80c60198dbe7d738ae0601597ea5d..e9e24b06e14a1ebeb05f597c7734043110f4cdc5 100644 (file)
@@ -1,4 +1,4 @@
-.TH MONKEYSPHERE-AUTHENTICATION "8" "January 2010" "monkeysphere" "System Commands"
+.TH MONKEYSPHERE-AUTHENTICATION "8" "July 3, 2010" "monkeysphere" "System Commands"
 
 .SH NAME
 
@@ -42,6 +42,11 @@ Refresh all keys in the monkeysphere-authentication keyring.  If no
 accounts are specified, then all accounts on the system are processed.
 `r' may be used in place of `refresh\-keys'.
 .TP
+.B keys\-for\-user USER
+Output to stdout all acceptable keys for a given user.  User IDs are
+read from the user's authorized_user_ids file (see
+MONKEYSPHERE_AUTHORIZED_USER_IDS below).
+.TP
 .B add\-id\-certifier KEYID|FILE
 Instruct system to trust user identity certifications made by KEYID.
 The key ID will be loaded from the keyserver.  A file may be loaded
index 8c58645bcb483fb30f04c88ca279806ff6c3e7a6..af8c40dd5e49f8d775675c06c542d8981d9023af 100755 (executable)
@@ -55,6 +55,7 @@ Monkeysphere authentication admin tool.
 subcommands:
  update-users (u) [USER]...        update user authorized_keys files
  refresh-keys (r)                  refresh keys in keyring
+ keys-for-user USER                output valid keys for user
 
  add-id-certifier (c+) KEYID|FILE  import and tsign a certification key
    [--domain (-n) DOMAIN]            limit ID certifications to DOMAIN
@@ -177,6 +178,11 @@ case $COMMAND in
        gpg_sphere "--keyserver $KEYSERVER --refresh-keys"
        ;;
 
+    'keys-for-user')
+       source "${MASHAREDIR}/keys_for_user"
+       keys_for_user "$@"
+       ;;
+
     'add-identity-certifier'|'add-id-certifier'|'add-certifier'|'c+')
        source "${MASHAREDIR}/setup"
        setup
diff --git a/src/monkeysphere-authentication-keys-for-user b/src/monkeysphere-authentication-keys-for-user
new file mode 100755 (executable)
index 0000000..fb589ea
--- /dev/null
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+exec monkeysphere-authentication keys-for-user "$@"
diff --git a/src/share/ma/keys_for_user b/src/share/ma/keys_for_user
new file mode 100644 (file)
index 0000000..f48d5d3
--- /dev/null
@@ -0,0 +1,50 @@
+# -*-shell-script-*-
+# This should be sourced by bash (though we welcome changes to make it POSIX sh compliant)
+
+# Monkeysphere authentication keys-for-user subcommand
+#
+# The monkeysphere scripts are written by:
+# Jameson Rollins <jrollins@finestructure.net>
+# Daniel Kahn Gillmor <dkg@fifthhorseman.net>
+#
+# They are Copyright 2008-2010, and are all released under the GPL,
+# version 3 or later.
+
+# This command could be run as an sshd AuthorizedKeysCommand to
+# provide the authorized keys for a user, based on OpenPGP user id's
+# listed in the user's authorized_user_ids file.
+
+keys_for_user() {
+
+local uname
+local authorizedUserIDs
+local line
+local userIDs
+
+# get users from command line
+uname="$1"
+
+# path to authorized_user_ids file, translating ssh-style path
+# variables
+authorizedUserIDs=$(translate_ssh_variables "$uname" "$AUTHORIZED_USER_IDS")
+
+# exit if the authorized_user_ids file is empty
+if [ ! -s "$authorizedUserIDs" ] ; then
+    failure "authorized_user_ids file '$authorizedUserIDs' is empty or does not exist."
+fi
+
+log debug "authorized_user_ids file: $authorizedUserIDs"
+
+# check permissions on the authorized_user_ids file path
+check_key_file_permissions "$uname" "$authorizedUserIDs" || failure
+
+GNUPGHOME="$GNUPGHOME_SPHERE"
+export GNUPGHOME
+
+# extract user IDs from authorized_user_ids file
+IFS=$'\n'
+for line in $(meat "$authorizedUserIDs") ; do
+    su_monkeysphere_user ". ${SYSSHAREDIR}/common; keys_for_userid '$line'"
+done
+
+}