1 /*
2 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
4 */
5
6 #pragma ident "%Z%%M% %I% %E% SMI"
7
8 /*
9 * lib/krb5/os/ccdefname.c
10 *
11 * Copyright 1990 by the Massachusetts Institute of Technology.
12 * All Rights Reserved.
13 *
14 * Export of this software from the United States of America may
15 * require a specific license from the United States Government.
16 * It is the responsibility of any person or organization contemplating
17 * export to obtain such a license before exporting.
18 *
19 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
20 * distribute this software and its documentation for any purpose and
21 * without fee is hereby granted, provided that the above copyright
22 * notice appear in all copies and that both that copyright notice and
23 * this permission notice appear in supporting documentation, and that
24 * the name of M.I.T. not be used in advertising or publicity pertaining
25 * to distribution of the software without specific, written prior
26 * permission. Furthermore if you modify this software you must label
27 * your software as modified software and not distribute it in such a
28 * fashion that it might be confused with the original M.I.T. software.
29 * M.I.T. makes no representations about the suitability of
30 * this software for any purpose. It is provided "as is" without express
31 * or implied warranty.
32 *
33 *
34 * Return default cred. cache name.
35 */
36
37 /*
38 * SUNW14resync - because of changes specific to Solaris, future
39 * resyncs should leave this file "as is" if possible.
40 */
41
42 #include <k5-int.h>
43 #include <stdio.h>
44
45 /*
46 * Solaris kerberos: use dirent.h to get maximum filename length MAXNAMLEN
47 */
48 #include <dirent.h>
49
get_from_os(char * name_buf,int name_size)50 static krb5_error_code get_from_os(
51 char *name_buf,
52 int name_size)
53 {
54 krb5_error_code retval;
55
56 /*
57 * Solaris Kerberos
58 * Use krb5_getuid() to select the mechanism to obtain the uid.
59 */
60 retval = snprintf(name_buf, name_size, "FILE:/tmp/krb5cc_%d",
61 krb5_getuid());
62 KRB5_LOG(KRB5_INFO, "get_from_os() FILE=%s\n", name_buf);
63 if (retval < 0)
64 return retval;
65 else
66 return 0;
67 }
68
69 /*ARGSUSED*/
70 krb5_error_code KRB5_CALLCONV
krb5_cc_set_default_name(krb5_context context,const char * name)71 krb5_cc_set_default_name(
72 krb5_context context,
73 const char *name)
74 {
75 char name_buf[MAXNAMLEN];
76 char *new_name = getenv(KRB5_ENV_CCNAME);
77 int name_length;
78 krb5_error_code retval;
79 krb5_os_context os_ctx;
80
81 if (!context || context->magic != KV5M_CONTEXT)
82 return KV5M_CONTEXT;
83
84 os_ctx = context->os_context;
85
86 /*
87 * Solaris kerberos:
88 * Use the following in this order
89 * 1) name from arg
90 * 2) name from environment variable
91 * 3) name from os based on UID
92 * resulting string is pointed to by name
93 */
94
95 if (!name) {
96 /* use environment variable or default */
97 if (new_name != 0) { /* so that it is in env variable */
98 name = new_name;
99 } else {
100 retval = get_from_os(name_buf, sizeof(name_buf));
101 if (retval)
102 return retval;
103 name = name_buf;
104 }
105 }
106
107 name_length = strlen(name);
108 if (name_length >= MAXNAMLEN || name_length <=0) {
109 KRB5_LOG(KRB5_ERR, "krb5_cc_set_default_name() "
110 "bad file size %d\n", name_length);
111 return -1;
112 }
113 new_name = malloc(name_length+1);
114 if (!new_name)
115 return ENOMEM;
116 strcpy(new_name, name);
117
118 if (os_ctx->default_ccname)
119 free(os_ctx->default_ccname);
120
121 os_ctx->default_ccname = new_name;
122 return 0;
123 }
124
125
126 const char * KRB5_CALLCONV
krb5_cc_default_name(krb5_context context)127 krb5_cc_default_name(krb5_context context)
128 {
129 krb5_os_context os_ctx;
130
131 if (!context || context->magic != KV5M_CONTEXT)
132 return NULL;
133
134 os_ctx = context->os_context;
135
136 /*
137 * Solaris kerberos: this is a bug fix for service principals.
138 * We need to always fetch the ccache name.
139 */
140 krb5_cc_set_default_name(context, NULL);
141
142 KRB5_LOG(KRB5_INFO, "krb5_cc_default_name() FILE=%s\n",
143 os_ctx->default_ccname);
144
145 return(os_ctx->default_ccname);
146 }
147