Lots of bugs, cleanup...
authorTheodore Tso <tytso@mit.edu>
Fri, 24 Dec 1993 22:32:17 +0000 (22:32 +0000)
committerTheodore Tso <tytso@mit.edu>
Fri, 24 Dec 1993 22:32:17 +0000 (22:32 +0000)
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3264 dc483132-0cff-0310-8789-dd5450dbe970

src/kadmin/client/kadmin.c
src/kadmin/client/kadmin_add.c
src/kadmin/client/kadmin_adr.c
src/kadmin/client/kadmin_cpr.c
src/kadmin/client/kadmin_cpw.c
src/kadmin/client/kadmin_del.c
src/kadmin/client/kadmin_inq.c
src/kadmin/client/kadmin_mod.c

index 62fdec822e8faadfdb24e29cdbcbefab4e194397..27ea4b053c2f4a2c5ff653f1063d7236580b19ee 100644 (file)
@@ -50,6 +50,15 @@ static char rcsid_kadmin[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+/*
+ * Try no preauthentication first; then try the encrypted timestamp
+ */
+int preauth_search_list[] = {
+       0,                      
+       KRB5_PADATA_ENC_TIMESTAMP,
+       -1
+       };
+
 krb5_error_code get_first_ticket 
        PROTOTYPE((krb5_ccache, 
                krb5_principal));
@@ -59,6 +68,8 @@ struct sockaddr_in local_sin, remote_sin;
 krb5_creds my_creds;
 
 void get_def_princ();
+void decode_kadmind_reply();
+int print_status_message();
 
 main(argc,argv)
   int argc;
@@ -494,29 +505,27 @@ repeat:
        exit(1);
     }
     free(inbuf.data);
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
+
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
     free(msg_data.data);
+    
     if (!((rd_priv_resp.appl_code == KADMIN) &&
-                (rd_priv_resp.retn_code == KADMGOOD))) {
-       fprintf(stderr, "Generic Error During kadmin Termination!\n");
+         (rd_priv_resp.retn_code == KADMGOOD))) {
+       if (rd_priv_resp.message)
+           fprintf(stderr, "%s\n", rd_priv_resp.message);
+       else
+           fprintf(stderr, "Generic Error During kadmin Termination!\n");
        retval = 1;
     } else {
        fprintf(stderr, "\nHave a Good Day.\n\n");
     }
 
-    free(send_cksum.contents);
+    if (rd_priv_resp.message)
+       free(rd_priv_resp.message);
 
-
-    if (retval) {
-       fprintf(stderr, "\n\nkadmin terminating - %s.\n\n", 
-               kadmind_kadmin_response[rd_priv_resp.retn_code]);
-       exit(1);
-    }
-    exit(0);
+    free(send_cksum.contents);
+    
+    exit(retval);
 }
 
 krb5_error_code
@@ -533,6 +542,7 @@ OLDDECLARG(krb5_principal, client)
     krb5_error_code retval;
     char *password;
     int  pwsize;
+    int         i;
     
     if ((retval = krb5_unparse_name(client, &client_name))) {
        fprintf(stderr, "Unable to Unparse Client Name!\n");
@@ -583,28 +593,34 @@ OLDDECLARG(krb5_principal, client)
     }
 
        /*      Build Request for Initial Credentials */
-    if ((retval = krb5_get_in_tkt_with_password(
-                       0,                      /* options */
-                       my_addresses,
-                       KRB5_PADATA_ENC_TIMESTAMP, /* do preauth */
-                       ETYPE_DES_CBC_CRC,      /* etype */
-                       KEYTYPE_DES,
-                       password,
-                       cache,
-                       &my_creds,
-                       0  ))) {
-            fprintf(stderr, "\nUnable to Get Initial Credentials : %s!\n",
-                        error_message(retval));
-           (void) memset(password, 0, pwsize);
-           free(password);
-           krb5_free_addresses(my_addresses);
-            return(1);
+    for (i=0; preauth_search_list[i] >= 0; i++) {
+       retval = krb5_get_in_tkt_with_password(
+                                       0,      /* options */
+                                       my_addresses,
+                                       /* do random preauth */
+                                        preauth_search_list[i],
+                                       ETYPE_DES_CBC_CRC,   /* etype */
+                                       KEYTYPE_DES,
+                                       password,
+                                       cache,
+                                       &my_creds,
+                                       0);
+       if (retval != KRB5KDC_PREAUTH_FAILED &&
+           retval != KRB5KRB_ERR_GENERIC)
+           break;
     }
+    
         /* Do NOT Forget to zap password  */
     memset((char *) password, 0, pwsize);
     free(password);
     krb5_free_addresses(my_addresses);
+    
+    if (retval) {
+            fprintf(stderr, "\nUnable to Get Initial Credentials : %s!\n",
+                        error_message(retval));
+            return(1);
+    }
     return(0);
 }
 
