version 1.46, 2001/10/02 08:38:50 |
version 1.46.2.1, 2002/03/07 17:37:47 |
|
|
/* argv0 */ |
/* argv0 */ |
extern char *__progname; |
extern char *__progname; |
|
|
|
/* Default files to add */ |
|
static char *default_files[] = { |
|
_PATH_SSH_CLIENT_ID_RSA, |
|
_PATH_SSH_CLIENT_ID_DSA, |
|
_PATH_SSH_CLIENT_IDENTITY, |
|
NULL |
|
}; |
|
|
|
|
/* we keep a cache of one passphrases */ |
/* we keep a cache of one passphrases */ |
static char *pass = NULL; |
static char *pass = NULL; |
static void |
static void |
|
|
|
|
key_free(public); |
key_free(public); |
xfree(comment); |
xfree(comment); |
|
|
return ret; |
return ret; |
} |
} |
|
|
|
|
|
|
xfree(comment); |
xfree(comment); |
key_free(private); |
key_free(private); |
|
|
return ret; |
return ret; |
} |
} |
|
|
|
|
{ |
{ |
if (ssh_update_card(ac, add, id)) { |
if (ssh_update_card(ac, add, id)) { |
fprintf(stderr, "Card %s: %s\n", |
fprintf(stderr, "Card %s: %s\n", |
add ? "added" : "removed", id); |
add ? "added" : "removed", id); |
return 0; |
return 0; |
} else { |
} else { |
fprintf(stderr, "Could not %s card: %s\n", |
fprintf(stderr, "Could not %s card: %s\n", |
add ? "add" : "remove", id); |
add ? "add" : "remove", id); |
return -1; |
return -1; |
} |
} |
} |
} |
|
|
static void |
static int |
list_identities(AuthenticationConnection *ac, int do_fp) |
list_identities(AuthenticationConnection *ac, int do_fp) |
{ |
{ |
Key *key; |
Key *key; |
|
|
|
|
for (version = 1; version <= 2; version++) { |
for (version = 1; version <= 2; version++) { |
for (key = ssh_get_first_identity(ac, &comment, version); |
for (key = ssh_get_first_identity(ac, &comment, version); |
key != NULL; |
key != NULL; |
key = ssh_get_next_identity(ac, &comment, version)) { |
key = ssh_get_next_identity(ac, &comment, version)) { |
had_identities = 1; |
had_identities = 1; |
if (do_fp) { |
if (do_fp) { |
fp = key_fingerprint(key, SSH_FP_MD5, |
fp = key_fingerprint(key, SSH_FP_MD5, |
|
|
xfree(comment); |
xfree(comment); |
} |
} |
} |
} |
if (!had_identities) |
if (!had_identities) { |
printf("The agent has no identities.\n"); |
printf("The agent has no identities.\n"); |
|
return -1; |
|
} |
|
return 0; |
} |
} |
|
|
|
static int |
|
do_file(AuthenticationConnection *ac, int deleting, char *file) |
|
{ |
|
if (deleting) { |
|
if (delete_file(ac, file) == -1) |
|
return -1; |
|
} else { |
|
if (add_file(ac, file) == -1) |
|
return -1; |
|
} |
|
return 0; |
|
} |
|
|
static void |
static void |
usage(void) |
usage(void) |
{ |
{ |
|
|
extern char *optarg; |
extern char *optarg; |
extern int optind; |
extern int optind; |
AuthenticationConnection *ac = NULL; |
AuthenticationConnection *ac = NULL; |
struct passwd *pw; |
|
char buf[1024]; |
|
char *sc_reader_id = NULL; |
char *sc_reader_id = NULL; |
int i, ch, deleting = 0, ret = 0; |
int i, ch, deleting = 0, ret = 0; |
|
|
|
|
ac = ssh_get_authentication_connection(); |
ac = ssh_get_authentication_connection(); |
if (ac == NULL) { |
if (ac == NULL) { |
fprintf(stderr, "Could not open a connection to your authentication agent.\n"); |
fprintf(stderr, "Could not open a connection to your authentication agent.\n"); |
exit(1); |
exit(2); |
} |
} |
while ((ch = getopt(argc, argv, "lLdDe:s:")) != -1) { |
while ((ch = getopt(argc, argv, "lLdDe:s:")) != -1) { |
switch (ch) { |
switch (ch) { |
case 'l': |
case 'l': |
case 'L': |
case 'L': |
list_identities(ac, ch == 'l' ? 1 : 0); |
if (list_identities(ac, ch == 'l' ? 1 : 0) == -1) |
|
ret = 1; |
goto done; |
goto done; |
break; |
break; |
case 'd': |
case 'd': |
|
|
sc_reader_id = optarg; |
sc_reader_id = optarg; |
break; |
break; |
case 'e': |
case 'e': |
deleting = 1; |
deleting = 1; |
sc_reader_id = optarg; |
sc_reader_id = optarg; |
break; |
break; |
default: |
default: |
|
|
goto done; |
goto done; |
} |
} |
if (argc == 0) { |
if (argc == 0) { |
pw = getpwuid(getuid()); |
char buf[MAXPATHLEN]; |
if (!pw) { |
struct passwd *pw; |
|
|
|
if ((pw = getpwuid(getuid())) == NULL) { |
fprintf(stderr, "No user found with uid %u\n", |
fprintf(stderr, "No user found with uid %u\n", |
(u_int)getuid()); |
(u_int)getuid()); |
ret = 1; |
ret = 1; |
goto done; |
goto done; |
} |
} |
snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, _PATH_SSH_CLIENT_IDENTITY); |
|
if (deleting) { |
for(i = 0; default_files[i]; i++) { |
if (delete_file(ac, buf) == -1) |
snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir, |
|
default_files[i]); |
|
if (do_file(ac, deleting, buf) == -1) |
ret = 1; |
ret = 1; |
} else { |
|
if (add_file(ac, buf) == -1) |
|
ret = 1; |
|
} |
} |
} else { |
} else { |
for (i = 0; i < argc; i++) { |
for(i = 0; i < argc; i++) { |
if (deleting) { |
if (do_file(ac, deleting, argv[i]) == -1) |
if (delete_file(ac, argv[i]) == -1) |
ret = 1; |
ret = 1; |
|
} else { |
|
if (add_file(ac, argv[i]) == -1) |
|
ret = 1; |
|
} |
|
} |
} |
} |
} |
clear_pass(); |
clear_pass(); |