1 /*        $NetBSD: appdefault.c,v 1.2 2017/01/28 21:31:49 christos Exp $        */
2 
3 /*
4  * Copyright (c) 2000 - 2001 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the Institute nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include "krb5_locl.h"
37 
38 KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_appdefault_boolean(krb5_context context,const char * appname,krb5_const_realm realm,const char * option,krb5_boolean def_val,krb5_boolean * ret_val)39 krb5_appdefault_boolean(krb5_context context, const char *appname,
40                               krb5_const_realm realm, const char *option,
41                               krb5_boolean def_val, krb5_boolean *ret_val)
42 {
43 
44     if(appname == NULL)
45           appname = getprogname();
46 
47     def_val = krb5_config_get_bool_default(context, NULL, def_val,
48                                                      "libdefaults", option, NULL);
49     if(realm != NULL)
50           def_val = krb5_config_get_bool_default(context, NULL, def_val,
51                                                          "realms", realm, option, NULL);
52 
53     def_val = krb5_config_get_bool_default(context, NULL, def_val,
54                                                      "appdefaults",
55                                                      option,
56                                                      NULL);
57     if(realm != NULL)
58           def_val = krb5_config_get_bool_default(context, NULL, def_val,
59                                                          "appdefaults",
60                                                          realm,
61                                                          option,
62                                                          NULL);
63     if(appname != NULL) {
64           def_val = krb5_config_get_bool_default(context, NULL, def_val,
65                                                          "appdefaults",
66                                                          appname,
67                                                          option,
68                                                          NULL);
69           if(realm != NULL)
70               def_val = krb5_config_get_bool_default(context, NULL, def_val,
71                                                                "appdefaults",
72                                                                appname,
73                                                                realm,
74                                                                option,
75                                                                NULL);
76     }
77     *ret_val = def_val;
78 }
79 
80 KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_appdefault_string(krb5_context context,const char * appname,krb5_const_realm realm,const char * option,const char * def_val,char ** ret_val)81 krb5_appdefault_string(krb5_context context, const char *appname,
82                            krb5_const_realm realm, const char *option,
83                            const char *def_val, char **ret_val)
84 {
85     if(appname == NULL)
86           appname = getprogname();
87 
88     def_val = krb5_config_get_string_default(context, NULL, def_val,
89                                                        "libdefaults", option, NULL);
90     if(realm != NULL)
91           def_val = krb5_config_get_string_default(context, NULL, def_val,
92                                                              "realms", realm, option, NULL);
93 
94     def_val = krb5_config_get_string_default(context, NULL, def_val,
95                                                        "appdefaults",
96                                                        option,
97                                                        NULL);
98     if(realm != NULL)
99           def_val = krb5_config_get_string_default(context, NULL, def_val,
100                                                              "appdefaults",
101                                                              realm,
102                                                              option,
103                                                              NULL);
104     if(appname != NULL) {
105           def_val = krb5_config_get_string_default(context, NULL, def_val,
106                                                              "appdefaults",
107                                                              appname,
108                                                              option,
109                                                              NULL);
110           if(realm != NULL)
111               def_val = krb5_config_get_string_default(context, NULL, def_val,
112                                                                  "appdefaults",
113                                                                  appname,
114                                                                  realm,
115                                                                  option,
116                                                                  NULL);
117     }
118     if(def_val != NULL)
119           *ret_val = strdup(def_val);
120     else
121           *ret_val = NULL;
122 }
123 
124 KRB5_LIB_FUNCTION void KRB5_LIB_CALL
krb5_appdefault_time(krb5_context context,const char * appname,krb5_const_realm realm,const char * option,time_t def_val,time_t * ret_val)125 krb5_appdefault_time(krb5_context context, const char *appname,
126                          krb5_const_realm realm, const char *option,
127                          time_t def_val, time_t *ret_val)
128 {
129     krb5_deltat t;
130     char *val;
131 
132     krb5_appdefault_string(context, appname, realm, option, NULL, &val);
133     if (val == NULL) {
134           *ret_val = def_val;
135           return;
136     }
137     if (krb5_string_to_deltat(val, &t))
138           *ret_val = def_val;
139     else
140           *ret_val = t;
141     free(val);
142 }
143