auth/ntlmssp: add gensec_ntlmssp_server_domain()
authorStefan Metzmacher <metze@samba.org>
Wed, 2 Mar 2016 11:06:50 +0000 (12:06 +0100)
committerStefan Metzmacher <metze@samba.org>
Thu, 10 Mar 2016 05:52:27 +0000 (06:52 +0100)
This is a hack in order to temporary export the server domain
from NTLMSSP through the gensec stack.

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

index 916b376b1111e1e47c9c1175a168b32de281902d..0b7667c5e20e3aa27ba17e0b479e667eccbefb26 100644 (file)
@@ -209,13 +209,48 @@ _PUBLIC_ NTSTATUS gensec_ntlmssp_init(void)
        return ret;
 }
 
+static struct gensec_security *gensec_find_child_by_ops(struct gensec_security *gensec_security,
+                                                       const struct gensec_security_ops *ops)
+{
+       struct gensec_security *current = gensec_security;
+
+       while (current != NULL) {
+               if (current->ops == ops) {
+                       return current;
+               }
+
+               current = current->child_security;
+       }
+
+       return NULL;
+}
+
 uint32_t gensec_ntlmssp_neg_flags(struct gensec_security *gensec_security)
 {
        struct gensec_ntlmssp_context *gensec_ntlmssp;
-       if (gensec_security->ops != &gensec_ntlmssp_security_ops) {
+
+       gensec_security = gensec_find_child_by_ops(gensec_security,
+                                       &gensec_ntlmssp_security_ops);
+       if (gensec_security == NULL) {
                return 0;
        }
+
        gensec_ntlmssp = talloc_get_type_abort(gensec_security->private_data,
                                               struct gensec_ntlmssp_context);
        return gensec_ntlmssp->ntlmssp_state->neg_flags;
 }
+
+const char *gensec_ntlmssp_server_domain(struct gensec_security *gensec_security)
+{
+       struct gensec_ntlmssp_context *gensec_ntlmssp;
+
+       gensec_security = gensec_find_child_by_ops(gensec_security,
+                                       &gensec_ntlmssp_security_ops);
+       if (gensec_security == NULL) {
+               return NULL;
+       }
+
+       gensec_ntlmssp = talloc_get_type_abort(gensec_security->private_data,
+                                              struct gensec_ntlmssp_context);
+       return gensec_ntlmssp->ntlmssp_state->server.netbios_domain;
+}
index 6061cd0951cf11bc40d209698877640f1dd7f8e4..b357e42d362a3a63ca6b2790cececc40c81dfb50 100644 (file)
@@ -132,3 +132,4 @@ bool ntlmssp_blob_matches_magic(const DATA_BLOB *blob);
 NTSTATUS gensec_ntlmssp_init(void);
 
 uint32_t gensec_ntlmssp_neg_flags(struct gensec_security *gensec_security);
+const char *gensec_ntlmssp_server_domain(struct gensec_security *gensec_security);