diff options
author | Stefan Metzmacher <metze@samba.org> | 2009-01-05 20:54:03 -0800 |
---|---|---|
committer | Karolin Seeger <kseeger@samba.org> | 2009-01-08 16:26:17 +0100 |
commit | d761bc8faf398c2f1e18cb50c87eb12944333e05 (patch) | |
tree | a6cd894f54c8570a5eda95c2d37fb18ea105eada /source/winbindd/winbindd_cred_cache.c | |
parent | 29159131ec51311b3bd9e2fd1877361d2368e8c3 (diff) | |
download | samba-d761bc8faf398c2f1e18cb50c87eb12944333e05.tar.gz samba-d761bc8faf398c2f1e18cb50c87eb12944333e05.tar.xz samba-d761bc8faf398c2f1e18cb50c87eb12944333e05.zip |
s3:winbindd: regain tickets for all ccache entries, when we go online
set_event_dispatch_time() is stupid by design and only handles
the first event with a given name.
metze
(cherry picked from commit e1f794a246feab1f100abd961e0e576f0b85453a)
Diffstat (limited to 'source/winbindd/winbindd_cred_cache.c')
-rw-r--r-- | source/winbindd/winbindd_cred_cache.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/source/winbindd/winbindd_cred_cache.c b/source/winbindd/winbindd_cred_cache.c index fcb3d033a66..c8695440487 100644 --- a/source/winbindd/winbindd_cred_cache.c +++ b/source/winbindd/winbindd_cred_cache.c @@ -281,6 +281,9 @@ done: return; } + if (entry->refresh_time == 0) { + entry->refresh_time = new_start; + } entry->event = event_add_timed(winbind_event_context(), entry, timeval_set(new_start, 0), "krb5_ticket_refresh_handler", @@ -368,6 +371,7 @@ static void krb5_ticket_gain_handler(struct event_context *event_ctx, t = timeval_current_ofs(MAX(30, lp_winbind_cache_time()), 0); #endif + entry->refresh_time = 0; entry->event = event_add_timed(winbind_event_context(), entry, t, @@ -385,6 +389,9 @@ static void krb5_ticket_gain_handler(struct event_context *event_ctx, t = timeval_set(KRB5_EVENT_REFRESH_TIME(entry->refresh_time), 0); #endif + if (entry->refresh_time == 0) { + entry->refresh_time = t.tv_sec; + } entry->event = event_add_timed(winbind_event_context(), entry, t, @@ -396,6 +403,45 @@ static void krb5_ticket_gain_handler(struct event_context *event_ctx, #endif } +void ccache_regain_all_now(void) +{ + struct WINBINDD_CCACHE_ENTRY *cur; + struct timeval t = timeval_current(); + + for (cur = ccache_list; cur; cur = cur->next) { + struct timed_event *new_event; + + /* + * if refresh_time is 0, we know that the + * the event has the krb5_ticket_gain_handler + */ + if (cur->refresh_time == 0) { + new_event = event_add_timed(winbind_event_context(), + cur, + t, + "krb5_ticket_gain_handler", + krb5_ticket_gain_handler, + cur); + } else { + new_event = event_add_timed(winbind_event_context(), + cur, + t, + "krb5_ticket_refresh_handler", + krb5_ticket_refresh_handler, + cur); + } + + if (!new_event) { + continue; + } + + TALLOC_FREE(cur->event); + cur->event = new_event; + } + + return; +} + /**************************************************************** Check if an ccache entry exists. ****************************************************************/ @@ -594,6 +640,7 @@ NTSTATUS add_ccache_to_list(const char *princ_name, if (postponed_request) { t = timeval_current_ofs(MAX(30, lp_winbind_cache_time()), 0); + entry->refresh_time = 0; entry->event = event_add_timed(winbind_event_context(), entry, t, @@ -607,6 +654,9 @@ NTSTATUS add_ccache_to_list(const char *princ_name, #else t = timeval_set(KRB5_EVENT_REFRESH_TIME(ticket_end), 0); #endif + if (entry->refresh_time == 0) { + entry->refresh_time = t.tv_sec; + } entry->event = event_add_timed(winbind_event_context(), entry, t, |