]> asedeno.scripts.mit.edu Git - 1ts-debian.git/commitdiff
I am committing the unforgivable sin of committing big glop of code with a origin/athena-update-branch
authorkcr <kcr@cbed1d16-5ef5-0310-b6a1-d4a37b08ba1f>
Wed, 3 Oct 2007 04:57:27 +0000 (04:57 +0000)
committerkcr <kcr@cbed1d16-5ef5-0310-b6a1-d4a37b08ba1f>
Wed, 3 Oct 2007 04:57:27 +0000 (04:57 +0000)
useless log message because I made the changes a year ago and want to go to sleep.

git-svn-id: svn://svn.1ts.org/debian/branches/athena-update-branch@211 cbed1d16-5ef5-0310-b6a1-d4a37b08ba1f

17 files changed:
zephyr/TODO
zephyr/h/internal.h
zephyr/h/zephyr/zephyr.h
zephyr/lib/ZFmtAuth.c
zephyr/lib/ZInit.c
zephyr/lib/ZMkAuth.c
zephyr/lib/ZReadZcode.c
zephyr/lib/Zinternal.c
zephyr/server/bdump.c
zephyr/server/client.c
zephyr/server/dispatch.c
zephyr/server/kstuff.c
zephyr/server/main.c
zephyr/server/realm.c
zephyr/server/subscr.c
zephyr/server/uloc.c
zephyr/server/zserver.h

index 5f59891287c1603f7ab1c65069b77ef2574a62fe..5f319f6d988fba58ba51194ed4cd2178123a58ba 100644 (file)
@@ -43,10 +43,3 @@ Milestone 6.5
 Milestone 7
          * brain dump via krb5, encrypted
          (optional) brain dump to/from file
-
-Milestone 8
-         * bring sourceforge up to date
-
-Milestone 9
-         * cough up a release of sourceforge
-       
index 9ec5e34b42f5f74ec4a4ea8fe5fe53aa2c5ef70b..403e85c965f1c6b27d0788c7e47b48de889301a8 100644 (file)
@@ -113,6 +113,14 @@ Code_t Z_WaitForNotice __P((ZNotice_t *notice,
                            int (*pred) __P((ZNotice_t *, void *)), void *arg,
                            int timeout));
 
+
+Code_t Z_NewFormatHeader __P((ZNotice_t *, char *, int, int *, Z_AuthProc));
+Code_t Z_NewFormatAuthHeader __P((ZNotice_t *, char *, int, int *, Z_AuthProc));
+Code_t Z_NewFormatRawHeader __P((ZNotice_t *, char *, int, int *, char **, 
+                                 int *, char **, char **));
+Code_t Z_AsciiFormatRawHeader __P((ZNotice_t *, char *, int, int *, char **, 
+                                 int *, char **, char **));
+
 void Z_gettimeofday(struct _ZTimeval *ztv, struct timezone *tz);
 
 #ifdef HAVE_KRB5
@@ -121,7 +129,11 @@ int ZGetCredsRealm(krb5_creds **creds_out, char *realm);
 Code_t Z_Checksum(krb5_data *cksumbuf, krb5_keyblock *keyblock, krb5_cksumtype cksumtype, char **asn1_data, int *asn1_len);
 Code_t Z_ExtractEncCksum(krb5_keyblock *keyblock, krb5_enctype *enctype, krb5_cksumtype *cksumtype);
 int Z_krb5_verify_cksum(krb5_keyblock *keyblock, krb5_data *cksumbuf, krb5_cksumtype cksumtype, char *asn1_data, int asn1_len);
-
+Code_t Z_InsertZcodeChecksum(krb5_keyblock *keyblock, ZNotice_t *notice, 
+                             char *buffer,
+                             char *cksum_start, int cksum_len, 
+                             char *cstart, char *cend, int buffer_len,
+                             int *length_ajdust);
 #endif
 
 #ifdef HAVE_KRB5_CREDS_KEYBLOCK_ENCTYPE
index c40e4ae4098221149182d603be79a843c393c5bc..59be66ae96662eb82bce985eec5d21c5e9b0dcd7 100644 (file)
@@ -156,6 +156,7 @@ Code_t ZParseNotice ZP((char*, int, ZNotice_t *));
 Code_t ZReadAscii ZP((char*, int, unsigned char*, int));
 Code_t ZReadAscii32 ZP((char *, int, unsigned long *));
 Code_t ZReadAscii16 ZP((char *, int, unsigned short *));
+Code_t ZReadZcode ZP((unsigned char*, unsigned char*, int, int *));
 Code_t ZSendPacket ZP((char*, int, int));
 Code_t ZSendList ZP((ZNotice_t*, char *[], int, Z_AuthProc));
 Code_t ZSrvSendList ZP((ZNotice_t*, char*[], int, Z_AuthProc, Code_t (*)()));
