From e72aefc9ec144a21d78202b53ecd7ce115f5ec2b Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Sun, 22 Sep 2013 22:07:57 -0700 Subject: [PATCH 01/16] contrib/git-credential-gnome-keyring.c: remove unnecessary pre-declarations These are all defined before they are used, so it is not necessary to pre-declare them. Remove the pre-declarations. Signed-off-by: Brandon Casey Signed-off-by: Jonathan Nieder --- .../gnome-keyring/git-credential-gnome-keyring.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index f2cdefee60..15b0a1ceaf 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -46,11 +46,6 @@ struct credential #define CREDENTIAL_INIT \ { NULL,NULL,0,NULL,NULL,NULL } -void credential_init(struct credential *c); -void credential_clear(struct credential *c); -int credential_read(struct credential *c); -void credential_write(const struct credential *c); - typedef int (*credential_op_cb)(struct credential*); struct credential_operation @@ -62,14 +57,6 @@ struct credential_operation #define CREDENTIAL_OP_END \ { NULL,NULL } -/* - * Table with operation callbacks is defined in concrete - * credential helper implementation and contains entries - * like { "get", function_to_get_credential } terminated - * by CREDENTIAL_OP_END. - */ -struct credential_operation const credential_helper_ops[]; - /* ---------------- common helper functions ----------------- */ static inline void free_password(char *password) From 083afc0ec0c0b3ec3a06cf96155eb5880f886293 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Sun, 22 Sep 2013 22:07:58 -0700 Subject: [PATCH 02/16] contrib/git-credential-gnome-keyring.c: remove unused die() function Signed-off-by: Brandon Casey Signed-off-by: Jonathan Nieder --- .../gnome-keyring/git-credential-gnome-keyring.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 15b0a1ceaf..4334f231cd 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -91,16 +91,6 @@ static inline void error(const char *fmt, ...) va_end(ap); } -static inline void die(const char *fmt, ...) -{ - va_list ap; - - va_start(ap,fmt); - error(fmt, ap); - va_end(ap); - exit(EXIT_FAILURE); -} - static inline void die_errno(int err) { error("%s", strerror(err)); From 4bc47cc009b82d89be3276fe5af3b03772e19c80 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:04 -0700 Subject: [PATCH 03/16] contrib/git-credential-gnome-keyring.c: *style* use "if ()" not "if()" etc. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../git-credential-gnome-keyring.c | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 4334f231cd..809b1b7cb5 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -117,10 +117,10 @@ static char* keyring_object(struct credential *c) return object; object = (char*) malloc(strlen(c->host)+strlen(c->path)+8); - if(!object) + if (!object) die_errno(errno); - if(c->port) + if (c->port) sprintf(object,"%s:%hd/%s",c->host,c->port,c->path); else sprintf(object,"%s/%s",c->host,c->path); @@ -314,14 +314,14 @@ int credential_read(struct credential *c) { line_len = strlen(buf); - if(buf[line_len-1]=='\n') + if (buf[line_len-1]=='\n') buf[--line_len]='\0'; - if(!line_len) + if (!line_len) break; value = strchr(buf,'='); - if(!value) { + if (!value) { warning("invalid credential line: %s", key); return -1; } @@ -379,9 +379,9 @@ static void usage(const char *name) basename = (basename) ? basename + 1 : name; fprintf(stderr, "usage: %s <", basename); - while(try_op->name) { + while (try_op->name) { fprintf(stderr,"%s",(try_op++)->name); - if(try_op->name) + if (try_op->name) fprintf(stderr,"%s","|"); } fprintf(stderr,"%s",">\n"); @@ -400,15 +400,15 @@ int main(int argc, char *argv[]) } /* lookup operation callback */ - while(try_op->name && strcmp(argv[1], try_op->name)) + while (try_op->name && strcmp(argv[1], try_op->name)) try_op++; /* unsupported operation given -- ignore silently */ - if(!try_op->name || !try_op->op) + if (!try_op->name || !try_op->op) goto out; ret = credential_read(&cred); - if(ret) + if (ret) goto out; /* perform credential operation */ From 18fe5add3385a5b41e294881992c1980dcf51ffd Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:05 -0700 Subject: [PATCH 04/16] contrib/git-credential-gnome-keyring.c: add static where applicable Mark global variable and functions as static. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../git-credential-gnome-keyring.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 809b1b7cb5..3ff541cfab 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -128,7 +128,7 @@ static char* keyring_object(struct credential *c) return object; } -int keyring_get(struct credential *c) +static int keyring_get(struct credential *c) { char* object = NULL; GList *entries; @@ -178,7 +178,7 @@ int keyring_get(struct credential *c) } -int keyring_store(struct credential *c) +static int keyring_store(struct credential *c) { guint32 item_id; char *object = NULL; @@ -212,7 +212,7 @@ int keyring_store(struct credential *c) return EXIT_SUCCESS; } -int keyring_erase(struct credential *c) +static int keyring_erase(struct credential *c) { char *object = NULL; GList *entries; @@ -277,7 +277,7 @@ int keyring_erase(struct credential *c) * Table with helper operation callbacks, used by generic * credential helper main function. */ -struct credential_operation const credential_helper_ops[] = +static struct credential_operation const credential_helper_ops[] = { { "get", keyring_get }, { "store", keyring_store }, @@ -287,12 +287,12 @@ struct credential_operation const credential_helper_ops[] = /* ------------------ credential functions ------------------ */ -void credential_init(struct credential *c) +static void credential_init(struct credential *c) { memset(c, 0, sizeof(*c)); } -void credential_clear(struct credential *c) +static void credential_clear(struct credential *c) { free(c->protocol); free(c->host); @@ -303,7 +303,7 @@ void credential_clear(struct credential *c) credential_init(c); } -int credential_read(struct credential *c) +static int credential_read(struct credential *c) { char buf[1024]; ssize_t line_len = 0; @@ -358,14 +358,14 @@ int credential_read(struct credential *c) return 0; } -void credential_write_item(FILE *fp, const char *key, const char *value) +static void credential_write_item(FILE *fp, const char *key, const char *value) { if (!value) return; fprintf(fp, "%s=%s\n", key, value); } -void credential_write(const struct credential *c) +static void credential_write(const struct credential *c) { /* only write username/password, if set */ credential_write_item(stdout, "username", c->username); From 7a6d6423c5a66589112f651a394b3a3ec076a7cf Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:06 -0700 Subject: [PATCH 05/16] contrib/git-credential-gnome-keyring.c: exit non-zero when called incorrectly If the correct arguments were not specified, this program should exit non-zero. Let's do so. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- contrib/credential/gnome-keyring/git-credential-gnome-keyring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 3ff541cfab..04852d77d3 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -396,7 +396,7 @@ int main(int argc, char *argv[]) if (!argv[1]) { usage(argv[0]); - goto out; + exit(EXIT_FAILURE); } /* lookup operation callback */ From fb2763746f2a4dcd63a5e4b389f8308e775684d8 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:07 -0700 Subject: [PATCH 06/16] contrib/git-credential-gnome-keyring.c: strlen() returns size_t, not ssize_t Also, initialization is not necessary since it is assigned before it is used. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- contrib/credential/gnome-keyring/git-credential-gnome-keyring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 04852d77d3..b9bb794601 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -306,7 +306,7 @@ static void credential_clear(struct credential *c) static int credential_read(struct credential *c) { char buf[1024]; - ssize_t line_len = 0; + size_t line_len; char *key = buf; char *value; From 73bbc0796b4ce65bfb1a12b47a0edc27845ecf50 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:08 -0700 Subject: [PATCH 07/16] contrib/git-credential-gnome-keyring.c: ensure buffer is non-empty before accessing Ensure buffer length is non-zero before attempting to access the last element. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- contrib/credential/gnome-keyring/git-credential-gnome-keyring.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index b9bb794601..0d2c55e0d2 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -314,7 +314,7 @@ static int credential_read(struct credential *c) { line_len = strlen(buf); - if (buf[line_len-1]=='\n') + if (line_len && buf[line_len-1] == '\n') buf[--line_len]='\0'; if (!line_len) From ff55c47d0f737cd33594e864a0e5a5e1d32fdd13 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:09 -0700 Subject: [PATCH 08/16] contrib/git-credential-gnome-keyring.c: set Gnome application name Since this is a Gnome application, let's set the application name to something reasonable. This will be displayed in Gnome dialog boxes e.g. the one that prompts for the user's keyring password. We add an include statement for glib.h and add the glib-2.0 cflags and libs to the compilation arguments, but both of these are really noops since glib is already a dependency of gnome-keyring. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- contrib/credential/gnome-keyring/Makefile | 4 ++-- .../credential/gnome-keyring/git-credential-gnome-keyring.c | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/contrib/credential/gnome-keyring/Makefile b/contrib/credential/gnome-keyring/Makefile index e6561d8db6..c3c7c98aa1 100644 --- a/contrib/credential/gnome-keyring/Makefile +++ b/contrib/credential/gnome-keyring/Makefile @@ -8,8 +8,8 @@ CFLAGS = -g -O2 -Wall -include ../../../config.mak.autogen -include ../../../config.mak -INCS:=$(shell pkg-config --cflags gnome-keyring-1) -LIBS:=$(shell pkg-config --libs gnome-keyring-1) +INCS:=$(shell pkg-config --cflags gnome-keyring-1 glib-2.0) +LIBS:=$(shell pkg-config --libs gnome-keyring-1 glib-2.0) SRCS:=$(MAIN).c OBJS:=$(SRCS:.c=.o) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 0d2c55e0d2..43b19dd5a2 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -28,6 +28,7 @@ #include #include #include +#include #include /* @@ -399,6 +400,8 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + g_set_application_name("Git Credential Helper"); + /* lookup operation callback */ while (try_op->name && strcmp(argv[1], try_op->name)) try_op++; From 8bb7a54c57d5bd8113886fc04be8d22d10337eef Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:10 -0700 Subject: [PATCH 09/16] contrib/git-credential-gnome-keyring.c: use gnome helpers in keyring_object() Rather than carefully allocating memory for sprintf() to write into, let's make use of the glib helper function g_strdup_printf(), which makes things a lot easier and less error-prone. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../gnome-keyring/git-credential-gnome-keyring.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 43b19dd5a2..b692e1f890 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -112,21 +112,13 @@ static inline char *xstrdup(const char *str) /* create a special keyring option string, if path is given */ static char* keyring_object(struct credential *c) { - char* object = NULL; - if (!c->path) - return object; - - object = (char*) malloc(strlen(c->host)+strlen(c->path)+8); - if (!object) - die_errno(errno); + return NULL; if (c->port) - sprintf(object,"%s:%hd/%s",c->host,c->port,c->path); - else - sprintf(object,"%s/%s",c->host,c->path); + return g_strdup_printf("%s:%hd/%s", c->host, c->port, c->path); - return object; + return g_strdup_printf("%s/%s", c->host, c->path); } static int keyring_get(struct credential *c) From 9fe3e6cf9e5e3dbf8777dd78dbd27c44cfc4eb85 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:11 -0700 Subject: [PATCH 10/16] contrib/git-credential-gnome-keyring.c: use secure memory functions for passwds gnome-keyring provides functions for allocating non-pageable memory (if possible) intended to be used for storing passwords. Let's use them. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../git-credential-gnome-keyring.c | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index b692e1f890..d8a7038a6e 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -30,6 +30,7 @@ #include #include #include +#include /* * This credential struct and API is simplified from git's credential.{h,c} @@ -60,16 +61,6 @@ struct credential_operation /* ---------------- common helper functions ----------------- */ -static inline void free_password(char *password) -{ - char *c = password; - if (!password) - return; - - while (*c) *c++ = '\0'; - free(password); -} - static inline void warning(const char *fmt, ...) { va_list ap; @@ -159,8 +150,8 @@ static int keyring_get(struct credential *c) /* pick the first one from the list */ password_data = (GnomeKeyringNetworkPasswordData *) entries->data; - free_password(c->password); - c->password = xstrdup(password_data->password); + gnome_keyring_memory_free(c->password); + c->password = gnome_keyring_memory_strdup(password_data->password); if (!c->username) c->username = xstrdup(password_data->user); @@ -291,7 +282,7 @@ static void credential_clear(struct credential *c) free(c->host); free(c->path); free(c->username); - free_password(c->password); + gnome_keyring_memory_free(c->password); credential_init(c); } @@ -338,8 +329,8 @@ static int credential_read(struct credential *c) free(c->username); c->username = xstrdup(value); } else if (!strcmp(key, "password")) { - free_password(c->password); - c->password = xstrdup(value); + gnome_keyring_memory_free(c->password); + c->password = gnome_keyring_memory_strdup(value); while (*value) *value++ = '\0'; } /* From da2727f23c68fb8cbda3cbd03e81141531166585 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:12 -0700 Subject: [PATCH 11/16] contrib/git-credential-gnome-keyring.c: use secure memory for reading passwords gnome-keyring provides functions to allocate non-pageable memory (if possible). Let's use them to allocate memory that may be used to hold secure data read from the keyring. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../gnome-keyring/git-credential-gnome-keyring.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index d8a7038a6e..5e79669469 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -289,12 +289,14 @@ static void credential_clear(struct credential *c) static int credential_read(struct credential *c) { - char buf[1024]; + char *buf; size_t line_len; - char *key = buf; + char *key; char *value; - while (fgets(buf, sizeof(buf), stdin)) + key = buf = gnome_keyring_memory_alloc(1024); + + while (fgets(buf, 1024, stdin)) { line_len = strlen(buf); @@ -307,6 +309,7 @@ static int credential_read(struct credential *c) value = strchr(buf,'='); if (!value) { warning("invalid credential line: %s", key); + gnome_keyring_memory_free(buf); return -1; } *value++ = '\0'; @@ -339,6 +342,9 @@ static int credential_read(struct credential *c) * learn new lines, and the helpers are updated to match. */ } + + gnome_keyring_memory_free(buf); + return 0; } From 68a65f5fe54c2b21bfe16ef3a0b48956ecf5658a Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:13 -0700 Subject: [PATCH 12/16] contrib/git-credential-gnome-keyring.c: use glib memory allocation functions Rather than roll our own, let's use the memory allocation/free routines provided by glib. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../git-credential-gnome-keyring.c | 48 +++++++------------ 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 5e79669469..273c43bcc4 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -83,21 +82,6 @@ static inline void error(const char *fmt, ...) va_end(ap); } -static inline void die_errno(int err) -{ - error("%s", strerror(err)); - exit(EXIT_FAILURE); -} - -static inline char *xstrdup(const char *str) -{ - char *ret = strdup(str); - if (!ret) - die_errno(errno); - - return ret; -} - /* ----------------- GNOME Keyring functions ----------------- */ /* create a special keyring option string, if path is given */ @@ -134,7 +118,7 @@ static int keyring_get(struct credential *c) c->port, &entries); - free(object); + g_free(object); if (result == GNOME_KEYRING_RESULT_NO_MATCH) return EXIT_SUCCESS; @@ -154,7 +138,7 @@ static int keyring_get(struct credential *c) c->password = gnome_keyring_memory_strdup(password_data->password); if (!c->username) - c->username = xstrdup(password_data->user); + c->username = g_strdup(password_data->user); gnome_keyring_network_password_list_free(entries); @@ -192,7 +176,7 @@ static int keyring_store(struct credential *c) c->password, &item_id); - free(object); + g_free(object); return EXIT_SUCCESS; } @@ -226,7 +210,7 @@ static int keyring_erase(struct credential *c) c->port, &entries); - free(object); + g_free(object); if (result == GNOME_KEYRING_RESULT_NO_MATCH) return EXIT_SUCCESS; @@ -278,10 +262,10 @@ static void credential_init(struct credential *c) static void credential_clear(struct credential *c) { - free(c->protocol); - free(c->host); - free(c->path); - free(c->username); + g_free(c->protocol); + g_free(c->host); + g_free(c->path); + g_free(c->username); gnome_keyring_memory_free(c->password); credential_init(c); @@ -315,22 +299,22 @@ static int credential_read(struct credential *c) *value++ = '\0'; if (!strcmp(key, "protocol")) { - free(c->protocol); - c->protocol = xstrdup(value); + g_free(c->protocol); + c->protocol = g_strdup(value); } else if (!strcmp(key, "host")) { - free(c->host); - c->host = xstrdup(value); + g_free(c->host); + c->host = g_strdup(value); value = strrchr(c->host,':'); if (value) { *value++ = '\0'; c->port = atoi(value); } } else if (!strcmp(key, "path")) { - free(c->path); - c->path = xstrdup(value); + g_free(c->path); + c->path = g_strdup(value); } else if (!strcmp(key, "username")) { - free(c->username); - c->username = xstrdup(value); + g_free(c->username); + c->username = g_strdup(value); } else if (!strcmp(key, "password")) { gnome_keyring_memory_free(c->password); c->password = gnome_keyring_memory_strdup(value); From 3006297a0e45417e5988536bf5dbeb65ac7cce8d Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:14 -0700 Subject: [PATCH 13/16] contrib/git-credential-gnome-keyring.c: use glib messaging functions Rather than roll our own, let's use the messaging functions provided by glib. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../git-credential-gnome-keyring.c | 33 +++---------------- 1 file changed, 4 insertions(+), 29 deletions(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 273c43bcc4..b70bd53959 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -58,30 +57,6 @@ struct credential_operation #define CREDENTIAL_OP_END \ { NULL,NULL } -/* ---------------- common helper functions ----------------- */ - -static inline void warning(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - fprintf(stderr, "warning: "); - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n" ); - va_end(ap); -} - -static inline void error(const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - fprintf(stderr, "error: "); - vfprintf(stderr, fmt, ap); - fprintf(stderr, "\n" ); - va_end(ap); -} - /* ----------------- GNOME Keyring functions ----------------- */ /* create a special keyring option string, if path is given */ @@ -127,7 +102,7 @@ static int keyring_get(struct credential *c) return EXIT_SUCCESS; if (result != GNOME_KEYRING_RESULT_OK) { - error("%s",gnome_keyring_result_to_message(result)); + g_critical("%s", gnome_keyring_result_to_message(result)); return EXIT_FAILURE; } @@ -220,7 +195,7 @@ static int keyring_erase(struct credential *c) if (result != GNOME_KEYRING_RESULT_OK) { - error("%s",gnome_keyring_result_to_message(result)); + g_critical("%s", gnome_keyring_result_to_message(result)); return EXIT_FAILURE; } @@ -234,7 +209,7 @@ static int keyring_erase(struct credential *c) if (result != GNOME_KEYRING_RESULT_OK) { - error("%s",gnome_keyring_result_to_message(result)); + g_critical("%s", gnome_keyring_result_to_message(result)); return EXIT_FAILURE; } @@ -292,7 +267,7 @@ static int credential_read(struct credential *c) value = strchr(buf,'='); if (!value) { - warning("invalid credential line: %s", key); + g_warning("invalid credential line: %s", key); gnome_keyring_memory_free(buf); return -1; } From 81c57e2c9d99ced72bcc6b9633109dff73a04526 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:15 -0700 Subject: [PATCH 14/16] contrib/git-credential-gnome-keyring.c: report failure to store password Produce an error message when we fail to store a password to the keyring. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../gnome-keyring/git-credential-gnome-keyring.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index b70bd53959..447e9aa551 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -125,6 +125,7 @@ static int keyring_store(struct credential *c) { guint32 item_id; char *object = NULL; + GnomeKeyringResult result; /* * Sanity check that what we are storing is actually sensible. @@ -139,7 +140,7 @@ static int keyring_store(struct credential *c) object = keyring_object(c); - gnome_keyring_set_network_password_sync( + result = gnome_keyring_set_network_password_sync( GNOME_KEYRING_DEFAULT, c->username, NULL /* domain */, @@ -152,6 +153,13 @@ static int keyring_store(struct credential *c) &item_id); g_free(object); + + if (result != GNOME_KEYRING_RESULT_OK && + result != GNOME_KEYRING_RESULT_CANCELLED) { + g_critical("%s", gnome_keyring_result_to_message(result)); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; } From 5a3db110533b3b58002a03da837aa38fdc4bfc56 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:16 -0700 Subject: [PATCH 15/16] contrib/git-credential-gnome-keyring.c: support ancient gnome-keyring The gnome-keyring lib distributed with RHEL 5.X is ancient and does not provide a few of the functions/defines that more recent versions do, but mostly the API is the same. Let's provide the missing bits via macro definitions and function implementation. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../git-credential-gnome-keyring.c | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index 447e9aa551..e1bc3face4 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -28,8 +28,66 @@ #include #include #include + +#ifdef GNOME_KEYRING_DEFAULT + + /* Modern gnome-keyring */ + #include +#else + + /* + * Support ancient gnome-keyring, circ. RHEL 5.X. + * GNOME_KEYRING_DEFAULT seems to have been introduced with Gnome 2.22, + * and the other features roughly around Gnome 2.20, 6 months before. + * Ubuntu 8.04 used Gnome 2.22 (I think). Not sure any distro used 2.20. + * So the existence/non-existence of GNOME_KEYRING_DEFAULT seems like + * a decent thing to use as an indicator. + */ + +#define GNOME_KEYRING_DEFAULT NULL + +/* + * ancient gnome-keyring returns DENIED when an entry is not found. + * Setting NO_MATCH to DENIED will prevent us from reporting DENIED + * errors during get and erase operations, but we will still report + * DENIED errors during a store. + */ +#define GNOME_KEYRING_RESULT_NO_MATCH GNOME_KEYRING_RESULT_DENIED + +#define gnome_keyring_memory_alloc g_malloc +#define gnome_keyring_memory_free gnome_keyring_free_password +#define gnome_keyring_memory_strdup g_strdup + +static const char* gnome_keyring_result_to_message(GnomeKeyringResult result) +{ + switch (result) { + case GNOME_KEYRING_RESULT_OK: + return "OK"; + case GNOME_KEYRING_RESULT_DENIED: + return "Denied"; + case GNOME_KEYRING_RESULT_NO_KEYRING_DAEMON: + return "No Keyring Daemon"; + case GNOME_KEYRING_RESULT_ALREADY_UNLOCKED: + return "Already UnLocked"; + case GNOME_KEYRING_RESULT_NO_SUCH_KEYRING: + return "No Such Keyring"; + case GNOME_KEYRING_RESULT_BAD_ARGUMENTS: + return "Bad Arguments"; + case GNOME_KEYRING_RESULT_IO_ERROR: + return "IO Error"; + case GNOME_KEYRING_RESULT_CANCELLED: + return "Cancelled"; + case GNOME_KEYRING_RESULT_ALREADY_EXISTS: + return "Already Exists"; + default: + return "Unknown Error"; + } +} + +#endif + /* * This credential struct and API is simplified from git's credential.{h,c} */ From 15f7221686eac053902b906c278680b485c865ce Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:17 -0700 Subject: [PATCH 16/16] contrib/git-credential-gnome-keyring.c: support really ancient gnome-keyring The gnome-keyring lib (0.4) distributed with RHEL 4.X is really ancient and does not provide most of the synchronous functions that even ancient releases do. Thankfully, we're only using one function that is missing. Let's emulate gnome_keyring_item_delete_sync() by calling the asynchronous function and then triggering the event loop processing until our callback is called. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../git-credential-gnome-keyring.c | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c index e1bc3face4..635c96bc56 100644 --- a/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c +++ b/contrib/credential/gnome-keyring/git-credential-gnome-keyring.c @@ -86,6 +86,45 @@ static const char* gnome_keyring_result_to_message(GnomeKeyringResult result) } } +/* + * Support really ancient gnome-keyring, circ. RHEL 4.X. + * Just a guess for the Glib version. Glib 2.8 was roughly Gnome 2.12 ? + * Which was released with gnome-keyring 0.4.3 ?? + */ +#if GLIB_MAJOR_VERSION == 2 && GLIB_MINOR_VERSION < 8 + +static void gnome_keyring_done_cb(GnomeKeyringResult result, gpointer user_data) +{ + gpointer *data = (gpointer*) user_data; + int *done = (int*) data[0]; + GnomeKeyringResult *r = (GnomeKeyringResult*) data[1]; + + *r = result; + *done = 1; +} + +static void wait_for_request_completion(int *done) +{ + GMainContext *mc = g_main_context_default(); + while (!*done) + g_main_context_iteration(mc, TRUE); +} + +static GnomeKeyringResult gnome_keyring_item_delete_sync(const char *keyring, guint32 id) +{ + int done = 0; + GnomeKeyringResult result; + gpointer data[] = { &done, &result }; + + gnome_keyring_item_delete(keyring, id, gnome_keyring_done_cb, data, + NULL); + + wait_for_request_completion(&done); + + return result; +} + +#endif #endif /*