@@ -771,3 +787,45 @@ usage()
     fprintf(stderr, "  the -n option is used.\n\n");
     exit(0);
 }
+
+void decode_kadmind_reply(data, response)
+    krb5_data  data;
+    kadmin_requests    *response;
+{
+    response->appl_code = data.data[0];
+    response->oper_code = data.data[1];
+    response->retn_code = data.data[2];
+    if (data.length > 3 && data.data[3]) {
+       response->message = malloc(data.length - 2);
+       if (response->message) {
+           memcpy(response->message, data.data + 3, data.length - 3);
+           response->message[data.length - 3] = 0;
+       }
+    } else
+       response->message = NULL;
+
+    return;
+}
+
+int print_status_message(response, success_msg)
+    kadmin_requests    *response;
+    char               *success_msg;
+{
+    int        retval = 1;
+    
+    if (response->appl_code == KADMIN) {
+       if (response->retn_code == KADMGOOD) {
+           fprintf(stderr, "%s\n", success_msg);
+           retval = 0;
+       } else if (response->retn_code == KADMBAD) 
+           fprintf(stderr, "%s\n", response->message);
+       else
+           fprintf(stderr, "ERROR: unknown return code from server.\n");
+    } else
+       fprintf(stderr, "ERROR: unknown application code from server.\n");
+
+    if (response->message)
+       free(response->message);
+    
+    return retval;
+}    
index 425e26ff450b2f2c7608b74811efb1ba9d1242ef..bf346568610da21189d87d6b95079af849d5bcfc 100644 (file)
@@ -45,6 +45,9 @@ static char rcsid_kadmin_add[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+void decode_kadmind_reply();
+int print_status_message();
+
 krb5_error_code
   kadm_add_user(my_creds, rep_ret, local_addr, foreign_addr, 
                local_socket, seqno, oper_type, principal)
@@ -144,8 +147,14 @@ char *principal;
     free(inbuf.data);
     
     if (msg_data.data[2] == KADMBAD) {
-       fprintf(stderr, "Principal Already Exists!\n\n");
-       return(0);
+       decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+       if (rd_priv_resp.message) {
+           fprintf(stderr, "%s\n\n", rd_priv_resp.message);
+           free(rd_priv_resp.message);
+       } else
+           fprintf(stderr, "Generic error from server.\n\n");
+        return(0);
     }
     
 #ifdef MACH_PASS
@@ -258,18 +267,13 @@ char *principal;
     }
     free(inbuf.data);
     
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
-    
-    free(msg_data.data);                                   
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+    free(inbuf.data);
+    free(msg_data.data);
+
+    retval = print_status_message(&rd_priv_resp,
+                                 "Database Addition Successful.");
     
-    if (!((rd_priv_resp.appl_code == KADMIN) &&
-         (rd_priv_resp.retn_code == KADMGOOD))) {
-        fprintf(stderr, "Generic Error During kadmin Addition!\n");
-        retval = 1;
-    } else {
-        fprintf(stderr, "\nDatabase Addition Successful.\n");
-    }
     return(retval);
 }
index e52e80acd2f77561f53cbc2fe58655df05445669..d239932a36e8ea000457c962ac795f85fc4091ea 100644 (file)
@@ -45,6 +45,9 @@ static char rcsid_kadmin_adr[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+void decode_kadmind_reply();
+int print_status_message();
+
 krb5_error_code
   kadm_add_user_rnd(my_creds, rep_ret, local_addr, foreign_addr, 
                    local_socket, seqno, principal)
@@ -140,19 +143,14 @@ char *principal;
        free(inbuf.data);
         return(1);
     }
+
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
+
     free(inbuf.data);
