move from lib/kadm5
authorJohan Danielsson <joda@pdc.kth.se>
Mon, 3 May 1999 16:43:31 +0000 (16:43 +0000)
committerJohan Danielsson <joda@pdc.kth.se>
Mon, 3 May 1999 16:43:31 +0000 (16:43 +0000)
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@6081 ec53bebd-3082-4978-b11e-865c3cabbd6b

kadmin/server.c

index 230befe82f4b9e8132c6259ea0effc129e0f01ed..f1186cc16fc3c824914321e0d11eae9f94d136c8 100644 (file)
@@ -36,7 +36,8 @@
  * SUCH DAMAGE. 
  */
 
-#include "kadm5_locl.h"
+#include "kadmin_locl.h"
+#include <krb5-private.h>
 
 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);