1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /* lib/krb5/os/ktdefname.c - Return default keytab name */
3 /*
4 * Copyright 1990 by the Massachusetts Institute of Technology.
5 * All Rights Reserved.
6 *
7 * Export of this software from the United States of America may
8 * require a specific license from the United States Government.
9 * It is the responsibility of any person or organization contemplating
10 * export to obtain such a license before exporting.
11 *
12 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13 * distribute this software and its documentation for any purpose and
14 * without fee is hereby granted, provided that the above copyright
15 * notice appear in all copies and that both that copyright notice and
16 * this permission notice appear in supporting documentation, and that
17 * the name of M.I.T. not be used in advertising or publicity pertaining
18 * to distribution of the software without specific, written prior
19 * permission. Furthermore if you modify this software you must label
20 * your software as modified software and not distribute it in such a
21 * fashion that it might be confused with the original M.I.T. software.
22 * M.I.T. makes no representations about the suitability of
23 * this software for any purpose. It is provided "as is" without express
24 * or implied warranty.
25 */
26
27 #define NEED_WINDOWS
28
29 #include "k5-int.h"
30 #include "os-proto.h"
31
32 /* this is a an exceedinly gross thing. */
33 char *krb5_overridekeyname = NULL;
34
35 static krb5_error_code
kt_default_name(krb5_context context,char ** name_out)36 kt_default_name(krb5_context context, char **name_out)
37 {
38 krb5_error_code ret;
39 char *str;
40
41 if (krb5_overridekeyname != NULL) {
42 *name_out = strdup(krb5_overridekeyname);
43 return (*name_out == NULL) ? ENOMEM : 0;
44 } else if (context->profile_secure == FALSE &&
45 (str = secure_getenv("KRB5_KTNAME")) != NULL) {
46 *name_out = strdup(str);
47 return (*name_out == NULL) ? ENOMEM : 0;
48 } else if (profile_get_string(context->profile, KRB5_CONF_LIBDEFAULTS,
49 KRB5_CONF_DEFAULT_KEYTAB_NAME, NULL, NULL,
50 &str) == 0 && str != NULL) {
51 ret = k5_expand_path_tokens(context, str, name_out);
52 profile_release_string(str);
53 return ret;
54 } else {
55 return k5_expand_path_tokens(context, DEFKTNAME, name_out);
56 }
57 }
58
59 krb5_error_code
k5_kt_client_default_name(krb5_context context,char ** name_out)60 k5_kt_client_default_name(krb5_context context, char **name_out)
61 {
62 krb5_error_code ret;
63 char *str;
64
65 if (context->profile_secure == FALSE &&
66 (str = secure_getenv("KRB5_CLIENT_KTNAME")) != NULL) {
67 *name_out = strdup(str);
68 return (*name_out == NULL) ? ENOMEM : 0;
69 } else if (profile_get_string(context->profile, KRB5_CONF_LIBDEFAULTS,
70 KRB5_CONF_DEFAULT_CLIENT_KEYTAB_NAME, NULL,
71 NULL, &str) == 0 && str != NULL) {
72 ret = k5_expand_path_tokens(context, str, name_out);
73 profile_release_string(str);
74 return ret;
75 } else {
76 return k5_expand_path_tokens(context, DEFCKTNAME, name_out);
77 }
78 }
79
80 krb5_error_code KRB5_CALLCONV
krb5_kt_default_name(krb5_context context,char * name,int name_size)81 krb5_kt_default_name(krb5_context context, char *name, int name_size)
82 {
83 krb5_error_code ret;
84 unsigned int namesize = (name_size < 0 ? 0 : name_size);
85 char *ktname;
86
87 ret = kt_default_name(context, &ktname);
88 if (ret)
89 return ret;
90 if (strlcpy(name, ktname, namesize) >= namesize)
91 ret = KRB5_CONFIG_NOTENUFSPACE;
92 free(ktname);
93 return ret;
94 }
95