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/auth/gensec/schannel.c

    r414 r745  
    2828#include "auth/gensec/gensec_proto.h"
    2929#include "../libcli/auth/schannel.h"
    30 #include "auth/gensec/schannel_state.h"
    3130#include "librpc/rpc/dcerpc.h"
    3231#include "param/param.h"
    33 #include "auth/session_proto.h"
    3432
    3533static size_t schannel_sig_size(struct gensec_security *gensec_security, size_t data_size)
    3634{
    37         return 32;
     35        struct schannel_state *state = (struct schannel_state *)gensec_security->private_data;
     36        uint32_t sig_size;
     37
     38        sig_size = netsec_outgoing_sig_size(state);
     39
     40        return sig_size;
    3841}
    3942
     
    5356        struct NL_AUTH_MESSAGE bind_schannel_ack;
    5457        struct netlogon_creds_CredentialState *creds;
    55         struct ldb_context *schannel_ldb;
    5658        const char *workstation;
    5759        const char *domain;
    58         uint32_t required_flags;
    5960
    6061        *out = data_blob(NULL, 0);
     
    9192#endif
    9293
    93                 ndr_err = ndr_push_struct_blob(out, out_mem_ctx,
    94                                                gensec_security->settings->iconv_convenience, &bind_schannel,
     94                ndr_err = ndr_push_struct_blob(out, out_mem_ctx, &bind_schannel,
    9595                                               (ndr_push_flags_fn_t)ndr_push_NL_AUTH_MESSAGE);
    9696                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     
    106106        case GENSEC_SERVER:
    107107
    108                 required_flags = NL_FLAG_OEM_NETBIOS_COMPUTER_NAME |
    109                                  NL_FLAG_OEM_NETBIOS_DOMAIN_NAME;
    110 
    111108                if (state->state != SCHANNEL_STATE_START) {
    112109                        /* no third leg on this protocol */
     
    115112
    116113                /* parse the schannel startup blob */
    117                 ndr_err = ndr_pull_struct_blob(&in, out_mem_ctx,
    118                         gensec_security->settings->iconv_convenience,
    119                         &bind_schannel,
     114                ndr_err = ndr_pull_struct_blob(&in, out_mem_ctx, &bind_schannel,
    120115                        (ndr_pull_flags_fn_t)ndr_pull_NL_AUTH_MESSAGE);
    121116                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     
    126121                }
    127122
    128                 if (!(required_flags == (bind_schannel.Flags & required_flags))) {
    129                         return NT_STATUS_INVALID_PARAMETER;
    130                 }
    131 
    132                 workstation = bind_schannel.oem_netbios_computer.a;
    133                 domain = bind_schannel.oem_netbios_domain.a;
    134 
    135                 if (strcasecmp_m(domain, lp_workgroup(gensec_security->settings->lp_ctx)) != 0) {
    136                         DEBUG(3, ("Request for schannel to incorrect domain: %s != our domain %s\n",
    137                                   domain, lp_workgroup(gensec_security->settings->lp_ctx)));
    138 
     123                if (bind_schannel.Flags & NL_FLAG_OEM_NETBIOS_DOMAIN_NAME) {
     124                        domain = bind_schannel.oem_netbios_domain.a;
     125                        if (strcasecmp_m(domain, lpcfg_workgroup(gensec_security->settings->lp_ctx)) != 0) {
     126                                DEBUG(3, ("Request for schannel to incorrect domain: %s != our domain %s\n",
     127                                          domain, lpcfg_workgroup(gensec_security->settings->lp_ctx)));
     128                                return NT_STATUS_LOGON_FAILURE;
     129                        }
     130                } else if (bind_schannel.Flags & NL_FLAG_UTF8_DNS_DOMAIN_NAME) {
     131                        domain = bind_schannel.utf8_dns_domain.u;
     132                        if (strcasecmp_m(domain, lpcfg_dnsdomain(gensec_security->settings->lp_ctx)) != 0) {
     133                                DEBUG(3, ("Request for schannel to incorrect domain: %s != our domain %s\n",
     134                                          domain, lpcfg_dnsdomain(gensec_security->settings->lp_ctx)));
     135                                return NT_STATUS_LOGON_FAILURE;
     136                        }
     137                } else {
     138                        DEBUG(3, ("Request for schannel to without domain\n"));
    139139                        return NT_STATUS_LOGON_FAILURE;
    140140                }
    141141
    142                 schannel_ldb = schannel_db_connect(out_mem_ctx, gensec_security->event_ctx,
    143                                                    gensec_security->settings->lp_ctx);
    144                 if (!schannel_ldb) {
    145                         return NT_STATUS_ACCESS_DENIED;
    146                 }
    147                 /* pull the session key for this client */
    148                 status = schannel_fetch_session_key_ldb(schannel_ldb,
    149                                                         out_mem_ctx, workstation, &creds);
    150                 talloc_free(schannel_ldb);
     142                if (bind_schannel.Flags & NL_FLAG_OEM_NETBIOS_COMPUTER_NAME) {
     143                        workstation = bind_schannel.oem_netbios_computer.a;
     144                } else if (bind_schannel.Flags & NL_FLAG_UTF8_NETBIOS_COMPUTER_NAME) {
     145                        workstation = bind_schannel.utf8_netbios_computer.u;
     146                } else {
     147                        DEBUG(3, ("Request for schannel to without netbios workstation\n"));
     148                        return NT_STATUS_LOGON_FAILURE;
     149                }
     150
     151                status = schannel_get_creds_state(out_mem_ctx,
     152                                                  lpcfg_private_dir(gensec_security->settings->lp_ctx),
     153                                                  workstation, &creds);
    151154                if (!NT_STATUS_IS_OK(status)) {
    152155                        DEBUG(3, ("Could not find session key for attempted schannel connection from %s: %s\n",
     
    158161                }
    159162
    160                 state->creds = talloc_reference(state, creds);
     163                state->creds = talloc_steal(state, creds);
    161164
    162165                bind_schannel_ack.MessageType = NL_NEGOTIATE_RESPONSE;
     
    167170                                                            * - gd */
    168171
    169                 ndr_err = ndr_push_struct_blob(out, out_mem_ctx,
    170                                                gensec_security->settings->iconv_convenience, &bind_schannel_ack,
     172                ndr_err = ndr_push_struct_blob(out, out_mem_ctx, &bind_schannel_ack,
    171173                                               (ndr_push_flags_fn_t)ndr_push_NL_AUTH_MESSAGE);
    172174                if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
     
    215217{
    216218        struct schannel_state *state = talloc_get_type(gensec_security->private_data, struct schannel_state);
    217         return auth_anonymous_session_info(state, gensec_security->event_ctx, gensec_security->settings->lp_ctx, _session_info);
     219        return auth_anonymous_session_info(state, gensec_security->settings->lp_ctx, _session_info);
    218220}
    219221
Note: See TracChangeset for help on using the changeset viewer.