The branch, master has been updated
       via  6b3135078e0 lib: Align an integer type
       via  5ae1605fc22 lib: Fix an error path memleak
       via  0321f31a8e1 lib: Use talloc_asprintf_addbufin 
_ber_read_OID_String_impl
       via  4313add2bf5 lib: Use unsigned long in ber_write_OID_String
       via  8f90ec12a56 lib: gensec.h references NTTIME, add time.h
       via  b317408591d wbclient: Fix a typo
       via  021dfe8f33b winbind: Modernize a few DEBUGs
       via  bc2b2350b94 smbd: Fix whitespace
       via  b29e408e140 libsmb: Use SMB2_0_INFO_SECURITY instead of raw "3"
       via  5c736ffe354 gensec: Simplify gensec_security_by_fn()
       via  82c477b9807 gensec: Filter out disabled mechs in 
gensec_security_mechs()
       via  426c0847670 gensec: Refactor gensec_security_mechs()
       via  b28de27f6b8 gensec: Simplify gensec_security_by_*
       via  9445d8e06e8 torture: Remove some pointless local variables
       via  df30ec83c96 lib: Use cli_credentials_add_gensec_features in a few 
places
       via  b436f5fec11 creds: Add cli_credentials_add_gensec_features
       via  dc31a49830d libsmb: Slightly simplify cli_session_creds_init
      from  4cade04d1f1 vfs_ceph: Implement SMB_VFS_FSET_DOS_ATTRIBUTES for 
precise btime

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 6b3135078e0f6c67566f4312998bc4032e387e19
Author: Volker Lendecke <v...@samba.org>
Date:   Thu May 23 16:13:58 2024 +0200

    lib: Align an integer type
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>
    
    Autobuild-User(master): Volker Lendecke <v...@samba.org>
    Autobuild-Date(master): Tue Jun  4 08:16:58 UTC 2024 on atb-devel-224

commit 5ae1605fc22acf672f46ba08f6b2ef4f675e92b8
Author: Volker Lendecke <v...@samba.org>
Date:   Thu May 23 16:12:53 2024 +0200

    lib: Fix an error path memleak
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 0321f31a8e1364b32fad61e99856024eaed0b81e
Author: Volker Lendecke <v...@samba.org>
Date:   Thu May 23 16:06:37 2024 +0200

    lib: Use talloc_asprintf_addbufin _ber_read_OID_String_impl
    
    Just one NULL check required
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 4313add2bf5ee41a5cbcac79135da96d5424ec2d
Author: Volker Lendecke <v...@samba.org>
Date:   Thu May 23 16:04:52 2024 +0200

    lib: Use unsigned long in ber_write_OID_String
    
    This is what smb_strtoul returns, so use it.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 8f90ec12a560bfe08b0bf9ae447b789bbcc22dda
Author: Volker Lendecke <v...@samba.org>
Date:   Thu May 23 15:48:55 2024 +0200

    lib: gensec.h references NTTIME, add time.h
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit b317408591da4cbb8facd1e9215fd204078722b7
Author: Volker Lendecke <v...@samba.org>
Date:   Fri May 24 18:34:05 2024 +0200

    wbclient: Fix a typo
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 021dfe8f33b3d21ec16ac6e4a28f5a1d09b838a3
Author: Volker Lendecke <v...@samba.org>
Date:   Fri May 24 18:48:29 2024 +0200

    winbind: Modernize a few DEBUGs
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit bc2b2350b94cbfc53628852026f68f71f09607e6
Author: Volker Lendecke <v...@samba.org>
Date:   Sat May 25 12:17:46 2024 +0200

    smbd: Fix whitespace
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit b29e408e140b74b82ba04391fd1ded43444c83b6
Author: Volker Lendecke <v...@samba.org>
Date:   Sat May 25 12:41:58 2024 +0200

    libsmb: Use SMB2_0_INFO_SECURITY instead of raw "3"
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 5c736ffe35408a6344e5c4c4ae57b89e09e51918
Author: Volker Lendecke <v...@samba.org>
Date:   Wed May 29 17:11:51 2024 +0200

    gensec: Simplify gensec_security_by_fn()
    
    We don't need that intermediate talloc ctx, we only allocate backends
    and don't pass it anywhere else.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 82c477b98071346a0e4e9162d9a200d1755533a7
