]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blobdiff - zephyr/lib/ZGetSender.c
don't convert the sender to krb4....
[1ts-debian.git] / zephyr / lib / ZGetSender.c
index df5f3e2e5979b69d724d6c24f709f29766e20bda..c63a278d461a1362bd0f207acf124f3aeed6bce3 100644 (file)
@@ -22,24 +22,53 @@ static const char rcsid_ZGetSender_c[] =
 char *ZGetSender()
 {
     struct passwd *pw;
+    static char *sender = NULL;
+#ifdef HAVE_KRB5
+    krb5_ccache ccache;
+    krb5_principal principal;
+    char *prname;
+    int result;
+    char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ]; /*XXX*/
+#else    
 #ifdef HAVE_KRB4
     char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ];
-    static char sender[ANAME_SZ+INST_SZ+REALM_SZ+3] = "";
-#else
-    static char sender[128] = "";
+#endif 
 #endif
 
     /* Return it if already cached */
-    if (*sender)
+    if (sender)
        return (sender);
 
+#ifdef HAVE_KRB5
+    result = krb5_cc_default(Z_krb5_ctx, &ccache);
+    if (!result) {
+      result = krb5_cc_get_principal(Z_krb5_ctx, ccache, &principal);
+      if (!result) {
+#if 1
+       krb5_unparse_name(Z_krb5_ctx, principal, &prname);
+       sender = strdup(prname);
+#else
+       krb5_524_conv_principal(Z_krb5_ctx, principal, pname, pinst, prealm);
+        sender = malloc(ANAME_SZ+INST_SZ+REALM_SZ+3);
+       if (sender)
+         (void) sprintf(sender, "%s%s%s@%s", pname, (pinst[0]?".":""),
+                        pinst, prealm);
+#endif
+       krb5_free_principal(Z_krb5_ctx, principal);
+      }
+      krb5_cc_close(Z_krb5_ctx, ccache);
+    } 
+#else
 #ifdef HAVE_KRB4
     if (krb_get_tf_fullname((char *)TKT_FILE, pname, pinst, prealm) == KSUCCESS)
     {
-       (void) sprintf(sender, "%s%s%s@%s", pname, (pinst[0]?".":""),
-                      pinst, prealm);
+        sender = malloc(ANAME_SZ+INST_SZ+REALM_SZ+3);
+       if (sender)
+         (void) sprintf(sender, "%s%s%s@%s", pname, (pinst[0]?".":""),
+                        pinst, prealm);
        return (sender);
     }
+#endif
 #endif
 
     /* XXX a uid_t is a u_short (now),  but getpwuid
@@ -47,6 +76,8 @@ char *ZGetSender()
     pw = getpwuid((int) getuid());
     if (!pw)
        return ("unknown");
-    (void) sprintf(sender, "%s@%s", pw->pw_name, __Zephyr_realm);
+    sender = malloc(strlen(pw->pw_name) + strlen(__Zephyr_realm) + 2);
+    if (sender)
+      (void) sprintf(sender, "%s@%s", pw->pw_name, __Zephyr_realm);
     return (sender);
 }