Skip to content

Commit

Permalink
Merge branch 'kn/osxkeychain-skip-idempotent-store' into next
Browse files Browse the repository at this point in the history
The credential helper that talks with osx keychain learned to avoid
storing back the authentication material it just got received from
the keychain.

* kn/osxkeychain-skip-idempotent-store:
  osxkeychain: state to skip unnecessary store operations
  osxkeychain: exclusive lock to serialize execution of operations
  • Loading branch information
gitster committed May 22, 2024
2 parents 899cce9 + e1ab45b commit 4d75716
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions contrib/credential/osxkeychain/git-credential-osxkeychain.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ static CFStringRef username;
static CFDataRef password;
static CFDataRef password_expiry_utc;
static CFDataRef oauth_refresh_token;
static int state_seen;

static void clear_credential(void)
{
Expand Down Expand Up @@ -171,6 +172,9 @@ static OSStatus find_internet_password(void)

CFRelease(item);

write_item("capability[]", "state", strlen("state"));
write_item("state[]", "osxkeychain:seen=1", strlen("osxkeychain:seen=1"));

out:
CFRelease(attrs);

Expand Down Expand Up @@ -284,6 +288,9 @@ static OSStatus add_internet_password(void)
CFDictionaryRef attrs;
OSStatus result;

if (state_seen)
return errSecSuccess;

/* Only store complete credentials */
if (!protocol || !host || !username || !password)
return -1;
Expand Down Expand Up @@ -395,6 +402,10 @@ static void read_credential(void)
oauth_refresh_token = CFDataCreate(kCFAllocatorDefault,
(UInt8 *)v,
strlen(v));
else if (!strcmp(buf, "state[]")) {
if (!strcmp(v, "osxkeychain:seen=1"))
state_seen = 1;
}
/*
* Ignore other lines; we don't know what they mean, but
* this future-proofs us when later versions of git do
Expand All @@ -414,6 +425,9 @@ int main(int argc, const char **argv)
if (!argv[1])
die("%s", usage);

if (open(argv[0], O_RDONLY | O_EXLOCK) == -1)
die("failed to lock %s", argv[0]);

read_credential();

if (!strcmp(argv[1], "get"))
Expand Down

0 comments on commit 4d75716

Please sign in to comment.