This file is indexed.

/usr/share/monkeysphere/ma/update_users is in monkeysphere 0.41-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# -*-shell-script-*-
# This should be sourced by bash (though we welcome changes to make it POSIX sh compliant)

# Monkeysphere authentication update-users 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 2008-2009, and are all released under the GPL,
# version 3 or later.

update_users() {

local returnCode=0
local unames
local uname
local authorizedKeysDir
local tmpAuthorizedKeys
local authorizedUserIDs

if [ "$1" ] ; then
    # get users from command line
    unames="$@"
else	     
    # or just look at all users if none specified
    unames=$(list_users)
fi

# set gnupg home
GNUPGHOME="$GNUPGHOME_SPHERE"

# the authorized_keys directory
authorizedKeysDir="${SYSDATADIR}/authorized_keys"

# check to see if the gpg trust database has been initialized
if [ ! -s "${GNUPGHOME}/trustdb.gpg" ] ; then
    failure "GNUPG trust database uninitialized.  Please see MONKEYSPHERE-SERVER(8)."
fi

# make sure the authorized_keys directory exists
mkdir -p "${authorizedKeysDir}"

# loop over users
for uname in $unames ; do
    # check all specified users exist
    if ! id "$uname" >/dev/null ; then
	log error "----- unknown user '$uname' -----"
	continue
    fi

    log verbose "----- user: $uname -----"

    # make temporary directory
    TMPLOC=$(mktemp -d ${MATMPDIR}/tmp.XXXXXXXXXX) || failure "Could not create temporary directory!"

    # trap to delete temporary directory on exit
    trap "rm -rf $TMPLOC" EXIT

     # create temporary authorized_keys file
    tmpAuthorizedKeys="${TMPLOC}/authorized_keys"
    touch "$tmpAuthorizedKeys"

    # set restrictive permissions on the temporary files
    # FIXME: is there a better way to do this?
    chmod 0700 "$TMPLOC"
    chmod 0600 "$tmpAuthorizedKeys"
    chown -R "$MONKEYSPHERE_USER" "$TMPLOC"

    # process authorized_user_ids file
    log debug "checking for authorized_user_ids..."
    # translating ssh-style path variables
    authorizedUserIDs=$(translate_ssh_variables "$uname" "$AUTHORIZED_USER_IDS")
    if [ -s "$authorizedUserIDs" ] ; then
	# check permissions on the authorized_user_ids file path
	if check_key_file_permissions "$uname" "$authorizedUserIDs" ; then
	    log verbose "processing authorized_user_ids..."

	    # process authorized_user_ids file, as monkeysphere user
	    su_monkeysphere_user \
		/usr/bin/env "STRICT_MODES=$STRICT_MODES" bash -c "$(printf ". %q && process_authorized_user_ids -" "${SYSSHAREDIR}/common")"\
		< "$authorizedUserIDs" \
		> "$tmpAuthorizedKeys"

	else
	    log debug "not processing authorized_user_ids."
	fi
    else
	log debug "empty or absent authorized_user_ids file."
    fi

    # add user-controlled authorized_keys file if specified translate
    # ssh-style path variables
    rawAuthorizedKeys=$(translate_ssh_variables "$uname" "$RAW_AUTHORIZED_KEYS")
    if [ "$rawAuthorizedKeys" != 'none' ] ; then
	log debug "checking for raw authorized_keys..."
	if [ -s "$rawAuthorizedKeys" ] ; then
	    # check permissions on the authorized_keys file path
	    if check_key_file_permissions "$uname" "$rawAuthorizedKeys" ; then
		log verbose "adding raw authorized_keys..."

		cat "$rawAuthorizedKeys" >> "$tmpAuthorizedKeys"

	    else
		log debug "not adding raw authorized_keys."
	    fi
	else
	    log debug "empty or absent authorized_keys file."
	fi
    fi

    # move the new authorized_keys file into place
    if [ -s "$tmpAuthorizedKeys" ] ; then
	# openssh appears to check the contents of the authorized_keys
	# file as the user in question, so the file must be readable
	# by that user at least.

	# but in general, we don't want the user tampering with this
	# file directly, so we'll adopt this approach: Own the file by
	# the monkeysphere-server invoker (usually root, but should be
	# the same uid that sshd is launched as); change the group of
	# the file so that members of the user's group can read it.

	if [ "$OUTPUT_STDOUT" ] ; then
	    log debug "outputting keys to stdout..."
	    cat "$tmpAuthorizedKeys"
	else
	    log debug "moving new file to ${authorizedKeysDir}/${uname}..."
	    # FIXME: is there a better way to do this?
	    chown $(whoami) "$tmpAuthorizedKeys" && \
		chgrp $(id -g "$uname") "$tmpAuthorizedKeys" && \
		chmod g+r "$tmpAuthorizedKeys" && \
		mv -f "$tmpAuthorizedKeys" "${authorizedKeysDir}/${uname}" || \
		{
		log error "Failed to install authorized_keys for '$uname'!"
		rm -f "${authorizedKeysDir}/${uname}"
		# indicate that there has been a failure:
		returnCode=1
	    }
	fi
    else
	rm -f "${authorizedKeysDir}/${uname}"
    fi

    # unset the trap
    trap - EXIT

    # destroy temporary directory
    rm -rf "$TMPLOC"
done

return $returnCode
}