From e72aefc9ec144a21d78202b53ecd7ce115f5ec2b Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Sun, 22 Sep 2013 22:07:57 -0700 Subject: 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 --- .../credential/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 f2cdefee6..15b0a1cea 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) -- cgit v1.2.1 From 083afc0ec0c0b3ec3a06cf96155eb5880f886293 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Sun, 22 Sep 2013 22:07:58 -0700 Subject: contrib/git-credential-gnome-keyring.c: remove unused die() function Signed-off-by: Brandon Casey Signed-off-by: Jonathan Nieder --- .../credential/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 15b0a1cea..4334f231c 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)); -- cgit v1.2.1 From 4bc47cc009b82d89be3276fe5af3b03772e19c80 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:04 -0700 Subject: contrib/git-credential-gnome-keyring.c: *style* use "if ()" not "if()" etc. Signed-off-by: Brandon Casey Signed-off-by: Junio C Hamano --- .../gnome-keyring/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 4334f231c..809b1b7cb 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 */ -- cgit v1.2.1 From 18fe5add3385a5b41e294881992c1980dcf51ffd Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:05 -0700 Subject: 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 --- .../gnome-keyring/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 809b1b7cb..3ff541cfa 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); -- cgit v1.2.1 From 7a6d6423c5a66589112f651a394b3a3ec076a7cf Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:06 -0700 Subject: 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 3ff541cfa..04852d77d 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 */ -- cgit v1.2.1 From fb2763746f2a4dcd63a5e4b389f8308e775684d8 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:07 -0700 Subject: 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 04852d77d..b9bb79460 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; -- cgit v1.2.1 From 73bbc0796b4ce65bfb1a12b47a0edc27845ecf50 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:08 -0700 Subject: 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 b9bb79460..0d2c55e0d 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) -- cgit v1.2.1 From ff55c47d0f737cd33594e864a0e5a5e1d32fdd13 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:09 -0700 Subject: 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 ++-- contrib/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 e6561d8db..c3c7c98aa 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 0d2c55e0d..43b19dd5a 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++; -- cgit v1.2.1 From 8bb7a54c57d5bd8113886fc04be8d22d10337eef Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:10 -0700 Subject: 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 43b19dd5a..b692e1f89 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) -- cgit v1.2.1 From 9fe3e6cf9e5e3dbf8777dd78dbd27c44cfc4eb85 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:11 -0700 Subject: 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 --- .../gnome-keyring/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 b692e1f89..d8a7038a6 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'; } /* -- cgit v1.2.1 From da2727f23c68fb8cbda3cbd03e81141531166585 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:12 -0700 Subject: 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 --- .../credential/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 d8a7038a6..5e7966946 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; } -- cgit v1.2.1 From 68a65f5fe54c2b21bfe16ef3a0b48956ecf5658a Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:13 -0700 Subject: 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 --- .../gnome-keyring/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 5e7966946..273c43bcc 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); -- cgit v1.2.1 From 3006297a0e45417e5988536bf5dbeb65ac7cce8d Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:14 -0700 Subject: 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 --- .../gnome-keyring/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 273c43bcc..b70bd5395 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; } -- cgit v1.2.1 From 81c57e2c9d99ced72bcc6b9633109dff73a04526 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:15 -0700 Subject: 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 --- .../credential/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 b70bd5395..447e9aa55 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; } -- cgit v1.2.1 From 5a3db110533b3b58002a03da837aa38fdc4bfc56 Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:16 -0700 Subject: 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 --- .../gnome-keyring/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 447e9aa55..e1bc3face 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} */ -- cgit v1.2.1 From 15f7221686eac053902b906c278680b485c865ce Mon Sep 17 00:00:00 2001 From: Brandon Casey Date: Mon, 23 Sep 2013 11:49:17 -0700 Subject: 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 --- .../gnome-keyring/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 e1bc3face..635c96bc5 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 /* -- cgit v1.2.1