version 1.9, 1999/11/23 22:25:52 |
version 1.10, 1999/11/24 00:26:00 |
|
|
/* |
/* |
|
* Dug Song <dugsong@UMICH.EDU> |
|
* Kerberos v4 authentication and ticket-passing routines. |
|
*/ |
|
|
auth-kerberos.c |
|
|
|
Dug Song <dugsong@UMICH.EDU> |
|
|
|
Kerberos v4 authentication and ticket-passing routines. |
|
|
|
$Id$ |
|
*/ |
|
|
|
#include "includes.h" |
#include "includes.h" |
#include "packet.h" |
#include "packet.h" |
#include "xmalloc.h" |
#include "xmalloc.h" |
|
|
|
|
*client = xmalloc(MAX_K_NAME_SZ); |
*client = xmalloc(MAX_K_NAME_SZ); |
(void) snprintf(*client, MAX_K_NAME_SZ, "%s%s%s@%s", adat.pname, |
(void) snprintf(*client, MAX_K_NAME_SZ, "%s%s%s@%s", adat.pname, |
*adat.pinst ? "." : "", adat.pinst, adat.prealm); |
*adat.pinst ? "." : "", adat.pinst, adat.prealm); |
|
|
/* Check ~/.klogin authorization now. */ |
/* Check ~/.klogin authorization now. */ |
if (kuserok(&adat, (char *) server_user) != KSUCCESS) { |
if (kuserok(&adat, (char *) server_user) != KSUCCESS) { |
|
|
/* If we can't successfully encrypt the checksum, we send back an |
/* If we can't successfully encrypt the checksum, we send back an |
empty message, admitting our failure. */ |
empty message, admitting our failure. */ |
if ((r = krb_mk_priv((u_char *) & cksum, reply.dat, sizeof(cksum) + 1, |
if ((r = krb_mk_priv((u_char *) & cksum, reply.dat, sizeof(cksum) + 1, |
schedule, &adat.session, &local, &foreign)) < 0) { |
schedule, &adat.session, &local, &foreign)) < 0) { |
packet_send_debug("Kerberos V4 mk_priv: (%d) %s", r, krb_err_txt[r]); |
packet_send_debug("Kerberos V4 mk_priv: (%d) %s", r, krb_err_txt[r]); |
reply.dat[0] = 0; |
reply.dat[0] = 0; |
reply.length = 0; |
reply.length = 0; |
|
|
|
|
if (strcmp(creds.service, "krbtgt")) { |
if (strcmp(creds.service, "krbtgt")) { |
log("Kerberos V4 tgt (%s%s%s@%s) rejected for %s", creds.pname, |
log("Kerberos V4 tgt (%s%s%s@%s) rejected for %s", creds.pname, |
creds.pinst[0] ? "." : "", creds.pinst, creds.realm, pw->pw_name); |
creds.pinst[0] ? "." : "", creds.pinst, creds.realm, |
|
pw->pw_name); |
packet_send_debug("Kerberos V4 tgt (%s%s%s@%s) rejected for %s", |
packet_send_debug("Kerberos V4 tgt (%s%s%s@%s) rejected for %s", |
creds.pname, creds.pinst[0] ? "." : "", creds.pinst, |
creds.pname, creds.pinst[0] ? "." : "", creds.pinst, |
creds.realm, pw->pw_name); |
creds.realm, pw->pw_name); |
goto auth_kerberos_tgt_failure; |
goto auth_kerberos_tgt_failure; |
} |
} |
if (!krb4_init(pw->pw_uid)) |
if (!krb4_init(pw->pw_uid)) |
|
|
goto auth_kerberos_tgt_failure; |
goto auth_kerberos_tgt_failure; |
|
|
if (save_credentials(creds.service, creds.instance, creds.realm, |
if (save_credentials(creds.service, creds.instance, creds.realm, |
creds.session, creds.lifetime, creds.kvno, |
creds.session, creds.lifetime, creds.kvno, |
&creds.ticket_st, creds.issue_date) != KSUCCESS) { |
&creds.ticket_st, creds.issue_date) != KSUCCESS) { |
packet_send_debug("Kerberos V4 tgt refused: couldn't save credentials"); |
packet_send_debug("Kerberos V4 tgt refused: couldn't save credentials"); |
goto auth_kerberos_tgt_failure; |
goto auth_kerberos_tgt_failure; |
} |
} |
|
|
chown(tkt_string(), pw->pw_uid, pw->pw_gid); |
chown(tkt_string(), pw->pw_uid, pw->pw_gid); |
|
|
packet_send_debug("Kerberos V4 tgt accepted (%s.%s@%s, %s%s%s@%s)", |
packet_send_debug("Kerberos V4 tgt accepted (%s.%s@%s, %s%s%s@%s)", |
creds.service, creds.instance, creds.realm, creds.pname, |
creds.service, creds.instance, creds.realm, creds.pname, |
creds.pinst[0] ? "." : "", creds.pinst, creds.realm); |
creds.pinst[0] ? "." : "", creds.pinst, creds.realm); |
memset(&creds, 0, sizeof(creds)); |
memset(&creds, 0, sizeof(creds)); |
packet_start(SSH_SMSG_SUCCESS); |
packet_start(SSH_SMSG_SUCCESS); |
packet_send(); |
packet_send(); |
|
|
log("AFS token (%s@%s) rejected for %s", creds.pname, creds.realm, |
log("AFS token (%s@%s) rejected for %s", creds.pname, creds.realm, |
pw->pw_name); |
pw->pw_name); |
packet_send_debug("AFS token (%s@%s) rejected for %s", creds.pname, |
packet_send_debug("AFS token (%s@%s) rejected for %s", creds.pname, |
creds.realm, pw->pw_name); |
creds.realm, pw->pw_name); |
memset(&creds, 0, sizeof(creds)); |
memset(&creds, 0, sizeof(creds)); |
packet_start(SSH_SMSG_FAILURE); |
packet_start(SSH_SMSG_FAILURE); |
packet_send(); |
packet_send(); |
|
|
return 0; |
return 0; |
} |
} |
packet_send_debug("AFS token accepted (%s@%s, %s@%s)", creds.service, |
packet_send_debug("AFS token accepted (%s@%s, %s@%s)", creds.service, |
creds.realm, creds.pname, creds.realm); |
creds.realm, creds.pname, creds.realm); |
memset(&creds, 0, sizeof(creds)); |
memset(&creds, 0, sizeof(creds)); |
packet_start(SSH_SMSG_SUCCESS); |
packet_start(SSH_SMSG_SUCCESS); |
packet_send(); |
packet_send(); |