~ubuntu-branches/ubuntu/maverick/krb5/maverick

« back to all changes in this revision

Viewing changes to src/lib/krb5/os/def_realm.c

  • Committer: Bazaar Package Importer
  • Author(s): Sam Hartman
  • Date: 2009-05-07 16:16:34 UTC
  • mfrom: (13.1.7 sid)
  • Revision ID: james.westby@ubuntu.com-20090507161634-xqyk0s9na0le4flj
Tags: 1.7dfsg~beta1-4
When  decrypting the TGS response fails with the subkey, try with the
session key to work around Heimdal bug, Closes: #527353 

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 * lib/krb5/os/def_realm.c
3
3
 *
4
 
 * Copyright 1990,1991 by the Massachusetts Institute of Technology.
 
4
 * Copyright 1990,1991,2009 by the Massachusetts Institute of Technology.
5
5
 * All Rights Reserved.
6
6
 *
7
7
 * Export of this software from the United States of America may
32
32
#include "os-proto.h"
33
33
#include <stdio.h>
34
34
 
35
 
#ifdef KRB5_DNS_LOOKUP       
 
35
#ifdef KRB5_DNS_LOOKUP             
36
36
#ifdef WSHELPER
37
37
#include <wshelper.h>
38
38
#else /* WSHELPER */
72
72
krb5_get_default_realm(krb5_context context, char **lrealm)
73
73
{
74
74
    char *realm = 0;
75
 
    char *cp;
76
75
    krb5_error_code retval;
77
76
 
78
77
    if (!context || (context->magic != KV5M_CONTEXT)) 
79
 
            return KV5M_CONTEXT;
 
78
            return KV5M_CONTEXT;
80
79
 
81
80
    if (!context->default_realm) {
82
81
        /*
85
84
         */
86
85
        context->default_realm = 0;
87
86
        if (context->profile != 0) {
88
 
            retval = profile_get_string(context->profile, "libdefaults",
89
 
                                        "default_realm", 0, 0,
 
87
            retval = profile_get_string(context->profile, KRB5_CONF_LIBDEFAULTS,
 
88
                                        KRB5_CONF_DEFAULT_REALM, 0, 0,
90
89
                                        &realm);
91
90
 
92
91
            if (!retval && realm) {
93
 
                context->default_realm = malloc(strlen(realm) + 1);
 
92
                context->default_realm = strdup(realm);
94
93
                if (!context->default_realm) {
95
94
                    profile_release_string(realm);
96
95
                    return ENOMEM;
97
96
                }
98
 
                strcpy(context->default_realm, realm);
99
97
                profile_release_string(realm);
100
98
            }
101
99
        }
106
104
        if (context->default_realm == 0) {
107
105
            int use_dns =  _krb5_use_dns_realm(context);
108
106
            if ( use_dns ) {
109
 
                /*
110
 
                 * Since this didn't appear in our config file, try looking
111
 
                 * it up via DNS.  Look for a TXT records of the form:
112
 
                 *
113
 
                 * _kerberos.<localhost>
114
 
                 * _kerberos.<domainname>
115
 
                 * _kerberos.<searchlist>
116
 
                 *
117
 
                 */
118
 
                char localhost[MAX_DNS_NAMELEN+1];
119
 
                char * p;
120
 
 
121
 
                krb5int_get_fq_local_hostname (localhost, sizeof(localhost));
122
 
 
123
 
                if ( localhost[0] ) {
124
 
                    p = localhost;
125
 
                    do {
126
 
                        retval = krb5_try_realm_txt_rr("_kerberos", p, 
127
 
                                                       &context->default_realm);
128
 
                        p = strchr(p,'.');
129
 
                        if (p)
130
 
                            p++;
131
 
                    } while (retval && p && p[0]);
132
 
 
133
 
                    if (retval)
134
 
                        retval = krb5_try_realm_txt_rr("_kerberos", "", 
135
 
                                                       &context->default_realm);
136
 
                } else {
137
 
                    retval = krb5_try_realm_txt_rr("_kerberos", "", 
138
 
                                                   &context->default_realm);
139
 
                }
140
 
                if (retval) {
141
 
                    return(KRB5_CONFIG_NODEFREALM);
142
 
                }
 
107
                /*
 
108
                 * Since this didn't appear in our config file, try looking
 
109
                 * it up via DNS.  Look for a TXT records of the form:
 
110
                 *
 
111
                 * _kerberos.<localhost>
 
112
                 * _kerberos.<domainname>
 
113
                 * _kerberos.<searchlist>
 
114
                 *
 
115
                 */
 
116
                char localhost[MAX_DNS_NAMELEN+1];
 
117
                char * p;
 
118
 
 
119
                krb5int_get_fq_local_hostname (localhost, sizeof(localhost));
 
120
 
 
121
                if ( localhost[0] ) {
 
122
                    p = localhost;
 
123
                    do {
 
124
                        retval = krb5_try_realm_txt_rr("_kerberos", p, 
 
125
                                                       &context->default_realm);
 
126
                        p = strchr(p,'.');
 
127
                        if (p)
 
128
                            p++;
 
129
                    } while (retval && p && p[0]);
 
130
 
 
131
                    if (retval)
 
132
                        retval = krb5_try_realm_txt_rr("_kerberos", "", 
 
133
                                                       &context->default_realm);
 
134
                } else {
 
135
                    retval = krb5_try_realm_txt_rr("_kerberos", "", 
 
136
                                                   &context->default_realm);
 
137
                }
 
138
                if (retval) {
 
139
                    return(KRB5_CONFIG_NODEFREALM);
 
140
                }
143
141
            }
144
142
        }
145
143
#endif /* KRB5_DNS_LOOKUP */
146
144
    }
147
145
 
148
146
    if (context->default_realm == 0)
149
 
        return(KRB5_CONFIG_NODEFREALM);
 
147
        return(KRB5_CONFIG_NODEFREALM);
150
148
    if (context->default_realm[0] == 0) {
151
149
        free (context->default_realm);
152
150
        context->default_realm = 0;
155
153
 
156
154
    realm = context->default_realm;
157
155
    
158
 
    if (!(*lrealm = cp = malloc((unsigned int) strlen(realm) + 1)))
 
156
    if (!(*lrealm = strdup(realm)))
159
157
        return ENOMEM;
160
 
    strcpy(cp, realm);
161
158
    return(0);
162
159
}
163
160
 
165
162
krb5_set_default_realm(krb5_context context, const char *lrealm)
166
163
{
167
164
    if (!context || (context->magic != KV5M_CONTEXT)) 
168
 
            return KV5M_CONTEXT;
 
165
            return KV5M_CONTEXT;
169
166
 
170
167
    if (context->default_realm) {
171
 
            free(context->default_realm);
172
 
            context->default_realm = 0;
 
168
            free(context->default_realm);
 
169
            context->default_realm = 0;
173
170
    }
174
171
 
175
172
    /* Allow the user to clear the default realm setting by passing in 
176
173
       NULL */
177
174
    if (!lrealm) return 0;
178
175
 
179
 
    context->default_realm = malloc(strlen (lrealm) + 1);
 
176
    context->default_realm = strdup(lrealm);
180
177
 
181
178
    if (!context->default_realm)
182
 
            return ENOMEM;
 
179
            return ENOMEM;
183
180
 
184
 
    strcpy(context->default_realm, lrealm);
185
181
    return(0);
186
182
 
187
183
}
189
185
void KRB5_CALLCONV
190
186
krb5_free_default_realm(krb5_context context, char *lrealm)
191
187
{
192
 
        free (lrealm);
193
 
}
 
188
    free (lrealm);
 
189
}
 
190
 
 
191
krb5_error_code
 
192
krb5int_get_domain_realm_mapping(krb5_context context, const char *host, char ***realmsp)
 
193
{
 
194
    char **retrealms;
 
195
    char *realm, *cp, *temp_realm;
 
196
    krb5_error_code retval;
 
197
    char temp_host[MAX_DNS_NAMELEN+1];
 
198
 
 
199
    /* do sanity check and lower-case */
 
200
    retval = krb5int_clean_hostname(context, host, temp_host, sizeof temp_host);
 
201
    if (retval)
 
202
        return retval;
 
203
    /*
 
204
       Search for the best match for the host or domain.
 
205
       Example: Given a host a.b.c.d, try to match on:
 
206
         1) a.b.c.d  2) .b.c.d.   3) b.c.d  4)  .c.d  5) c.d  6) .d   7) d
 
207
     */
 
208
 
 
209
    cp = temp_host;
 
210
    realm = (char *)NULL;
 
211
    temp_realm = 0;
 
212
    while (cp ) {
 
213
        retval = profile_get_string(context->profile, KRB5_CONF_DOMAIN_REALM, cp,
 
214
                                    0, (char *)NULL, &temp_realm);
 
215
        if (retval)
 
216
            return retval;
 
217
        if (temp_realm != (char *)NULL)
 
218
            break;        /* Match found */
 
219
 
 
220
        /* Setup for another test */
 
221
        if (*cp == '.') {
 
222
            cp++;
 
223
        } else {
 
224
            cp = strchr(cp, '.');
 
225
        }
 
226
    }
 
227
    if (temp_realm != (char*)NULL) {
 
228
        realm = strdup(temp_realm);
 
229
        profile_release_string(temp_realm);
 
230
        if (!realm) {
 
231
            return ENOMEM;
 
232
        }
 
233
    }
 
234
    retrealms = (char **)calloc(2, sizeof(*retrealms));
 
235
    if (!retrealms) {
 
236
        if (realm != (char *)NULL)
 
237
            free(realm);
 
238
        return ENOMEM;
 
239
    }
 
240
 
 
241
    retrealms[0] = realm;
 
242
    retrealms[1] = 0;
 
243
 
 
244
    *realmsp = retrealms;
 
245
    return 0;
 
246
}
 
247