Expose stock user/pass credential utility
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
diff --git a/include/git2/transport.h b/include/git2/transport.h
index fba5fb9..f03e9fc 100644
--- a/include/git2/transport.h
+++ b/include/git2/transport.h
@@ -68,6 +68,26 @@ typedef int (*git_cred_acquire_cb)(
unsigned int allowed_types,
void *payload);
+/**
+ * Payload for git_cred_stock_userpass_plaintext.
+ */
+typedef struct git_cred_stock_userpass_plaintext_payload {
+ char *username;
+ char *password;
+} git_cred_stock_userpass_plaintext_payload;
+
+
+/**
+ * Stock callback usable as a git_cred_acquire_cb. This calls
+ * git_cred_userpass_plaintext_new unless the protocol has not specified
+ * GIT_CREDTYPE_USERPASS_PLAINTEXT as an allowed type.
+ */
+GIT_EXTERN(int) git_cred_stock_userpass_plaintext(
+ git_cred **cred,
+ const char *url,
+ unsigned int allowed_types,
+ void *payload);
+
/*
*** End interface for credentials acquisition ***
*** Begin base transport interface ***
diff --git a/src/transports/cred.c b/src/transports/cred.c
index 85472bd..5ecb8a4 100644
--- a/src/transports/cred.c
+++ b/src/transports/cred.c
@@ -57,3 +57,23 @@ int git_cred_userpass_plaintext_new(
*cred = &c->parent;
return 0;
}
+
+int git_cred_stock_userpass_plaintext(
+ git_cred **cred,
+ const char *url,
+ unsigned int allowed_types,
+ void *payload)
+{
+ git_cred_stock_userpass_plaintext_payload *userpass =
+ (git_cred_stock_userpass_plaintext_payload*)payload;
+
+ GIT_UNUSED(url);
+
+ if (!userpass || !userpass->username || !userpass->password) return -1;
+
+ if ((GIT_CREDTYPE_USERPASS_PLAINTEXT & allowed_types) == 0 ||
+ git_cred_userpass_plaintext_new(cred, userpass->username, userpass->password) < 0)
+ return -1;
+
+ return 0;
+}
diff --git a/tests-clar/network/cred.c b/tests-clar/network/cred.c
new file mode 100644
index 0000000..52920c3
--- /dev/null
+++ b/tests-clar/network/cred.c
@@ -0,0 +1,27 @@
+#include "clar_libgit2.h"
+
+#include "git2/transport.h"
+
+void test_network_cred__stock_userpass_validates_args(void)
+{
+ git_cred_stock_userpass_plaintext_payload payload = {0};
+
+ cl_git_fail(git_cred_stock_userpass_plaintext(NULL, NULL, 0, NULL));
+
+ payload.username = "user";
+ cl_git_fail(git_cred_stock_userpass_plaintext(NULL, NULL, 0, &payload));
+
+ payload.username = NULL;
+ payload.username = "pass";
+ cl_git_fail(git_cred_stock_userpass_plaintext(NULL, NULL, 0, &payload));
+}
+
+void test_network_cred__stock_userpass_validates_that_method_is_allowed(void)
+{
+ git_cred *cred;
+ git_cred_stock_userpass_plaintext_payload payload = {"user", "pass"};
+
+ cl_git_fail(git_cred_stock_userpass_plaintext(&cred, NULL, 0, &payload));
+ cl_git_pass(git_cred_stock_userpass_plaintext(&cred, NULL, GIT_CREDTYPE_USERPASS_PLAINTEXT, &payload));
+ git__free(cred);
+}
diff --git a/tests-clar/online/clone.c b/tests-clar/online/clone.c
index 082ed52..9c51d69 100644
--- a/tests-clar/online/clone.c
+++ b/tests-clar/online/clone.c
@@ -121,7 +121,7 @@ static int update_tips(const char *refname, const git_oid *a, const git_oid *b,
return 0;
}
-void test_clone_network__custom_remote_callbacks(void)
+void test_online_clone__custom_remote_callbacks(void)
{
git_remote_callbacks remote_callbacks = GIT_REMOTE_CALLBACKS_INIT;
int callcount = 0;
@@ -134,39 +134,18 @@ void test_clone_network__custom_remote_callbacks(void)
cl_assert(callcount > 0);
}
-struct cred_user_pass {
- const char *user;
- const char *pass;
-};
-
-static int cred_acquire(
- git_cred **cred,
- const char *url,
- unsigned int allowed_types,
- void *payload)
-{
- struct cred_user_pass *user_pass = (struct cred_user_pass*)payload;
-
- GIT_UNUSED(url);
- if ((GIT_CREDTYPE_USERPASS_PLAINTEXT & allowed_types) == 0 ||
- git_cred_userpass_plaintext_new(cred, user_pass->user, user_pass->pass) < 0)
- return -1;
-
- return 0;
-}
-
-void test_clone_network__credentials(void)
+void test_online_clone__credentials(void)
{
/* Remote URL environment variable must be set. User and password are optional. */
const char *remote_url = cl_getenv("GITTEST_REMOTE_URL");
- struct cred_user_pass user_pass = {
+ git_cred_stock_userpass_plaintext_payload user_pass = {
cl_getenv("GITTEST_REMOTE_USER"),
cl_getenv("GITTEST_REMOTE_PASS")
};
if (!remote_url) return;
- g_options.cred_acquire_cb = cred_acquire;
+ g_options.cred_acquire_cb = git_cred_stock_userpass_plaintext;
g_options.cred_acquire_payload = &user_pass;
cl_git_pass(git_clone(&g_repo, remote_url, "./foo", &g_options));