]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blob - lib/ZGetSender.c
c63a278d461a1362bd0f207acf124f3aeed6bce3
[1ts-debian.git] / lib / ZGetSender.c
1 /* This file is part of the Project Athena Zephyr Notification System.
2  * It contains source for the ZGetSender.c function.
3  *
4  *      Created by:     Robert French
5  *
6  *      $Id$
7  *
8  *      Copyright (c) 1987, 1991 by the Massachusetts Institute of Technology.
9  *      For copying and distribution information, see the file
10  *      "mit-copyright.h". 
11  */
12
13 #include <internal.h>
14
15 #ifndef lint
16 static const char rcsid_ZGetSender_c[] =
17     "$Id$";
18 #endif
19
20 #include <pwd.h>
21
22 char *ZGetSender()
23 {
24     struct passwd *pw;
25     static char *sender = NULL;
26 #ifdef HAVE_KRB5
27     krb5_ccache ccache;
28     krb5_principal principal;
29     char *prname;
30     int result;
31     char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ]; /*XXX*/
32 #else    
33 #ifdef HAVE_KRB4
34     char pname[ANAME_SZ], pinst[INST_SZ], prealm[REALM_SZ];
35 #endif 
36 #endif
37
38     /* Return it if already cached */
39     if (sender)
40         return (sender);
41
42 #ifdef HAVE_KRB5
43     result = krb5_cc_default(Z_krb5_ctx, &ccache);
44     if (!result) {
45       result = krb5_cc_get_principal(Z_krb5_ctx, ccache, &principal);
46       if (!result) {
47 #if 1
48         krb5_unparse_name(Z_krb5_ctx, principal, &prname);
49         sender = strdup(prname);
50 #else
51         krb5_524_conv_principal(Z_krb5_ctx, principal, pname, pinst, prealm);
52         sender = malloc(ANAME_SZ+INST_SZ+REALM_SZ+3);
53         if (sender)
54           (void) sprintf(sender, "%s%s%s@%s", pname, (pinst[0]?".":""),
55                          pinst, prealm);
56 #endif
57         krb5_free_principal(Z_krb5_ctx, principal);
58       }
59       krb5_cc_close(Z_krb5_ctx, ccache);
60     } 
61 #else
62 #ifdef HAVE_KRB4
63     if (krb_get_tf_fullname((char *)TKT_FILE, pname, pinst, prealm) == KSUCCESS)
64     {
65         sender = malloc(ANAME_SZ+INST_SZ+REALM_SZ+3);
66         if (sender)
67           (void) sprintf(sender, "%s%s%s@%s", pname, (pinst[0]?".":""),
68                          pinst, prealm);
69         return (sender);
70     }
71 #endif
72 #endif
73
74     /* XXX a uid_t is a u_short (now),  but getpwuid
75      * wants an int. AARGH! */
76     pw = getpwuid((int) getuid());
77     if (!pw)
78         return ("unknown");
79     sender = malloc(strlen(pw->pw_name) + strlen(__Zephyr_realm) + 2);
80     if (sender)
81       (void) sprintf(sender, "%s@%s", pw->pw_name, __Zephyr_realm);
82     return (sender);
83 }