]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
Fix bug #9098 - winbind does not refresh kerberos tickets.
authorJeremy Allison <jra@samba.org>
Tue, 21 Aug 2012 18:24:58 +0000 (11:24 -0700)
committerKarolin Seeger <kseeger@samba.org>
Thu, 23 Aug 2012 18:21:07 +0000 (20:21 +0200)
Based on work from Ian Gordon <ian.gordon@strath.ac.uk>.
(cherry picked from commit 3f60bff699223a8895d060585f765706e167da37)

source3/winbindd/winbindd_cred_cache.c
source3/winbindd/winbindd_pam.c
source3/winbindd/winbindd_proto.h

index ab8934bfd4a8b631c7bee70e87de68b0990249f6..3b6277e665f43a5a7f896c1ed8ea5fee0828d496 100644 (file)
@@ -490,6 +490,7 @@ NTSTATUS add_ccache_to_list(const char *princ_name,
                            const char *ccname,
                            const char *service,
                            const char *username,
+                           const char *pass,
                            const char *realm,
                            uid_t uid,
                            time_t create_time,
@@ -591,8 +592,22 @@ NTSTATUS add_ccache_to_list(const char *princ_name,
                        }
 
                        DEBUG(10,("add_ccache_to_list: added krb5_ticket handler\n"));
+
                }
 
+               /*
+                * If we're set up to renew our krb5 tickets, we must
+                * cache the credentials in memory for the ticket
+                * renew function (or increase the reference count
+                * if we're logging in more than once). Fix inspired
+                * by patch from Ian Gordon <ian.gordon@strath.ac.uk>
+                * for bugid #9098.
+                */
+
+               ntret = winbindd_add_memory_creds(username, uid, pass);
+               DEBUG(10, ("winbindd_add_memory_creds returned: %s\n",
+                       nt_errstr(ntret)));
+
                return NT_STATUS_OK;
        }
 
@@ -675,6 +690,20 @@ NTSTATUS add_ccache_to_list(const char *princ_name,
                "added ccache [%s] for user [%s] to the list\n",
                ccname, username));
 
+       if (entry->event) {
+               /*
+                * If we're set up to renew our krb5 tickets, we must
+                * cache the credentials in memory for the ticket
+                * renew function. Fix inspired by patch from
+                * Ian Gordon <ian.gordon@strath.ac.uk> for
+                * bugid #9098.
+                */
+
+               ntret = winbindd_add_memory_creds(username, uid, pass);
+               DEBUG(10, ("winbindd_add_memory_creds returned: %s\n",
+                       nt_errstr(ntret)));
+       }
+
        return NT_STATUS_OK;
 
  no_mem:
index 55069f6477acc3bb0c3d58519743b7ec0656053b..619b63212dc3f181dddd8dc1155df48140c8ad18 100644 (file)
@@ -640,6 +640,7 @@ static NTSTATUS winbindd_raw_kerberos_login(TALLOC_CTX *mem_ctx,
                                            cc,
                                            service,
                                            user,
+                                           pass,
                                            realm,
                                            uid,
                                            time(NULL),
@@ -957,6 +958,7 @@ static NTSTATUS winbindd_dual_pam_auth_cached(struct winbindd_domain *domain,
                                                            cc,
                                                            service,
                                                            state->request->data.auth.user,
+                                                           state->request->data.auth.pass,
                                                            domain->alt_name,
                                                            uid,
                                                            time(NULL),
@@ -2105,6 +2107,13 @@ enum winbindd_result winbindd_dual_pam_logoff(struct winbindd_domain *domain,
                goto process_result;
        }
 
+       /*
+        * Remove any mlock'ed memory creds in the child
+        * we might be using for krb5 ticket renewal.
+        */
+
+       winbindd_delete_memory_creds(state->request->data.logoff.user);
+
 #else
        result = NT_STATUS_NOT_SUPPORTED;
 #endif
index ab61223c86d2547eac3ca307af6f73cb240748a3..41292d4e5381681e557b21860f5ff5405255d169 100644 (file)
@@ -188,6 +188,7 @@ NTSTATUS add_ccache_to_list(const char *princ_name,
                            const char *ccname,
                            const char *service,
                            const char *username,
+                           const char *password,
                            const char *realm,
                            uid_t uid,
                            time_t create_time,