Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source4/heimdal/kuser/kinit.c

    r414 r745  
    33 * (Royal Institute of Technology, Stockholm, Sweden).
    44 * All rights reserved.
     5 *
     6 * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
    57 *
    68 * Redistribution and use in source and binary forms, with or without
     
    3436#include "kuser_locl.h"
    3537
    36 #ifndef HEIMDAL_SMALLER
    37 #include "krb5-v4compat.h"
    38 #endif
    39 
    40 struct krb5_dh_moduli;
    41 struct AlgorithmIdentifier;
    42 struct _krb5_krb_auth_data;
    43 #include <krb5-private.h>
     38#ifdef __APPLE__
     39#include <Security/Security.h>
     40#endif
    4441
    4542#ifndef NO_NTLM
     
    6865char *keytab_str        = NULL;
    6966int do_afslog           = -1;
    70 #ifndef HEIMDAL_SMALLER
    71 int get_v4_tgt          = -1;
    72 int convert_524         = 0;
    73 static char *krb4_cc_name;
    74 #endif
    7567int fcache_version;
    7668char *password_file     = NULL;
    7769char *pk_user_id        = NULL;
    7870int pk_enterprise_flag = 0;
     71struct hx509_certs_data *ent_user_id = NULL;
    7972char *pk_x509_anchors   = NULL;
    8073int pk_use_enckey       = 0;
     
    9891     * C: v4 cache name?
    9992     * 5:
     93     *
     94     * old flags
     95     * 4:
     96     * 9:
    10097     */
    101 #ifndef HEIMDAL_SMALLER
    102     { "524init",        '4', arg_flag, &get_v4_tgt,
    103       NP_("obtain version 4 TGT", "") },
    104 
    105     { "524convert",     '9', arg_flag, &convert_524,
    106       NP_("only convert ticket to version 4", "") },
    107 #endif
    10898    { "afslog",         0  , arg_flag, &do_afslog,
    10999      NP_("obtain afs tokens", "")  },
     
    112102      NP_("credentials cache", ""), "cachename" },
    113103
    114     { "forwardable",    'f', arg_flag, &forwardable_flag,
     104    { "forwardable",    0, arg_negative_flag, &forwardable_flag,
     105      NP_("get tickets not forwardable", "")},
     106
     107    { NULL,             'f', arg_flag, &forwardable_flag,
    115108      NP_("get forwardable tickets", "")},
    116109
     
    232225}
    233226
    234 #ifndef HEIMDAL_SMALLER
    235 
    236 static krb5_error_code
    237 do_524init(krb5_context context, krb5_ccache ccache,
    238            krb5_creds *creds, const char *server)
    239 {
    240     krb5_error_code ret;
    241 
    242     struct credentials c;
    243     krb5_creds in_creds, *real_creds;
    244 
    245     if(creds != NULL)
    246         real_creds = creds;
    247     else {
    248         krb5_principal client;
    249         krb5_cc_get_principal(context, ccache, &client);
    250         memset(&in_creds, 0, sizeof(in_creds));
    251         ret = get_server(context, client, server, &in_creds.server);
    252         if(ret) {
    253             krb5_free_principal(context, client);
    254             return ret;
    255         }
    256         in_creds.client = client;
    257         ret = krb5_get_credentials(context, 0, ccache, &in_creds, &real_creds);
    258         krb5_free_principal(context, client);
    259         krb5_free_principal(context, in_creds.server);
    260         if(ret)
    261             return ret;
    262     }
    263     ret = krb524_convert_creds_kdc_ccache(context, ccache, real_creds, &c);
    264     if(ret)
    265         krb5_warn(context, ret, "converting creds");
    266     else {
    267         krb5_error_code tret = _krb5_krb_tf_setup(context, &c, NULL, 0);
    268         if(tret)
    269             krb5_warn(context, tret, "saving v4 creds");
    270     }
    271 
    272     if(creds == NULL)
    273         krb5_free_creds(context, real_creds);
    274     memset(&c, 0, sizeof(c));
    275 
    276     return ret;
    277 }
    278 
    279 #endif
    280 
    281227static int
    282228renew_validate(krb5_context context,
     
    358304    if(ret == 0 && server == NULL) {
    359305        /* only do this if it's a general renew-my-tgt request */
    360 #ifndef HEIMDAL_SMALLER
    361         if(get_v4_tgt)
    362             do_524init(context, cache, out, NULL);
    363 #endif
    364306#ifndef NO_AFS
    365307        if(do_afslog && k_hasafs())
     
    445387    }
    446388
     389#ifdef __APPLE__
     390    if (passwd[0] == '\0') {
     391        const char *realm;
     392        OSStatus osret;
     393        UInt32 length;
     394        void *buffer;
     395        char *name;
     396
     397        realm = krb5_principal_get_realm(context, principal);
     398
     399        ret = krb5_unparse_name_flags(context, principal,
     400                                      KRB5_PRINCIPAL_UNPARSE_NO_REALM, &name);
     401        if (ret)
     402            goto nopassword;
     403
     404        osret = SecKeychainFindGenericPassword(NULL, strlen(realm), realm,
     405                                               strlen(name), name,
     406                                               &length, &buffer, NULL);
     407        free(name);
     408        if (osret == noErr && length < sizeof(passwd) - 1) {
     409            memcpy(passwd, buffer, length);
     410            passwd[length] = '\0';
     411        }
     412    nopassword:
     413        do { } while(0);
     414    }
     415#endif
    447416
    448417    memset(&cred, 0, sizeof(cred));
     
    466435    if (canonicalize_flag)
    467436        krb5_get_init_creds_opt_set_canonicalize(context, opt, TRUE);
    468     if (pk_enterprise_flag && windows_flag)
     437    if ((pk_enterprise_flag || enterprise_flag || canonicalize_flag) && windows_flag)
    469438        krb5_get_init_creds_opt_set_win2k(context, opt, TRUE);
    470     if (pk_user_id || anonymous_flag) {
     439    if (pk_user_id || ent_user_id || anonymous_flag) {
    471440        ret = krb5_get_init_creds_opt_set_pkinit(context, opt,
    472441                                                 principal,
     
    482451        if (ret)
    483452            krb5_err(context, 1, ret, "krb5_get_init_creds_opt_set_pkinit");
     453        if (ent_user_id)
     454            krb5_get_init_creds_opt_set_pkinit_user_certs(context, opt, ent_user_id);
    484455    }
    485456
     
    544515                                          opt);
    545516        krb5_kt_close(context, kt);
    546     } else if (pk_user_id || anonymous_flag) {
     517    } else if (pk_user_id || ent_user_id || anonymous_flag) {
    547518        ret = krb5_get_init_creds_password (context,
    548519                                            &cred,
     
    741712                        ctx->ccache, ctx->ticket_life, 0);
    742713
    743 #ifndef HEIMDAL_SMALLER
    744     if(get_v4_tgt || convert_524)
    745         do_524init(ctx->context, ctx->ccache, NULL, server_str);
    746 #endif
    747714#ifndef NO_AFS
    748715    if(do_afslog && k_hasafs())
     
    796763
    797764    if (pk_enterprise_flag) {
    798         ret = _krb5_pk_enterprise_cert(context, pk_user_id,
    799                                        argv[0], &principal);
     765        ret = krb5_pk_enterprise_cert(context, pk_user_id,
     766                                      argv[0], &principal,
     767                                      &ent_user_id);
    800768        if (ret)
    801769            krb5_err(context, 1, ret, "krb5_pk_enterprise_certs");
     770
     771        pk_user_id = NULL;
    802772
    803773    } else if (anonymous_flag) {
     
    807777                                  NULL);
    808778        if (ret)
    809             krb5_err(context, 1, ret, "krb5_build_principal");
     779            krb5_err(context, 1, ret, "krb5_make_principal");
    810780        krb5_principal_set_type(context, principal, KRB5_NT_WELLKNOWN);
    811781
     
    831801                                krb5_principal_get_realm(context, principal),
    832802                                "renewable", FALSE, &renewable_flag);
    833 #ifndef HEIMDAL_SMALLER
    834     if(get_v4_tgt == -1)
    835         krb5_appdefault_boolean(context, "kinit",
    836                                 krb5_principal_get_realm(context, principal),
    837                                 "krb4_get_tickets", FALSE, &get_v4_tgt);
    838 #endif
    839803    if(do_afslog == -1)
    840804        krb5_appdefault_boolean(context, "kinit",
     
    854818                     krb5_cc_get_name(context, ccache));
    855819            setenv("KRB5CCNAME", s, 1);
    856 #ifndef HEIMDAL_SMALLER
    857             if (get_v4_tgt) {
    858                 int fd;
    859                 if (asprintf(&krb4_cc_name, "%s_XXXXXX", TKT_ROOT) < 0)
    860                     krb5_errx(context, 1, "out of memory");
    861                 if((fd = mkstemp(krb4_cc_name)) >= 0) {
    862                     close(fd);
    863                     setenv("KRBTKFILE", krb4_cc_name, 1);
    864                 } else {
    865                     free(krb4_cc_name);
    866                     krb4_cc_name = NULL;
     820        } else {
     821            ret = krb5_cc_cache_match(context, principal, &ccache);
     822            if (ret) {
     823                const char *type;
     824                ret = krb5_cc_default (context, &ccache);
     825                if (ret)
     826                    krb5_err (context, 1, ret, N_("resolving credentials cache", ""));
     827
     828                /*
     829                 * Check if the type support switching, and we do,
     830                 * then do that instead over overwriting the current
     831                 * default credential
     832                 */
     833                type = krb5_cc_get_type(context, ccache);
     834                if (krb5_cc_support_switch(context, type)) {
     835                    krb5_cc_close(context, ccache);
     836                    ret = krb5_cc_new_unique(context, type, NULL, &ccache);
    867837                }
    868838            }
    869 #endif
    870         } else {
    871             ret = krb5_cc_cache_match(context, principal, &ccache);
    872             if (ret)
    873                 ret = krb5_cc_default (context, &ccache);
    874839        }
    875840    }
     
    915880    }
    916881
    917 #ifndef HEIMDAL_SMALLER
    918     if(!convert_524)
    919 #endif
    920         get_new_tickets(context, principal, ccache, ticket_life, 1);
    921 
    922 #ifndef HEIMDAL_SMALLER
    923     if(get_v4_tgt || convert_524)
    924         do_524init(context, ccache, NULL, server_str);
    925 #endif
     882    get_new_tickets(context, principal, ccache, ticket_life, 1);
     883
    926884#ifndef NO_AFS
    927885    if(do_afslog && k_hasafs())
     
    949907       
    950908        krb5_cc_destroy(context, ccache);
    951 #ifndef HEIMDAL_SMALLER
    952         _krb5_krb_dest_tkt(context, krb4_cc_name);
    953 #endif
    954909#ifndef NO_AFS
    955910        if(k_hasafs())
Note: See TracChangeset for help on using the changeset viewer.