(kadmind_loop): break-up and restructure
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6115 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
145
kadmin/server.c
145
kadmin/server.c
@@ -329,90 +329,37 @@ fail:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
krb5_error_code
|
static void
|
||||||
kadmind_loop (krb5_context, krb5_auth_context, krb5_keytab, int);
|
v5_loop (krb5_context context,
|
||||||
|
|
||||||
void
|
|
||||||
handle_v4(krb5_context context,
|
|
||||||
int len,
|
|
||||||
int fd);
|
|
||||||
|
|
||||||
krb5_error_code
|
|
||||||
kadmind_loop(krb5_context context,
|
|
||||||
krb5_auth_context ac,
|
krb5_auth_context ac,
|
||||||
krb5_keytab keytab,
|
void *kadm_handle,
|
||||||
int fd)
|
int fd)
|
||||||
{
|
{
|
||||||
char *client;
|
char *client;
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
void *kadm_handle;
|
|
||||||
|
|
||||||
while(1){
|
|
||||||
krb5_data in, out, msg, reply;
|
|
||||||
unsigned char tmp[4];
|
|
||||||
unsigned long len;
|
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
|
unsigned long len;
|
||||||
|
u_char tmp[4];
|
||||||
struct iovec iov[2];
|
struct iovec iov[2];
|
||||||
krb5_boolean krb4_packet = 0;
|
krb5_data in, out, msg, reply;
|
||||||
|
|
||||||
n = krb5_net_read(context, &fd, tmp, 4);
|
|
||||||
if(n == 0)
|
|
||||||
exit(0);
|
|
||||||
if(n < 0)
|
|
||||||
krb5_errx(context, 1, "read error: %d", errno);
|
|
||||||
if(n < 4)
|
|
||||||
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 >>= 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");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
krb5_net_read(context, &fd, tmp, 4);
|
||||||
|
_krb5_get_int (tmp, &len, 4);
|
||||||
|
|
||||||
in.length = len;
|
in.length = len;
|
||||||
in.data = malloc(in.length);
|
in.data = malloc(in.length);
|
||||||
n = krb5_net_read(context, &fd, in.data, in.length);
|
n = krb5_net_read(context, &fd, in.data, in.length);
|
||||||
|
if (n == 0)
|
||||||
|
exit (0);
|
||||||
if(n < 0)
|
if(n < 0)
|
||||||
krb5_errx(context, 1, "read error: %d", errno);
|
krb5_errx(context, 1, "read error: %d", errno);
|
||||||
if(n < in.length)
|
if(n < in.length)
|
||||||
krb5_errx(context, 1, "short read (%ld)", (long int)n);
|
krb5_errx(context, 1, "short read (%ld)", (long int)n);
|
||||||
if(!krb4_packet) {
|
|
||||||
ret = krb5_rd_priv(context, ac, &in, &out, NULL);
|
ret = krb5_rd_priv(context, ac, &in, &out, NULL);
|
||||||
krb5_data_free(&in);
|
krb5_data_free(&in);
|
||||||
kadmind_dispatch(kadm_handle, &out, &msg);
|
kadmind_dispatch(kadm_handle, &out, &msg);
|
||||||
krb5_data_free(&out);
|
krb5_data_free(&out);
|
||||||
}
|
|
||||||
ret = krb5_mk_priv(context, ac, &msg, &reply, NULL);
|
ret = krb5_mk_priv(context, ac, &msg, &reply, NULL);
|
||||||
krb5_data_free(&msg);
|
krb5_data_free(&msg);
|
||||||
if(ret)
|
if(ret)
|
||||||
@@ -432,3 +379,73 @@ kadmind_loop(krb5_context context,
|
|||||||
krb5_errx(context, 1, "short write");
|
krb5_errx(context, 1, "short write");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_v5(krb5_context context,
|
||||||
|
krb5_auth_context ac,
|
||||||
|
krb5_keytab keytab,
|
||||||
|
int len,
|
||||||
|
int fd)
|
||||||
|
{
|
||||||
|
krb5_error_code ret;
|
||||||
|
u_char tmp[4];
|
||||||
|
krb5_ticket *ticket;
|
||||||
|
krb5_principal server;
|
||||||
|
char *client;
|
||||||
|
void *kadm_handle;
|
||||||
|
|
||||||
|
krb5_net_read(context, &fd, tmp, len);
|
||||||
|
if(len != sizeof(KRB5_SENDAUTH_VERSION) ||
|
||||||
|
memcmp(tmp, KRB5_SENDAUTH_VERSION, len) != 0)
|
||||||
|
krb5_errx(context, 1, "bad sendauth version %.8s", tmp);
|
||||||
|
|
||||||
|
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_err (context, 1, ret, "kadm5_init_with_password_ctx");
|
||||||
|
v5_loop (context, ac, kadm_handle, fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
krb5_error_code
|
||||||
|
kadmind_loop(krb5_context context,
|
||||||
|
krb5_auth_context ac,
|
||||||
|
krb5_keytab keytab,
|
||||||
|
int fd)
|
||||||
|
{
|
||||||
|
unsigned char tmp[4];
|
||||||
|
ssize_t n;
|
||||||
|
unsigned long len;
|
||||||
|
|
||||||
|
n = krb5_net_read(context, &fd, tmp, 4);
|
||||||
|
if(n == 0)
|
||||||
|
exit(0);
|
||||||
|
if(n < 0)
|
||||||
|
krb5_errx(context, 1, "read error: %d", errno);
|
||||||
|
if(n < 4)
|
||||||
|
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 >>= 16;
|
||||||
|
#ifdef KRB4
|
||||||
|
handle_v4(context, len, fd);
|
||||||
|
#else
|
||||||
|
krb5_errx(context, 1, "packet appears to be version 4");
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
handle_v5(context, ac, keytab, len, fd);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user