diff options
author | Andrew Bartlett <abartlet@samba.org> | 2005-12-11 08:31:46 +0000 |
---|---|---|
committer | Andrew Bartlett <abartlet@samba.org> | 2005-12-11 08:31:46 +0000 |
commit | 33677f2cccc5bd0242b54a5acf2af20ed7379f9e (patch) | |
tree | f22f5851c0b0f073803837d6be5a7b90876c4971 /source/auth | |
parent | d93568eb821ba0bd58ea4e883e4f56726c87aee5 (diff) | |
download | samba-33677f2cccc5bd0242b54a5acf2af20ed7379f9e.tar.gz samba-33677f2cccc5bd0242b54a5acf2af20ed7379f9e.tar.xz samba-33677f2cccc5bd0242b54a5acf2af20ed7379f9e.zip |
r12179: Allow our KDC to use LDAP to get to the backend database.
To avoid a circular depenency, it is not allowed to use Krb5 as an
authentication mechanism, so this must be removed from the list. An
extension to the credentials system allows this function.
Also remove proto.h use for any of the KDC, and use NTSTATUS returns
in more places.
Andrew Bartlett
Diffstat (limited to 'source/auth')
-rw-r--r-- | source/auth/credentials/credentials_gensec.c | 47 | ||||
-rw-r--r-- | source/auth/gensec/gensec.c | 7 |
2 files changed, 51 insertions, 3 deletions
diff --git a/source/auth/credentials/credentials_gensec.c b/source/auth/credentials/credentials_gensec.c index 077e4689ec0..fcaa760ed4c 100644 --- a/source/auth/credentials/credentials_gensec.c +++ b/source/auth/credentials/credentials_gensec.c @@ -24,8 +24,53 @@ const struct gensec_security_ops **cli_credentials_gensec_list(struct cli_credentials *creds) { - if (!creds->gensec_list) { + if (!creds || !creds->gensec_list) { return gensec_security_all(); } return creds->gensec_list; } + +static NTSTATUS cli_credentials_gensec_remove_mech(struct cli_credentials *creds, + const struct gensec_security_ops *remove_mech) +{ + const struct gensec_security_ops **gensec_list; + const struct gensec_security_ops **new_gensec_list; + int i, j; + + gensec_list = cli_credentials_gensec_list(creds); + + for (i=0; gensec_list && gensec_list[i]; i++) { + /* noop */ + } + + new_gensec_list = talloc_array(creds, const struct gensec_security_ops *, i + 1); + if (!new_gensec_list) { + return NT_STATUS_NO_MEMORY; + } + + j = 0; + for (i=0; gensec_list && gensec_list[i]; i++) { + if (gensec_list[i] != remove_mech) { + new_gensec_list[j] = gensec_list[i]; + j++; + } + } + new_gensec_list[j] = NULL; + + creds->gensec_list = new_gensec_list; + + return NT_STATUS_OK; +} + +NTSTATUS cli_credentials_gensec_remove_oid(struct cli_credentials *creds, + const char *oid) +{ + const struct gensec_security_ops *gensec_by_oid; + + gensec_by_oid = gensec_security_by_oid(NULL, oid); + if (!gensec_by_oid) { + return NT_STATUS_OK; + } + + return cli_credentials_gensec_remove_mech(creds, gensec_by_oid); +} diff --git a/source/auth/gensec/gensec.c b/source/auth/gensec/gensec.c index 0d79cb892cb..26f245787be 100644 --- a/source/auth/gensec/gensec.c +++ b/source/auth/gensec/gensec.c @@ -53,8 +53,8 @@ static const struct gensec_security_ops *gensec_security_by_authtype(struct gens return NULL; } -static const struct gensec_security_ops *gensec_security_by_oid(struct gensec_security *gensec_security, - const char *oid_string) +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; @@ -805,6 +805,9 @@ NTSTATUS gensec_set_credentials(struct gensec_security *gensec_security, struct struct cli_credentials *gensec_get_credentials(struct gensec_security *gensec_security) { + if (!gensec_security) { + return NULL; + } return gensec_security->credentials; } |