diff options
author | Milan Crha <mcrha@redhat.com> | 2018-05-10 13:58:32 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2018-05-10 13:58:32 +0200 |
commit | 2be90d75c054de32697381c5a55fcf971da6c6f6 (patch) | |
tree | 4c4d213f205c19f09bf0297c3b1e75457cdced1b /src/libedataserver | |
parent | eaf1fc2bd9fef2a8e577a7c36c9dbbc91c543502 (diff) | |
download | evolution-data-server-2be90d75c054de32697381c5a55fcf971da6c6f6.tar.gz |
Bug 795997 - Fails to parse Google OAuth2 authorization code
Diffstat (limited to 'src/libedataserver')
-rw-r--r-- | src/libedataserver/e-oauth2-service-google.c | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/src/libedataserver/e-oauth2-service-google.c b/src/libedataserver/e-oauth2-service-google.c index 261ba0698..c380c61ce 100644 --- a/src/libedataserver/e-oauth2-service-google.c +++ b/src/libedataserver/e-oauth2-service-google.c @@ -119,16 +119,49 @@ eos_google_extract_authorization_code (EOAuth2Service *service, *out_authorization_code = NULL; - if (!page_title || !*page_title) - return FALSE; + if (page_title && *page_title) { + /* Known response, but no authorization code */ + if (g_ascii_strncasecmp (page_title, "Denied ", 7) == 0) + return TRUE; + + if (g_ascii_strncasecmp (page_title, "Success code=", 13) == 0) { + *out_authorization_code = g_strdup (page_title + 13); + return TRUE; + } + } + + if (page_uri && *page_uri) { + SoupURI *suri; + + suri = soup_uri_new (page_uri); + if (suri) { + const gchar *query = soup_uri_get_query (suri); + gboolean known = FALSE; + + if (query && *query) { + GHashTable *params; + + params = soup_form_decode (query); + if (params) { + const gchar *response; + + response = g_hash_table_lookup (params, "response"); + if (response && g_ascii_strncasecmp (response, "code=", 5) == 0) { + *out_authorization_code = g_strdup (response + 5); + known = TRUE; + } else if (response && g_ascii_strncasecmp (response, "error", 5) == 0) { + known = TRUE; + } + + g_hash_table_destroy (params); + } + } - /* Known response, but no authorization code */ - if (g_ascii_strncasecmp (page_title, "Denied ", 7) == 0) - return TRUE; + soup_uri_free (suri); - if (g_ascii_strncasecmp (page_title, "Success code=", 13) == 0) { - *out_authorization_code = g_strdup (page_title + 13); - return TRUE; + if (known) + return TRUE; + } } return FALSE; |