Changeset 745 for trunk/server/source4/heimdal/kuser/kinit.c
- Timestamp:
- Nov 27, 2012, 4:43:17 PM (13 years ago)
- Location:
- trunk/server
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server
- Property svn:mergeinfo changed
/vendor/current merged: 581,587,591,594,597,600,615,618,740
- Property svn:mergeinfo changed
-
trunk/server/source4/heimdal/kuser/kinit.c
r414 r745 3 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 4 * All rights reserved. 5 * 6 * Portions Copyright (c) 2009 Apple Inc. All rights reserved. 5 7 * 6 8 * Redistribution and use in source and binary forms, with or without … … 34 36 #include "kuser_locl.h" 35 37 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 44 41 45 42 #ifndef NO_NTLM … … 68 65 char *keytab_str = NULL; 69 66 int do_afslog = -1; 70 #ifndef HEIMDAL_SMALLER71 int get_v4_tgt = -1;72 int convert_524 = 0;73 static char *krb4_cc_name;74 #endif75 67 int fcache_version; 76 68 char *password_file = NULL; 77 69 char *pk_user_id = NULL; 78 70 int pk_enterprise_flag = 0; 71 struct hx509_certs_data *ent_user_id = NULL; 79 72 char *pk_x509_anchors = NULL; 80 73 int pk_use_enckey = 0; … … 98 91 * C: v4 cache name? 99 92 * 5: 93 * 94 * old flags 95 * 4: 96 * 9: 100 97 */ 101 #ifndef HEIMDAL_SMALLER102 { "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 #endif108 98 { "afslog", 0 , arg_flag, &do_afslog, 109 99 NP_("obtain afs tokens", "") }, … … 112 102 NP_("credentials cache", ""), "cachename" }, 113 103 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, 115 108 NP_("get forwardable tickets", "")}, 116 109 … … 232 225 } 233 226 234 #ifndef HEIMDAL_SMALLER235 236 static krb5_error_code237 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 #endif280 281 227 static int 282 228 renew_validate(krb5_context context, … … 358 304 if(ret == 0 && server == NULL) { 359 305 /* only do this if it's a general renew-my-tgt request */ 360 #ifndef HEIMDAL_SMALLER361 if(get_v4_tgt)362 do_524init(context, cache, out, NULL);363 #endif364 306 #ifndef NO_AFS 365 307 if(do_afslog && k_hasafs()) … … 445 387 } 446 388 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 447 416 448 417 memset(&cred, 0, sizeof(cred)); … … 466 435 if (canonicalize_flag) 467 436 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) 469 438 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) { 471 440 ret = krb5_get_init_creds_opt_set_pkinit(context, opt, 472 441 principal, … … 482 451 if (ret) 483 452 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); 484 455 } 485 456 … … 544 515 opt); 545 516 krb5_kt_close(context, kt); 546 } else if (pk_user_id || anonymous_flag) {517 } else if (pk_user_id || ent_user_id || anonymous_flag) { 547 518 ret = krb5_get_init_creds_password (context, 548 519 &cred, … … 741 712 ctx->ccache, ctx->ticket_life, 0); 742 713 743 #ifndef HEIMDAL_SMALLER744 if(get_v4_tgt || convert_524)745 do_524init(ctx->context, ctx->ccache, NULL, server_str);746 #endif747 714 #ifndef NO_AFS 748 715 if(do_afslog && k_hasafs()) … … 796 763 797 764 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); 800 768 if (ret) 801 769 krb5_err(context, 1, ret, "krb5_pk_enterprise_certs"); 770 771 pk_user_id = NULL; 802 772 803 773 } else if (anonymous_flag) { … … 807 777 NULL); 808 778 if (ret) 809 krb5_err(context, 1, ret, "krb5_ build_principal");779 krb5_err(context, 1, ret, "krb5_make_principal"); 810 780 krb5_principal_set_type(context, principal, KRB5_NT_WELLKNOWN); 811 781 … … 831 801 krb5_principal_get_realm(context, principal), 832 802 "renewable", FALSE, &renewable_flag); 833 #ifndef HEIMDAL_SMALLER834 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 #endif839 803 if(do_afslog == -1) 840 804 krb5_appdefault_boolean(context, "kinit", … … 854 818 krb5_cc_get_name(context, ccache)); 855 819 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); 867 837 } 868 838 } 869 #endif870 } else {871 ret = krb5_cc_cache_match(context, principal, &ccache);872 if (ret)873 ret = krb5_cc_default (context, &ccache);874 839 } 875 840 } … … 915 880 } 916 881 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 926 884 #ifndef NO_AFS 927 885 if(do_afslog && k_hasafs()) … … 949 907 950 908 krb5_cc_destroy(context, ccache); 951 #ifndef HEIMDAL_SMALLER952 _krb5_krb_dest_tkt(context, krb4_cc_name);953 #endif954 909 #ifndef NO_AFS 955 910 if(k_hasafs())
Note:
See TracChangeset
for help on using the changeset viewer.