Ignore:
Timestamp:
Aug 2, 2010, 6:40:21 PM (15 years ago)
Author:
Silvan Scherrer
Message:

Samba 3.5: vendor update to 3.5.4

Location:
vendor/current/source3/libads
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/libads/kerberos.c

    r414 r478  
    716716static char *print_kdc_line(char *mem_ctx,
    717717                        const char *prev_line,
    718                         const struct sockaddr_storage *pss)
     718                        const struct sockaddr_storage *pss,
     719                        const char *kdc_name)
    719720{
    720721        char *kdc_str = NULL;
     
    727728                char addr[INET6_ADDRSTRLEN];
    728729                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));
    729733
    730734                if (port != 0 && port != DEFAULT_KRB5_PORT) {
     
    744748                                        print_canonical_sockaddr(mem_ctx, pss),
    745749                                        gai_strerror(ret)));
     750                                return NULL;
    746751                        }
    747752                        /* Success, use host:port */
     
    752757                                        (unsigned int)port);
    753758                } 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                        }
    759775                }
    760776        }
     
    773789                const char *realm,
    774790                const char *sitename,
    775                 struct sockaddr_storage *pss)
     791                struct sockaddr_storage *pss,
     792                const char *kdc_name)
    776793{
    777794        int i;
     
    780797        int count_site = 0;
    781798        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);
    783800
    784801        if (kdc_str == NULL) {
     
    804821                        kdc_str = print_kdc_line(mem_ctx,
    805822                                                kdc_str,
    806                                                 &ip_srv_site[i].ss);
     823                                                &ip_srv_site[i].ss,
     824                                                NULL);
    807825                        if (!kdc_str) {
    808826                                SAFE_FREE(ip_srv_site);
     
    841859                kdc_str = print_kdc_line(mem_ctx,
    842860                                kdc_str,
    843                                 &ip_srv_nonsite[i].ss);
     861                                &ip_srv_nonsite[i].ss,
     862                                NULL);
    844863                if (!kdc_str) {
    845864                        SAFE_FREE(ip_srv_site);
     
    869888                                                const char *domain,
    870889                                                const char *sitename,
    871                                                 struct sockaddr_storage *pss)
     890                                                struct sockaddr_storage *pss,
     891                                                const char *kdc_name)
    872892{
    873893        char *dname;
     
    913933        strupper_m(realm_upper);
    914934
    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);
    916936        if (!kdc_ip_string) {
    917937                goto done;
  • vendor/current/source3/libads/kerberos_verify.c

    r414 r478  
    308308        krb5_error_code ret = 0;
    309309        bool auth_ok = False;
     310        bool cont = true;
    310311        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];
    312314        krb5_enctype enctypes[] = {
    313315#if defined(ENCTYPE_ARCFOUR_HMAC)
     
    319321        };
    320322        krb5_data packet;
    321         int i;
     323        int i, j;
    322324
    323325        *pp_tkt = NULL;
     
    325327        *perr = 0;
    326328
     329        ZERO_STRUCT(passwords);
    327330
    328331        if (!secrets_init()) {
     
    339342        }
    340343
    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        }
    343353
    344354        /* CIFS doesn't use addresses in tickets. This would break NAT. JRA */
     
    348358
    349359        /* 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
    372402                        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*/
    373408                        break;
    374409                }
    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 
    390410        }
    391411
    392412 out:
    393         SAFE_FREE(password_s);
     413        SAFE_FREE(passwords[0].data);
     414        SAFE_FREE(passwords[1].data);
    394415        *perr = ret;
    395416        return auth_ok;
Note: See TracChangeset for help on using the changeset viewer.