@@ -179,6 +180,8 @@ Code_t ZSrvSendRawList ZP((ZNotice_t*, char*[], int,
 Code_t ZMakeAscii ZP((char*, int, unsigned char*, int));
 Code_t ZMakeAscii32 ZP((char *, int, unsigned long));
 Code_t ZMakeAscii16 ZP((char *, int, unsigned int));
+Code_t ZMakeZcode ZP((char*, int, unsigned char*, int));
+Code_t ZMakeZcode32 ZP((char *, int, unsigned long));
 Code_t ZReceivePacket ZP((ZPacket_t, int*, struct sockaddr_in*));
 Code_t ZCheckAuthentication ZP((ZNotice_t*, struct sockaddr_in*));
 Code_t ZCheckZcodeAuthentication ZP((ZNotice_t*, struct sockaddr_in*));
index 2372bb6e62dec65c3095757fc99a9dfb794a2ee5..843dc328eb3aed6fcc8203f371137a58c2786ee4 100644 (file)
@@ -16,7 +16,7 @@ static char rcsid_ZFormatAuthenticNotice_c[] = "$Id: ZFmtAuth.c,v 1.20 1999/01/2
 
 #include <internal.h>
 
-#ifdef HAVE_KRB4
+#if defined(HAVE_KRB4) || defined(HAVE_KRB5)
 Code_t ZFormatAuthenticNotice(notice, buffer, buffer_len, len, session)
     ZNotice_t *notice;
     register char *buffer;
@@ -62,3 +62,71 @@ Code_t ZFormatAuthenticNotice(notice, buffer, buffer_len, len, session)
     return (ZERR_NONE);
 }
 #endif
+
+#ifdef HAVE_KRB5
+Code_t ZFormatAuthenticNoticeV5(notice, buffer, buffer_len, len, keyblock)
+    ZNotice_t *notice;
+    register char *buffer;
+    register int buffer_len;
+    int *len;
+    krb5_keyblock *keyblock;
+{
+    ZNotice_t newnotice;
+    char *ptr;
+    int retval, hdrlen, hdr_adj;
+    krb5_enctype enctype;
+    krb5_cksumtype cksumtype;
+    int valid;
+    char *svcinst, *x, *y;
+    int key_len;
+    char *cksum_start, *cstart, *cend;
+    int cksum_len;
+    
+    key_len = Z_keylen(keyblock);
+    retval = Z_ExtractEncCksum(keyblock, &enctype, &cksumtype);
+    if (retval)
+         return (ZAUTH_FAILED);
+
+    if (key_len == 8 && (enctype == ENCTYPE_DES_CBC_CRC || 
+                         enctype == ENCTYPE_DES_CBC_MD4 ||
+                         enctype == ENCTYPE_DES_CBC_MD5)) {
+         C_Block tmp;
+         memcpy(&tmp, Z_keydata(keyblock), key_len);
+         return ZFormatAuthenticNotice(notice, buffer, buffer_len, len,
+                                       tmp);
+    }
+         
+    newnotice = *notice;
+    newnotice.z_auth = 1;
+    newnotice.z_authent_len = 0;
+    newnotice.z_ascii_authent = "";
+
+    if ((retval = Z_NewFormatRawHeader(&newnotice, buffer, buffer_len,
+                                       &hdrlen, 
+                                       &cksum_start, &cksum_len, &cstart, 
+                                       &cend)) != ZERR_NONE)
+       return (retval);
+     
+    retval = Z_InsertZcodeChecksum(keyblock, &newnotice, buffer, 
+                                   cksum_start, cksum_len, cstart, cend, 
+                                   buffer_len, &hdr_adj);
+     if (retval)
+          return retval;
+     
+     hdrlen += hdr_adj;
+     
+     ptr = buffer+hdrlen;
+
+     if (newnotice.z_message_len+hdrlen > buffer_len)
+          return (ZERR_PKTLEN);
+     
+     (void) memcpy(ptr, newnotice.z_message, newnotice.z_message_len);
+     
+     *len = hdrlen+newnotice.z_message_len;
+     
+     if (*len > Z_MAXPKTLEN)
+          return (ZERR_PKTLEN);
+     
+     return (ZERR_NONE);
+}
+#endif
index 024e2b29a291846728ddd9bf133553cc9cf03fab..7d866ddf9d8bdf97418f2aac1a6341407a98d5ee 100644 (file)
@@ -130,7 +130,11 @@ Code_t ZInitialize()
       /* XXX check ticket file here */
       code = krb5_get_default_realm(Z_krb5_ctx, &p);
       strcpy(__Zephyr_realm, p);
+#ifdef HAVE_KRB5_FREE_DEFAULT_REALM
       krb5_free_default_realm(Z_krb5_ctx, p);
+#else
+      free(p);
+#endif
       if (code)
        return code;
     }
