From ac3f2e784f818fb06b20b053cf4127d331e8f63c Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Fri, 31 Aug 2007 15:24:43 +0000 Subject: r24843: Add a "validate-cache" control message to winbindd. So there is a new subcommand "smbcontrol winbindd validate-cache" now. This change provides the infrastructure: The function currently returns "true" unconditionally. The call of a real cache validation function will be incorporated in subsequent changes. Michael (This used to be commit ef92d505c04397614cb0dd5ede967e9017a5e302) --- source3/include/messages.h | 1 + source3/nsswitch/winbindd.c | 26 ++++++++++++++++++++++++++ source3/utils/smbcontrol.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) (limited to 'source3') diff --git a/source3/include/messages.h b/source3/include/messages.h index 7818446a09..b3ae85ec9c 100644 --- a/source3/include/messages.h +++ b/source3/include/messages.h @@ -96,6 +96,7 @@ #define MSG_WINBIND_ONLINESTATUS 0x0405 #define MSG_WINBIND_TRY_TO_GO_ONLINE 0x0406 #define MSG_WINBIND_FAILED_TO_GO_ONLINE 0x0407 +#define MSG_WINBIND_VALIDATE_CACHE 0x0408 /* event messages */ #define MSG_DUMP_EVENT_LIST 0x0500 diff --git a/source3/nsswitch/winbindd.c b/source3/nsswitch/winbindd.c index d7368a3d34..913ad04c6d 100644 --- a/source3/nsswitch/winbindd.c +++ b/source3/nsswitch/winbindd.c @@ -202,6 +202,28 @@ static void msg_shutdown(struct messaging_context *msg, do_sigterm = True; } + +static void winbind_msg_validate_cache(struct messaging_context *msg_ctx, + void *private_data, + uint32_t msg_type, + struct server_id server_id, + DATA_BLOB *data) +{ + uint8 ret; + + DEBUG(10, ("winbindd_msg_validate_cache: got validate-cache " + "message.\n")); + +#if 0 + ret = (uint8)winbindd_validate_cache_nobackup(); + DEBUG(10, ("winbindd_msg_validata_cache: got return value %d\n", ret)); +#else + ret = 0; +#endif + messaging_send_buf(msg_ctx, server_id, MSG_WINBIND_VALIDATE_CACHE, &ret, + (size_t)1); +} + static struct winbindd_dispatch_table { enum winbindd_cmd cmd; void (*fn)(struct winbindd_cli_state *state); @@ -1170,6 +1192,10 @@ int main(int argc, char **argv, char **envp) messaging_register(winbind_messaging_context(), NULL, MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list); + messaging_register(winbind_messaging_context(), NULL, + MSG_WINBIND_VALIDATE_CACHE, + winbind_msg_validate_cache); + netsamlogon_cache_init(); /* Non-critical */ /* clear the cached list of trusted domains */ diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c index 2a435945e6..8255a41c96 100644 --- a/source3/utils/smbcontrol.c +++ b/source3/utils/smbcontrol.c @@ -1012,6 +1012,48 @@ static BOOL do_dump_event_list(struct messaging_context *msg_ctx, return send_message(msg_ctx, pid, MSG_DUMP_EVENT_LIST, NULL, 0); } +static void winbind_validate_cache_cb(struct messaging_context *msg, + void *private_data, + uint32_t msg_type, + struct server_id pid, + DATA_BLOB *data) +{ + char *src_string = procid_str(NULL, &pid); + printf("Winbindd cache is %svalid. (answer from pid %s)\n", + (*(data->data) == 0 ? "" : "NOT "), src_string); + TALLOC_FREE(src_string); + num_replies++; +} + +static BOOL do_winbind_validate_cache(struct messaging_context *msg_ctx, + const struct server_id pid, + const int argc, const char **argv) +{ + struct server_id myid = pid_to_procid(sys_getpid()); + + if (argc != 1) { + fprintf(stderr, "Usage: smbcontrol winbindd validate-cache\n"); + return False; + } + + messaging_register(msg_ctx, NULL, MSG_WINBIND_VALIDATE_CACHE, + winbind_validate_cache_cb); + + if (!send_message(msg_ctx, pid, MSG_WINBIND_VALIDATE_CACHE, &myid, + sizeof(myid))) { + return False; + } + + wait_replies(msg_ctx, procid_to_pid(&pid) == 0); + + if (num_replies == 0) { + printf("No replies received\n"); + } + + messaging_deregister(msg_ctx, MSG_WINBIND_VALIDATE_CACHE, NULL); + + return num_replies; +} static BOOL do_reload_config(struct messaging_context *msg_ctx, const struct server_id pid, @@ -1110,6 +1152,8 @@ static const struct { { "offline", do_winbind_offline, "Ask winbind to go into offline state"}, { "onlinestatus", do_winbind_onlinestatus, "Request winbind online status"}, { "dump-event-list", do_dump_event_list, "Dump event list"}, + { "validate-cache" , do_winbind_validate_cache, + "Validate winbind's credential cache" }, { "noop", do_noop, "Do nothing" }, { NULL } }; -- cgit