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/source3/libads/krb5_setpw.c

    r414 r745  
    2121#include "includes.h"
    2222#include "smb_krb5.h"
     23#include "libads/kerberos_proto.h"
     24#include "../lib/util/asn1.h"
    2325
    2426#ifdef HAVE_KRB5
     
    574576        krb5_error_code ret = 0;
    575577        krb5_context context = NULL;
    576         krb5_principal principal = NULL;
    577         char *princ_name = NULL;
    578         char *realm = NULL;
     578        const char *realm = NULL;
     579        unsigned int realm_len = 0;
    579580        krb5_creds creds, *credsp = NULL;
    580 #if KRB5_PRINC_REALM_RETURNS_REALM
    581         krb5_realm orig_realm;
    582 #else
    583         krb5_data orig_realm;
    584 #endif
    585581        krb5_ccache ccache = NULL;
    586582
     
    605601        }
    606602
    607         realm = strchr_m(princ, '@');
    608         if (!realm) {
    609                 krb5_cc_close(context, ccache);
    610                 krb5_free_context(context);
    611                 DEBUG(1,("Failed to get realm\n"));
    612                 return ADS_ERROR_KRB5(-1);
    613         }
    614         realm++;
    615 
    616         if (asprintf(&princ_name, "kadmin/changepw@%s", realm) == -1) {
     603        ret = krb5_cc_get_principal(context, ccache, &creds.client);
     604        if (ret) {
    617605                krb5_cc_close(context, ccache);
    618606                krb5_free_context(context);
    619                 DEBUG(1,("asprintf failed\n"));
    620                 return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
    621         }
    622 
    623         ret = smb_krb5_parse_name(context, princ_name, &creds.server);
    624         if (ret) {
    625                 krb5_cc_close(context, ccache);
    626                 krb5_free_context(context);
    627                 DEBUG(1,("Failed to parse kadmin/changepw (%s)\n", error_message(ret)));
    628                 return ADS_ERROR_KRB5(ret);
    629         }
    630 
    631         /* parse the principal we got as a function argument */
    632         ret = smb_krb5_parse_name(context, princ, &principal);
    633         if (ret) {
    634                 krb5_cc_close(context, ccache);
    635                 krb5_free_principal(context, creds.server);
    636                 krb5_free_context(context);
    637                 DEBUG(1,("Failed to parse %s (%s)\n", princ_name, error_message(ret)));
    638                 free(princ_name);
    639                 return ADS_ERROR_KRB5(ret);
    640         }
    641 
    642         free(princ_name);
    643 
    644         /* The creds.server principal takes ownership of this memory.
    645                 Remember to set back to original value before freeing. */
    646         orig_realm = *krb5_princ_realm(context, creds.server);
    647         krb5_princ_set_realm(context, creds.server, krb5_princ_realm(context, principal));
    648        
    649         ret = krb5_cc_get_principal(context, ccache, &creds.client);
    650         if (ret) {
    651                 krb5_cc_close(context, ccache);
    652                 krb5_princ_set_realm(context, creds.server, &orig_realm);
    653                 krb5_free_principal(context, creds.server);
    654                 krb5_free_principal(context, principal);
    655                 krb5_free_context(context);
    656                 DEBUG(1,("Failed to get principal from ccache (%s)\n",
     607                DEBUG(1,("Failed to get principal from ccache (%s)\n",
    657608                         error_message(ret)));
    658609                return ADS_ERROR_KRB5(ret);
    659610        }
    660        
    661         ret = krb5_get_credentials(context, 0, ccache, &creds, &credsp);
     611
     612        realm = smb_krb5_principal_get_realm(context, creds.client);
     613        realm_len = strlen(realm);
     614        ret = krb5_build_principal(context,
     615                                   &creds.server,
     616                                   realm_len,
     617                                   realm, "kadmin", "changepw", NULL);
     618
     619        ret = krb5_get_credentials(context, 0, ccache, &creds, &credsp);
    662620        if (ret) {
    663621                krb5_cc_close(context, ccache);
    664622                krb5_free_principal(context, creds.client);
    665                 krb5_princ_set_realm(context, creds.server, &orig_realm);
    666623                krb5_free_principal(context, creds.server);
    667                 krb5_free_principal(context, principal);
     624                krb5_free_context(context);
     625                DEBUG(1,("krb5_build_prinipal_ext (%s)\n", error_message(ret)));
     626                return ADS_ERROR_KRB5(ret);
     627        }
     628       
     629        ret = krb5_get_credentials(context, 0, ccache, &creds, &credsp);
     630        if (ret) {
     631                krb5_cc_close(context, ccache);
     632                krb5_free_principal(context, creds.client);
     633                krb5_free_principal(context, creds.server);
    668634                krb5_free_context(context);
    669635                DEBUG(1,("krb5_get_credentials failed (%s)\n", error_message(ret)));
     
    679645        krb5_free_creds(context, credsp);
    680646        krb5_free_principal(context, creds.client);
    681         krb5_princ_set_realm(context, creds.server, &orig_realm);
    682647        krb5_free_principal(context, creds.server);
    683         krb5_free_principal(context, principal);
    684648        krb5_cc_close(context, ccache);
    685649        krb5_free_context(context);
     
    729693    krb5_creds creds;
    730694    char *chpw_princ = NULL, *password;
     695    const char *realm = NULL;
    731696
    732697    initialize_krb5_error_table();
     
    750715    krb5_get_init_creds_opt_set_proxiable(&opts, 0);
    751716
     717    realm = smb_krb5_principal_get_realm(context, princ);
     718
    752719    /* We have to obtain an INITIAL changepw ticket for changing password */
    753     if (asprintf(&chpw_princ, "kadmin/changepw@%s",
    754                                 (char *) krb5_princ_realm(context, princ)) == -1) {
     720    if (asprintf(&chpw_princ, "kadmin/changepw@%s", realm) == -1) {
    755721        krb5_free_context(context);
    756722        DEBUG(1,("ads_krb5_chg_password: asprintf fail\n"));
     
    807773}
    808774
    809 
    810 /**
    811  * Set the machine account password
    812  * @param ads connection to ads server
    813  * @param hostname machine whose password is being set
    814  * @param password new password
    815  * @return status of password change
    816  **/
    817 ADS_STATUS ads_set_machine_password(ADS_STRUCT *ads,
    818                                     const char *machine_account,
    819                                     const char *password)
    820 {
    821         ADS_STATUS status;
    822         char *principal = NULL;
    823 
    824         /*
    825           we need to use the '$' form of the name here (the machine account name),
    826           as otherwise the server might end up setting the password for a user
    827           instead
    828          */
    829         if (asprintf(&principal, "%s@%s", machine_account, ads->config.realm) < 0) {
    830                 return ADS_ERROR_NT(NT_STATUS_NO_MEMORY);
    831         }
    832        
    833         status = ads_krb5_set_password(ads->auth.kdc_server, principal,
    834                                        password, ads->auth.time_offset);
    835        
    836         SAFE_FREE(principal);
    837         return status;
    838 }
    839775#endif
Note: See TracChangeset for help on using the changeset viewer.