index 2a8b8da5888d66f636b6fe0ba368efeca607dcea..42f5591b63039d492b8738eccea4a650c6cb16e7 100644 (file)
@@ -145,14 +145,9 @@ Code_t ZMakeZcodeRealmAuthentication(notice, buffer, buffer_len, phdr_len,
     krb5_cksumtype cksumtype;
     krb5_auth_context authctx;
     krb5_data *authent;
-    krb5_data cksumbuf;
     char *svcinst, *x, *y;
     char *cksum_start, *cstart, *cend, *asn1_data;
-    int plain_len;   /* length of part not to be checksummed */
-    int cksum_len;   /* length of part to be checksummed (incl cksum) */
-    int cksum0_len;  /* length of part before checksum */
-    int cksum1_len;  /* length of part after checksum */
-    int i, zcode_len, asn1_len;
+    int i, cksum_len, zcode_len, asn1_len, phdr_adj;
     
     result = ZGetCredsRealm(&creds, realm);
     if (result)
@@ -161,11 +156,6 @@ Code_t ZMakeZcodeRealmAuthentication(notice, buffer, buffer_len, phdr_len,
     
     /* Figure out what checksum type to use */
     keyblock = Z_credskey(creds);
-    result = Z_ExtractEncCksum(keyblock, &enctype, &cksumtype);
-    if (result) {
-       krb5_free_creds(Z_krb5_ctx, creds);
-       return result;
-    }
     /* HOLDING: creds */
     
     /* Create the authenticator */
@@ -217,52 +207,14 @@ Code_t ZMakeZcodeRealmAuthentication(notice, buffer, buffer_len, phdr_len,
        krb5_free_creds(Z_krb5_ctx, creds);
        return (result);
     }
-    /* HOLDING: creds */
-    
-    /* Assemble the things to be checksummed */
-    plain_len  = cksum_start - buffer;
-    cksum0_len = cstart - cksum_start;
-    cksum1_len = (cksum_start + cksum_len) - cend;
-    memset(&cksumbuf, 0, sizeof(cksumbuf));
-    cksumbuf.length = cksum0_len + cksum1_len + notice->z_message_len;
-    cksumbuf.data = malloc(cksumbuf.length);
-    if (!cksumbuf.data) {
-       krb5_free_creds(Z_krb5_ctx, creds);
-       return (ENOMEM);
-    }
-    /* HOLDING: creds, cksumbuf.data */
-    memcpy(cksumbuf.data, cksum_start, cksum0_len);
-    memcpy(cksumbuf.data + cksum0_len, cend, cksum1_len);
-    memcpy(cksumbuf.data + cksum0_len + cksum1_len,
-          notice->z_message, notice->z_message_len);
-
-    /* compute the checksum */
-    result = Z_Checksum(&cksumbuf, keyblock, cksumtype, &asn1_data, &asn1_len);
+    result = Z_InsertZcodeChecksum(keyblock, notice, buffer, cksum_start,
+                                   cksum_len, cstart, cend, buffer_len,
+                                   &phdr_adj);
     krb5_free_creds(Z_krb5_ctx, creds);
     if (result) {
-       free(cksumbuf.data);
-       return result;
+         return result;
     }
-    
-    /* 
-     * OK....  we can zcode to a space starting at 'cstart',
-     * with a length of buffer_len - (plain_len + cksum_len).
-     * Then we tack on the end part, which is located at
-     * cksumbuf.data + cksum0_len and has length cksum1_len
-     */
-    result = ZMakeZcode(cstart, buffer_len - (plain_len + cksum_len),
-                       asn1_data, asn1_len);
-    if (!result) {
-       zcode_len = strlen(cstart) + 1;
-       memcpy(cstart + zcode_len, cksumbuf.data + cksum0_len, cksum1_len);
-       *phdr_len -= cksum_len - (cksum0_len + cksum1_len);
-       *phdr_len += zcode_len;
-    }
-    
-    /* free stuff up, and then return the result from the last call */
-
-    free(cksumbuf.data);
-    free(asn1_data);
+    *phdr_len += phdr_adj;
 
     return (result);
 #endif /* HAVE_KRB5 */
@@ -298,8 +250,12 @@ int ZGetCredsRealm(krb5_creds **creds_out, char *realm) {
     krb5_cc_close(Z_krb5_ctx, ccache);
     return result;
   }
-  
+#ifdef HAVE_KRB5_CREDS_KEYBLOCK_ENCTYPE 
   creds_in.keyblock.enctype = ENCTYPE_DES_CBC_CRC; /* XXX? */
+#else
+  creds_in.session.keytype = KEYTYPE_DES; /* XXX? */
+#endif
   
   result = krb5_get_credentials(Z_krb5_ctx, 0, ccache, &creds_in, creds_out);
   krb5_cc_close(Z_krb5_ctx, ccache);
index 0de47b837bf42d8fc040d47f77fbd160cfe6e57d..ed3a283172ce452b9771ec4779cf9d43631db91a 100644 (file)
@@ -18,6 +18,7 @@ static char rcsid_ZReadZcode_c[] = "$Id$";
 #include <assert.h>
 
 
+#if 0
 Code_t
 ZReadAsciiOrZcode(char *buf, int buflen, unsigned char *data, int datalen)
 {
@@ -33,6 +34,7 @@ Code_t ZReadZcode32(ptr, value_ptr)
 {
     abort();
 }
+#endif
 
 Code_t ZReadZcode(ptr, field, max, len)
     unsigned char *ptr;
index 015564b0f28a71f9e60a56745c7d22ab701db945..b28e485f8381a84355dacac353057a4ecab1649d 100644 (file)
@@ -109,6 +109,8 @@ void *__Z_debug_print_closure;
 
 static int Z_AddField __P((char **ptr, char *field, char *end));
 static int find_or_insert_uid __P((ZUnique_Id_t *uid, ZNotice_Kind_t kind));
+static Code_t Z_ZcodeFormatRawHeader __P((ZNotice_t *, char *, int, int *, char **, 
+                                 int *, char **, char **, int cksumtype));
 
 /* Find or insert uid in the old uids buffer.  The buffer is a sorted
  * circular queue.  We make the assumption that most packets arrive in
@@ -694,6 +696,7 @@ Code_t Z_NewFormatHeader(notice, buffer, buffer_len, len, cert_routine)
     Code_t retval;
     static char version[BUFSIZ]; /* default init should be all \0 */
     struct sockaddr_in name;
+    struct timeval tv;
     int namelen = sizeof(name);
 
     if (!notice->z_sender)
@@ -713,9 +716,9 @@ Code_t Z_NewFormatHeader(notice, buffer, buffer_len, len, cert_routine)
 
     notice->z_multinotice = "";
     
-    (void) gettimeofday(&notice->z_uid.tv, (struct timezone *)0);
-    notice->z_uid.tv.tv_sec = htonl((u_long) notice->z_uid.tv.tv_sec);
-    notice->z_uid.tv.tv_usec = htonl((u_long) notice->z_uid.tv.tv_usec);
+    (void) gettimeofday(&tv, (struct timezone *)0);
+    notice->z_uid.tv.tv_sec = htonl((u_long) tv.tv_sec);
+    notice->z_uid.tv.tv_usec = htonl((u_long) tv.tv_usec);
     
     (void) memcpy(&notice->z_uid.zuid_addr, &__My_addr, sizeof(__My_addr));
 
@@ -795,7 +798,7 @@ Code_t Z_AsciiFormatRawHeader(notice, buffer, buffer_len, hdr_len,
                                 cksum_start, cksum_len, cstart, cend, 1));
 }
 
-Code_t Z_ZcodeFormatRawHeader(notice, buffer, buffer_len, hdr_len, cksum_start,
+static Code_t Z_ZcodeFormatRawHeader(notice, buffer, buffer_len, hdr_len, cksum_start,
                              cksum_len, cstart, cend, cksumstyle)
     ZNotice_t *notice;
     char *buffer;
@@ -1296,7 +1299,9 @@ void ZSetDebug(proc, arg)
 #endif /* Z_DEBUG */
 
 #ifdef HAVE_KRB5
-Code_t Z_Checksum(krb5_data *cksumbuf, krb5_keyblock *keyblock, krb5_cksumtype cksumtype, char **asn1_data, int *asn1_len) {
+Code_t Z_Checksum(krb5_data *cksumbuf, krb5_keyblock *keyblock, 
+                  krb5_cksumtype cksumtype, 
+                  char **asn1_data, int *asn1_len) {
     krb5_error_code result;
     char *data;
     int len;
@@ -1320,7 +1325,8 @@ Code_t Z_Checksum(krb5_data *cksumbuf, krb5_keyblock *keyblock, krb5_cksumtype c
     len = checksum.length;
 #else
     /* Create the checksum -- heimdal crypto API */
-    result = krb5_crypto_init(Z_krb5_ctx, keyblock, enctype, &cryptctx);
+    result = krb5_crypto_init(Z_krb5_ctx, keyblock, keyblock->keytype, 
+                              &cryptctx);
     if (result)
        return result;
 
@@ -1354,7 +1360,71 @@ Code_t Z_Checksum(krb5_data *cksumbuf, krb5_keyblock *keyblock, krb5_cksumtype c
 }
 
 Code_t
-Z_ExtractEncCksum(krb5_keyblock *keyblock, krb5_enctype *enctype, krb5_cksumtype *cksumtype) {
+Z_InsertZcodeChecksum(krb5_keyblock *keyblock, ZNotice_t *notice, 
+                      char *buffer, char *cksum_start, int cksum_len, 
+                      char *cstart, char *cend, int buffer_len, 
+                      int *length_adjust)
+{
+     int plain_len;   /* length of part not to be checksummed */
+     int cksum0_len;  /* length of part before checksum */
+     int cksum1_len;  /* length of part after checksum */
+     krb5_data cksumbuf;
+     krb5_data cksum;
+     char *key_data;
+     int key_len;
+     krb5_enctype enctype;
+     krb5_cksumtype cksumtype;
+     Code_t result;
+     
+     key_data = Z_keydata(keyblock);
+     key_len = Z_keylen(keyblock);
+     result = Z_ExtractEncCksum(keyblock, &enctype, &cksumtype);
+     if (result)
+          return (ZAUTH_FAILED);
+     
+     /* Assemble the things to be checksummed */
+     plain_len  = cksum_start - buffer;
+     cksum0_len = cstart - cksum_start;
+     cksum1_len = (cksum_start + cksum_len) - cend;
+     memset(&cksumbuf, 0, sizeof(cksumbuf));
+     cksumbuf.length = cksum0_len + cksum1_len + notice->z_message_len;
+     cksumbuf.data = malloc(cksumbuf.length);
+     if (!cksumbuf.data)
+          return ENOMEM;
+     memcpy(cksumbuf.data, cksum_start, cksum0_len);
+     memcpy(cksumbuf.data + cksum0_len, cend, cksum1_len);
+     memcpy(cksumbuf.data + cksum0_len + cksum1_len,
+            notice->z_message, notice->z_message_len);
+     /* compute the checksum */
+     result = Z_Checksum(&cksumbuf, keyblock, cksumtype, 
+                        (char **)&cksum.data, &cksum.length);
+     if (result) {
+          free(cksumbuf.data);
+          return result;
+     }
+     
+     /*
+      * OK....  we can zcode to a space starting at 'cstart',
+      * with a length of buffer_len - (plain_len + cksum_len).
+      * Then we tack on the end part, which is located at
+      * cksumbuf.data + cksum0_len and has length cksum1_len
+      */
+     
+     result = ZMakeZcode(cstart, buffer_len - (plain_len + cksum_len),
+                         cksum.data, cksum.length);
+     free(cksum.data);
+     if (!result) {
+          int zcode_len = strlen(cstart) + 1;
+          memcpy(cstart + zcode_len, cksumbuf.data + cksum0_len, cksum1_len);
+          *length_adjust = zcode_len - cksum_len + (cksum0_len + cksum1_len);
+     }
+     free(cksumbuf.data);
+     return result;
+}
+
+Code_t
+Z_ExtractEncCksum(krb5_keyblock *keyblock, krb5_enctype *enctype, 
+                  krb5_cksumtype *cksumtype) {
 #if HAVE_KRB5_CREDS_KEYBLOCK_ENCTYPE
     *enctype  = keyblock->enctype; 
     return Z_krb5_lookup_cksumtype(*enctype, cksumtype); 
@@ -1362,6 +1432,7 @@ Z_ExtractEncCksum(krb5_keyblock *keyblock, krb5_enctype *enctype, krb5_cksumtype
     unsigned int len; 
     ENCTYPE *val; 
     int i = 0; 
+    Code_t result;
  
     result = krb5_keytype_to_enctypes(Z_krb5_ctx, keyblock->keytype, 
                                      &len, &val); 
@@ -1386,7 +1457,9 @@ Z_ExtractEncCksum(krb5_keyblock *keyblock, krb5_enctype *enctype, krb5_cksumtype
 #ifdef HAVE_KRB5
 /* returns 0 if invalid or losing, 1 if valid, *sigh* */
 int
-Z_krb5_verify_cksum(krb5_keyblock *keyblock, krb5_data *cksumbuf, krb5_cksumtype cksumtype, char *asn1_data, int asn1_len) {
+Z_krb5_verify_cksum(krb5_keyblock *keyblock, krb5_data *cksumbuf, 
+                    krb5_cksumtype cksumtype, char *asn1_data, 
+                    int asn1_len) {
     krb5_error_code result;
 #if HAVE_KRB5_C_MAKE_CHECKSUM
     krb5_checksum checksum;
@@ -1415,14 +1488,14 @@ Z_krb5_verify_cksum(krb5_keyblock *keyblock, krb5_data *cksumbuf, krb5_cksumtype
     checksum.checksum.data = asn1_data;
     checksum.cksumtype = cksumtype;
 
-    result = krb5_crypto_init(Z_krb5_ctx, keyblock, enctype, &cryptctx);
+    result = krb5_crypto_init(Z_krb5_ctx, keyblock, keyblock->keytype, &cryptctx);
     if (result)
        return result;
     
     /* HOLDING: cryptctx */
     result = krb5_verify_checksum(Z_krb5_ctx, cryptctx,
                                  Z_KEYUSAGE_SRV_CKSUM,
-                                 cksumbuf.data, cksumbuf.length,
+                                 cksumbuf->data, cksumbuf->length,
                                  &checksum);
     krb5_crypto_destroy(Z_krb5_ctx, cryptctx);
     if (result)
index 58f45863d8067f571f70df430dd88a56fbea577f..c230e15c00846ff1680ebf604b65940cd37443e2 100644 (file)
@@ -463,13 +463,18 @@ bdump_get_v12 (notice, auth, who, server)
     /* Now begin the brain dump. */
 
 #ifdef HAVE_KRB5
+    if (get_tgt()) {
+       cleanup(server);
+       return;
+    }
     { /* "client" side */
        krb5_auth_context actx;
        krb5_creds creds;
-       krb5_creads *credsp;
+       krb5_creds *credsp;
        krb5_principal principal;
        krb5_data data;
-
+        krb5_ap_rep_enc_part *rep;
        memset((char *)&creds, 0, sizeof(creds));
 
        retval = krb5_build_principal(Z_krb5_ctx, &principal, 
@@ -495,14 +500,14 @@ bdump_get_v12 (notice, auth, who, server)
        krb5_free_principal(Z_krb5_ctx, principal);
        if (retval) {
            syslog(LOG_ERR, "bdump_get: krb5_copy_principal (client): %s", error_message(retval));
-           krb5_free_cred_contents(Z_krb5_ctx, creds);
+           krb5_free_cred_contents(Z_krb5_ctx, &creds);
            cleanup(server);
            return;
        }
 
-       retval = krb5_get_credentials(Z_krb5_context, 0, Z_krb5_ccache,
+       retval = krb5_get_credentials(Z_krb5_ctx, 0, Z_krb5_ccache,
                                      &creds, &credsp);
-       krb5_free_cred_contents(Z_krb5_ctx, creds);
+       krb5_free_cred_contents(Z_krb5_ctx, &creds);
        if (retval) {
            syslog(LOG_ERR, "bdump_get: krb5_get_credentials: %s", error_message(retval));
            cleanup(server);
@@ -517,16 +522,47 @@ bdump_get_v12 (notice, auth, who, server)
            return;
        }
 
-       memset((char *)data, 0, sizeof(krb5_data));
-       retval = krb5_mk_req_ext(Z_krb5_ctx, &actx, AP_OPTS_MUTUAL_REQUIRE|AP_OPTS_USE_SUBKEY,
+       memset((char *)&data, 0, sizeof(krb5_data));
+       retval = krb5_mk_req_extended(Z_krb5_ctx, &actx, AP_OPTS_MUTUAL_REQUIRED|AP_OPTS_USE_SUBKEY,
                                 NULL, credsp, &data);
-i      if (retval) {
+       if (retval) {
            syslog(LOG_ERR, "bdump_get: krb5_mk_req_ext: %s", error_message(retval));
            krb5_auth_con_free(Z_krb5_ctx, actx);
            krb5_free_creds(Z_krb5_ctx, credsp);
            cleanup(server);
            return;
        }
+        retval = SendKrb5Data(live_socket, &data);
+        krb5_free_creds(Z_krb5_ctx, credsp);
+        if (retval) {
+             syslog(LOG_ERR, "bdump_get: cannot send authenticator: %s",
+                    error_message(retval));
+             krb5_free_data_contents(Z_krb5_ctx, &data);
+             krb5_auth_con_free(Z_krb5_ctx, actx);
+             cleanup(server);
+             return;
+        }    
+        krb5_free_data_contents(Z_krb5_ctx, &data);
+       memset((char *)&data, 0, sizeof(krb5_data));
+        retval = GetKrb5Data(live_socket, &data);
+        if (retval) {
+             syslog(LOG_ERR, "bdump_get: cannot get auth response: %s",
+                    error_message(retval));
+             krb5_auth_con_free(Z_krb5_ctx, actx);
+             cleanup(server);
+             return;
+        }    
+        retval = krb5_rd_rep(Z_krb5_ctx, actx, &data, &rep);
+        free(data.data);
+        memset((char *)&data, 0, sizeof(krb5_data));
+        if (retval) {
+             syslog(LOG_ERR, "bdump_get: mutual authentication failed: %s",
+                    error_message(retval));
+             krb5_auth_con_free(Z_krb5_ctx, actx);
+             cleanup(server);
+             return;
+        }    
+
     }
 #else    
 #ifdef HAVE_KRB4
@@ -909,8 +945,14 @@ bdump_recv_loop(server)
     Code_t retval;
     Client *client = NULL;
     struct sockaddr_in who;
-#ifdef HAVE_KRB4
+#ifdef HAVE_KRB5
+    char buf[512];
+    int blen;
+#endif
+#if defined(HAVE_KRB4) || defined(HAVE_KRB5)    
     char *cp;
+#endif
+#ifdef HAVE_KRB4
     C_Block cblock;
 #endif /* HAVE_KRB4 */
     ZRealm *realm = NULL;
@@ -991,6 +1033,52 @@ bdump_recv_loop(server)
                syslog(LOG_ERR,"brl failed: %s", error_message(retval));
                return retval;
            }
+#ifdef HAVE_KRB5
+           client->session_keyblock = NULL;
+           if (*notice.z_class_inst) {
+               /* check out this session key I found */
+               cp = notice.z_message + strlen(notice.z_message) + 1;
+               if (*cp == '0') {
+                   /* ****ing netascii; this is an encrypted DES keyblock
+                      XXX this code should be conditionalized for server
+                      transitions   */
+                   retval = krb5_init_keyblock(Z_krb5_ctx, ENCTYPE_DES_CBC_CRC,
+                                               sizeof(C_Block),
+                                               &client->session_keyblock);
+                   if (retval) {
+                       syslog(LOG_ERR, "brl failed to allocate DES keyblock: %s",
+                              error_message(retval));
+                       return retval;
+                   }
+                   retval = ZReadAscii(cp, strlen(cp), cblock, sizeof(C_Block));
+                   if (retval != ZERR_NONE) {
+                       syslog(LOG_ERR,"brl bad cblk read: %s (%s)",
+                              error_message(retval), cp);
+                   } else {
+                       des_ecb_encrypt(cblock, client->session_keyblock->contents,
+                                       serv_ksched.s, DES_DECRYPT);
+                   }
+               } else if (*cp == 'Z') { /* Zcode! Long live the new flesh! */
+                   retval = ZReadZcode(cp, buf, sizeof(buf), &blen);
+                   if (retval != ZERR_NONE) {
+                       syslog(LOG_ERR,"brl bad cblk read: %s (%s)",
+                              error_message(retval), cp);
+                   } else {
+                       retval = krb5_init_keyblock(Z_krb5_ctx,
+                                                   ntohl(*(krb5_enctype *)&buf[0]),
+                                                   ntohl(*(krb5_ui_4 *)&buf[4]),
+                                                   &client->session_keyblock);
+                       if (retval) {
+                           syslog(LOG_ERR, "brl failed to allocate keyblock: %s",
+                                  error_message(retval));
+                           return retval;
+                       }
+                       memcpy(client->session_keyblock->contents, &buf[8],
+                              client->session_keyblock->length);
+                   }
+               }
+           }
+#else
 #ifdef HAVE_KRB4
            memset(client->session_key, 0, sizeof(C_Block));
            if (*notice.z_class_inst) {
@@ -1010,6 +1098,7 @@ bdump_recv_loop(server)
                }
            }
 #endif /* HAVE_KRB4 */
+#endif
        } else if (strcmp(notice.z_opcode, CLIENT_SUBSCRIBE) == 0) { 
            /* a subscription packet */
            if (!client) {
index cae441341e0fea0747e960fdf9ac04355d329608..c7d87dbbe42c76d68770a61f2c0fef706fe33276 100644 (file)
@@ -84,8 +84,12 @@ client_register(notice, host, client_p, wantdefaults)
        if (!client)
            return ENOMEM;
        memset(&client->addr, 0, sizeof(struct sockaddr_in));
-#ifdef KERBEROS
+#ifdef HAVE_KRB5
+        client->session_keyblock = NULL;
+#else
+#ifdef HAVE_KRB4
        memset(&client->session_key, 0, sizeof(client->session_key));
+#endif
 #endif
        client->last_send = 0;
        client->last_ack = NOW;
@@ -122,6 +126,10 @@ client_deregister(client, flush)
     nack_release(client);
     subscr_cancel_client(client);
     free_string(client->principal);
+#ifdef HAVE_KRB5
+    if (client->session_keyblock)
+         krb5_free_keyblock(Z_krb5_ctx, client->session_keyblock);
+#endif
     if (flush)
        uloc_flush_client(&client->addr);
     free(client);
index ad743a87f44a74295ba7f53c42f33dffbeb8b013..89e4dddb2dfb7e2971e2f0e81398c5c4bc202de5 100644 (file)
@@ -14,6 +14,7 @@
 #include <zephyr/mit-copyright.h>
 #include "zserver.h"
 #include <sys/socket.h>
+#include <com_err.h>
 
 #ifndef lint
 #ifndef SABER
@@ -588,6 +589,7 @@ xmit_frag(notice, buf, len, waitforack)
     return(ZERR_NONE);
 }
 
+
 /*
  * Send the notice to the client.  After transmitting, put it onto the
  * not ack'ed list.
@@ -621,14 +623,23 @@ xmit(notice, dest, auth, client)
                                   we are distributing authentic and
                                   we have a pointer to auth info
                                   */
-#ifdef HAVE_KRB4
-       retval = ZFormatAuthenticNotice(notice, noticepack, packlen, &packlen,
-                                       client->session_key);
-       if (retval != ZERR_NONE) {
-           syslog(LOG_ERR, "xmit auth format: %s", error_message(retval));
-           free(noticepack);
-           return;
-       }
+#ifdef HAVE_KRB5
+         retval = ZFormatAuthenticNoticeV5(notice, noticepack, packlen,
+                                           &packlen, client->session_keyblock);
+         if (retval != ZERR_NONE) {
+              syslog(LOG_ERR, "xmit auth format: %s", error_message(retval));
+              free(noticepack);
+              return;
+         }
+#else
+#if defined(HAVE_KRB4)
+         retval = ZFormatAuthenticNotice(notice, noticepack, packlen,
+                                           &packlen, client->session_key);
+         if (retval != ZERR_NONE) {
+              syslog(LOG_ERR, "xmit auth format: %s", error_message(retval));
+              free(noticepack);
+              return;
+         }
 #else /* !HAVE_KRB4 */
        notice->z_auth = 1;
        retval = ZFormatSmallRawNotice(notice, noticepack, &packlen);
@@ -638,6 +649,7 @@ xmit(notice, dest, auth, client)
            return;
        }
 #endif /* HAVE_KRB4 */
+#endif /* HAVE_KRB5 */
     } else {
        notice->z_auth = 0;
        notice->z_authent_len = 0;
@@ -1165,9 +1177,27 @@ control_dispatch(notice, auth, who, server)
                clt_ack(notice, who, AUTH_FAILED);
            return ZERR_NONE;
        }
+#ifdef HAVE_KRB5
+        if (client->session_keyblock) {
+             krb5_free_keyblock_contents(Z_krb5_ctx, client->session_keyblock);
+             retval = krb5_copy_keyblock_contents(Z_krb5_ctx, ZGetSession(),
+                                         client->session_keyblock);
+        } else {
+             retval = krb5_copy_keyblock(Z_krb5_ctx, ZGetSession(), 
+                                &client->session_keyblock);
+        }
+        if (retval) {
+             syslog(LOG_WARNING, "keyblock copy failed in subscr: %s",
+                    error_message(retval));
+             if (server == me_server)
+                  nack(notice, who);
+             return ZERR_NONE;
+        }
+#else
 #ifdef HAVE_KRB4
        /* in case it's changed */
        memcpy(client->session_key, ZGetSession(), sizeof(C_Block));
+#endif
 #endif
        retval = subscr_subscribe(client, notice, server);
        if (retval != ZERR_NONE) {
index 7963880e1968855f65f34b9934317929c73242f2..548127ff25327addd6a2e0151fe53e11adc31df7 100644 (file)
@@ -22,27 +22,6 @@ static const char rcsid_kstuff_c[] = "$Id: kstuff.c,v 1.26 2001/04/10 23:28:20 g
 
 #ifdef HAVE_KRB4
 
-/* Keep a hash table mapping tickets to session keys, so we can do a fast
- * check of the cryptographic checksum without doing and DES decryptions.
- * Also remember the expiry time of the ticket, so that we can sweep the
- * table periodically. */
-
-#define HASHTAB_SIZE 4091
-
-typedef struct hash_entry Hash_entry;
-
-/* The ticket comes at the end, in a variable-length array. */
-struct hash_entry {
-    C_Block session_key;
-    time_t expires;
-    char srcprincipal[ANAME_SZ+INST_SZ+REALM_SZ+4];
-    Hash_entry *next;
-    int ticket_len;
-    unsigned char ticket[1];
-};
-
-Hash_entry *hashtab[HASHTAB_SIZE];
-
 static ZChecksum_t compute_checksum __P((ZNotice_t *, C_Block));
 static ZChecksum_t compute_rlm_checksum __P((ZNotice_t *, C_Block));
 
@@ -110,6 +89,10 @@ GetKerberosData(fd, haddr, kdata, service, srvtab)
  * get the ticket and write it to the file descriptor
  */
 
+#if !defined(krb_err_base) && defined(ERROR_TABLE_BASE_krb)
+#define krb_err_base ERROR_TABLE_BASE_krb
+#endif
+
 Code_t
 SendKerberosData(fd, ticket, service, host)
      int fd;           /* file descriptor to write onto */
@@ -139,6 +122,59 @@ SendKerberosData(fd, ticket, service, host)
 
 #endif /* HAVE_KRB4 */
 
+#ifdef HAVE_KRB5
+Code_t
+GetKrb5Data(int fd, krb5_data *data) {
+    char p[20];
+    int i;
+    unsigned char *dst;
+    Code_t retval;
+
+    for (i=0; i<20; i++) {
+       if (read(fd, &p[i], 1) != 1) {
+           syslog(LOG_WARNING,"bad read reply len");
+           return(KFAILURE);
+       }
+       if (p[i] == ' ') {
+           p[i] = '\0';
+           break;
+       }
+    }
+    if (i == 20 || strncmp(p, "V5-", 3) || !atoi(p+3)) {
+        syslog(LOG_WARNING,"bad reply len");
+        return ZSRV_PKSHORT;
+    }
+    data->length = atoi(p+3);
+    data->data = malloc(data->length);
+    if (! data->data) {
+       data->length = 0;
+       return errno;
+    }
+    dst=data->data;
+    for (i=0; i < data->length; i++) {
+       if (read(fd, dst++, 1) != 1) {
+            free(data->data);
+            memset((char *)data, 0, sizeof(krb5_data));
+            syslog(LOG_WARNING,"bad read reply string");
+            return ZSRV_PKSHORT;
+        }
+    }
+    return 0;
+}
+Code_t
+SendKrb5Data(int fd, krb5_data *data) {
+    char p[32];
+    int written, size_to_write;
+    sprintf(p, "V5-%d", data->length);
+    size_to_write = strlen (p);
+    if (size_to_write != (written = write(fd, p, size_to_write)) ||
+        data->length != (written = write(fd, data->data, data->length))) {
+        return (written < 0) ? errno : ZSRV_PKSHORT; 
+    }    
+    return 0;
+}
+#endif
+
 Code_t
 ZCheckRealmAuthentication(notice, from, realm)
     ZNotice_t *notice;
@@ -238,7 +274,7 @@ ZCheckRealmAuthentication(notice, from, realm)
     
     if (tkt == 0 || !Z_tktprincp(tkt)) {
        if (tkt)
-           krb5_free_tickets(Z_krb5_ctx, tkt);
+           krb5_free_ticket(Z_krb5_ctx, tkt);
        free(authbuf);
        krb5_auth_con_free(Z_krb5_ctx, authctx);
        return ZAUTH_FAILED;
@@ -746,7 +782,7 @@ ZCheckAuthentication4(notice, from)
     result = krb_rd_req(&authent, SERVER_SERVICE, instance,
                        from->sin_addr.s_addr, &dat, srvtab_file);
     if (result == RD_AP_OK) {
-       ZSetSessionDES(dat.session);
+       ZSetSessionDES(&dat.session);
        sprintf(srcprincipal, "%s%s%s@%s", dat.pname, dat.pinst[0] ? "." : "",
                dat.pinst, dat.prealm);
        if (strcmp(srcprincipal, notice->z_sender))
@@ -810,34 +846,19 @@ static ZChecksum_t compute_rlm_checksum(notice, session_key)
 #endif
 }
 
-void sweep_ticket_hash_table(arg)
-    void *arg;
-{
-    int i;
-    Hash_entry **ptr, *entry;
-
-    for (i = 0; i < HASHTAB_SIZE; i++) {
-       ptr = &hashtab[i];
-       while (*ptr) {
-           entry = *ptr;
-           if (entry->expires < NOW) {
-               *ptr = entry->next;
-               free(entry);
-           } else {
-               ptr = &(*ptr)->next;
-           }
-       }
-    }
-    timer_set_rel(SWEEP_INTERVAL, sweep_ticket_hash_table, NULL);
-}
-
 #ifdef HAVE_KRB5
 void
 ZSetSession(krb5_keyblock *keyblock) {
-#if 0
+#if 1
     krb5_error_code result;
 
-    result = krb5_copy_keyblock_contents(Z_krb5_ctx, keyblock, __Zephyr_session_keyblock);
+    if (__Zephyr_keyblock) {
+         krb5_free_keyblock_contents(Z_krb5_ctx, __Zephyr_keyblock);
+         result = krb5_copy_keyblock_contents(Z_krb5_ctx, keyblock, __Zephyr_keyblock);
+    } else {
+         result = krb5_copy_keyblock(Z_krb5_ctx, keyblock, &__Zephyr_keyblock);
+    }
+    
     if (result) /*XXX we're out of memory? */
        ;
 #else
@@ -848,7 +869,43 @@ ZSetSession(krb5_keyblock *keyblock) {
 #ifdef HAVE_KRB4
 void
 ZSetSessionDES(C_Block *key) {
+#ifdef HAVE_KRB5
+     Code_t result;
+#ifdef HAVE_KRB5_INIT_KEYBLOCK
+     if (__Zephyr_keyblock) {
+          krb5_free_keyblock(__Zephyr_keyblock);
+          __Zephyr_keyblock=NULL;
+     }
+     result = krb5_init_keyblock(Z_krb5_ctx, ENCTYPE_DES_CBC_CRC, 
+                                 sizeof(C_Block)
+                                 &__Zephyr_keyblock);
+     if (result) /*XXX we're out of memory? */
+       return;
+
+     memcpy(Z_keydata(__Zephyr_keyblock), key, sizeof(C_Block));
+#else
+     krb5_keyblock *tmp, tmp_ss;
+     tmp = &tmp_ss;
+     Z_keylen(tmp)=sizeof(C_Block);
+     Z_keydata(tmp)=key;
+#if HAVE_KRB5_CREDS_KEYBLOCK_ENCTYPE
+     tmp->enctype = ENCTYPE_DES_CBC_CRC;
+#else
+     tmp->keytype = KEYTYPE_DES;
+#endif
+    if (__Zephyr_keyblock) {
+         krb5_free_keyblock_contents(Z_krb5_ctx, __Zephyr_keyblock);
+         result = krb5_copy_keyblock_contents(Z_krb5_ctx, tmp, 
+                                              __Zephyr_keyblock);
+    } else {
+         result = krb5_copy_keyblock(Z_krb5_ctx, tmp, &__Zephyr_keyblock);
+    }
+     if (result) /*XXX we're out of memory? */
+          ;
+#endif
+#else
     memcpy(__Zephyr_session, key, sizeof(C_Block));
+#endif
 }
 #endif
 
index 76020c7fe24e1f61a39c26638f350131a757c920..6ed1481188df49f0ba1caf390f20bb5bcb898228 100644 (file)
@@ -126,11 +126,12 @@ char *bdump_version = "1.2";
 
 #ifdef HAVE_KRB5
 krb5_ccache Z_krb5_ccache;
-#endif
-
+krb5_keyblock *__Zephyr_keyblock;
+#else
 #ifdef HAVE_KRB4
 C_Block __Zephyr_session;
 #endif
+#endif
 
 int
 main(argc, argv)
@@ -309,9 +310,6 @@ main(argc, argv)
     /* Reinitialize t_local now that initialization is done. */
     gettimeofday(&t_local, NULL);
     uptime = NOW;
-#ifdef HAVE_KRB4
-    timer_set_rel(SWEEP_INTERVAL, sweep_ticket_hash_table, NULL);
-#endif
 
     realm_wakeup();
 #ifdef DEBUG_MALLOC
index 05ce612d38287dde95eb80d69ae226c6aa833c9b..ddfd057096a21ea3cdbe2528065c760842e4ecea 100644 (file)
@@ -282,7 +282,7 @@ realm_sender_in_realm(realm, sender)
     return 0;
 }
 
-sender_in_realm(notice)
+int sender_in_realm(notice)
     ZNotice_t *notice;
 {
   char *realm;
@@ -557,8 +557,12 @@ realm_init()
            abort();
        }
        memset(&client->addr, 0, sizeof(struct sockaddr_in));
+#ifdef HAVE_KRB5
+        client->session_keyblock = NULL;
+#else
 #ifdef HAVE_KRB4
        memset(&client->session_key, 0, sizeof(client->session_key));
+#endif
 #endif
        sprintf(rlmprinc, "%s.%s@%s", SERVER_SERVICE, SERVER_INSTANCE, 
                rlm->name);
@@ -1170,7 +1174,7 @@ realm_sendit_auth(notice, who, auth, realm, ack_to_sender)
            if (sscanf(notice->z_multinotice, "%d/%d", &origoffset, 
                       &origlen) != 2) {
                syslog(LOG_WARNING, "rlm_sendit_auth frag: parse failed");
-               return;
+               return ZERR_BADFIELD;
            }
 
 #if 0
@@ -1205,7 +1209,7 @@ realm_sendit_auth(notice, who, auth, realm, ack_to_sender)
            buffer = (char *) malloc(sizeof(ZPacket_t));
            if (!buffer) {
                syslog(LOG_ERR, "realm_sendit_auth malloc");
-               return;                 /* DON'T put on nack list */
+               return ENOMEM;                 /* DON'T put on nack list */
            }
 
            buffer_len = sizeof(ZPacket_t);
@@ -1405,6 +1409,7 @@ ticket_retrieve(realm)
        }
     } else {
        syslog(LOG_ERR, "tkt_rtrv: don't have ticket, but have no child");
+        result = KRB5KRB_AP_ERR_TKT_EXPIRED;
     }
  
     pid = fork();
@@ -1480,7 +1485,7 @@ ticket_retrieve(realm)
     } else {
        realm->child_pid = pid;
        realm->have_tkt = 0;
-       
+
        syslog(LOG_WARNING, "tkt_rtrv: %s: %d", realm->name,
               result);
        return (result);
index add1d34f2490ca3806382ebf23e0c75c6f32c38a..dddb5b8c819c2b33c042786d52139d2e2e14c5b7 100644 (file)
@@ -553,7 +553,7 @@ subscr_marshal_subs(notice, auth, who, found)
     zdbug((LOG_DEBUG, "subscr_marshal"));
 #endif
     *found = 0;
-
+    
     /* Note that the following code is an incredible crock! */
        
     /* We cannot send multiple packets as acknowledgements to the client,
@@ -838,10 +838,15 @@ subscr_send_subs(client)
 {
     int i = 0;
     Destlist *subs;
+#ifdef HAVE_KRB5
+    char buf[512];
+    char *bufp;
+#else
 #ifdef HAVE_KRB4
     char buf[512];
     C_Block cblock;
 #endif /* HAVE_KRB4 */
+#endif
     char buf2[512];
     char *list[7 * NUM_FIELDS];
     int num = 0;
@@ -854,14 +859,45 @@ subscr_send_subs(client)
 
     list[num++] = buf2;
 
+#ifdef HAVE_KRB5
+#ifdef HAVE_KRB4 /* XXX make this optional for server transition time */
+    if (client->session_keyblock->enctype == ENCTYPE_DES_CBC_CRC) {
+       bufp = malloc(client->session_keyblock->length);
+       if (bufp == NULL) {
+           syslog(LOG_WARNING, "subscr_send_subs: cannot allocate memory for DES keyblock: %m");
+           return errno;
+       }
+       des_ecb_encrypt(client->session_keyblock->contents, bufp, serv_ksched.s, DES_ENCRYPT);
+       retval = ZMakeAscii(buf, sizeof(buf), bufp, client->session_keyblock->length);
+    } else {
+#endif
+       bufp = malloc(client->session_keyblock->length + 8); /* + enctype
+                                                               + length */
+       if (bufp == NULL) {
+           syslog(LOG_WARNING, "subscr_send_subs: cannot allocate memory for keyblock: %m");
+           return errno;
+       }
+       *(krb5_enctype *)&bufp[0] = htonl(client->session_keyblock->enctype);
+       *(krb5_ui_4 *)&bufp[4] = htonl(client->session_keyblock->length);
+       memcpy(&bufp[8], client->session_keyblock->contents, client->session_keyblock->length);
+
+       retval = ZMakeZcode(buf, sizeof(buf), bufp, client->session_keyblock->length + 8);
+#ifdef HAVE_KRB4
+    }
+#endif /* HAVE_KRB4 */
+#else /* HAVE_KRB5 */
 #ifdef HAVE_KRB4
 #ifdef NOENCRYPTION
     memcpy(cblock, client->session_key, sizeof(C_Block));
-#else
+#else /* NOENCRYPTION */
     des_ecb_encrypt(client->session_key, cblock, serv_ksched.s, DES_ENCRYPT);
-#endif
+#endif /* NOENCRYPTION */
 
     retval = ZMakeAscii(buf, sizeof(buf), cblock, sizeof(C_Block));
+#endif /* HAVE_KRB4 */
+#endif /* HAVE_KRB5 */    
+
+#if defined(HAVE_KRB4) || defined(HAVE_KRB5)
     if (retval != ZERR_NONE) {
 #if 0
        zdbug((LOG_DEBUG,"zmakeascii failed: %s", error_message(retval)));
@@ -872,7 +908,7 @@ subscr_send_subs(client)
        zdbug((LOG_DEBUG, "cblock %s", buf));
 #endif
     }          
-#endif /* HAVE_KRB4 */
+#endif /* HAVE_KRB4 || HAVE_KRB5*/
     retval = bdump_send_list_tcp(SERVACK, &client->addr, ZEPHYR_ADMIN_CLASS,
                                 num > 1 ? "CBLOCK" : "", ADMIN_NEWCLT,
                                 client->principal->string, "", list, num);
index 2121edd26dbe72c377f3252436274819b21653d5..56340aedd0800b9b77ad055e14b2c85250baf903 100644 (file)
@@ -445,6 +445,7 @@ uloc_send_locations()
          default:
            syslog(LOG_ERR,"broken location state %s/%d",
                   loc->user->string, (int) loc->exposure);
+           exposure_level = EXPOSE_OPSTAFF;
            break;
        }
        retval = bdump_send_list_tcp(ACKED, &loc->addr, LOGIN_CLASS,
index 0e3c3cc7d156fb420da924b9889e9090dfc8cbbd..68a44bfd45316b673ef21f7030f399faa619fd87 100644 (file)
@@ -17,6 +17,9 @@
 #include <zephyr/mit-copyright.h>
 
 #include <internal.h>
+
+#include <com_err.h>
+
 #include <arpa/inet.h>
 
 #include "zsrv_err.h"
 #include "access.h"
 #include "acl.h"
 
-#if defined(HAVE_KRB4) || defined(HAVE_KRB5)
+#if defined(HAVE_KRB5) || defined(HAVE_KRB4)
 /* Kerberos-specific library interfaces used only by the server. */
+#ifdef HAVE_KRB5
+extern krb5_keyblock *__Zephyr_keyblock;
+#define ZGetSession() (__Zephyr_keyblock)
+void ZSetSession(krb5_keyblock *keyblock);
+Code_t ZFormatAuthenticNoticeV5 __P((ZNotice_t*, char*, int, int*, krb5_keyblock *));
+#else
 extern C_Block __Zephyr_session;
 #define ZGetSession() (__Zephyr_session)
-void ZSetSession(krb5_keyblock *keyblock);
+#endif
 void ZSetSessionDES(C_Block *key);
 
 Code_t ZFormatAuthenticNotice __P((ZNotice_t*, char*, int, int*, C_Block));
@@ -123,9 +132,13 @@ struct _ZRealmname {
 struct _Client {
     struct sockaddr_in addr;           /* ipaddr/port of client */
     Destlist           *subs   ;       /* subscriptions */
+#ifdef HAVE_KRB5
+    krb5_keyblock       *session_keyblock;
+#else
 #ifdef HAVE_KRB4
     C_Block            session_key;    /* session key for this client */
 #endif /* HAVE_KRB4 */
+#endif
     String             *principal;     /* krb principal of user */
     int                        last_send;      /* Counter for last sent packet. */
     time_t             last_ack;       /* Time of last received ack */
@@ -271,7 +284,7 @@ void sweep_ticket_hash_table __P((void *));
 #ifndef NOENCRYPTION
 Sched *check_key_sched_cache __P((des_cblock key));
 void add_to_key_sched_cache __P((des_cblock key, Sched *sched));
-int krb_set_key __P((char *key, int cvt));
+/*int krb_set_key __P((void *key, int cvt));*/
 /* int krb_rd_req __P((KTEXT authent, char *service, char *instance,
                    unsigned KRB_INT32 from_addr, AUTH_DAT *ad, char *fn)); */
 int krb_find_ticket __P((KTEXT authent, KTEXT ticket));