version 1.45, 2001/08/03 10:31:30 |
version 1.46, 2001/10/02 08:38:50 |
|
|
} |
} |
} |
} |
|
|
static void |
static int |
delete_file(AuthenticationConnection *ac, const char *filename) |
delete_file(AuthenticationConnection *ac, const char *filename) |
{ |
{ |
Key *public; |
Key *public; |
char *comment = NULL; |
char *comment = NULL; |
|
int ret = -1; |
|
|
public = key_load_public(filename, &comment); |
public = key_load_public(filename, &comment); |
if (public == NULL) { |
if (public == NULL) { |
printf("Bad key file %s\n", filename); |
printf("Bad key file %s\n", filename); |
return; |
return -1; |
} |
} |
if (ssh_remove_identity(ac, public)) |
if (ssh_remove_identity(ac, public)) { |
fprintf(stderr, "Identity removed: %s (%s)\n", filename, comment); |
fprintf(stderr, "Identity removed: %s (%s)\n", filename, comment); |
else |
ret = 0; |
|
} else |
fprintf(stderr, "Could not remove identity: %s\n", filename); |
fprintf(stderr, "Could not remove identity: %s\n", filename); |
|
|
key_free(public); |
key_free(public); |
xfree(comment); |
xfree(comment); |
|
|
|
return ret; |
} |
} |
|
|
/* Send a request to remove all identities. */ |
/* Send a request to remove all identities. */ |
static void |
static int |
delete_all(AuthenticationConnection *ac) |
delete_all(AuthenticationConnection *ac) |
{ |
{ |
int success = 1; |
int ret = -1; |
|
|
if (!ssh_remove_all_identities(ac, 1)) |
if (ssh_remove_all_identities(ac, 1)) |
success = 0; |
ret = 0; |
/* ignore error-code for ssh2 */ |
/* ignore error-code for ssh2 */ |
ssh_remove_all_identities(ac, 2); |
ssh_remove_all_identities(ac, 2); |
|
|
if (success) |
if (ret == 0) |
fprintf(stderr, "All identities removed.\n"); |
fprintf(stderr, "All identities removed.\n"); |
else |
else |
fprintf(stderr, "Failed to remove all identities.\n"); |
fprintf(stderr, "Failed to remove all identities.\n"); |
|
|
|
return ret; |
} |
} |
|
|
static void |
static int |
add_file(AuthenticationConnection *ac, const char *filename) |
add_file(AuthenticationConnection *ac, const char *filename) |
{ |
{ |
struct stat st; |
struct stat st; |
Key *private; |
Key *private; |
char *comment = NULL; |
char *comment = NULL; |
char msg[1024]; |
char msg[1024]; |
|
int ret = -1; |
|
|
if (stat(filename, &st) < 0) { |
if (stat(filename, &st) < 0) { |
perror(filename); |
perror(filename); |
exit(1); |
return -1; |
} |
} |
/* At first, try empty passphrase */ |
/* At first, try empty passphrase */ |
private = key_load_private(filename, "", &comment); |
private = key_load_private(filename, "", &comment); |
|
|
if (strcmp(pass, "") == 0) { |
if (strcmp(pass, "") == 0) { |
clear_pass(); |
clear_pass(); |
xfree(comment); |
xfree(comment); |
return; |
return -1; |
} |
} |
private = key_load_private(filename, pass, &comment); |
private = key_load_private(filename, pass, &comment); |
if (private != NULL) |
if (private != NULL) |
|
|
strlcpy(msg, "Bad passphrase, try again: ", sizeof msg); |
strlcpy(msg, "Bad passphrase, try again: ", sizeof msg); |
} |
} |
} |
} |
if (ssh_add_identity(ac, private, comment)) |
if (ssh_add_identity(ac, private, comment)) { |
fprintf(stderr, "Identity added: %s (%s)\n", filename, comment); |
fprintf(stderr, "Identity added: %s (%s)\n", filename, comment); |
else |
ret = 0; |
|
} else |
fprintf(stderr, "Could not add identity: %s\n", filename); |
fprintf(stderr, "Could not add identity: %s\n", filename); |
|
|
xfree(comment); |
xfree(comment); |
key_free(private); |
key_free(private); |
|
|
|
return ret; |
} |
} |
|
|
static void |
static int |
update_card(AuthenticationConnection *ac, int add, const char *id) |
update_card(AuthenticationConnection *ac, int add, const char *id) |
{ |
{ |
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); |
else |
return 0; |
|
} 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; |
|
} |
} |
} |
|
|
static void |
static void |
|
|
struct passwd *pw; |
struct passwd *pw; |
char buf[1024]; |
char buf[1024]; |
char *sc_reader_id = NULL; |
char *sc_reader_id = NULL; |
int i, ch, deleting = 0; |
int i, ch, deleting = 0, ret = 0; |
|
|
SSLeay_add_all_algorithms(); |
SSLeay_add_all_algorithms(); |
|
|
|
|
deleting = 1; |
deleting = 1; |
break; |
break; |
case 'D': |
case 'D': |
delete_all(ac); |
if (delete_all(ac) == -1) |
|
ret = 1; |
goto done; |
goto done; |
break; |
break; |
case 's': |
case 's': |
|
|
break; |
break; |
default: |
default: |
usage(); |
usage(); |
exit(1); |
ret = 1; |
break; |
goto done; |
} |
} |
} |
} |
argc -= optind; |
argc -= optind; |
argv += optind; |
argv += optind; |
if (sc_reader_id != NULL) { |
if (sc_reader_id != NULL) { |
update_card(ac, !deleting, sc_reader_id); |
if (update_card(ac, !deleting, sc_reader_id) == -1) |
|
ret = 1; |
goto done; |
goto done; |
} |
} |
if (argc == 0) { |
if (argc == 0) { |
|
|
if (!pw) { |
if (!pw) { |
fprintf(stderr, "No user found with uid %u\n", |
fprintf(stderr, "No user found with uid %u\n", |
(u_int)getuid()); |
(u_int)getuid()); |
ssh_close_authentication_connection(ac); |
ret = 1; |
exit(1); |
goto done; |
} |
} |
snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, _PATH_SSH_CLIENT_IDENTITY); |
snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, _PATH_SSH_CLIENT_IDENTITY); |
if (deleting) |
if (deleting) { |
delete_file(ac, buf); |
if (delete_file(ac, buf) == -1) |
else |
ret = 1; |
add_file(ac, buf); |
} 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 (deleting) { |
delete_file(ac, argv[i]); |
if (delete_file(ac, argv[i]) == -1) |
else |
ret = 1; |
add_file(ac, argv[i]); |
} else { |
|
if (add_file(ac, argv[i]) == -1) |
|
ret = 1; |
|
} |
} |
} |
} |
} |
clear_pass(); |
clear_pass(); |
|
|
done: |
done: |
ssh_close_authentication_connection(ac); |
ssh_close_authentication_connection(ac); |
exit(0); |
return ret; |
} |
} |