Nalin Dahyabhai 414f99e
From acbb59cd4b1759afe492b8503cddb0a2f719e6c8 Mon Sep 17 00:00:00 2001
Nalin Dahyabhai 414f99e
From: Nalin Dahyabhai <nalin@dahyabhai.net>
Nalin Dahyabhai 414f99e
Date: Wed, 30 Oct 2013 21:47:14 -0400
Nalin Dahyabhai 414f99e
Subject: [PATCH 4/6] Try to use the default_ccache_name'd as the target
Nalin Dahyabhai 414f99e
Nalin Dahyabhai 414f99e
Try to use the location named by the default_ccache_name setting as the
Nalin Dahyabhai 414f99e
target cache.  If it's a collection, just create or update a subsidiary
Nalin Dahyabhai 414f99e
cache.  If it's not, then fall back to creating a new cache to try to
Nalin Dahyabhai 414f99e
avoid destroying the contents of one that might already be there.  We
Nalin Dahyabhai 414f99e
can't really detect this in advance for KEYRING: caches, though.
Nalin Dahyabhai 414f99e
---
Nalin Dahyabhai 414f99e
 src/clients/ksu/ksu.h  |  2 +-
Nalin Dahyabhai 414f99e
 src/clients/ksu/main.c | 91 ++++++++++++++++++++++++++++++++++++--------------
Nalin Dahyabhai 414f99e
 2 files changed, 67 insertions(+), 26 deletions(-)
Nalin Dahyabhai 414f99e
Nalin Dahyabhai 414f99e
diff --git a/src/clients/ksu/ksu.h b/src/clients/ksu/ksu.h
Nalin Dahyabhai 414f99e
index a889fb9..a195f52 100644
Nalin Dahyabhai 414f99e
--- a/src/clients/ksu/ksu.h
Nalin Dahyabhai 414f99e
+++ b/src/clients/ksu/ksu.h
Nalin Dahyabhai 414f99e
@@ -44,7 +44,7 @@
Nalin Dahyabhai 414f99e
 #define KRB5_DEFAULT_OPTIONS 0
Nalin Dahyabhai 414f99e
 #define KRB5_DEFAULT_TKT_LIFE 60*60*12 /* 12 hours */
Nalin Dahyabhai 414f99e
 
Nalin Dahyabhai 414f99e
-#define KRB5_SECONDARY_CACHE "FILE:/tmp/krb5cc_"
Nalin Dahyabhai 414f99e
+#define KRB5_DEFAULT_SECONDARY_CACHE "FILE:/tmp/krb5cc_%{uid}"
Nalin Dahyabhai 414f99e
 #define KRB5_TEMPORARY_CACHE "MEMORY:_ksu"
Nalin Dahyabhai 414f99e
 
Nalin Dahyabhai 414f99e
 #define KRB5_LOGIN_NAME ".k5login"
Nalin Dahyabhai 414f99e
diff --git a/src/clients/ksu/main.c b/src/clients/ksu/main.c
Nalin Dahyabhai 414f99e
index 7497a2b..58df6a1 100644
Nalin Dahyabhai 414f99e
--- a/src/clients/ksu/main.c
Nalin Dahyabhai 414f99e
+++ b/src/clients/ksu/main.c
Nalin Dahyabhai 414f99e
@@ -90,7 +90,10 @@ main (argc, argv)
Nalin Dahyabhai 414f99e
     krb5_ccache cc_tmp = NULL, cc_target = NULL;
Nalin Dahyabhai 414f99e
     krb5_context ksu_context;
Nalin Dahyabhai 414f99e
     char * cc_target_tag = NULL;
Nalin Dahyabhai 414f99e
+    char * cc_target_tag_conf;
Nalin Dahyabhai 414f99e
+    krb5_boolean cc_target_switchable;
Nalin Dahyabhai 414f99e
     char * target_user = NULL;
Nalin Dahyabhai 414f99e
+    char * target_user_uid_str;
Nalin Dahyabhai 414f99e
     char * source_user;
Nalin Dahyabhai 414f99e
 
Nalin Dahyabhai 414f99e
     krb5_ccache cc_source = NULL;
Nalin Dahyabhai 414f99e
@@ -116,7 +119,6 @@ main (argc, argv)
Nalin Dahyabhai 414f99e
     krb5_boolean stored = FALSE;
Nalin Dahyabhai 414f99e
     krb5_principal  kdc_server;
