switch kswitch to kcc
This commit is contained in:
@@ -15,7 +15,7 @@ man_MANS = \
|
|||||||
kgetcred.1 \
|
kgetcred.1 \
|
||||||
kimpersonate.8
|
kimpersonate.8
|
||||||
|
|
||||||
bin_PROGRAMS = kinit kdestroy kgetcred kswitch kcc
|
bin_PROGRAMS = kinit kdestroy kgetcred kcc
|
||||||
libexec_PROGRAMS = kdigest kimpersonate
|
libexec_PROGRAMS = kdigest kimpersonate
|
||||||
|
|
||||||
noinst_PROGRAMS = kverify kdecode_ticket generate-requests copy_cred_cache
|
noinst_PROGRAMS = kverify kdecode_ticket generate-requests copy_cred_cache
|
||||||
@@ -33,13 +33,11 @@ kdestroy_LDADD = $(kinit_LDADD)
|
|||||||
|
|
||||||
kimpersonate_LDADD = $(kinit_LDADD)
|
kimpersonate_LDADD = $(kinit_LDADD)
|
||||||
|
|
||||||
kswitch_LDADD = $(kinit_LDADD) $(LIB_readline)
|
|
||||||
|
|
||||||
kcc_LDADD = \
|
kcc_LDADD = \
|
||||||
$(top_builddir)/lib/sl/libsl.la \
|
$(top_builddir)/lib/sl/libsl.la \
|
||||||
$(kinit_LDADD)
|
$(kinit_LDADD)
|
||||||
|
|
||||||
dist_kcc_SOURCES = kcc.c klist.c
|
dist_kcc_SOURCES = kcc.c klist.c kswitch.c
|
||||||
nodist_kcc_SOURCES = kcc-commands.c
|
nodist_kcc_SOURCES = kcc-commands.c
|
||||||
|
|
||||||
$(kcc_OBJECTS): kcc-commands.h
|
$(kcc_OBJECTS): kcc-commands.h
|
||||||
@@ -79,4 +77,5 @@ EXTRA_DIST = $(man_MANS) \
|
|||||||
# make sure install-exec-hook doesn't have any commands in Makefile.am.common
|
# make sure install-exec-hook doesn't have any commands in Makefile.am.common
|
||||||
install-exec-hook:
|
install-exec-hook:
|
||||||
(cd $(DESTDIR)$(bindir) && rm -f klist && $(LN_S) kcc klist)
|
(cd $(DESTDIR)$(bindir) && rm -f klist && $(LN_S) kcc klist)
|
||||||
|
(cd $(DESTDIR)$(bindir) && rm -f kswitch && $(LN_S) kcc kswitch)
|
||||||
|
|
||||||
|
@@ -123,6 +123,35 @@ command = {
|
|||||||
help = "Credentials cache"
|
help = "Credentials cache"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
command = {
|
||||||
|
name = "kswitch"
|
||||||
|
name = "switch"
|
||||||
|
help = "Switch default kerberos cache"
|
||||||
|
option = {
|
||||||
|
long = "type"
|
||||||
|
short = "t"
|
||||||
|
type = "string"
|
||||||
|
help = "type of credential cache"
|
||||||
|
}
|
||||||
|
option = {
|
||||||
|
long = "cache"
|
||||||
|
short = "c"
|
||||||
|
type = "string"
|
||||||
|
help = "name of credential cache"
|
||||||
|
}
|
||||||
|
option = {
|
||||||
|
long = "principal"
|
||||||
|
short = "p"
|
||||||
|
type = "string"
|
||||||
|
help = "name of principal"
|
||||||
|
}
|
||||||
|
option = {
|
||||||
|
long = "interactive"
|
||||||
|
short = "i"
|
||||||
|
type = "flag"
|
||||||
|
help = "interactive selection"
|
||||||
|
}
|
||||||
|
};
|
||||||
command = {
|
command = {
|
||||||
name = "kvno"
|
name = "kvno"
|
||||||
help = "Acquire a Kerberos ticket"
|
help = "Acquire a Kerberos ticket"
|
||||||
|
@@ -89,7 +89,7 @@ static int
|
|||||||
command_alias(const char *name)
|
command_alias(const char *name)
|
||||||
{
|
{
|
||||||
const char *aliases[] = {
|
const char *aliases[] = {
|
||||||
"kinit", "klist", "kgetcred", "kdeltkt",
|
"kinit", "klist", "kswitch", "kgetcred", "kvno", "kdeltkt",
|
||||||
"kdestroy", "kcpytkt", NULL
|
"kdestroy", "kcpytkt", NULL
|
||||||
}, **p = aliases;
|
}, **p = aliases;
|
||||||
|
|
||||||
|
140
kuser/kswitch.c
140
kuser/kswitch.c
@@ -32,6 +32,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "kuser_locl.h"
|
#include "kuser_locl.h"
|
||||||
|
#include "kcc-commands.h"
|
||||||
|
|
||||||
#ifdef HAVE_READLINE
|
#ifdef HAVE_READLINE
|
||||||
char *readline(char *prompt);
|
char *readline(char *prompt);
|
||||||
@@ -41,105 +42,43 @@ char *readline(char *prompt);
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int version_flag = 0;
|
|
||||||
static int help_flag = 0;
|
|
||||||
static char *cache;
|
|
||||||
static char *principal;
|
|
||||||
static char *type;
|
|
||||||
static int interactive_flag;
|
|
||||||
|
|
||||||
static struct getargs args[] = {
|
|
||||||
{ "type", 't', arg_string, &type,
|
|
||||||
NP_("type of credential cache", ""), "type" },
|
|
||||||
{ "cache", 'c', arg_string, &cache,
|
|
||||||
NP_("name of credential cache", ""), "cache" },
|
|
||||||
{ "principal", 'p', arg_string, &principal,
|
|
||||||
NP_("name of principal", ""), "principal" },
|
|
||||||
{ "interactive", 'i', arg_flag, &interactive_flag,
|
|
||||||
NP_("interactive selection", ""), NULL },
|
|
||||||
{ "version", 0, arg_flag, &version_flag,
|
|
||||||
NP_("print version", ""), NULL },
|
|
||||||
{ "help", 0, arg_flag, &help_flag, NULL, NULL}
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage (int ret) __attribute__((noreturn));
|
|
||||||
|
|
||||||
static void
|
|
||||||
usage (int ret)
|
|
||||||
{
|
|
||||||
arg_printusage (args, sizeof(args)/sizeof(*args), NULL, "");
|
|
||||||
exit (ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
kswitch(struct kswitch_options *opt, int argc, char **argv)
|
||||||
{
|
{
|
||||||
krb5_context context;
|
|
||||||
krb5_error_code ret;
|
krb5_error_code ret;
|
||||||
krb5_ccache id = NULL;
|
krb5_ccache id = NULL;
|
||||||
int optidx = 0;
|
|
||||||
|
|
||||||
setprogname (argv[0]);
|
if (opt->cache_string && opt->principal_string)
|
||||||
|
krb5_errx(kcc_context, 1,
|
||||||
setlocale (LC_ALL, "");
|
|
||||||
bindtextdomain ("heimdal_kuser", HEIMDAL_LOCALEDIR);
|
|
||||||
textdomain("heimdal_kuser");
|
|
||||||
|
|
||||||
ret = krb5_init_context (&context);
|
|
||||||
if (ret == KRB5_CONFIG_BADFORMAT)
|
|
||||||
errx (1, "krb5_init_context failed to parse configuration file");
|
|
||||||
else if (ret)
|
|
||||||
errx(1, "krb5_init_context failed: %d", ret);
|
|
||||||
|
|
||||||
if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
|
|
||||||
usage(1);
|
|
||||||
|
|
||||||
if (help_flag)
|
|
||||||
usage (0);
|
|
||||||
|
|
||||||
if(version_flag){
|
|
||||||
print_version(NULL);
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
argc -= optidx;
|
|
||||||
argv += optidx;
|
|
||||||
|
|
||||||
if (argc != 0)
|
|
||||||
usage (1);
|
|
||||||
|
|
||||||
if (cache && principal)
|
|
||||||
krb5_errx(context, 1,
|
|
||||||
N_("Both --cache and --principal given, choose one", ""));
|
N_("Both --cache and --principal given, choose one", ""));
|
||||||
|
|
||||||
if (interactive_flag) {
|
if (opt->interactive_flag) {
|
||||||
krb5_cc_cache_cursor cursor;
|
krb5_cc_cache_cursor cursor;
|
||||||
krb5_ccache *ids;
|
krb5_ccache *ids = NULL;
|
||||||
size_t i, len = 0;
|
size_t i, len = 0;
|
||||||
char *name;
|
char *name;
|
||||||
rtbl_t ct;
|
rtbl_t ct;
|
||||||
|
|
||||||
ct = rtbl_create();
|
ct = rtbl_create();
|
||||||
|
|
||||||
rtbl_add_column (ct, "", 0);
|
rtbl_add_column(ct, "", 0);
|
||||||
rtbl_add_column (ct, "Principal", 0);
|
rtbl_add_column(ct, "Principal", 0);
|
||||||
rtbl_set_column_prefix(ct, "Principal", " ");
|
rtbl_set_column_prefix(ct, "Principal", " ");
|
||||||
|
|
||||||
ret = krb5_cc_cache_get_first (context, NULL, &cursor);
|
ret = krb5_cc_cache_get_first(kcc_context, NULL, &cursor);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_cc_cache_get_first");
|
krb5_err(kcc_context, 1, ret, "krb5_cc_cache_get_first");
|
||||||
|
|
||||||
while (krb5_cc_cache_next (context, cursor, &id) == 0) {
|
while (krb5_cc_cache_next(kcc_context, cursor, &id) == 0) {
|
||||||
krb5_principal p;
|
krb5_principal p;
|
||||||
char num[10];
|
char num[10];
|
||||||
|
|
||||||
ret = krb5_cc_get_principal(context, id, &p);
|
ret = krb5_cc_get_principal(kcc_context, id, &p);
|
||||||
if (ret)
|
if (ret)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ret = krb5_unparse_name(context, p, &name);
|
ret = krb5_unparse_name(kcc_context, p, &name);
|
||||||
krb5_free_principal(context, p);
|
krb5_free_principal(kcc_context, p);
|
||||||
|
|
||||||
snprintf(num, sizeof(num), "%d", (int)(len + 1));
|
snprintf(num, sizeof(num), "%d", (int)(len + 1));
|
||||||
rtbl_add_column_entry(ct, "", num);
|
rtbl_add_column_entry(ct, "", num);
|
||||||
@@ -150,7 +89,7 @@ main (int argc, char **argv)
|
|||||||
ids[len] = id;
|
ids[len] = id;
|
||||||
len++;
|
len++;
|
||||||
}
|
}
|
||||||
krb5_cc_cache_end_seq_get(context, cursor);
|
krb5_cc_cache_end_seq_get(kcc_context, cursor);
|
||||||
|
|
||||||
rtbl_format(ct, stdout);
|
rtbl_format(ct, stdout);
|
||||||
rtbl_destroy(ct);
|
rtbl_destroy(ct);
|
||||||
@@ -159,57 +98,58 @@ main (int argc, char **argv)
|
|||||||
if (name) {
|
if (name) {
|
||||||
i = atoi(name);
|
i = atoi(name);
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
krb5_errx(context, 1, "Cache number '%s' is invalid", name);
|
krb5_errx(kcc_context, 1, "Cache number '%s' is invalid", name);
|
||||||
if (i > len)
|
if (i > len)
|
||||||
krb5_errx(context, 1, "Cache number '%s' is too large", name);
|
krb5_errx(kcc_context, 1, "Cache number '%s' is too large", name);
|
||||||
|
|
||||||
id = ids[i - 1];
|
id = ids[i - 1];
|
||||||
ids[i - 1] = NULL;
|
ids[i - 1] = NULL;
|
||||||
} else
|
} else
|
||||||
krb5_errx(context, 1, "No cache selected");
|
krb5_errx(kcc_context, 1, "No cache selected");
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
if (ids[i])
|
if (ids[i])
|
||||||
krb5_cc_close(context, ids[i]);
|
krb5_cc_close(kcc_context, ids[i]);
|
||||||
|
|
||||||
} else if (principal) {
|
} else if (opt->principal_string) {
|
||||||
krb5_principal p;
|
krb5_principal p;
|
||||||
|
|
||||||
ret = krb5_parse_name(context, principal, &p);
|
ret = krb5_parse_name(kcc_context, opt->principal_string, &p);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_parse_name: %s", principal);
|
krb5_err(kcc_context, 1, ret, "krb5_parse_name: %s",
|
||||||
|
opt->principal_string);
|
||||||
|
|
||||||
ret = krb5_cc_cache_match(context, p, &id);
|
ret = krb5_cc_cache_match(kcc_context, p, &id);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret,
|
krb5_err(kcc_context, 1, ret,
|
||||||
N_("Did not find principal: %s", ""), principal);
|
N_("Did not find principal: %s", ""),
|
||||||
|
opt->principal_string);
|
||||||
|
|
||||||
krb5_free_principal(context, p);
|
krb5_free_principal(kcc_context, p);
|
||||||
|
|
||||||
} else if (cache) {
|
} else if (opt->cache_string) {
|
||||||
const krb5_cc_ops *ops;
|
const krb5_cc_ops *ops;
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
ops = krb5_cc_get_prefix_ops(context, type);
|
ops = krb5_cc_get_prefix_ops(kcc_context, opt->type_string);
|
||||||
if (ops == NULL)
|
if (ops == NULL)
|
||||||
krb5_err (context, 1, 0, "krb5_cc_get_prefix_ops");
|
krb5_err(kcc_context, 1, 0, "krb5_cc_get_prefix_ops");
|
||||||
|
|
||||||
asprintf(&str, "%s:%s", ops->prefix, cache);
|
asprintf(&str, "%s:%s", ops->prefix, opt->cache_string);
|
||||||
if (str == NULL)
|
if (str == NULL)
|
||||||
krb5_errx(context, 1, N_("out of memory", ""));
|
krb5_errx(kcc_context, 1, N_("out of memory", ""));
|
||||||
|
|
||||||
ret = krb5_cc_resolve(context, str, &id);
|
ret = krb5_cc_resolve(kcc_context, str, &id);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_cc_resolve: %s", str);
|
krb5_err(kcc_context, 1, ret, "krb5_cc_resolve: %s", str);
|
||||||
|
|
||||||
free(str);
|
free(str);
|
||||||
} else
|
} else {
|
||||||
usage(1);
|
krb5_errx(kcc_context, 1, "missing option for kswitch");
|
||||||
|
}
|
||||||
|
|
||||||
ret = krb5_cc_switch(context, id);
|
ret = krb5_cc_switch(kcc_context, id);
|
||||||
if (ret)
|
if (ret)
|
||||||
krb5_err (context, 1, ret, "krb5_cc_switch");
|
krb5_err(kcc_context, 1, ret, "krb5_cc_switch");
|
||||||
|
|
||||||
krb5_cc_close(context, id);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -27,7 +27,7 @@ kinit="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kinit"
|
|||||||
klist="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kcc klist"
|
klist="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kcc klist"
|
||||||
kpasswd="${TESTS_ENVIRONMENT} ${top_builddir}/kpasswd/kpasswd"
|
kpasswd="${TESTS_ENVIRONMENT} ${top_builddir}/kpasswd/kpasswd"
|
||||||
kpasswdd="${TESTS_ENVIRONMENT} ${top_builddir}/kpasswd/kpasswdd"
|
kpasswdd="${TESTS_ENVIRONMENT} ${top_builddir}/kpasswd/kpasswdd"
|
||||||
kswitch="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kswitch"
|
kswitch="${TESTS_ENVIRONMENT} ${top_builddir}/kuser/kcc kswitch"
|
||||||
ktutil="${TESTS_ENVIRONMENT} ${top_builddir}/admin/ktutil"
|
ktutil="${TESTS_ENVIRONMENT} ${top_builddir}/admin/ktutil"
|
||||||
|
|
||||||
# regression test tools
|
# regression test tools
|
||||||
|
Reference in New Issue
Block a user