[SCM] Samba Shared Repository - branch master updated -
release-4-0-0alpha7-1735-gcbe3dab
Bo Yang
boyang at samba.org
Thu May 21 03:17:18 GMT 2009
The branch, master has been updated
via cbe3dabb9d1fe4e16e14c50550df2afab7e4a21e (commit)
via 8c7a579bdcca32897bd9ee716a488568b721ed90 (commit)
via e65aa34078f5c2c969103a23d6693071d88672a2 (commit)
from 000da55dd930d151db14ee8eed58e82806522692 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit cbe3dabb9d1fe4e16e14c50550df2afab7e4a21e
Author: Bo Yang <boyang at samba.org>
Date: Fri May 22 02:12:59 2009 +0800
s3: Fix onlinestatus msg to return status of all domain instead of omitting trusted domains
Signed-off-by: Bo Yang <boyang at samba.org>
commit 8c7a579bdcca32897bd9ee716a488568b721ed90
Author: Bo Yang <boyang at samba.org>
Date: Fri May 22 02:03:32 2009 +0800
s3: set winbindd request flags in ntlm_auth to make it contact trusted domain when krb5 auth is enabled
Signed-off-by: Bo Yang <boyang at samba.org>
commit e65aa34078f5c2c969103a23d6693071d88672a2
Author: Bo Yang <boyang at samba.org>
Date: Fri May 22 01:39:03 2009 +0800
s3: Fix request flags in wbinfo when perform krb5 authentication
Signed-off-by: Bo Yang <boyang at samba.org>
-----------------------------------------------------------------------
Summary of changes:
nsswitch/wbinfo.c | 3 +-
source3/Makefile.in | 2 +-
source3/utils/ntlm_auth.c | 57 ++++++++++++++++-
source3/utils/ntlm_auth_proto.h | 1 +
source3/winbindd/winbindd_dual.c | 129 +++++++++++++++-----------------------
5 files changed, 111 insertions(+), 81 deletions(-)
Changeset truncated at 500 lines:
diff --git a/nsswitch/wbinfo.c b/nsswitch/wbinfo.c
index 9ee0e01..04addda 100644
--- a/nsswitch/wbinfo.c
+++ b/nsswitch/wbinfo.c
@@ -2031,7 +2031,8 @@ int main(int argc, char **argv, char **envp)
uint32 flags = WBFLAG_PAM_KRB5 |
WBFLAG_PAM_CACHED_LOGIN |
WBFLAG_PAM_FALLBACK_AFTER_KRB5 |
- WBFLAG_PAM_INFO3_TEXT;
+ WBFLAG_PAM_INFO3_TEXT |
+ WBFLAG_PAM_CONTACT_TRUSTDOM;
if (!wbinfo_auth_krb5(string_arg, "FILE", flags)) {
d_fprintf(stderr, "Could not authenticate user [%s] with "
diff --git a/source3/Makefile.in b/source3/Makefile.in
index fdcd86a..585bd5d 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -2813,7 +2813,7 @@ bin/ntlm_auth at EXEEXT@: $(BINARY_PREREQS) $(NTLM_AUTH_OBJ) $(PARAM_OBJ) \
@$(CC) -o $@ $(LDFLAGS) $(DYNEXP) $(NTLM_AUTH_OBJ) \
$(PARAM_OBJ) $(LIB_NONSMBD_OBJ) $(LIBS) \
$(POPT_LIBS) $(KRB5LIBS) $(LDAP_LIBS) $(NSCD_LIBS) \
- $(LIBTALLOC_LIBS) $(LIBTDB_LIBS) $(LIBWBCLIENT_LIBS)
+ $(LIBTALLOC_LIBS) $(LIBTDB_LIBS) $(LIBWBCLIENT_LIBS) @INIPARSERLIBS@
bin/pam_smbpass. at SHLIBEXT@: $(BINARY_PREREQS) $(PAM_SMBPASS_OBJ) @LIBTALLOC_TARGET@ @LIBWBCLIENT_TARGET@ @LIBTDB_TARGET@
@echo "Linking shared library $@"
diff --git a/source3/utils/ntlm_auth.c b/source3/utils/ntlm_auth.c
index 50688bf..6de5ea6 100644
--- a/source3/utils/ntlm_auth.c
+++ b/source3/utils/ntlm_auth.c
@@ -26,6 +26,13 @@
#include "includes.h"
#include "utils/ntlm_auth.h"
#include "../libcli/auth/libcli_auth.h"
+#include <iniparser.h>
+
+#ifndef PAM_WINBIND_CONFIG_FILE
+#define PAM_WINBIND_CONFIG_FILE "/etc/security/pam_winbind.conf"
+#endif
+
+#define WINBIND_KRB5_AUTH 0x00000080
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_WINBIND
@@ -125,6 +132,7 @@ static int use_cached_creds;
static const char *require_membership_of;
static const char *require_membership_of_sid;
+static const char *opt_pam_winbind_conf;
static char winbind_separator(void)
{
@@ -279,6 +287,36 @@ static bool get_require_membership_sid(void) {
return False;
}
+
+/*
+ * Get some configuration from pam_winbind.conf to see if we
+ * need to contact trusted domain
+ */
+
+int get_pam_winbind_config()
+{
+ int ctrl = 0;
+ dictionary *d = NULL;
+
+ if (!opt_pam_winbind_conf || !*opt_pam_winbind_conf) {
+ opt_pam_winbind_conf = PAM_WINBIND_CONFIG_FILE;
+ }
+
+ d = iniparser_load(CONST_DISCARD(char *, opt_pam_winbind_conf));
+
+ if (!d) {
+ return 0;
+ }
+
+ if (iniparser_getboolean(d, CONST_DISCARD(char *, "global:krb5_auth"), false)) {
+ ctrl |= WINBIND_KRB5_AUTH;
+ }
+
+ iniparser_freedict(d);
+
+ return ctrl;
+}
+
/* Authenticate a user with a plaintext password */
static bool check_plaintext_auth(const char *user, const char *pass,
@@ -677,12 +715,27 @@ static NTSTATUS do_ccache_ntlm_auth(DATA_BLOB initial_msg, DATA_BLOB challenge_m
{
struct winbindd_request wb_request;
struct winbindd_response wb_response;
+ int ctrl = 0;
NSS_STATUS result;
/* get winbindd to do the ntlmssp step on our behalf */
ZERO_STRUCT(wb_request);
ZERO_STRUCT(wb_response);
+ /*
+ * This is tricky here. If we set krb5_auth in pam_winbind.conf
+ * creds for users in trusted domain will be stored the winbindd
+ * child of the trusted domain. If we ask the primary domain for
+ * ntlm_ccache_auth, it will fail. So, we have to ask the trusted
+ * domain's child for ccache_ntlm_auth. that is to say, we have to
+ * set WBFALG_PAM_CONTACT_TRUSTDOM in request.flags.
+ */
+ ctrl = get_pam_winbind_config();
+
+ if (ctrl | WINBIND_KRB5_AUTH) {
+ wb_request.flags |= WBFLAG_PAM_CONTACT_TRUSTDOM;
+ }
+
fstr_sprintf(wb_request.data.ccache_ntlm_auth.user,
"%s%c%s", opt_domain, winbind_separator(), opt_username);
wb_request.data.ccache_ntlm_auth.uid = geteuid();
@@ -2308,7 +2361,8 @@ enum {
OPT_USER_SESSION_KEY,
OPT_DIAGNOSTICS,
OPT_REQUIRE_MEMBERSHIP,
- OPT_USE_CACHED_CREDS
+ OPT_USE_CACHED_CREDS,
+ OPT_PAM_WINBIND_CONF
};
int main(int argc, const char **argv)
@@ -2347,6 +2401,7 @@ enum {
{ "use-cached-creds", 0, POPT_ARG_NONE, &use_cached_creds, OPT_USE_CACHED_CREDS, "Use cached credentials if no password is given"},
{ "diagnostics", 0, POPT_ARG_NONE, &diagnostics, OPT_DIAGNOSTICS, "Perform diagnostics on the authentictaion chain"},
{ "require-membership-of", 0, POPT_ARG_STRING, &require_membership_of, OPT_REQUIRE_MEMBERSHIP, "Require that a user be a member of this group (either name or SID) for authentication to succeed" },
+ { "pam-winbind-conf", 0, POPT_ARG_STRING, &opt_pam_winbind_conf, OPT_PAM_WINBIND_CONF, "Require that request must set WBFLAG_PAM_CONTACT_TRUSTDOM when krb5 auth is required" },
POPT_COMMON_CONFIGFILE
POPT_COMMON_VERSION
POPT_TABLEEND
diff --git a/source3/utils/ntlm_auth_proto.h b/source3/utils/ntlm_auth_proto.h
index e48a190..5f8d264 100644
--- a/source3/utils/ntlm_auth_proto.h
+++ b/source3/utils/ntlm_auth_proto.h
@@ -44,5 +44,6 @@ NTSTATUS contact_winbind_auth_crap(const char *username,
/* The following definitions come from utils/ntlm_auth_diagnostics.c */
bool diagnose_ntlm_auth(void);
+int get_pam_winbind_config(void);
#endif /* _NTLM_AUTH_PROTO_H_ */
diff --git a/source3/winbindd/winbindd_dual.c b/source3/winbindd/winbindd_dual.c
index 893303e..a69d34f 100644
--- a/source3/winbindd/winbindd_dual.c
+++ b/source3/winbindd/winbindd_dual.c
@@ -692,29 +692,66 @@ void winbind_msg_online(struct messaging_context *msg_ctx,
}
}
-/* Forward the online/offline messages to our children. */
+static const char *collect_onlinestatus(TALLOC_CTX *mem_ctx)
+{
+ struct winbindd_domain *domain;
+ char *buf = NULL;
+
+ if ((buf = talloc_asprintf(mem_ctx, "global:%s ",
+ get_global_winbindd_state_offline() ?
+ "Offline":"Online")) == NULL) {
+ return NULL;
+ }
+
+ for (domain = domain_list(); domain; domain = domain->next) {
+ if ((buf = talloc_asprintf_append_buffer(buf, "%s:%s ",
+ domain->name,
+ domain->online ?
+ "Online":"Offline")) == NULL) {
+ return NULL;
+ }
+ }
+
+ buf = talloc_asprintf_append_buffer(buf, "\n");
+
+ DEBUG(5,("collect_onlinestatus: %s", buf));
+
+ return buf;
+}
+
void winbind_msg_onlinestatus(struct messaging_context *msg_ctx,
void *private_data,
uint32_t msg_type,
struct server_id server_id,
DATA_BLOB *data)
{
- struct winbindd_child *child;
+ TALLOC_CTX *mem_ctx;
+ const char *message;
+ struct server_id *sender;
+
+ DEBUG(5,("winbind_msg_onlinestatus received.\n"));
+
+ if (!data->data) {
+ return;
+ }
- DEBUG(10,("winbind_msg_onlinestatus: got onlinestatus message.\n"));
+ sender = (struct server_id *)data->data;
- for (child = children; child != NULL; child = child->next) {
- if (child->domain && child->domain->primary) {
- DEBUG(10,("winbind_msg_onlinestatus: "
- "sending message to pid %u of primary domain.\n",
- (unsigned int)child->pid));
- messaging_send_buf(msg_ctx, pid_to_procid(child->pid),
- MSG_WINBIND_ONLINESTATUS,
- (uint8 *)data->data,
- data->length);
- break;
- }
+ mem_ctx = talloc_init("winbind_msg_onlinestatus");
+ if (mem_ctx == NULL) {
+ return;
}
+
+ message = collect_onlinestatus(mem_ctx);
+ if (message == NULL) {
+ talloc_destroy(mem_ctx);
+ return;
+ }
+
+ messaging_send_buf(msg_ctx, *sender, MSG_WINBIND_ONLINESTATUS,
+ (uint8 *)message, strlen(message) + 1);
+
+ talloc_destroy(mem_ctx);
}
void winbind_msg_dump_event_list(struct messaging_context *msg_ctx,
@@ -1068,68 +1105,6 @@ static void child_msg_online(struct messaging_context *msg,
}
}
-static const char *collect_onlinestatus(TALLOC_CTX *mem_ctx)
-{
- struct winbindd_domain *domain;
- char *buf = NULL;
-
- if ((buf = talloc_asprintf(mem_ctx, "global:%s ",
- get_global_winbindd_state_offline() ?
- "Offline":"Online")) == NULL) {
- return NULL;
- }
-
- for (domain = domain_list(); domain; domain = domain->next) {
- if ((buf = talloc_asprintf_append_buffer(buf, "%s:%s ",
- domain->name,
- domain->online ?
- "Online":"Offline")) == NULL) {
- return NULL;
- }
- }
-
- buf = talloc_asprintf_append_buffer(buf, "\n");
-
- DEBUG(5,("collect_onlinestatus: %s", buf));
-
- return buf;
-}
-
-static void child_msg_onlinestatus(struct messaging_context *msg_ctx,
- void *private_data,
- uint32_t msg_type,
- struct server_id server_id,
- DATA_BLOB *data)
-{
- TALLOC_CTX *mem_ctx;
- const char *message;
- struct server_id *sender;
-
- DEBUG(5,("winbind_msg_onlinestatus received.\n"));
-
- if (!data->data) {
- return;
- }
-
- sender = (struct server_id *)data->data;
-
- mem_ctx = talloc_init("winbind_msg_onlinestatus");
- if (mem_ctx == NULL) {
- return;
- }
-
- message = collect_onlinestatus(mem_ctx);
- if (message == NULL) {
- talloc_destroy(mem_ctx);
- return;
- }
-
- messaging_send_buf(msg_ctx, *sender, MSG_WINBIND_ONLINESTATUS,
- (uint8 *)message, strlen(message) + 1);
-
- talloc_destroy(mem_ctx);
-}
-
static void child_msg_dump_event_list(struct messaging_context *msg,
void *private_data,
uint32_t msg_type,
@@ -1296,8 +1271,6 @@ static bool fork_domain_child(struct winbindd_child *child)
messaging_register(winbind_messaging_context(), NULL,
MSG_WINBIND_ONLINE, child_msg_online);
messaging_register(winbind_messaging_context(), NULL,
- MSG_WINBIND_ONLINESTATUS, child_msg_onlinestatus);
- messaging_register(winbind_messaging_context(), NULL,
MSG_DUMP_EVENT_LIST, child_msg_dump_event_list);
messaging_register(winbind_messaging_context(), NULL,
MSG_DEBUG, debug_message);
--
Samba Shared Repository
More information about the samba-cvs
mailing list