From 323e23dfd39712ea9f622c5ca1616a5aadb02bab Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Mon, 3 May 1999 16:43:31 +0000 Subject: [PATCH] move from lib/kadm5 git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6081 ec53bebd-3082-4978-b11e-865c3cabbd6b --- kadmin/server.c | 59 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/kadmin/server.c b/kadmin/server.c index 230befe82..f1186cc16 100644 --- a/kadmin/server.c +++ b/kadmin/server.c @@ -36,7 +36,8 @@ * SUCH DAMAGE. */ -#include "kadm5_locl.h" +#include "kadmin_locl.h" +#include RCSID("$Id$"); @@ -328,24 +329,24 @@ fail: return 0; } +krb5_error_code +kadmind_loop (krb5_context, krb5_auth_context, krb5_keytab, int); + +void +handle_v4(krb5_context context, + int len, + int fd); + krb5_error_code kadmind_loop(krb5_context context, krb5_auth_context ac, - const char *client, + krb5_keytab keytab, int fd) { + char *client; krb5_error_code ret; void *kadm_handle; - ret = kadm5_init_with_password_ctx(context, - client, - NULL, - KADM5_ADMIN_SERVICE, - NULL, 0, 0, - &kadm_handle); - if(ret) { - abort(); - } - + while(1){ krb5_data in, out, msg, reply; unsigned char tmp[4]; @@ -363,10 +364,42 @@ kadmind_loop(krb5_context context, krb5_errx(context, 1, "short read (%ld)", (long int)n); _krb5_get_int(tmp, &len, 4); if(len > 0xffff && (len & 0xffff) == ('K' << 8) + 'A') { - len = len << 16; + len >>= 16; krb4_packet = 1; +#ifdef KRB4 + handle_v4(context, len, fd); +#else krb5_errx(context, 1, "packet appears to be version 4"); +#endif } + krb5_net_read(context, &fd, tmp, sizeof(tmp)); + if(len != sizeof(KRB5_SENDAUTH_VERSION) || + memcmp(tmp, KRB5_SENDAUTH_VERSION, sizeof(tmp)) != 0) + krb5_errx(context, 1, "bad sendauth version %.8s", tmp); + + { + krb5_ticket *ticket; + krb5_principal server; + krb5_parse_name(context, KADM5_ADMIN_SERVICE, &server); + ret = krb5_recvauth(context, &ac, &fd, KADMIN_APPL_VERSION, + server, KRB5_RECVAUTH_IGNORE_VERSION, + keytab, &ticket); + krb5_free_principal(context, server); + + if(ret) + krb5_err(context, 1, ret, "krb5_recvauth"); + krb5_unparse_name(context, ticket->client, &client); + ret = kadm5_init_with_password_ctx(context, + client, + NULL, + KADM5_ADMIN_SERVICE, + NULL, 0, 0, + &kadm_handle); + if(ret) + krb5_abort(context, ret, "kadm5_init_with_password_ctx"); + } + + in.length = len; in.data = malloc(in.length); n = krb5_net_read(context, &fd, in.data, in.length);