Nalin Dahyabhai 414f99e
     krb5_boolean zero_password;
Nalin Dahyabhai 414f99e
-    char * dir_of_cc_target;
Nalin Dahyabhai 414f99e
 
Nalin Dahyabhai 414f99e
     options.opt = KRB5_DEFAULT_OPTIONS;
Nalin Dahyabhai 414f99e
     options.lifetime = KRB5_DEFAULT_TKT_LIFE;
Nalin Dahyabhai 414f99e
@@ -420,31 +422,70 @@ main (argc, argv)
Nalin Dahyabhai 414f99e
     }
Nalin Dahyabhai 414f99e
 
Nalin Dahyabhai 414f99e
     if (cc_target_tag == NULL) {
Nalin Dahyabhai 414f99e
-
Nalin Dahyabhai 414f99e
         cc_target_tag = (char *)xcalloc(KRB5_SEC_BUFFSIZE ,sizeof(char));
Nalin Dahyabhai 414f99e
-        /* make sure that the new ticket file does not already exist
Nalin Dahyabhai 414f99e
-           This is run as source_uid because it is reasonable to
Nalin Dahyabhai 414f99e
-           require the source user to have write to where the target
Nalin Dahyabhai 414f99e
-           cache will be created.*/
Nalin Dahyabhai 414f99e
-
Nalin Dahyabhai 414f99e
-        do {
Nalin Dahyabhai 414f99e
-            snprintf(cc_target_tag, KRB5_SEC_BUFFSIZE, "%s%ld.%d",
Nalin Dahyabhai 414f99e
-                     KRB5_SECONDARY_CACHE,
Nalin Dahyabhai 414f99e
-                     (long) target_uid, gen_sym());
Nalin Dahyabhai 414f99e
-            cc_target_tag_tmp = strchr(cc_target_tag, ':') + 1;
Nalin Dahyabhai 414f99e
-
Nalin Dahyabhai 414f99e
-        } while (krb5_ccache_name_is_initialized(ksu_context,
Nalin Dahyabhai 414f99e
-                                                 cc_target_tag));
Nalin Dahyabhai 414f99e
-    }
Nalin Dahyabhai 414f99e
-
Nalin Dahyabhai 414f99e
-
Nalin Dahyabhai 414f99e
-    dir_of_cc_target = get_dir_of_file(cc_target_tag_tmp);
Nalin Dahyabhai 414f99e
-
Nalin Dahyabhai 414f99e
-    if (access(dir_of_cc_target, R_OK | W_OK )){
Nalin Dahyabhai 414f99e
-        fprintf(stderr,
Nalin Dahyabhai 414f99e
-                _("%s does not have correct permissions for %s\n"),
Nalin Dahyabhai 414f99e
-                source_user, cc_target_tag);
Nalin Dahyabhai 414f99e
-        exit(1);
Nalin Dahyabhai 414f99e
+        if (cc_target_tag == NULL) {
Nalin Dahyabhai 414f99e
+            com_err(prog_name, retval , _("while allocating memory for the "
Nalin Dahyabhai 414f99e
+                                          "target ccache name"));
Nalin Dahyabhai 414f99e
+            exit(1);
Nalin Dahyabhai 414f99e
+        }
Nalin Dahyabhai 414f99e
+        /* Read the configured value. */
Nalin Dahyabhai 414f99e
+        if (profile_get_string(ksu_context->profile, KRB5_CONF_LIBDEFAULTS,
Nalin Dahyabhai 414f99e
+                               KRB5_CONF_DEFAULT_CCACHE_NAME, NULL,
Nalin Dahyabhai 414f99e
+                               KRB5_DEFAULT_SECONDARY_CACHE,
Nalin Dahyabhai 414f99e
+                               &cc_target_tag_conf)) {
Nalin Dahyabhai 414f99e
+            com_err(prog_name, retval , _("while allocating memory for the "
Nalin Dahyabhai 414f99e
+                                          "target ccache name"));
Nalin Dahyabhai 414f99e
+            exit(1);
Nalin Dahyabhai 414f99e
+        }
Nalin Dahyabhai 414f99e
+        /* Prepend "FILE:" if a cctype wasn't specified in the config. */
Nalin Dahyabhai 414f99e
+        if (strchr(cc_target_tag_conf, ':')) {
Nalin Dahyabhai 414f99e
+            cc_target_tag_tmp = strdup(cc_target_tag_conf);
Nalin Dahyabhai 414f99e
+        } else {
Nalin Dahyabhai 414f99e
+            if (asprintf(&cc_target_tag_tmp, "FILE:%s",
Nalin Dahyabhai 414f99e
+                         cc_target_tag_conf) < 0)
Nalin Dahyabhai 414f99e
+                cc_target_tag_tmp = NULL;
Nalin Dahyabhai 414f99e
+        }
Nalin Dahyabhai 414f99e
+        profile_release_string(cc_target_tag_conf);
Nalin Dahyabhai 414f99e
+        if (cc_target_tag_tmp == NULL) {
Nalin Dahyabhai 414f99e
+            com_err(prog_name, retval , _("while allocating memory for the "
Nalin Dahyabhai 414f99e
+                                          "target ccache name"));
Nalin Dahyabhai 414f99e
+            exit(1);
Nalin Dahyabhai 414f99e
+        }
Nalin Dahyabhai 414f99e
+        /* Resolve parameters in the configured value for the target user. */
Nalin Dahyabhai 414f99e
+        if (asprintf(&target_user_uid_str, "%lu",
Nalin Dahyabhai 414f99e
+                     (unsigned long)target_uid) < 0) {
Nalin Dahyabhai 414f99e
+            com_err(prog_name, retval , _("while allocating memory for the "
Nalin Dahyabhai 414f99e
+                                          "target ccache name"));
Nalin Dahyabhai 414f99e
+            exit(1);
Nalin Dahyabhai 414f99e
+        }
Nalin Dahyabhai 414f99e
+        if (k5_expand_path_tokens_extra(ksu_context,
Nalin Dahyabhai 414f99e
+                                        cc_target_tag_tmp, &cc_target_tag_conf,
Nalin Dahyabhai 414f99e
+                                        "euid", target_user_uid_str,
Nalin Dahyabhai 414f99e
+                                        "uid", target_user_uid_str,
Nalin Dahyabhai 414f99e
+                                        "USERID", target_user_uid_str,
Nalin Dahyabhai 414f99e
+                                        "username", target_user,
Nalin Dahyabhai 414f99e
+                                        NULL) != 0) {
Nalin Dahyabhai 414f99e
+            com_err(prog_name, retval , _("while allocating memory for the "
Nalin Dahyabhai 414f99e
+                                          "target ccache name"));
Nalin Dahyabhai 414f99e
+            exit(1);
Nalin Dahyabhai 414f99e
+        }
Nalin Dahyabhai 414f99e
+        cc_target_tag_tmp[strcspn(cc_target_tag_tmp, ":")] = '\0';
Nalin Dahyabhai 414f99e
+        cc_target_switchable = krb5_cc_support_switch(ksu_context,
Nalin Dahyabhai 414f99e
+                                                      cc_target_tag_tmp);
Nalin Dahyabhai 414f99e
+        free(cc_target_tag_tmp);
Nalin Dahyabhai 414f99e
+        /* Try to avoid destroying a target ccache. */
Nalin Dahyabhai 414f99e
+        if (cc_target_switchable) {
Nalin Dahyabhai 414f99e
+            snprintf(cc_target_tag, KRB5_SEC_BUFFSIZE, "%s",
Nalin Dahyabhai 414f99e
+                     cc_target_tag_conf);
Nalin Dahyabhai 414f99e
+        } else {
Nalin Dahyabhai 414f99e
+            do {
Nalin Dahyabhai 414f99e
+                snprintf(cc_target_tag, KRB5_SEC_BUFFSIZE, "%s.%d",
Nalin Dahyabhai 414f99e
+                         cc_target_tag_conf, gen_sym());
Nalin Dahyabhai 414f99e
+            } while (krb5_ccache_name_is_initialized(ksu_context,
Nalin Dahyabhai 414f99e
+                                                     cc_target_tag));
Nalin Dahyabhai 414f99e
+        }
Nalin Dahyabhai 414f99e
+        cc_target_tag_tmp = strchr(cc_target_tag, ':') + 1;
Nalin Dahyabhai 414f99e
+        krb5_free_string(ksu_context, cc_target_tag_conf);
Nalin Dahyabhai 414f99e
     }
Nalin Dahyabhai 414f99e
 
Nalin Dahyabhai 414f99e
     if (auth_debug){
Nalin Dahyabhai 414f99e
-- 
Nalin Dahyabhai 414f99e
1.8.5.3
Nalin Dahyabhai 414f99e