summaryrefslogtreecommitdiff
path: root/src/libedataserver
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2018-05-10 13:58:32 +0200
committerMilan Crha <mcrha@redhat.com>2018-05-10 13:58:32 +0200
commit2be90d75c054de32697381c5a55fcf971da6c6f6 (patch)
tree4c4d213f205c19f09bf0297c3b1e75457cdced1b /src/libedataserver
parenteaf1fc2bd9fef2a8e577a7c36c9dbbc91c543502 (diff)
downloadevolution-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.c49
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;