Changeset 478 for vendor/current/source3/libads
- Timestamp:
- Aug 2, 2010, 6:40:21 PM (15 years ago)
- Location:
- vendor/current/source3/libads
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/libads/kerberos.c
r414 r478 716 716 static char *print_kdc_line(char *mem_ctx, 717 717 const char *prev_line, 718 const struct sockaddr_storage *pss) 718 const struct sockaddr_storage *pss, 719 const char *kdc_name) 719 720 { 720 721 char *kdc_str = NULL; … … 727 728 char addr[INET6_ADDRSTRLEN]; 728 729 uint16_t port = get_sockaddr_port(pss); 730 731 DEBUG(10,("print_kdc_line: IPv6 case for kdc_name: %s, port: %d\n", 732 kdc_name, port)); 729 733 730 734 if (port != 0 && port != DEFAULT_KRB5_PORT) { … … 744 748 print_canonical_sockaddr(mem_ctx, pss), 745 749 gai_strerror(ret))); 750 return NULL; 746 751 } 747 752 /* Success, use host:port */ … … 752 757 (unsigned int)port); 753 758 } else { 754 kdc_str = talloc_asprintf(mem_ctx, "%s\tkdc = %s\n", 755 prev_line, 756 print_sockaddr(addr, 757 sizeof(addr), 758 pss)); 759 760 /* no krb5 lib currently supports "kdc = ipv6 address" 761 * at all, so just fill in just the kdc_name if we have 762 * it and let the krb5 lib figure out the appropriate 763 * ipv6 address - gd */ 764 765 if (kdc_name) { 766 kdc_str = talloc_asprintf(mem_ctx, "%s\tkdc = %s\n", 767 prev_line, kdc_name); 768 } else { 769 kdc_str = talloc_asprintf(mem_ctx, "%s\tkdc = %s\n", 770 prev_line, 771 print_sockaddr(addr, 772 sizeof(addr), 773 pss)); 774 } 759 775 } 760 776 } … … 773 789 const char *realm, 774 790 const char *sitename, 775 struct sockaddr_storage *pss) 791 struct sockaddr_storage *pss, 792 const char *kdc_name) 776 793 { 777 794 int i; … … 780 797 int count_site = 0; 781 798 int count_nonsite; 782 char *kdc_str = print_kdc_line(mem_ctx, "", pss );799 char *kdc_str = print_kdc_line(mem_ctx, "", pss, kdc_name); 783 800 784 801 if (kdc_str == NULL) { … … 804 821 kdc_str = print_kdc_line(mem_ctx, 805 822 kdc_str, 806 &ip_srv_site[i].ss); 823 &ip_srv_site[i].ss, 824 NULL); 807 825 if (!kdc_str) { 808 826 SAFE_FREE(ip_srv_site); … … 841 859 kdc_str = print_kdc_line(mem_ctx, 842 860 kdc_str, 843 &ip_srv_nonsite[i].ss); 861 &ip_srv_nonsite[i].ss, 862 NULL); 844 863 if (!kdc_str) { 845 864 SAFE_FREE(ip_srv_site); … … 869 888 const char *domain, 870 889 const char *sitename, 871 struct sockaddr_storage *pss) 890 struct sockaddr_storage *pss, 891 const char *kdc_name) 872 892 { 873 893 char *dname; … … 913 933 strupper_m(realm_upper); 914 934 915 kdc_ip_string = get_kdc_ip_string(dname, realm, sitename, pss );935 kdc_ip_string = get_kdc_ip_string(dname, realm, sitename, pss, kdc_name); 916 936 if (!kdc_ip_string) { 917 937 goto done; -
vendor/current/source3/libads/kerberos_verify.c
r414 r478 308 308 krb5_error_code ret = 0; 309 309 bool auth_ok = False; 310 bool cont = true; 310 311 char *password_s = NULL; 311 krb5_data password; 312 /* Let's make some room for 2 password (old and new)*/ 313 krb5_data passwords[2]; 312 314 krb5_enctype enctypes[] = { 313 315 #if defined(ENCTYPE_ARCFOUR_HMAC) … … 319 321 }; 320 322 krb5_data packet; 321 int i ;323 int i, j; 322 324 323 325 *pp_tkt = NULL; … … 325 327 *perr = 0; 326 328 329 ZERO_STRUCT(passwords); 327 330 328 331 if (!secrets_init()) { … … 339 342 } 340 343 341 password.data = password_s; 342 password.length = strlen(password_s); 344 passwords[0].data = password_s; 345 passwords[0].length = strlen(password_s); 346 347 password_s = secrets_fetch_prev_machine_password(lp_workgroup()); 348 if (password_s) { 349 DEBUG(10,("ads_secrets_verify_ticket: found previous password\n")); 350 passwords[1].data = password_s; 351 passwords[1].length = strlen(password_s); 352 } 343 353 344 354 /* CIFS doesn't use addresses in tickets. This would break NAT. JRA */ … … 348 358 349 359 /* We need to setup a auth context with each possible encoding type in turn. */ 350 for (i=0;enctypes[i];i++) { 351 krb5_keyblock *key = NULL; 352 353 if (!(key = SMB_MALLOC_P(krb5_keyblock))) { 354 ret = ENOMEM; 355 goto out; 356 } 357 358 if (create_kerberos_key_from_string(context, host_princ, &password, key, enctypes[i], false)) { 359 SAFE_FREE(key); 360 continue; 361 } 362 363 krb5_auth_con_setuseruserkey(context, auth_context, key); 364 365 if (!(ret = krb5_rd_req(context, &auth_context, &packet, 366 NULL, 367 NULL, NULL, pp_tkt))) { 368 DEBUG(10,("ads_secrets_verify_ticket: enc type [%u] decrypted message !\n", 369 (unsigned int)enctypes[i] )); 370 auth_ok = True; 371 krb5_copy_keyblock(context, key, keyblock); 360 for (j=0; j<2 && passwords[j].length; j++) { 361 362 for (i=0;enctypes[i];i++) { 363 krb5_keyblock *key = NULL; 364 365 if (!(key = SMB_MALLOC_P(krb5_keyblock))) { 366 ret = ENOMEM; 367 goto out; 368 } 369 370 if (create_kerberos_key_from_string(context, host_princ, &passwords[j], key, enctypes[i], false)) { 371 SAFE_FREE(key); 372 continue; 373 } 374 375 krb5_auth_con_setuseruserkey(context, auth_context, key); 376 377 if (!(ret = krb5_rd_req(context, &auth_context, &packet, 378 NULL, 379 NULL, NULL, pp_tkt))) { 380 DEBUG(10,("ads_secrets_verify_ticket: enc type [%u] decrypted message !\n", 381 (unsigned int)enctypes[i] )); 382 auth_ok = True; 383 cont = false; 384 krb5_copy_keyblock(context, key, keyblock); 385 krb5_free_keyblock(context, key); 386 break; 387 } 388 389 DEBUG((ret != KRB5_BAD_ENCTYPE) ? 3 : 10, 390 ("ads_secrets_verify_ticket: enc type [%u] failed to decrypt with error %s\n", 391 (unsigned int)enctypes[i], error_message(ret))); 392 393 /* successfully decrypted but ticket is just not valid at the moment */ 394 if (ret == KRB5KRB_AP_ERR_TKT_NYV || 395 ret == KRB5KRB_AP_ERR_TKT_EXPIRED || 396 ret == KRB5KRB_AP_ERR_SKEW) { 397 krb5_free_keyblock(context, key); 398 cont = false; 399 break; 400 } 401 372 402 krb5_free_keyblock(context, key); 403 } 404 if (!cont) { 405 /* If we found a valid pass then no need to try 406 * the next one or we have invalid ticket so no need 407 * to try next password*/ 373 408 break; 374 409 } 375 376 DEBUG((ret != KRB5_BAD_ENCTYPE) ? 3 : 10,377 ("ads_secrets_verify_ticket: enc type [%u] failed to decrypt with error %s\n",378 (unsigned int)enctypes[i], error_message(ret)));379 380 /* successfully decrypted but ticket is just not valid at the moment */381 if (ret == KRB5KRB_AP_ERR_TKT_NYV ||382 ret == KRB5KRB_AP_ERR_TKT_EXPIRED ||383 ret == KRB5KRB_AP_ERR_SKEW) {384 krb5_free_keyblock(context, key);385 break;386 }387 388 krb5_free_keyblock(context, key);389 390 410 } 391 411 392 412 out: 393 SAFE_FREE(password_s); 413 SAFE_FREE(passwords[0].data); 414 SAFE_FREE(passwords[1].data); 394 415 *perr = ret; 395 416 return auth_ok;
Note:
See TracChangeset
for help on using the changeset viewer.