auth/ntlmssp: use ndr_push_AV_PAIR_LIST in gensec_ntlmssp_server_negotiate().
authorGünther Deschner <gd@samba.org>
Tue, 18 Aug 2009 22:40:12 +0000 (00:40 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 10 Mar 2016 05:52:29 +0000 (06:52 +0100)
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>

Signed-off-by: Günther Deschner <gd@samba.org>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
auth/ntlmssp/ntlmssp.h
auth/ntlmssp/ntlmssp_server.c

index 4d2ddf9c12e9b49d6065bbc74f96fc6337706222..f1af2243855a74a45d69c8db382494b4bff68520 100644 (file)
@@ -82,6 +82,7 @@ struct ntlmssp_state
                const char *netbios_domain;
                const char *dns_name;
                const char *dns_domain;
+               struct AV_PAIR_LIST av_pair_list;
        } server;
 
        DATA_BLOB internal_chal; /* Random challenge as supplied to the client for NTLM authentication */
index 94692cdda9b1cc34de98d8866b52b2206c3404fe..4bb2a64eac1d446c24e1b522ea38995a0235e4e3 100644 (file)
@@ -150,16 +150,39 @@ NTSTATUS gensec_ntlmssp_server_negotiate(struct gensec_security *gensec_security
                                                        cryptkey, 8);
 
        /* This creates the 'blob' of names that appears at the end of the packet */
-       if (chal_flags & NTLMSSP_NEGOTIATE_TARGET_INFO)
-       {
-               status = msrpc_gen(ntlmssp_state, &struct_blob, "aaaaa",
-                         MsvAvNbDomainName, target_name,
-                         MsvAvNbComputerName, ntlmssp_state->server.netbios_name,
-                         MsvAvDnsDomainName, ntlmssp_state->server.dns_domain,
-                         MsvAvDnsComputerName, ntlmssp_state->server.dns_name,
-                         MsvAvEOL, "");
-               if (!NT_STATUS_IS_OK(status)) {
-                       return status;
+       if (chal_flags & NTLMSSP_NEGOTIATE_TARGET_INFO) {
+               enum ndr_err_code err;
+               struct AV_PAIR *pairs = NULL;
+               uint32_t count = 5;
+
+               pairs = talloc_zero_array(ntlmssp_state, struct AV_PAIR, count);
+               if (pairs == NULL) {
+                       return NT_STATUS_NO_MEMORY;
+               }
+
+               pairs[0].AvId                   = MsvAvNbDomainName;
+               pairs[0].Value.AvNbDomainName   = target_name;
+
+               pairs[1].AvId                   = MsvAvNbComputerName;
+               pairs[1].Value.AvNbComputerName = ntlmssp_state->server.netbios_name;
+
+               pairs[2].AvId                   = MsvAvDnsDomainName;
+               pairs[2].Value.AvDnsDomainName  = ntlmssp_state->server.dns_domain;
+
+               pairs[3].AvId                   = MsvAvDnsComputerName;
+               pairs[3].Value.AvDnsComputerName= ntlmssp_state->server.dns_name;
+
+               pairs[4].AvId                   = MsvAvEOL;
+
+               ntlmssp_state->server.av_pair_list.count = count;
+               ntlmssp_state->server.av_pair_list.pair = pairs;
+
+               err = ndr_push_struct_blob(&struct_blob,
+                                       ntlmssp_state,
+                                       &ntlmssp_state->server.av_pair_list,
+                                       (ndr_push_flags_fn_t)ndr_push_AV_PAIR_LIST);
+               if (!NDR_ERR_CODE_IS_SUCCESS(err)) {
+                       return NT_STATUS_NO_MEMORY;
                }
        } else {
                struct_blob = data_blob_null;