X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=src%2Fmonkeysphere-host;h=a5db8c1e0294208f30de1c5924654eca0a2cb1df;hb=e9f00652e3503ef2292e6d27df80cbb4c8e09504;hp=fab3ef70e96ad5d22a23e2abcd4d69dc709d82fa;hpb=7dbd6806e538ff8732dd87fcf20bfd8271464552;p=monkeysphere.git diff --git a/src/monkeysphere-host b/src/monkeysphere-host index fab3ef7..a5db8c1 100755 --- a/src/monkeysphere-host +++ b/src/monkeysphere-host @@ -74,7 +74,7 @@ EOF # function to interact with the gpg keyring gpg_host() { - GNUPGHOME="$GNUPGHOME_HOST" gpg --no-greeting --quiet --no-tty "$@" + GNUPGHOME="$GNUPGHOME_HOST" gpg --no-auto-check-trustdb --no-greeting --quiet --no-tty "$@" } # list the info about the a key, in colon format, to stdout @@ -102,10 +102,85 @@ update_pgp_pub_file() { > "$HOST_KEY_FILE" } -# check that the service name is well formed +# check that the service name is well formed. we assume that the +# service name refers to a host; DNS labels for host names are limited +# to a very small range of characters (see RFC 1912, section 2.1). + +# FIXME: i'm failing to check here for label components that are +# all-number (e.g. ssh://666.666), which are technically not allowed +# (though some exist on the 'net, apparently) + +# FIXME: this will probably misbehave if raw IP addresses are provided, +# either IPv4 or IPv6 using the bracket notation. + +# FIXME: this doesn't address the use of hashed User IDs. + check_service_name() { local name="$1" - log error "FIX ME: check service name" + local errs="" + local scheme + local port + local assigned_ports + + [ -n "$name" ] || \ + failure "You must supply a service name to check" + + printf '%s' "$name" | perl -n -e '($str = $_) =~ s/\s//g ; exit !(lc($str) eq $_);' || \ + failure "Not a valid service name: '$name' + +Service names should be canonicalized to all lower-case, +with no whitespace" + + [[ "$name" =~ ^[a-z0-9./:-]+$ ]] || \ + failure "Not a valid service name: '$name' + +Service names should contain only lower-case ASCII letters +numbers, dots (.), hyphens (-), slashes (/), and a colon (:). +If you are using non-ASCII characters (e.g. IDN), you should +use the canonicalized ASCII (NAMEPREP -> Punycode) representation +(see RFC 3490)." + + [[ "$name" =~ \. ]] || \ + failure "Not a valid service name: '$name' + +Service names should use fully-qualified domain names (FQDN), but the +domain name you chose appears to only have the local part. For +example: don't use 'ssh://foo' ; use 'ssh://foo.example.com' instead." + + [[ "$name" =~ ^[a-z0-9]([a-z0-9-]*[a-z0-9])?://[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.|((\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+))(:[1-9][0-9]{0,4})?$ ]] || \ + failure "Not a valid service name: '$name' + +Service names look like ://full.example.com[:], +where is something like ssh or https, and is +a decimal number (supplied only if the service is on a non-standard +port)." + + scheme=$(cut -f1 -d: <<<"$name") + port=$(cut -f3 -d: <<<"$name") + + # check that the scheme name is found in the system services + # database + available_=$(get_port_for_service "$scheme") || \ + log error "Error looking up service scheme named '%s'" "$scheme" + + # FIXME: if the service isn't found, or does not have a port, what + # should we do? at the moment, we're just warning. + + if [ -n "$port" ]; then + # check that the port number is a legitimate port number (> 0, < 65536) + [ "$port" -gt 0 ] && [ "$port" -lt 65536 ] || \ + failure "The given port number should be greater than 0 and +less than 65536. '$port' is not OK" + + # if the port number is given, and the scheme is in the services + # database, check that the port number does *not* match the + # default port. + if (printf '%s' "$assigned_ports" | grep -q -F -x "$port" ) ; then + failure $(printf "The scheme %s uses port number %d by default. +You should leave off the port number if it is the default" "$scheme" "$port") + fi + fi + } # fail if host key not present @@ -164,7 +239,7 @@ prompt_userid_exists() { if gpgOut=$(gpg_host_list_keys "=${userID}" 2>/dev/null) ; then fingerprint=$(echo "$gpgOut" | grep '^fpr:' | cut -d: -f10) if [ "$PROMPT" != "false" ] ; then - printf "Service name '%s' is already being used by key '%s'.\nAre you sure you want to use it again? (y/N) " "$fingerprint" "$userID" >&2 + printf "Service name '%s' is already being used by key '%s'.\nAre you sure you want to use it again? (y/N) " "$userID" "$fingerprint" >&2 read OK; OK=${OK:=N} if [ "${OK/y/Y}" != 'Y' ] ; then failure "Service name not added." @@ -181,20 +256,21 @@ multi_key() { shift local keys=$@ local i=0 - local fprs=($(list_primary_fingerprints <"$HOST_KEY_FILE")) local key check_no_keys + local fprs=($(list_primary_fingerprints <"$HOST_KEY_FILE")) + if [[ -z "$1" || "$1" == '--all' ]] ; then keys="${fprs[@]}" fi for key in $keys ; do if (( i++ > 0 )) ; then - echo "##############################" + printf "\n" fi - eval "$cmd" "$key" + "$cmd" "$key" done } @@ -226,15 +302,16 @@ show_key() { # create the ssh key tmpssh="$GNUPGHOME"/ssh_host_key_rsa_pub - gpg --export "$fingerprint" 2>/dev/null \ + gpg --export --no-armor "$fingerprint" 2>/dev/null \ | openpgp2ssh 2>/dev/null >"$tmpssh" # list the host key info # FIXME: make no-show-keyring work so we don't have to do the grep'ing # FIXME: can we show uid validity somehow? gpg --list-keys --list-options show-unusable-uids "$fingerprint" 2>/dev/null \ - | grep -v "^${GNUPGHOME}/pubring.gpg$" \ - | egrep -v '^-+$' + | grep -v "^${GNUPGHOME}/pubring.gpg$" \ + | egrep -v '^-+$' \ + | grep -v '^$' # list revokers, if there are any revokers=$(gpg --list-keys --with-colons --fixed-list-mode "$fingerprint" \ @@ -244,7 +321,6 @@ show_key() { for key in $revokers ; do echo "revoker: $key" done - echo fi # list the pgp fingerprint @@ -303,7 +379,7 @@ COMMAND="$1" shift case $COMMAND in - 'import-key'|'i') + 'import-key'|'import'|'i') source "${MHSHAREDIR}/import_key" import_key "$@" ;; @@ -312,7 +388,7 @@ case $COMMAND in multi_key show_key "$@" ;; - 'set-expire'|'extend-key'|'e') + 'set-expire'|'extend-key'|'extend'|'e') source "${MHSHAREDIR}/set_expire" set_expire "$@" ;; @@ -351,7 +427,7 @@ case $COMMAND in update_pgp_pub_file ;; - 'version'|'v') + 'version'|'--version'|'v') version ;;