sq cli_credentials_ccache_update_principal
[metze/samba/wip.git] / auth / credentials / credentials_krb5.c
index 46a7b05fe682ada1f3435bb9ea6cfa0ca7de65a8..8057aac4b2807e8f95b76f2e0c9231c353273f01 100644 (file)
@@ -402,6 +402,76 @@ _PUBLIC_ bool cli_credentials_ccache_reinit(struct cli_credentials *cred,
        return ok;
 }
 
+/**
+ * @brief Get the credential cache containter
+ *
+ * @param[in]  cred     The cli_credentials to get the ccache from.
+ *
+ * @return A pointer to the credential cache containter or NULL on error.
+ */
+_PUBLIC_ struct ccache_container *cli_credentials_ccache_get(struct cli_credentials *cred)
+{
+       return cred->krb5_ccache;
+}
+
+_PUBLIC_ bool cli_credentials_ccache_update_principal(struct cli_credentials *creds)
+{
+       krb5_context context;
+       struct ccache_container *ccc = cli_credentials_ccache_get(creds);
+       krb5_principal cc_principal = NULL;
+       krb5_error_code code;
+       char *principal;
+       char *realm;
+       bool ok;
+
+       if (ccc == NULL) {
+               return false;
+       }
+       context = ccc->smb_krb5_context->krb5_context;
+
+       code = krb5_cc_get_principal(context,
+                                    ccc->ccache,
+                                    &cc_principal);
+       if (code != 0) {
+               switch (code) {
+               /* Empty cache */
+               case KRB5_CC_NOTFOUND:
+               case KRB5_FCC_NOFILE:
+                       return true;
+               }
+               return false;
+       }
+
+       code = smb_krb5_unparse_name(creds,
+                                    context,
+                                    cc_principal,
+                                    &principal);
+       if (code != 0) {
+               return false;
+       }
+
+       ok = cli_credentials_set_principal(creds,
+                                          principal,
+                                          CRED_SPECIFIED);
+       TALLOC_FREE(principal);
+       if (!ok) {
+               krb5_free_principal(context, cc_principal);
+               return ok;
+       }
+
+       realm = smb_krb5_principal_get_realm(context, cc_principal);
+       krb5_free_principal(context, cc_principal);
+       if (realm == NULL) {
+               return false;
+       }
+       ok = cli_credentials_set_realm(creds,
+                                      realm,
+                                      CRED_SPECIFIED);
+       SAFE_FREE(realm);
+
+       return ok;
+}
+
 static int cli_credentials_set_from_ccache(struct cli_credentials *cred, 
                                           struct ccache_container *ccache,
                                           enum credentials_obtained obtained,