jafo at tummy.com
2001-May-17 07:19 UTC
Patch: Set SSH_AUTHKEY to key id used to authenticate.
Attached is a patch which sets the SSH_AUTHKEY environment variable to be the remaining data at the end of an SSH key which is used for authentication. The motivation behind this is that there are time in which it's useful to know who is on the other end of the connection. For example, if I log in as root on a box, I'd like to be able to configure vi-specific settings, while another user may prefer to have emacs. Originally I had thought about doing it with environment variables. Set it up with: SSH_PROPOGATE_ENV="SSH_PROPOGATE_ENV INPUTRC REMOTE_USER" INPUTRC="$HOME/.inputrc-vi" REMOTE_USER="jafo" Something like that. Obviously, there are some problems with "$HOME" getting expanded on the client side, but worst case you could use REMOTE_USER in the .profile. Basing it on the key id seemed to be the simplest thing for me though... A general-purpose way to propogate environment variables would be nice though. Enjoy, Sean -- If the code and the comments disagree, then both are probably wrong. -- Norm Schryer Sean Reifschneider, Inimitably Superfluous <jafo at tummy.com> tummy.com - Linux Consulting since 1995. Qmail, KRUD, Firewalls, Python -------------- next part -------------- diff -ur openssh-2.9p1/auth2.c openssh-2.9p1authdata/auth2.c --- openssh-2.9p1/auth2.c Wed Apr 25 06:44:15 2001 +++ openssh-2.9p1authdata/auth2.c Thu May 17 00:56:38 2001 @@ -771,6 +771,7 @@ if (key_equal(found, key) && auth_parse_options(pw, options, file, linenum) == 1) { found_key = 1; + key_matching_data(cp); debug("matching key found: file %s, line %ld", file, linenum); break; diff -ur openssh-2.9p1/key.c openssh-2.9p1authdata/key.c --- openssh-2.9p1/key.c Tue Apr 17 12:11:37 2001 +++ openssh-2.9p1authdata/key.c Thu May 17 00:56:46 2001 @@ -781,3 +781,23 @@ break; } } + +const char *key_matching_data(char *cp) +{ + static int isSet = 0; + static char name[100]; + char *s; + int len = 0; + + if (!cp) return(isSet ? name : NULL); + + /* skip leading white-space */ + for (; *cp && isspace(*cp); cp++); + /* copy the data to name */ + for (s = name; *cp && !isspace(*cp) && len < sizeof(name); s++, cp++, len++) + *s = *cp; + *s = '\0'; + isSet = 1; + + return(NULL); +} diff -ur openssh-2.9p1/key.h openssh-2.9p1authdata/key.h --- openssh-2.9p1/key.h Tue Apr 17 12:11:37 2001 +++ openssh-2.9p1authdata/key.h Thu May 17 00:34:28 2001 @@ -80,5 +80,6 @@ Key *key, u_char *signature, int signaturelen, u_char *data, int datalen); +const char *key_matching_data(char *cp); #endif diff -ur openssh-2.9p1/session.c openssh-2.9p1authdata/session.c --- openssh-2.9p1/session.c Wed Apr 18 09:29:34 2001 +++ openssh-2.9p1authdata/session.c Thu May 17 00:41:15 2001 @@ -57,6 +57,7 @@ #include "serverloop.h" #include "canohost.h" #include "session.h" +#include "key.h" #ifdef WITH_IRIX_PROJECT #include <proj.h> @@ -1281,6 +1282,8 @@ get_remote_ipaddr(), get_remote_port(), get_local_port()); child_set_env(&env, &envsize, "SSH_CLIENT", buf); + if (key_matching_data(NULL)) + child_set_env(&env, &envsize, "SSH_AUTHKEY", key_matching_data(NULL)); if (s->ttyfd != -1) child_set_env(&env, &envsize, "SSH_TTY", s->tty); if (s->term)