default to forwardable, use keychain password, handle krb5_cc_switch
This commit is contained in:
@@ -3,6 +3,8 @@
|
|||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
* Portions Copyright (c) 2009 Apple Inc. All rights reserved.
|
||||||
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
* are met:
|
* are met:
|
||||||
@@ -33,6 +35,10 @@
|
|||||||
|
|
||||||
#include "kuser_locl.h"
|
#include "kuser_locl.h"
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <Security/Security.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef HEIMDAL_SMALLER
|
#ifndef HEIMDAL_SMALLER
|
||||||
#include "krb5-v4compat.h"
|
#include "krb5-v4compat.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -113,7 +119,7 @@ static struct getargs args[] = {
|
|||||||
{ "cache", 'c', arg_string, &cred_cache,
|
{ "cache", 'c', arg_string, &cred_cache,
|
||||||
NP_("credentials cache", ""), "cachename" },
|
NP_("credentials cache", ""), "cachename" },
|
||||||
|
|
||||||
{ "forwardable", 'f', arg_flag, &forwardable_flag,
|
{ "forwardable", 'f', arg_negative_flag, &forwardable_flag,
|
||||||
NP_("get forwardable tickets", "")},
|
NP_("get forwardable tickets", "")},
|
||||||
|
|
||||||
{ "keytab", 't', arg_string, &keytab_str,
|
{ "keytab", 't', arg_string, &keytab_str,
|
||||||
@@ -422,7 +428,7 @@ get_new_tickets(krb5_context context,
|
|||||||
char passwd[256];
|
char passwd[256];
|
||||||
krb5_deltat start_time = 0;
|
krb5_deltat start_time = 0;
|
||||||
krb5_deltat renew = 0;
|
krb5_deltat renew = 0;
|
||||||
const char *renewstr = NULL;
|
char *renewstr = NULL;
|
||||||
krb5_enctype *enctype = NULL;
|
krb5_enctype *enctype = NULL;
|
||||||
krb5_ccache tempccache;
|
krb5_ccache tempccache;
|
||||||
#ifndef NO_NTLM
|
#ifndef NO_NTLM
|
||||||
@@ -451,6 +457,33 @@ get_new_tickets(krb5_context context,
|
|||||||
passwd[strcspn(passwd, "\n")] = '\0';
|
passwd[strcspn(passwd, "\n")] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
if (passwd[0] == '\0') {
|
||||||
|
const char *realm;
|
||||||
|
OSStatus osret;
|
||||||
|
UInt32 length;
|
||||||
|
void *buffer;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
realm = krb5_principal_get_realm(context, principal);
|
||||||
|
|
||||||
|
ret = krb5_unparse_name_flags(context, principal,
|
||||||
|
KRB5_PRINCIPAL_UNPARSE_NO_REALM, &name);
|
||||||
|
if (ret)
|
||||||
|
goto nopassword;
|
||||||
|
|
||||||
|
osret = SecKeychainFindGenericPassword(NULL, strlen(realm), realm,
|
||||||
|
strlen(name), name,
|
||||||
|
&length, &buffer, NULL);
|
||||||
|
free(name);
|
||||||
|
if (osret == noErr && length < sizeof(passwd) - 1) {
|
||||||
|
memcpy(passwd, buffer, length);
|
||||||
|
passwd[length] = '\0';
|
||||||
|
}
|
||||||
|
nopassword:
|
||||||
|
do { } while(0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
memset(&cred, 0, sizeof(cred));
|
memset(&cred, 0, sizeof(cred));
|
||||||
|
|
||||||
@@ -472,7 +505,7 @@ get_new_tickets(krb5_context context,
|
|||||||
pac_flag ? TRUE : FALSE);
|
pac_flag ? TRUE : FALSE);
|
||||||
if (canonicalize_flag)
|
if (canonicalize_flag)
|
||||||
krb5_get_init_creds_opt_set_canonicalize(context, opt, TRUE);
|
krb5_get_init_creds_opt_set_canonicalize(context, opt, TRUE);
|
||||||
if (pk_enterprise_flag && windows_flag)
|
if ((pk_enterprise_flag || enterprise_flag || canonicalize_flag) && windows_flag)
|
||||||
krb5_get_init_creds_opt_set_win2k(context, opt, TRUE);
|
krb5_get_init_creds_opt_set_win2k(context, opt, TRUE);
|
||||||
if (pk_user_id || ent_user_id || anonymous_flag) {
|
if (pk_user_id || ent_user_id || anonymous_flag) {
|
||||||
ret = krb5_get_init_creds_opt_set_pkinit(context, opt,
|
ret = krb5_get_init_creds_opt_set_pkinit(context, opt,
|
||||||
@@ -881,8 +914,23 @@ main (int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
ret = krb5_cc_cache_match(context, principal, &ccache);
|
ret = krb5_cc_cache_match(context, principal, &ccache);
|
||||||
if (ret)
|
if (ret) {
|
||||||
|
const char *type;
|
||||||
ret = krb5_cc_default (context, &ccache);
|
ret = krb5_cc_default (context, &ccache);
|
||||||
|
if (ret)
|
||||||
|
krb5_err (context, 1, ret, N_("resolving credentials cache", ""));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if the type support switching, and we do,
|
||||||
|
* then do that instead over overwriting the current
|
||||||
|
* default credential
|
||||||
|
*/
|
||||||
|
type = krb5_cc_get_type(context, ccache);
|
||||||
|
if (krb5_cc_support_switch(context, type)) {
|
||||||
|
krb5_cc_close(context, ccache);
|
||||||
|
ret = krb5_cc_new_unique(context, type, NULL, &ccache);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ret)
|
if (ret)
|
||||||
|
Reference in New Issue
Block a user