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/dsdb/samdb/cracknames.c

    r414 r745  
    2424#include "includes.h"
    2525#include "librpc/gen_ndr/drsuapi.h"
     26#include "lib/events/events.h"
    2627#include "rpc_server/common/common.h"
    27 #include "lib/events/events.h"
    28 #include "lib/ldb/include/ldb.h"
    29 #include "lib/ldb/include/ldb_errors.h"
     28#include <ldb.h>
     29#include <ldb_errors.h>
    3030#include "system/kerberos.h"
    3131#include "auth/kerberos/kerberos.h"
    3232#include "libcli/ldap/ldap_ndr.h"
    3333#include "libcli/security/security.h"
    34 #include "librpc/gen_ndr/ndr_misc.h"
    3534#include "auth/auth.h"
    3635#include "../lib/util/util_ldb.h"
    3736#include "dsdb/samdb/samdb.h"
     37#include "dsdb/common/util.h"
    3838#include "param/param.h"
    3939
    4040static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
    4141                                   struct smb_krb5_context *smb_krb5_context,
    42                                    uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
     42                                   uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
     43                                   enum drsuapi_DsNameFormat format_desired,
    4344                                   struct ldb_dn *name_dn, const char *name,
    4445                                   const char *domain_filter, const char *result_filter,
    4546                                   struct drsuapi_DsNameInfo1 *info1);
    4647static WERROR DsCrackNameOneSyntactical(TALLOC_CTX *mem_ctx,
    47                                         uint32_t format_offered, uint32_t format_desired,
     48                                        enum drsuapi_DsNameFormat format_offered,
     49                                        enum drsuapi_DsNameFormat format_desired,
    4850                                        struct ldb_dn *name_dn, const char *name,
    4951                                        struct drsuapi_DsNameInfo1 *info1);
     
    5658        krb5_principal principal;
    5759        /* perhaps it's a principal with a realm, so return the right 'domain only' response */
    58         char *realm;
     60        const char *realm;
    5961        ret = krb5_parse_name_flags(smb_krb5_context->krb5_context, name,
    6062                                    KRB5_PRINCIPAL_PARSE_REQUIRE_REALM, &principal);
     
    8183                                                      char **alias_to)
    8284{
    83         int i;
     85        unsigned int i;
    8486        int ret;
    8587        struct ldb_result *res;
     
    100102
    101103        service_dn = ldb_dn_new(tmp_ctx, ldb_ctx, "CN=Directory Service,CN=Windows NT,CN=Services");
    102         if ( ! ldb_dn_add_base(service_dn, samdb_config_dn(ldb_ctx))) {
     104        if ( ! ldb_dn_add_base(service_dn, ldb_get_config_basedn(ldb_ctx))) {
    103105                return DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
    104106        }
     
    178180static WERROR DsCrackNameSPNAlias(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
    179181                                  struct smb_krb5_context *smb_krb5_context,
    180                                   uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
     182                                  uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
     183                                  enum drsuapi_DsNameFormat format_desired,
    181184                                  const char *name, struct drsuapi_DsNameInfo1 *info1)
    182185{
     
    204207        if (principal->name.name_string.len < 2) {
    205208                info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
     209                krb5_free_principal(smb_krb5_context->krb5_context, principal);
    206210                return WERR_OK;
    207211        }
     
    215219
    216220        if (namestatus == DRSUAPI_DS_NAME_STATUS_NOT_FOUND) {
     221                wret = WERR_OK;
    217222                info1->status           = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY;
    218223                info1->dns_domain_name  = talloc_strdup(mem_ctx, dns_name);
    219224                if (!info1->dns_domain_name) {
    220                         krb5_free_principal(smb_krb5_context->krb5_context, principal);
    221                         return WERR_NOMEM;
    222                 }
    223                 return WERR_OK;
     225                        wret = WERR_NOMEM;
     226                }
     227                krb5_free_principal(smb_krb5_context->krb5_context, principal);
     228                return wret;
    224229        } else if (namestatus != DRSUAPI_DS_NAME_STATUS_OK) {
    225230                info1->status = namestatus;
     
    263268static WERROR DsCrackNameUPN(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
    264269                             struct smb_krb5_context *smb_krb5_context,
    265                              uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
     270                             uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
     271                             enum drsuapi_DsNameFormat format_desired,
    266272                             const char *name, struct drsuapi_DsNameInfo1 *info1)
    267273{
     
    272278        krb5_error_code ret;
    273279        krb5_principal principal;
    274         char *realm;
     280        const char *realm;
    275281        char *unparsed_name_short;
    276282        const char *domain_attrs[] = { NULL };
     
    290296        }
    291297
    292         realm = krb5_principal_get_realm(smb_krb5_context->krb5_context, principal);
     298        realm = krb5_principal_get_realm(smb_krb5_context->krb5_context,
     299                                         principal);
    293300
    294301        ldb_ret = ldb_search(sam_ctx, mem_ctx, &domain_res,
     
    303310                DEBUG(2, ("DsCrackNameUPN domain ref search failed: %s", ldb_errstring(sam_ctx)));
    304311                info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
     312                krb5_free_principal(smb_krb5_context->krb5_context, principal);
    305313                return WERR_OK;
    306314        }
     
    310318                break;
    311319        case 0:
     320                krb5_free_principal(smb_krb5_context->krb5_context, principal);
    312321                return dns_domain_from_principal(mem_ctx, smb_krb5_context,
    313322                                                 name, info1);
    314323        default:
    315324                info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE;
     325                krb5_free_principal(smb_krb5_context->krb5_context, principal);
    316326                return WERR_OK;
    317327        }
     
    349359
    350360WERROR DsCrackNameOneName(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
    351                           uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
     361                          uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
     362                          enum drsuapi_DsNameFormat format_desired,
    352363                          const char *name, struct drsuapi_DsNameInfo1 *info1)
    353364{
     
    375386        case DRSUAPI_DS_NAME_FORMAT_UNKNOWN:
    376387        {
    377                 int i;
     388                unsigned int i;
    378389                enum drsuapi_DsNameFormat formats[] = {
    379390                        DRSUAPI_DS_NAME_FORMAT_FQDN_1779, DRSUAPI_DS_NAME_FORMAT_USER_PRINCIPAL,
     
    454465                char *p;
    455466                char *domain;
     467                struct ldb_dn *dn_domain;
    456468                const char *account = NULL;
    457469
     
    471483                }
    472484
     485                /* it could be in DNS domain form */
     486                dn_domain = samdb_dns_domain_to_dn(sam_ctx, mem_ctx, domain);
     487                W_ERROR_HAVE_NO_MEMORY(dn_domain);
     488
    473489                domain_filter = talloc_asprintf(mem_ctx,
    474                                                 "(&(&(nETBIOSName=%s)(objectclass=crossRef))(ncName=*))",
    475                                                 ldb_binary_encode_string(mem_ctx, domain));
     490                                                "(&(&(|(nETBIOSName=%s)(nCName=%s))(objectclass=crossRef))(ncName=*))",
     491                                                ldb_binary_encode_string(mem_ctx, domain),
     492                                                ldb_dn_get_linearized(dn_domain));
    476493                W_ERROR_HAVE_NO_MEMORY(domain_filter);
    477494                if (account) {
     
    606623                        krb5_free_principal(smb_krb5_context->krb5_context, principal);
    607624                        return WERR_OK;
     625                } else if (ret == 0) {
     626                        krb5_free_principal(smb_krb5_context->krb5_context, principal);
    608627                }
    609628                ret = krb5_parse_name_flags(smb_krb5_context->krb5_context, name,
    610629                                            KRB5_PRINCIPAL_PARSE_NO_REALM, &principal);
    611630                if (ret) {
    612                         krb5_free_principal(smb_krb5_context->krb5_context, principal);
    613 
    614631                        return dns_domain_from_principal(mem_ctx, smb_krb5_context,
    615632                                                         name, info1);
     
    632649                                                      strcspn(principal->name.name_string.val[1], "."));
    633650                        if (computer_name == NULL) {
     651                                krb5_free_principal(smb_krb5_context->krb5_context, principal);
     652                                free(unparsed_name_short);
    634653                                return WERR_NOMEM;
    635654                        }
     
    652671                return WERR_OK;
    653672        }
    654 
    655673        }
    656674
     
    673691
    674692static WERROR DsCrackNameOneSyntactical(TALLOC_CTX *mem_ctx,
    675                                         uint32_t format_offered, uint32_t format_desired,
     693                                        enum drsuapi_DsNameFormat format_offered,
     694                                        enum drsuapi_DsNameFormat format_desired,
    676695                                        struct ldb_dn *name_dn, const char *name,
    677696                                        struct drsuapi_DsNameInfo1 *info1)
     
    712731static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
    713732                                   struct smb_krb5_context *smb_krb5_context,
    714                                    uint32_t format_flags, uint32_t format_offered, uint32_t format_desired,
     733                                   uint32_t format_flags, enum drsuapi_DsNameFormat format_offered,
     734                                   enum drsuapi_DsNameFormat format_desired,
    715735                                   struct ldb_dn *name_dn, const char *name,
    716736                                   const char *domain_filter, const char *result_filter,
     
    723743        struct ldb_message **result_res = NULL;
    724744        struct ldb_message *result = NULL;
    725         struct ldb_dn *result_basedn = NULL;
    726745        int i;
    727746        char *p;
     
    800819                }
    801820
    802                 info1->dns_domain_name  = samdb_result_string(domain_res->msgs[0], "dnsRoot", NULL);
     821                info1->dns_domain_name  = ldb_msg_find_attr_as_string(domain_res->msgs[0], "dnsRoot", NULL);
    803822                W_ERROR_HAVE_NO_MEMORY(info1->dns_domain_name);
    804823                info1->status           = DRSUAPI_DS_NAME_STATUS_DOMAIN_ONLY;
     
    811830                int ret;
    812831                struct ldb_result *res;
     832                uint32_t dsdb_flags = 0;
     833                struct ldb_dn *search_dn;
     834
    813835                if (domain_res) {
    814                         result_basedn = samdb_result_dn(sam_ctx, mem_ctx, domain_res->msgs[0], "ncName", NULL);
    815 
    816                         ret = ldb_search(sam_ctx, mem_ctx, &res,
    817                                                  result_basedn, LDB_SCOPE_SUBTREE,
    818                                                  result_attrs, "%s", result_filter);
    819                         if (ret != LDB_SUCCESS) {
    820                                 talloc_free(result_res);
    821                                 info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
    822                                 return WERR_OK;
    823                         }
    824                         ldb_ret = res->count;
    825                         result_res = res->msgs;
     836                        dsdb_flags = 0;
     837                        search_dn = samdb_result_dn(sam_ctx, mem_ctx, domain_res->msgs[0], "ncName", NULL);
    826838                } else {
    827                         /* search with the 'phantom root' flag */
    828                         struct ldb_request *req;
    829 
    830                         res = talloc_zero(mem_ctx, struct ldb_result);
    831                         W_ERROR_HAVE_NO_MEMORY(res);
    832 
    833                         ret = ldb_build_search_req(&req, sam_ctx, mem_ctx,
    834                                                    ldb_get_root_basedn(sam_ctx),
    835                                                    LDB_SCOPE_SUBTREE,
    836                                                    result_filter,
    837                                                    result_attrs,
    838                                                    NULL,
    839                                                    res,
    840                                                    ldb_search_default_callback,
    841                                                    NULL);
    842                         if (ret == LDB_SUCCESS) {
    843                                 struct ldb_search_options_control *search_options;
    844                                 search_options = talloc(req, struct ldb_search_options_control);
    845                                 W_ERROR_HAVE_NO_MEMORY(search_options);
    846                                 search_options->search_options = LDB_SEARCH_OPTION_PHANTOM_ROOT;
    847 
    848                                 ret = ldb_request_add_control(req, LDB_CONTROL_SEARCH_OPTIONS_OID, false, search_options);
    849                         }
    850                         if (ret != LDB_SUCCESS) {
    851                                 talloc_free(res);
    852                                 info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
    853                                 return WERR_OK;
    854                         }
    855 
    856                         ret = ldb_request(sam_ctx, req);
    857 
    858                         if (ret == LDB_SUCCESS) {
    859                                 ret = ldb_wait(req->handle, LDB_WAIT_ALL);
    860                         }
    861 
    862                         talloc_free(req);
    863 
    864                         if (ret != LDB_SUCCESS) {
    865                                 DEBUG(2, ("DsCrackNameOneFilter phantom root search failed: %s",
    866                                           ldb_errstring(sam_ctx)));
    867                                 info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
    868                                 return WERR_OK;
    869                         }
    870                         ldb_ret = res->count;
    871                         result_res = res->msgs;
    872                 }
     839                        dsdb_flags = DSDB_SEARCH_SEARCH_ALL_PARTITIONS;
     840                        search_dn = ldb_get_root_basedn(sam_ctx);
     841                }
     842
     843                /* search with the 'phantom root' flag */
     844                ret = dsdb_search(sam_ctx, mem_ctx, &res,
     845                                  search_dn,
     846                                  LDB_SCOPE_SUBTREE,
     847                                  result_attrs,
     848                                  DSDB_SEARCH_SEARCH_ALL_PARTITIONS,
     849                                  "%s", result_filter);
     850                if (ret != LDB_SUCCESS) {
     851                        DEBUG(2, ("DsCrackNameOneFilter phantom root search failed: %s",
     852                                  ldb_errstring(sam_ctx)));
     853                        info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
     854                        return WERR_OK;
     855                }
     856
     857                ldb_ret = res->count;
     858                result_res = res->msgs;
    873859        } else if (format_offered == DRSUAPI_DS_NAME_FORMAT_FQDN_1779) {
    874860                ldb_ret = gendb_search_dn(sam_ctx, mem_ctx, name_dn, &result_res,
     
    880866        } else {
    881867                /* Can't happen */
    882                 DEBUG(0, ("LOGIC ERROR: DsCrackNameOneFilter domain ref search not availible: This can't happen..."));
     868                DEBUG(0, ("LOGIC ERROR: DsCrackNameOneFilter domain ref search not available: This can't happen..."));
    883869                info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
    884870                return WERR_OK;
     
    901887                                              format_flags, format_offered, format_desired,
    902888                                              name, info1);
     889                default:
     890                        break;
    903891                }
    904892                info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
     
    923911                                        canonical_name = ldb_dn_canonical_ex_string(mem_ctx, result_res[i]->dn);
    924912                                        break;
     913                                default:
     914                                        break;
    925915                                }
    926916                                if (strcasecmp_m(canonical_name, name) == 0) {
     
    957947        }
    958948        case DRSUAPI_DS_NAME_FORMAT_CANONICAL: {
    959                 info1->result_name      = samdb_result_string(result, "canonicalName", NULL);
     949                info1->result_name      = ldb_msg_find_attr_as_string(result, "canonicalName", NULL);
    960950                info1->status           = DRSUAPI_DS_NAME_STATUS_OK;
    961951                return WERR_OK;
     
    997987                                return WERR_OK;
    998988                        }
    999                         _dom = samdb_result_string(domain_res->msgs[0], "nETBIOSName", NULL);
     989                        _dom = ldb_msg_find_attr_as_string(domain_res->msgs[0], "nETBIOSName", NULL);
    1000990                        W_ERROR_HAVE_NO_MEMORY(_dom);
    1001991                } else {
    1002                         _acc = samdb_result_string(result, "sAMAccountName", NULL);
     992                        _acc = ldb_msg_find_attr_as_string(result, "sAMAccountName", NULL);
    1003993                        if (!_acc) {
    1004994                                info1->status = DRSUAPI_DS_NAME_STATUS_NO_MAPPING;
     
    10611051                                        return WERR_OK;
    10621052                                }
    1063                                 _dom = samdb_result_string(domain_res2->msgs[0], "nETBIOSName", NULL);
     1053                                _dom = ldb_msg_find_attr_as_string(domain_res2->msgs[0], "nETBIOSName", NULL);
    10641054                                W_ERROR_HAVE_NO_MEMORY(_dom);
    10651055                        }
     
    10841074        }
    10851075        case DRSUAPI_DS_NAME_FORMAT_DISPLAY: {
    1086                 info1->result_name      = samdb_result_string(result, "displayName", NULL);
     1076                info1->result_name      = ldb_msg_find_attr_as_string(result, "displayName", NULL);
    10871077                if (!info1->result_name) {
    1088                         info1->result_name      = samdb_result_string(result, "sAMAccountName", NULL);
     1078                        info1->result_name      = ldb_msg_find_attr_as_string(result, "sAMAccountName", NULL);
    10891079                }
    10901080                if (!info1->result_name) {
     
    12371227                                struct tevent_context *ev_ctx,
    12381228                                struct loadparm_context *lp_ctx,
    1239                                 uint32_t format_offered,
     1229                                enum drsuapi_DsNameFormat format_offered,
    12401230                                const char *name,
    12411231                                const char **nt4_domain, const char **nt4_account)
     
    12531243        }
    12541244
    1255         ldb = samdb_connect(mem_ctx, ev_ctx, lp_ctx, system_session(mem_ctx, lp_ctx));
     1245        ldb = samdb_connect(mem_ctx, ev_ctx, lp_ctx, system_session(lp_ctx), 0);
    12561246        if (ldb == NULL) {
    12571247                return NT_STATUS_INTERNAL_DB_CORRUPTION;
     
    12891279        p[0] = '\0';
    12901280
    1291         if (p[1]) {
    1292                 *nt4_account = talloc_strdup(mem_ctx, &p[1]);
    1293                 if (*nt4_account == NULL) {
    1294                         return NT_STATUS_NO_MEMORY;
    1295                 }
     1281        *nt4_account = talloc_strdup(mem_ctx, &p[1]);
     1282        if (*nt4_account == NULL) {
     1283                return NT_STATUS_NO_MEMORY;
    12961284        }
    12971285
     
    13061294                                     const char **nt4_account)
    13071295{
    1308         uint32_t format_offered = DRSUAPI_DS_NAME_FORMAT_UNKNOWN;
     1296        enum drsuapi_DsNameFormat format_offered = DRSUAPI_DS_NAME_FORMAT_UNKNOWN;
    13091297
    13101298        /* Handle anonymous bind */
     
    13291317        return crack_name_to_nt4_name(mem_ctx, ev_ctx, lp_ctx, format_offered, name, nt4_domain, nt4_account);
    13301318}
     1319
     1320
     1321WERROR dcesrv_drsuapi_ListRoles(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
     1322                                const struct drsuapi_DsNameRequest1 *req1,
     1323                                struct drsuapi_DsNameCtr1 **ctr1)
     1324{
     1325        struct drsuapi_DsNameInfo1 *names;
     1326        uint32_t i;
     1327        uint32_t count = 5;/*number of fsmo role owners we are going to return*/
     1328
     1329        *ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
     1330        W_ERROR_HAVE_NO_MEMORY(*ctr1);
     1331        names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
     1332        W_ERROR_HAVE_NO_MEMORY(names);
     1333
     1334        for (i = 0; i < count; i++) {
     1335                WERROR werr;
     1336                struct ldb_dn *role_owner_dn, *fsmo_role_dn, *server_dn;
     1337                werr = dsdb_get_fsmo_role_info(mem_ctx, sam_ctx, i,
     1338                                               &fsmo_role_dn, &role_owner_dn);
     1339                if(!W_ERROR_IS_OK(werr)) {
     1340                        return werr;
     1341                }
     1342                server_dn = ldb_dn_copy(mem_ctx, role_owner_dn);
     1343                ldb_dn_remove_child_components(server_dn, 1);
     1344                names[i].status = DRSUAPI_DS_NAME_STATUS_OK;
     1345                names[i].dns_domain_name = samdb_dn_to_dnshostname(sam_ctx, mem_ctx,
     1346                                                                   server_dn);
     1347                if(!names[i].dns_domain_name) {
     1348                        DEBUG(4, ("list_roles: Failed to find dNSHostName for server %s",
     1349                                  ldb_dn_get_linearized(server_dn)));
     1350                }
     1351                names[i].result_name = talloc_strdup(mem_ctx, ldb_dn_get_linearized(role_owner_dn));
     1352        }
     1353
     1354        (*ctr1)->count = count;
     1355        (*ctr1)->array = names;
     1356
     1357        return WERR_OK;
     1358}
     1359
     1360WERROR dcesrv_drsuapi_CrackNamesByNameFormat(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
     1361                                             const struct drsuapi_DsNameRequest1 *req1,
     1362                                             struct drsuapi_DsNameCtr1 **ctr1)
     1363{
     1364        struct drsuapi_DsNameInfo1 *names;
     1365        uint32_t i, count;
     1366        WERROR status;
     1367
     1368        *ctr1 = talloc(mem_ctx, struct drsuapi_DsNameCtr1);
     1369        W_ERROR_HAVE_NO_MEMORY(*ctr1);
     1370
     1371        count = req1->count;
     1372        names = talloc_array(mem_ctx, struct drsuapi_DsNameInfo1, count);
     1373        W_ERROR_HAVE_NO_MEMORY(names);
     1374
     1375        for (i=0; i < count; i++) {
     1376                status = DsCrackNameOneName(sam_ctx, mem_ctx,
     1377                                            req1->format_flags,
     1378                                            req1->format_offered,
     1379                                            req1->format_desired,
     1380                                            req1->names[i].str,
     1381                                            &names[i]);
     1382                if (!W_ERROR_IS_OK(status)) {
     1383                        return status;
     1384                }
     1385        }
     1386
     1387        (*ctr1)->count = count;
     1388        (*ctr1)->array = names;
     1389
     1390        return WERR_OK;
     1391}
Note: See TracChangeset for help on using the changeset viewer.