]> xenbits.xensource.com Git - libvirt.git/commitdiff
virnetsocket: improve search for default SSH key
authorPino Toscano <ptoscano@redhat.com>
Wed, 9 Nov 2016 14:28:34 +0000 (15:28 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 15 Nov 2016 14:50:51 +0000 (15:50 +0100)
Add a couple of helper functions to check whether one of the default
names of SSH keys (as documented in ssh-keygen(1)) exists, and use them
to specify a key for the libssh2 transport if none was passed.

src/rpc/virnetclient.c

index 361dc1adfc5b5a02c210a72f597220b99a8386c0..713b8d53bd0c7980fd5ce07e1f7b7f0e7cc2e646 100644 (file)
@@ -335,6 +335,51 @@ static virNetClientPtr virNetClientNew(virNetSocketPtr sock,
     return NULL;
 }
 
+/*
+ * Check whether the specified SSH key exists.
+ *
+ * Return -1 on error, 0 if it does not exist, and 1 if it does exist.
+ */
+static int
+virNetClientCheckKeyExists(const char *homedir,
+                           const char *name,
+                           char **retPath)
+{
+    char *path;
+
+    if (virAsprintf(&path, "%s/.ssh/%s", homedir, name) < 0)
+        return -1;
+
+    if (!(virFileExists(path))) {
+        VIR_FREE(path);
+        return 0;
+    }
+
+    *retPath = path;
+    return 1;
+}
+
+/*
+ * Detect the default SSH key, if existing.
+ *
+ * Return -1 on error, 0 if it does not exist, and 1 if it does exist.
+ */
+static int
+virNetClientFindDefaultSshKey(const char *homedir, char **retPath)
+{
+    size_t i;
+
+    const char *keys[] = { "identity", "id_dsa", "id_ecdsa", "id_ed25519", "id_rsa" };
+
+    for (i = 0; i < ARRAY_CARDINALITY(keys); ++i) {
+        int ret = virNetClientCheckKeyExists(homedir, keys[i], retPath);
+        if (ret != 0)
+            return ret;
+    }
+
+    return 0;
+}
+
 
 virNetClientPtr virNetClientNewUNIX(const char *path,
                                     bool spawnDaemon,
@@ -426,22 +471,8 @@ virNetClientPtr virNetClientNewLibSSH2(const char *host,
 
     if (homedir) {
         if (!privkeyPath) {
-            /* RSA */
-            virBufferAsprintf(&buf, "%s/.ssh/id_rsa", homedir);
-            if (!(privkey = virBufferContentAndReset(&buf)))
+            if (virNetClientFindDefaultSshKey(homedir, &privkey) < 0)
                 goto no_memory;
-
-            if (!(virFileExists(privkey)))
-                VIR_FREE(privkey);
-            /* DSA */
-            if (!privkey) {
-                virBufferAsprintf(&buf, "%s/.ssh/id_dsa", homedir);
-                if (!(privkey = virBufferContentAndReset(&buf)))
-                    goto no_memory;
-
-                if (!(virFileExists(privkey)))
-                    VIR_FREE(privkey);
-            }
         } else {
             if (VIR_STRDUP(privkey, privkeyPath) < 0)
                 goto cleanup;