s4:http/gensec: implement "http_negotiate" using GENSEC_OID_SPNEGO
authorStefan Metzmacher <metze@samba.org>
Thu, 20 Jul 2017 11:03:03 +0000 (13:03 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Mon, 7 Aug 2017 13:20:02 +0000 (15:20 +0200)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
source4/lib/http/gensec/generic.c

index 1d7ae47b793660222145ade34eacec833977048d..5bafb839d65e4197ad2a831433baf306ab219133 100644 (file)
@@ -63,6 +63,12 @@ static NTSTATUS gensec_http_ntlm_client_start(struct gensec_security *gensec)
                                                GENSEC_OID_NTLMSSP);
 }
 
+static NTSTATUS gensec_http_negotiate_client_start(struct gensec_security *gensec)
+{
+       return gensec_http_generic_client_start(gensec, "Negotiate",
+                                               GENSEC_OID_SPNEGO);
+}
+
 struct gensec_http_generic_update_state {
        struct gensec_security *gensec;
        DATA_BLOB sub_in;
@@ -245,6 +251,17 @@ static const struct gensec_security_ops gensec_http_ntlm_security_ops = {
        .priority       = GENSEC_EXTERNAL,
 };
 
+static const struct gensec_security_ops gensec_http_negotiate_security_ops = {
+       .name           = "http_negotiate",
+       .auth_type      = 0,
+       .client_start   = gensec_http_negotiate_client_start,
+       .update_send    = gensec_http_generic_update_send,
+       .update_recv    = gensec_http_generic_update_recv,
+       .enabled        = true,
+       .priority       = GENSEC_EXTERNAL,
+       .glue           = true,
+};
+
 _PUBLIC_ NTSTATUS gensec_http_generic_init(TALLOC_CTX *ctx)
 {
        NTSTATUS status;
@@ -256,5 +273,12 @@ _PUBLIC_ NTSTATUS gensec_http_generic_init(TALLOC_CTX *ctx)
                return status;
        }
 
+       status = gensec_register(ctx, &gensec_http_negotiate_security_ops);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0, ("Failed to register '%s' gensec backend!\n",
+                         gensec_http_negotiate_security_ops.name));
+               return status;
+       }
+
        return status;
 }