From: "M Hickford via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: M Hickford <mirth.hickford@gmail.com>,
M Hickford <mirth.hickford@gmail.com>
Subject: [PATCH] credential/osxkeychain: store new attributes
Date: Tue, 13 Feb 2024 21:43:38 +0000 [thread overview]
Message-ID: <pull.1663.git.1707860618119.gitgitgadget@gmail.com> (raw)
From: M Hickford <mirth.hickford@gmail.com>
d208bfd (credential: new attribute password_expiry_utc, 2023-02-18)
and a5c76569e7 (credential: new attribute oauth_refresh_token)
introduced new credential attributes.
Similar to 7144dee3 (credential/libsecret: erase matching creds only,
2023-07-26), we encode the new attributes in the secret, separated by
newline:
hunter2
password_expiry_utc=1684189401
oauth_refresh_token=xyzzy
This is extensible and backwards compatible. The credential protocol
already assumes that attribute values do not contain newlines.
Signed-off-by: M Hickford <mirth.hickford@gmail.com>
---
[RFC] contrib/credential/osxkeychain: store new attributes
Is any keen MacOS user interested in building and testing this RFC
patch? I personally don't have a MacOS machine, so haven't tried
building it. Fixes are surely necessary. Once it builds, you can test
the feature with:
GIT_TEST_CREDENTIAL_HELPER=osxkeychain ./t0303-credential-external.sh
The feature would help git-credential-oauth users on MacOS
https://github.com/hickford/git-credential-oauth/issues/42
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1663%2Fhickford%2Fosxkeychain-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1663/hickford/osxkeychain-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1663
.../osxkeychain/git-credential-osxkeychain.c | 56 ++++++++++++++++++-
1 file changed, 54 insertions(+), 2 deletions(-)
diff --git a/contrib/credential/osxkeychain/git-credential-osxkeychain.c b/contrib/credential/osxkeychain/git-credential-osxkeychain.c
index 5f2e5f16c88..25ffa84f4ba 100644
--- a/contrib/credential/osxkeychain/git-credential-osxkeychain.c
+++ b/contrib/credential/osxkeychain/git-credential-osxkeychain.c
@@ -8,6 +8,8 @@ static char *host;
static char *path;
static char *username;
static char *password;
+static char *password_expiry_utc;
+static char *oauth_refresh_token;
static UInt16 port;
__attribute__((format (printf, 1, 2)))
@@ -22,6 +24,17 @@ static void die(const char *err, ...)
exit(1);
}
+
+static void *xmalloc(size_t size)
+{
+ void *ret = malloc(size);
+ if (!ret && !size)
+ ret = malloc(1);
+ if (!ret)
+ die("Out of memory");
+ return ret;
+}
+
static void *xstrdup(const char *s1)
{
void *ret = strdup(s1);
@@ -69,11 +82,27 @@ static void find_internet_password(void)
void *buf;
UInt32 len;
SecKeychainItemRef item;
+ char *line;
+ char *remaining_lines;
+ char *part;
+ char *remaining_parts;
if (SecKeychainFindInternetPassword(KEYCHAIN_ARGS, &len, &buf, &item))
return;
- write_item("password", buf, len);
+ line = strtok_r(buf, "\n", &remaining_lines);
+ write_item("password", line, strlen(line));
+ while(line != NULL) {
+ part = strtok_r(line, "=", &remaining_parts);
+ if (!strcmp(part, "oauth_refresh_token")) {
+ write_item("oauth_refresh_token", remaining_parts, strlen(remaining_parts));
+ }
+ if (!strcmp(part, "password_expiry_utc")) {
+ write_item("password_expiry_utc", remaining_parts, strlen(remaining_parts));
+ }
+ line = strtok_r(NULL, "\n", &remaining_lines);
+ }
+
if (!username)
find_username_in_item(item);
@@ -100,13 +129,32 @@ static void delete_internet_password(void)
static void add_internet_password(void)
{
+ int len;
+
/* Only store complete credentials */
if (!protocol || !host || !username || !password)
return;
+ char *secret;
+ if (password_expiry_utc && oauth_refresh_token) {
+ len = strlen(password) + strlen(password_expiry_utc) + strlen(oauth_refresh_token) + strlen("\npassword_expiry_utc=\noauth_refresh_token=");
+ secret = xmalloc(len);
+ snprintf(secret, len, len, "%s\npassword_expiry_utc=%s\noauth_refresh_token=%s", password, oauth_refresh_token);
+ } else if (oauth_refresh_token) {
+ len = strlen(password) + strlen(oauth_refresh_token) + strlen("\noauth_refresh_token=");
+ secret = xmalloc(len);
+ snprintf(secret, len, len, "%s\noauth_refresh_token=%s", password, oauth_refresh_token);
+ } else if (password_expiry_utc) {
+ len = strlen(password) + strlen(password_expiry_utc) + strlen("\npassword_expiry_utc=");
+ secret = xmalloc(len);
+ snprintf(secret, len, len, "%s\npassword_expiry_utc=%s", password, password_expiry_utc);
+ } else {
+ secret = xstrdup(password);
+ }
+
if (SecKeychainAddInternetPassword(
KEYCHAIN_ARGS,
- KEYCHAIN_ITEM(password),
+ KEYCHAIN_ITEM(secret),
NULL))
return;
}
@@ -161,6 +209,10 @@ static void read_credential(void)
username = xstrdup(v);
else if (!strcmp(buf, "password"))
password = xstrdup(v);
+ else if (!strcmp(buf, "password_expiry_utc"))
+ password_expiry_utc = xstrdup(v);
+ else if (!strcmp(buf, "oauth_refresh_token"))
+ oauth_refresh_token = xstrdup(v);
/*
* Ignore other lines; we don't know what they mean, but
* this future-proofs us when later versions of git do
base-commit: c875e0b8e036c12cfbf6531962108a063c7a821c
--
gitgitgadget
next reply other threads:[~2024-02-13 21:43 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-13 21:43 M Hickford via GitGitGadget [this message]
2024-02-14 18:25 ` [PATCH] credential/osxkeychain: store new attributes Junio C Hamano
2024-02-14 22:35 ` M Hickford
2024-02-27 20:00 ` M Hickford
2024-02-27 20:13 ` Junio C Hamano
2024-02-15 4:59 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1663.git.1707860618119.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=mirth.hickford@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.