-    
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
-    
-    free(msg_data.data);                                   
-    
-    if (!((rd_priv_resp.appl_code == KADMIN) &&
-         (rd_priv_resp.retn_code == KADMGOOD)))
-      fprintf(stderr, "Principal already exists!\n");
-    else
-      fprintf(stderr, "\nDatabase Addition Successful.\n");
+    free(msg_data.data);
 
+    retval = print_status_message(&rd_priv_resp,
+                                 "Database Addition Successful.");
+    
     return(retval);
 }
index 41f53eb87ad4454f7aaeeb471b0fe01348aba1c2..a5273e01161d9c01001f815593f5fcfc4befbd30 100644 (file)
@@ -46,6 +46,9 @@ static char rcsid_kadmin_cpr[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+void decode_kadmind_reply();
+int print_status_message();
+
 krb5_error_code
 kadm_cpw_user_rnd(my_creds, rep_ret, local_addr, foreign_addr, 
                  local_socket, seqno, principal)
@@ -142,18 +145,14 @@ char *principal;
     }
     free(inbuf.data);
 
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+    free(inbuf.data);
     free(msg_data.data);
-    if (!((rd_priv_resp.appl_code == KADMIN) &&
-               (rd_priv_resp.retn_code == KADMGOOD)))
-      fprintf(stderr, "Principal does NOT exist!\n");
-    else
-      fprintf(stderr, "\nPassword Modification Successful.\n");
 
+    print_status_message(&rd_priv_resp,
+                        "Password Modification Successful.");
+    
     return(0);
 }
 
index 697e1bde0e1eea3341f08a3567d46338bd642565..57a5f8f05fe97f28960f1208f1c340f58ec01136 100644 (file)
@@ -46,6 +46,9 @@ static char rcsid_kadmin_cpw[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+void decode_kadmind_reply();
+int print_status_message();
+
 krb5_error_code
 kadm_cpw_user(my_creds, rep_ret, local_addr, foreign_addr, 
              local_socket, seqno, oper_type, principal)
@@ -146,7 +149,13 @@ char *principal;
     free(inbuf.data);
 
     if (msg_data.data[2] == KADMBAD) {
-        fprintf(stderr, "Principal Does NOT Exist!\n\n");
+       decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+       if (rd_priv_resp.message) {
+           fprintf(stderr, "%s\n\n", rd_priv_resp.message);
+           free(rd_priv_resp.message);
+       } else
+           fprintf(stderr, "Generic error from server.\n\n");
         return(0);
     }
 
@@ -262,20 +271,14 @@ char *principal;
         free(inbuf.data);
         return(1);
     }
-    free(inbuf.data);
 
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+    free(inbuf.data);
     free(msg_data.data);
-    if (!((rd_priv_resp.appl_code == KADMIN) &&
-               (rd_priv_resp.retn_code == KADMGOOD))) {
-       fprintf(stderr, "Generic Error During kadmin Password Modification!\n");
-       return(1);
-    } else {
-        fprintf(stderr, "\nPassword Modification Successful.\n");
-    }
+
+    print_status_message(&rd_priv_resp,
+                        "Password Modification Successful.");
+    
     return(0);
 }
index c76aa1e0b1e95fce825b74c04a515e6331fbbc78..793f3442d6f088074bf147a34acea41b3c17e6b4 100644 (file)
@@ -43,6 +43,9 @@ static char rcsid_kadmin_del[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+void decode_kadmind_reply();
+int print_status_message();
+
 krb5_error_code
 kadm_del_user(my_creds, rep_ret, local_addr, foreign_addr, 
              local_socket, seqno, principal)
@@ -137,17 +140,13 @@ char *principal;
         return(1);
     }
 
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
 
     free(inbuf.data);
     free(msg_data.data);
-    if (!((rd_priv_resp.appl_code == KADMIN) &&
-               (rd_priv_resp.retn_code == KADMGOOD)))
-      fprintf(stderr, "Principal Does NOT Exist!\n");
-    else
-      fprintf(stderr, "\nDatabase Deletion Successful.\n");
 
+    print_status_message(&rd_priv_resp,
+                        "Database Deletion Successful.");
+    
     return(0);
 }
