]> andersk Git - openssh.git/blobdiff - ssh-add.c
- markus@cvs.openbsd.org 2002/03/25 09:21:13
[openssh.git] / ssh-add.c
index 979164cae60e62aba8796b28bd7fa7fe192d3141..d24d761a8db1980fb7c27eee06cb5d52567de2ec 100644 (file)
--- a/ssh-add.c
+++ b/ssh-add.c
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: ssh-add.c,v 1.45 2001/08/03 10:31:30 jakob Exp $");
+RCSID("$OpenBSD: ssh-add.c,v 1.53 2002/03/21 22:44:05 rees Exp $");
 
 #include <openssl/evp.h>
 
@@ -58,6 +58,15 @@ char *__progname;
 /* argv0 */
 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 */
 static char *pass = NULL;
 static void
@@ -70,53 +79,61 @@ clear_pass(void)
        }
 }
 
-static void
+static int
 delete_file(AuthenticationConnection *ac, const char *filename)
 {
        Key *public;
        char *comment = NULL;
+       int ret = -1;
 
        public = key_load_public(filename, &comment);
        if (public == NULL) {
                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);
-       else
+               ret = 0;
+       } else
                fprintf(stderr, "Could not remove identity: %s\n", filename);
+
        key_free(public);
        xfree(comment);
+
+       return ret;
 }
 
 /* Send a request to remove all identities. */
-static void
+static int
 delete_all(AuthenticationConnection *ac)
 {
-       int success = 1;
+       int ret = -1;
 
-       if (!ssh_remove_all_identities(ac, 1))
-               success = 0;
+       if (ssh_remove_all_identities(ac, 1))
+               ret = 0;
        /* ignore error-code for ssh2 */
        ssh_remove_all_identities(ac, 2);
 
-       if (success)
+       if (ret == 0)
                fprintf(stderr, "All identities removed.\n");
        else
                fprintf(stderr, "Failed to remove all identities.\n");
+
+       return ret;
 }
 
-static void
+static int
 add_file(AuthenticationConnection *ac, const char *filename)
 {
        struct stat st;
        Key *private;
        char *comment = NULL;
        char msg[1024];
+       int ret = -1;
 
        if (stat(filename, &st) < 0) {
                perror(filename);
-               exit(1);
+               return -1;
        }
        /* At first, try empty passphrase */
        private = key_load_private(filename, "", &comment);
@@ -135,7 +152,7 @@ add_file(AuthenticationConnection *ac, const char *filename)
                        if (strcmp(pass, "") == 0) {
                                clear_pass();
                                xfree(comment);
-                               return;
+                               return -1;
                        }
                        private = key_load_private(filename, pass, &comment);
                        if (private != NULL)
@@ -144,26 +161,39 @@ add_file(AuthenticationConnection *ac, const char *filename)
                        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);
-       else
+               ret = 0;
+       } else
                fprintf(stderr, "Could not add identity: %s\n", filename);
+
        xfree(comment);
        key_free(private);
+
+       return ret;
 }
 
-static void
+static int
 update_card(AuthenticationConnection *ac, int add, const char *id)
 {
-       if (ssh_update_card(ac, add, id))
+       char *pin;
+
+       pin = read_passphrase("Enter passphrase for smartcard: ", RP_ALLOW_STDIN);
+       if (pin == NULL)
+               return -1;
+
+       if (ssh_update_card(ac, add, id, pin)) {
                fprintf(stderr, "Card %s: %s\n",
-                    add ? "added" : "removed", id);
-       else
+                   add ? "added" : "removed", id);
+               return 0;
+       } else {
                fprintf(stderr, "Could not %s card: %s\n",
-                    add ? "add" : "remove", id);
+                   add ? "add" : "remove", id);
+               return -1;
+       }
 }
 
-static void
+static int
 list_identities(AuthenticationConnection *ac, int do_fp)
 {
        Key *key;
@@ -173,8 +203,8 @@ list_identities(AuthenticationConnection *ac, int do_fp)
 
        for (version = 1; version <= 2; version++) {
                for (key = ssh_get_first_identity(ac, &comment, version);
-                    key != NULL;
-                    key = ssh_get_next_identity(ac, &comment, version)) {
+                   key != NULL;
+                   key = ssh_get_next_identity(ac, &comment, version)) {
                        had_identities = 1;
                        if (do_fp) {
                                fp = key_fingerprint(key, SSH_FP_MD5,
@@ -191,8 +221,24 @@ list_identities(AuthenticationConnection *ac, int do_fp)
                        xfree(comment);
                }
        }
-       if (!had_identities)
+       if (!had_identities) {
                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
@@ -216,10 +262,8 @@ main(int argc, char **argv)
        extern char *optarg;
        extern int optind;
        AuthenticationConnection *ac = NULL;
-       struct passwd *pw;
-       char buf[1024];
        char *sc_reader_id = NULL;
-       int i, ch, deleting = 0;
+       int i, ch, deleting = 0, ret = 0;
 
        __progname = get_progname(argv[0]);
        init_rng();
@@ -231,65 +275,78 @@ main(int argc, char **argv)
        ac = ssh_get_authentication_connection();
        if (ac == NULL) {
                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) {
                case 'l':
                case 'L':
-                       list_identities(ac, ch == 'l' ? 1 : 0);
+                       if (list_identities(ac, ch == 'l' ? 1 : 0) == -1)
+                               ret = 1;
                        goto done;
                        break;
                case 'd':
                        deleting = 1;
                        break;
                case 'D':
-                       delete_all(ac);
+                       if (delete_all(ac) == -1)
+                               ret = 1;
                        goto done;
                        break;
                case 's':
                        sc_reader_id = optarg;
                        break;
                case 'e':
-                       deleting = 1; 
+                       deleting = 1;
                        sc_reader_id = optarg;
                        break;
                default:
                        usage();
-                       exit(1);
-                       break;
+                       ret = 1;
+                       goto done;
                }
        }
        argc -= optind;
        argv += optind;
        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;
        }
        if (argc == 0) {
-               pw = getpwuid(getuid());
-               if (!pw) {
+               char buf[MAXPATHLEN];
+               struct passwd *pw;
+               struct stat st;
+               int count = 0;
+
+               if ((pw = getpwuid(getuid())) == NULL) {
                        fprintf(stderr, "No user found with uid %u\n",
                            (u_int)getuid());
-                       ssh_close_authentication_connection(ac);
-                       exit(1);
+                       ret = 1;
+                       goto done;
                }
-               snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, _PATH_SSH_CLIENT_IDENTITY);
-               if (deleting)
-                       delete_file(ac, buf);
-               else
-                       add_file(ac, buf);
-       } else {
-               for (i = 0; i < argc; i++) {
-                       if (deleting)
-                               delete_file(ac, argv[i]);
+
+               for(i = 0; default_files[i]; i++) {
+                       snprintf(buf, sizeof(buf), "%s/%s", pw->pw_dir,
+                           default_files[i]);
+                       if (stat(buf, &st) < 0)
+                               continue;
+                       if (do_file(ac, deleting, buf) == -1)
+                               ret = 1;
                        else
-                               add_file(ac, argv[i]);
+                               count++;
+               }
+               if (count == 0)
+                       ret = 1;
+       } else {
+               for(i = 0; i < argc; i++) {
+                       if (do_file(ac, deleting, argv[i]) == -1)
+                               ret = 1;
                }
        }
        clear_pass();
 
 done:
        ssh_close_authentication_connection(ac);
-       exit(0);
+       return ret;
 }
This page took 0.048046 seconds and 4 git commands to generate.