Author: Volker Lendecke <v...@samba.org>
Date:   Wed May 29 17:08:26 2024 +0200

    gensec: Filter out disabled mechs in gensec_security_mechs()
    
    Every single caller of gensec_security_mechs() had to manually filter
    out disabled mechanisms. Don't offer them from the start.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 426c08476704f8ac574a18562719517c6084ed3f
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 28 18:49:41 2024 +0200

    gensec: Refactor gensec_security_mechs()
    
    The decision whether to offer a mechanism was split between
    gensec_security_mechs() and gensec_use_kerberos_mechs() with two
    booleans passed down. Consolidate that decision into one
    gensec_offer_mech() function that queries all information on its own.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit b28de27f6b880962e9183d28d76f27ce0847bd36
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 28 15:52:05 2024 +0200

    gensec: Simplify gensec_security_by_*
    
    Centralize looping over all backends
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit 9445d8e06e8b8bb25ddb55ae045c51c56f3210cf
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 28 14:52:25 2024 +0200

    torture: Remove some pointless local variables
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit df30ec83c961d8333d76ed13aa1944a2e93f9050
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 28 12:38:18 2024 +0200

    lib: Use cli_credentials_add_gensec_features in a few places
    
    Capture a common pattern
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit b436f5fec117ba746546bc1e8ed8adb2bf3756a2
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 28 12:32:58 2024 +0200

    creds: Add cli_credentials_add_gensec_features
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

commit dc31a49830d6a01b177293ededa856c8d4be06ab
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 28 12:23:35 2024 +0200

    libsmb: Slightly simplify cli_session_creds_init
    
    In this case a nested if seems easier to understand to me than another
    if-expression duplicating half of a previous one.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Andrew Bartlett <abart...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 auth/credentials/credentials.c            |   9 +
 auth/credentials/credentials.h            |   3 +
 auth/gensec/gensec.h                      |   3 +-
 auth/gensec/gensec_start.c                | 336 ++++++++++++++----------------
 auth/gensec/spnego.c                      |   6 -
 lib/cmdline/cmdline.c                     |  10 +-
 lib/util/asn1.c                           |  19 +-
 nsswitch/libwbclient/wbc_pam.c            |   2 +-
 source3/lib/netapi/netapi.c               |   8 +-
 source3/libsmb/cliconnect.c               |  42 ++--
 source3/libsmb/clisecdesc.c               |  16 +-
 source3/libsmb/libsmb_context.c           |   8 +-
 source3/smbd/srvstr.c                     |   8 +-
 source3/torture/locktest2.c               |  12 +-
 source3/utils/net.c                       |  10 +-
 source3/winbindd/winbindd_ccache_access.c |  29 ++-
 source3/winbindd/winbindd_pam.c           |  17 +-
 17 files changed, 242 insertions(+), 296 deletions(-)


Changeset truncated at 500 lines:

diff --git a/auth/credentials/credentials.c b/auth/credentials/credentials.c
index 441db6f0e5b..174858fb83a 100644
--- a/auth/credentials/credentials.c
+++ b/auth/credentials/credentials.c
@@ -171,6 +171,15 @@ _PUBLIC_ bool cli_credentials_set_gensec_features(struct 
cli_credentials *creds,
        return false;
 }
 