index 0b7b04289b09007807faceadb95fd306afac9a81..90f4fb9d9425f681d48d46ba2550ed286bc38730 100644 (file)
@@ -44,6 +44,9 @@ static char rcsid_kadmin_inq[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+void decode_kadmind_reply();
+int print_status_message();
+
 krb5_error_code
 kadm_inq_user(my_creds, rep_ret, local_addr, foreign_addr, 
              local_socket, seqno, principal)
@@ -59,7 +62,6 @@ char *principal;
     char username[755];
     int count;
     krb5_error_code retval;     /* return code */
-
     char *my_data;
 
     if ((inbuf.data = (char *) calloc(1, 3 + sizeof(username))) == (char *) 0) {
@@ -148,16 +150,23 @@ char *principal;
     }
        
     if (msg_data.data[2] == KADMBAD) {
-        fprintf(stderr, "Principal Does Not Exist!\n\n");
+       decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+       if (rd_priv_resp.message) {
+           fprintf(stderr, "%s\n\n", rd_priv_resp.message);
+           free(rd_priv_resp.message);
+       } else
+           fprintf(stderr, "Generic error from server.\n\n");
         return(0);
     }
 
-    if ((my_data = (char *) calloc(1, msg_data.length + 1)) == (char *) 0) {
-       fprintf(stderr, "No Memory Allocating Inquiry Buffer!\n");
-       return(1);
+    my_data = malloc(msg_data.length + 1);
+    if (!my_data) {
+       fprintf(stderr, "kadmin_inq: Couldn't allocate space for my_data!\n");
+       exit(1);
     }
-
-    (void) memcpy(my_data, msg_data.data, msg_data.length);
+    memcpy(my_data, msg_data.data, msg_data.length);
+    my_data[msg_data.length] = 0;
 
                /* Print Inquiry Information */
     fprintf(stdout, "%s\n", my_data);
@@ -221,18 +230,13 @@ char *principal;
     }
     free(inbuf.data);
      
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+    free(inbuf.data);
     free(msg_data.data);
-    if (!((rd_priv_resp.appl_code == KADMIN) &&
-                (rd_priv_resp.retn_code == KADMGOOD))) {
-        fprintf(stderr, "Generic Error During kadmin Inquiry!\n");
-        retval = 1;
-    } else {
-        fprintf(stderr, "\nDatabase Inquiry Successful.\n");
-    }
+
+    print_status_message(&rd_priv_resp,
+                        "Password Inquiry Successful.");
+    
     return(0);
 }
index 25a6587c1dba21cf8a24a66357acb6c18d0ec5d5..9828f6012863cda639e042888752d5629bffb91c 100644 (file)
@@ -44,6 +44,9 @@ static char rcsid_kadmin_mod[] =
 #include <krb5/kdb.h>
 #include <krb5/kdb_dbm.h>
 
+void decode_kadmind_reply();
+int print_status_message();
+
 krb5_error_code
 kadm_mod_user(my_creds, rep_ret, local_addr, foreign_addr, 
              local_socket, seqno, principal)
@@ -141,7 +144,13 @@ char *principal;
     free(msg_data.data);
 
     if (msg_data.data[2] == KADMBAD) {
-        fprintf(stderr, "Principal Does NOT Exist!\n\n");
+       decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+       if (rd_priv_resp.message) {
+           fprintf(stderr, "%s\n\n", rd_priv_resp.message);
+           free(rd_priv_resp.message);
+       } else
+           fprintf(stderr, "Generic error from server.\n\n");
         return(0);
     }
 
@@ -204,20 +213,15 @@ char *principal;
        free(inbuf.data);
         return(1);
     }
-    free(inbuf.data);
 
-    memcpy(&rd_priv_resp.appl_code, msg_data.data, 1);
-    memcpy(&rd_priv_resp.oper_code, msg_data.data + 1, 1);
-    memcpy(&rd_priv_resp.retn_code, msg_data.data + 2, 1);
 
+    decode_kadmind_reply(msg_data, &rd_priv_resp);
+
+    free(inbuf.data);
     free(msg_data.data);
 
-    if (!((rd_priv_resp.appl_code == KADMIN) &&
-               (rd_priv_resp.retn_code == KADMGOOD))) {
-       fprintf(stderr, "Error Performing kadmin service!\n");
-       retval = 1;
-    } else {
-        fprintf(stderr, "\nDatabase Modification Successful.\n");
-    }
+    print_status_message(&rd_priv_resp,
+                        "Database Modification Successful.");
+    
     return(0);
 }