diff --git a/lib/kafs/afskrb.c b/lib/kafs/afskrb.c index 58a084148..5992f9441 100644 --- a/lib/kafs/afskrb.c +++ b/lib/kafs/afskrb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995 - 2001 Kungliga Tekniska Högskolan + * Copyright (c) 1995 - 2001, 2003 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -35,22 +35,27 @@ RCSID("$Id$"); +#ifdef KRB4 + struct krb_kafs_data { const char *realm; }; static int get_cred(kafs_data *data, const char *name, const char *inst, - const char *realm, CREDENTIALS *c) + const char *realm, uid_t uid, struct kafs_token *kt) { + CREDENTIALS c; KTEXT_ST tkt; - int ret = krb_get_cred((char*)name, (char*)inst, (char*)realm, c); + int ret = krb_get_cred((char*)name, (char*)inst, (char*)realm, &c); if (ret) { ret = krb_mk_req(&tkt, (char*)name, (char*)inst, (char*)realm, 0); if (ret == KSUCCESS) - ret = krb_get_cred((char*)name, (char*)inst, (char*)realm, c); + ret = krb_get_cred((char*)name, (char*)inst, (char*)realm, &c); } + if (ret == 0) + ret = _kafs_v4_to_kt(&c, uid, kt); return ret; } @@ -62,11 +67,13 @@ afslog_uid_int(kafs_data *data, const char *homedir) { int ret; - CREDENTIALS c; + struct kafs_token kt; char name[ANAME_SZ]; char inst[INST_SZ]; char realm[REALM_SZ]; + kt.ticket = NULL; + if (cell == 0 || cell[0] == 0) return _kafs_afslog_all_local_cells (data, uid, homedir); @@ -75,10 +82,13 @@ afslog_uid_int(kafs_data *data, if (ret != KSUCCESS) return ret; - ret = _kafs_get_cred(data, cell, realm_hint, realm, &c); + kt.ticket = NULL; + ret = _kafs_get_cred(data, cell, realm_hint, realm, uid, &kt); - if (ret == 0) - ret = kafs_settoken(cell, uid, &c); + if (ret == 0) { + ret = kafs_settoken_rxkad(cell, &kt.ct, kt.ticket, kt.ticket_len); + free(kt.ticket); + } return ret; } @@ -135,3 +145,27 @@ krb_realm_of_cell(const char *cell, char **realm) kd.get_realm = get_realm; return _kafs_realm_of_cell(&kd, cell, realm); } + +int +kafs_settoken(const char *cell, uid_t uid, CREDENTIALS *c) +{ + struct kafs_token kt; + int ret; + + kt.ticket = NULL; + + ret = _kafs_v4_to_kt(c, uid, &kt); + if (ret) + return ret; + + if (kt.ct.EndTimestamp < time(NULL)) { + free(kt.ticket); + return 0; + } + + ret = kafs_settoken_rxkad(cell, &kt.ct, kt.ticket, kt.ticket_len); + free(kt.ticket); + return ret; +} + +#endif /* KRB4 */