+_PUBLIC_ bool cli_credentials_add_gensec_features(
+       struct cli_credentials *creds,
+       uint32_t gensec_features,
+       enum credentials_obtained obtained)
+{
+       return cli_credentials_set_gensec_features(
+               creds, creds->gensec_features | gensec_features, obtained);
+}
+
 _PUBLIC_ uint32_t cli_credentials_get_gensec_features(struct cli_credentials 
*creds)
 {
        return creds->gensec_features;
diff --git a/auth/credentials/credentials.h b/auth/credentials/credentials.h
index 386647c7aae..2b95b963766 100644
--- a/auth/credentials/credentials.h
+++ b/auth/credentials/credentials.h
@@ -253,6 +253,9 @@ bool cli_credentials_set_gensec_features(struct 
cli_credentials *creds,
                                         uint32_t gensec_features,
                                         enum credentials_obtained obtained);
 uint32_t cli_credentials_get_gensec_features(struct cli_credentials *creds);
+bool cli_credentials_add_gensec_features(struct cli_credentials *creds,
+                                        uint32_t gensec_features,
+                                        enum credentials_obtained obtained);
 int cli_credentials_set_ccache(struct cli_credentials *cred,
                               struct loadparm_context *lp_ctx,
                               const char *name,
diff --git a/auth/gensec/gensec.h b/auth/gensec/gensec.h
index 25242384f55..24abacfb2aa 100644
--- a/auth/gensec/gensec.h
+++ b/auth/gensec/gensec.h
@@ -25,6 +25,7 @@
 
 #include "../lib/util/data_blob.h"
 #include "libcli/util/ntstatus.h"
+#include "lib/util/time.h"
 
 #define GENSEC_SASL_NAME_NTLMSSP "NTLM"
 
@@ -301,8 +302,6 @@ NTSTATUS gensec_wrap(struct gensec_security 
*gensec_security,
                     const DATA_BLOB *in,
                     DATA_BLOB *out);
 
-bool gensec_security_ops_enabled(const struct gensec_security_ops *ops, struct 
gensec_security *security);
-
 NTSTATUS gensec_start_mech_by_sasl_name(struct gensec_security 
*gensec_security,
                                        const char *sasl_name);
 const char **gensec_security_sasl_names(struct gensec_security 
*gensec_security,
diff --git a/auth/gensec/gensec_start.c b/auth/gensec/gensec_start.c
index 4405aca278d..05d0d3cf7a7 100644
--- a/auth/gensec/gensec_start.c
+++ b/auth/gensec/gensec_start.c
@@ -43,7 +43,8 @@
 static const struct gensec_security_ops **generic_security_ops;
 static int gensec_num_backends;
 
-bool gensec_security_ops_enabled(const struct gensec_security_ops *ops, struct 
gensec_security *security)
+static bool gensec_security_ops_enabled(const struct gensec_security_ops *ops,
+                                       struct gensec_security *security)
 {
        bool ok = lpcfg_parm_bool(security->settings->lp_ctx,
                                  NULL,
@@ -79,72 +80,66 @@ bool gensec_security_ops_enabled(const struct 
gensec_security_ops *ops, struct g
  * more complex.
  */
 
-static const struct gensec_security_ops **gensec_use_kerberos_mechs(
-               TALLOC_CTX *mem_ctx,
-               const struct gensec_security_ops * const *old_gensec_list,
-               enum credentials_use_kerberos use_kerberos,
-               bool keep_schannel)
+static bool gensec_offer_mech(struct gensec_security *gensec_security,
+                             const struct gensec_security_ops *mech)
 {
-       const struct gensec_security_ops **new_gensec_list;
-       int i, j, num_mechs_in;
+       struct cli_credentials *creds = NULL;
+       enum credentials_use_kerberos use_kerberos;
+       bool offer;
 
-       for (num_mechs_in=0; old_gensec_list && old_gensec_list[num_mechs_in]; 
num_mechs_in++) {
-               /* noop */
-       }
+       /*
+        * We want to always offer SPNEGO and other backends
+        */
+       offer = mech->glue;
 
-       new_gensec_list = talloc_array(mem_ctx,
-                                      const struct gensec_security_ops *,
-                                      num_mechs_in + 1);
-       if (!new_gensec_list) {
-               return NULL;
+       if (gensec_security != NULL) {
+               creds = gensec_get_credentials(gensec_security);
        }
 
-       j = 0;
-       for (i=0; old_gensec_list && old_gensec_list[i]; i++) {
-               bool keep = false;
-
+       if ((mech->auth_type == DCERPC_AUTH_TYPE_SCHANNEL) && (creds != NULL))
+       {
+               if (cli_credentials_get_netlogon_creds(creds) != NULL) {
+                       offer = true;
+               }
                /*
-                * We want to keep SPNEGO and other backends
+                * Even if Kerberos is set to REQUIRED, offer the
+                * schannel auth mechanism so that machine accounts are
+                * able to authenticate via netlogon.
                 */
-               keep = old_gensec_list[i]->glue;
-
-               if (old_gensec_list[i]->auth_type == DCERPC_AUTH_TYPE_SCHANNEL) 
{
-                       keep = keep_schannel;
+               if (gensec_security->gensec_role == GENSEC_SERVER) {
+                       offer = true;
                }
+       }
 
-               switch (use_kerberos) {
-               case CRED_USE_KERBEROS_DESIRED:
-                       keep = true;
-                       break;
-
-               case CRED_USE_KERBEROS_DISABLED:
-                       if (old_gensec_list[i]->kerberos == false) {
-                               keep = true;
-                       }
-
-                       break;
-
-               case CRED_USE_KERBEROS_REQUIRED:
-                       if (old_gensec_list[i]->kerberos == true) {
-                               keep = true;
-                       }
+       use_kerberos = CRED_USE_KERBEROS_DESIRED;
+       if (creds != NULL) {
+               use_kerberos = cli_credentials_get_kerberos_state(creds);
+       }
 
-                       break;
-               default:
-                       /* Can't happen or invalid parameter */
-                       return NULL;
+       switch (use_kerberos) {
+       case CRED_USE_KERBEROS_DESIRED:
+               offer = true;
+               break;
+       case CRED_USE_KERBEROS_DISABLED:
+               if (!mech->kerberos) {
+                       offer = true;
                }
-
-               if (!keep) {
-                       continue;
+               break;
+       case CRED_USE_KERBEROS_REQUIRED:
+               if (mech->kerberos) {
+                       offer = true;
                }
+               break;
+       default:
+               /* Can't happen or invalid parameter */
+               offer = false;
+       }
 
-               new_gensec_list[j] = old_gensec_list[i];
-               j++;
+       if (offer && (gensec_security != NULL)) {
+               offer = gensec_security_ops_enabled(mech, gensec_security);
        }
-       new_gensec_list[j] = NULL;
 
-       return new_gensec_list;
+       return offer;
 }
 
 _PUBLIC_ const struct gensec_security_ops **gensec_security_mechs(
@@ -153,159 +148,147 @@ _PUBLIC_ const struct gensec_security_ops 
**gensec_security_mechs(
 {
        const struct gensec_security_ops * const *backends =
                generic_security_ops;
-       enum credentials_use_kerberos use_kerberos = CRED_USE_KERBEROS_DESIRED;
-       bool keep_schannel = false;
-
-       if (gensec_security != NULL) {
-               struct cli_credentials *creds = NULL;
-
-               creds = gensec_get_credentials(gensec_security);
-               if (creds != NULL) {
-                       use_kerberos = 
cli_credentials_get_kerberos_state(creds);
-                       if (cli_credentials_get_netlogon_creds(creds) != NULL) {
-                               keep_schannel = true;
-                       }
-
-                       /*
-                        * Even if Kerberos is set to REQUIRED, keep the
-                        * schannel auth mechanism so that machine accounts are
-                        * able to authenticate via netlogon.
-                        */
-                       if (gensec_security->gensec_role == GENSEC_SERVER) {
-                               keep_schannel = true;
-                       }
-               }
+       const struct gensec_security_ops **result = NULL;
+       size_t i, j, num_backends;
 
-               if (gensec_security->settings->backends) {
-                       backends = gensec_security->settings->backends;
-               }
+       if ((gensec_security != NULL) &&
+           (gensec_security->settings->backends != NULL)) {
+               backends = gensec_security->settings->backends;
        }
 
-       return gensec_use_kerberos_mechs(mem_ctx, backends,
-                                        use_kerberos, keep_schannel);
+       if (backends == NULL) {
+               /* Just return the NULL terminator */
+               return talloc_zero(mem_ctx,
+                                  const struct gensec_security_ops *);
+       }
 
-}
+       for (num_backends = 0; backends[num_backends]; num_backends++) {
+               /* noop */
+       }
 
-_PUBLIC_ const struct gensec_security_ops *gensec_security_by_oid(
-                               struct gensec_security *gensec_security,
-                               const char *oid_string)
-{
-       int i, j;
-       const struct gensec_security_ops **backends;
-       const struct gensec_security_ops *backend;
-       TALLOC_CTX *mem_ctx = talloc_new(gensec_security);
-       if (!mem_ctx) {
+       result = talloc_array(
+               mem_ctx, const struct gensec_security_ops *, num_backends + 1);
+       if (result == NULL) {
                return NULL;
        }
-       backends = gensec_security_mechs(gensec_security, mem_ctx);
-       for (i=0; backends && backends[i]; i++) {
-               if (gensec_security != NULL &&
-                               !gensec_security_ops_enabled(backends[i],
-                                                                               
         gensec_security))
-                   continue;
-               if (backends[i]->oid) {
-                       for (j=0; backends[i]->oid[j]; j++) {
-                               if (backends[i]->oid[j] &&
-                                   (strcmp(backends[i]->oid[j], oid_string) == 
0)) {
-                                       backend = backends[i];
-                                       talloc_free(mem_ctx);
-                                       return backend;
-                               }
-                       }
+
+       j = 0;
+       for (i = 0; backends[i]; i++) {
+               bool offer = gensec_offer_mech(gensec_security, backends[i]);
+               if (offer) {
+                       result[j++] = backends[i];
                }
        }
-       talloc_free(mem_ctx);
 
-       return NULL;
+       result[j] = NULL;
+       return result;
 }
 
-_PUBLIC_ const struct gensec_security_ops *gensec_security_by_sasl_name(
-                               struct gensec_security *gensec_security,
-                               const char *sasl_name)
+static const struct gensec_security_ops *gensec_security_by_fn(
+       struct gensec_security *gensec_security,
+       bool (*fn)(const struct gensec_security_ops *backend,
+                  const void *private_data),
+       const void *private_data)
 {
-       int i;
-       const struct gensec_security_ops **backends;
-       const struct gensec_security_ops *backend;
-       TALLOC_CTX *mem_ctx = talloc_new(gensec_security);
-       if (!mem_ctx) {
+       size_t i;
+       const struct gensec_security_ops **backends = NULL;
+
+       backends = gensec_security_mechs(gensec_security, gensec_security);
+       if (backends == NULL) {
                return NULL;
        }
-       backends = gensec_security_mechs(gensec_security, mem_ctx);
-       for (i=0; backends && backends[i]; i++) {
-               if (gensec_security != NULL &&
-                   !gensec_security_ops_enabled(backends[i], gensec_security)) 
{
-                       continue;
-               }
-               if (backends[i]->sasl_name
-                   && (strcmp(backends[i]->sasl_name, sasl_name) == 0)) {
-                       backend = backends[i];
-                       talloc_free(mem_ctx);
+
+       for (i = 0; backends[i] != NULL; i++) {
+               const struct gensec_security_ops *backend = backends[i];
+               bool ok;
+
+               ok = fn(backend, private_data);
+               if (ok) {
+                       TALLOC_FREE(backends);
                        return backend;
                }
        }
-       talloc_free(mem_ctx);
 
+       TALLOC_FREE(backends);
        return NULL;
 }
 
-_PUBLIC_ const struct gensec_security_ops *gensec_security_by_auth_type(
-                               struct gensec_security *gensec_security,
-                               uint32_t auth_type)
+static bool by_oid_fn(const struct gensec_security_ops *backend,
+                     const void *private_data)
 {
+       const char *oid = private_data;
        int i;
-       const struct gensec_security_ops **backends;
-       const struct gensec_security_ops *backend;
-       TALLOC_CTX *mem_ctx;
 
-       if (auth_type == DCERPC_AUTH_TYPE_NONE) {
-               return NULL;
+       if (backend->oid == NULL) {
+               return false;
        }
 
-       mem_ctx = talloc_new(gensec_security);
-       if (!mem_ctx) {
-               return NULL;
-       }
-       backends = gensec_security_mechs(gensec_security, mem_ctx);
-       for (i=0; backends && backends[i]; i++) {
-               if (gensec_security != NULL &&
-                   !gensec_security_ops_enabled(backends[i], gensec_security)) 
{
-                       continue;
-               }
-               if (backends[i]->auth_type == auth_type) {
-                       backend = backends[i];
-                       talloc_free(mem_ctx);
-                       return backend;
+       for (i = 0; backend->oid[i] != NULL; i++) {
+               if (strcmp(backend->oid[i], oid) == 0) {
+                       return true;
                }
        }
-       talloc_free(mem_ctx);
+       return false;
+}
 
-       return NULL;
+_PUBLIC_ const struct gensec_security_ops *gensec_security_by_oid(
+       struct gensec_security *gensec_security,
+       const char *oid_string)
+{
+       return gensec_security_by_fn(gensec_security, by_oid_fn, oid_string);
 }
 
-const struct gensec_security_ops *gensec_security_by_name(struct 
gensec_security *gensec_security,
-                                                         const char *name)
+static bool by_sasl_name_fn(const struct gensec_security_ops *backend,
+                           const void *private_data)
 {
-       int i;
-       const struct gensec_security_ops **backends;
-       const struct gensec_security_ops *backend;
-       TALLOC_CTX *mem_ctx = talloc_new(gensec_security);
-       if (!mem_ctx) {
+       const char *sasl_name = private_data;
+       if (backend->sasl_name == NULL) {
+               return false;
+       }
+       return (strcmp(backend->sasl_name, sasl_name) == 0);
+}
+
+_PUBLIC_ const struct gensec_security_ops *gensec_security_by_sasl_name(
+       struct gensec_security *gensec_security,
+       const char *sasl_name)
+{
+       return gensec_security_by_fn(
+               gensec_security, by_sasl_name_fn, sasl_name);
+}
+
+static bool by_auth_type_fn(const struct gensec_security_ops *backend,
+                           const void *private_data)
+{
+       uint32_t auth_type = *((const uint32_t *)private_data);
+       return (backend->auth_type == auth_type);
+}
+
+_PUBLIC_ const struct gensec_security_ops *gensec_security_by_auth_type(
+       struct gensec_security *gensec_security,
+       uint32_t auth_type)
+{
+       if (auth_type == DCERPC_AUTH_TYPE_NONE) {
                return NULL;
        }
-       backends = gensec_security_mechs(gensec_security, mem_ctx);
-       for (i=0; backends && backends[i]; i++) {
-               if (gensec_security != NULL &&
-                               !gensec_security_ops_enabled(backends[i], 
gensec_security))
-                   continue;
-               if (backends[i]->name
-                   && (strcmp(backends[i]->name, name) == 0)) {
-                       backend = backends[i];
-                       talloc_free(mem_ctx);
-                       return backend;
-               }
+       return gensec_security_by_fn(
+               gensec_security, by_auth_type_fn, &auth_type);
+}
+
+static bool by_name_fn(const struct gensec_security_ops *backend,
+                      const void *private_data)
+{
+       const char *name = private_data;
+       if (backend->name == NULL) {
+               return false;
        }
-       talloc_free(mem_ctx);
-       return NULL;
+       return (strcmp(backend->name, name) == 0);
+}
+
+_PUBLIC_ const struct gensec_security_ops *gensec_security_by_name(
+       struct gensec_security *gensec_security,
+       const char *name)
+{
+       return gensec_security_by_fn(gensec_security, by_name_fn, name);
 }
 
 static const char **gensec_security_sasl_names_from_ops(
@@ -334,11 +317,6 @@ static const char **gensec_security_sasl_names_from_ops(
                }
 
                if (gensec_security != NULL) {
-                       if (!gensec_security_ops_enabled(ops[i],
-                                                        gensec_security)) {
-                               continue;
-                       }
-
                        role = gensec_security->gensec_role;
                }
 
@@ -428,9 +406,6 @@ static const struct gensec_security_ops 
**gensec_security_by_sasl_list(
        /* Find backends in our preferred order, by walking our list,
         * then looking in the supplied list */
        for (i=0; backends && backends[i]; i++) {
-               if (gensec_security != NULL &&
-                               !gensec_security_ops_enabled(backends[i], 
gensec_security))
-                   continue;
                for (sasl_idx = 0; sasl_names[sasl_idx]; sasl_idx++) {
                        if (!backends[i]->sasl_name ||
                            !(strcmp(backends[i]->sasl_name,
@@ -500,9 +475,6 @@ _PUBLIC_ const struct gensec_security_ops_wrapper 
*gensec_security_by_oid_list(
        /* Find backends in our preferred order, by walking our list,
         * then looking in the supplied list */
        for (i=0; backends && backends[i]; i++) {
-               if (gensec_security != NULL &&
-                               !gensec_security_ops_enabled(backends[i], 
gensec_security))
-                   continue;
                if (!backends[i]->oid) {
                        continue;
                }
@@ -570,10 +542,6 @@ static const char **gensec_security_oids_from_ops(
        }
 
        for (i=0; ops && ops[i]; i++) {
-               if (gensec_security != NULL &&
-                       !gensec_security_ops_enabled(ops[i], gensec_security)) {
-                       continue;
-               }
                if (!ops[i]->oid) {
                        continue;
                }
diff --git a/auth/gensec/spnego.c b/auth/gensec/spnego.c
index 717f643957a..d63d292f168 100644
--- a/auth/gensec/spnego.c
+++ b/auth/gensec/spnego.c
@@ -242,12 +242,6 @@ static NTSTATUS gensec_spnego_server_try_fallback(struct 
gensec_security *gensec


-- 
Samba Shared Repository

Reply via email to