summaryrefslogtreecommitdiffstats
path: root/source/winbindd/winbindd_cred_cache.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2009-01-05 20:54:03 -0800
committerKarolin Seeger <kseeger@samba.org>2009-01-08 16:26:17 +0100
commitd761bc8faf398c2f1e18cb50c87eb12944333e05 (patch)
treea6cd894f54c8570a5eda95c2d37fb18ea105eada /source/winbindd/winbindd_cred_cache.c
parent29159131ec51311b3bd9e2fd1877361d2368e8c3 (diff)
downloadsamba-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.c50
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,