summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2023-02-01 11:28:34 +0100
committerMilan Crha <mcrha@redhat.com>2023-02-01 11:30:36 +0100
commitb8e662bc105152ac430f9a4b8977a72d559e9483 (patch)
treef3d54a81b509025d1a48090af5caf5eb2f24726d /src
parent343ebd9a9a3b162dd37d09e229b729af7cfc8698 (diff)
downloadevolution-data-server-b8e662bc105152ac430f9a4b8977a72d559e9483.tar.gz
OAuth2: Extract returned information from URI query or fragment
The server can return requested information, or an error, either in the URI's query or in the fragment. Let the code try both places.
Diffstat (limited to 'src')
-rw-r--r--src/libedataserver/e-oauth2-service.c69
1 files changed, 47 insertions, 22 deletions
diff --git a/src/libedataserver/e-oauth2-service.c b/src/libedataserver/e-oauth2-service.c
index 61b3b964e..7eca355df 100644
--- a/src/libedataserver/e-oauth2-service.c
+++ b/src/libedataserver/e-oauth2-service.c
@@ -1931,6 +1931,42 @@ e_oauth2_service_util_take_to_form (GHashTable *form,
g_hash_table_remove (form, name);
}
+static gboolean
+eos_util_extract_from_form (GHashTable *form,
+ gchar **out_authorization_code,
+ gchar **out_error_code,
+ gchar **out_error_description)
+{
+ gboolean any_set = FALSE;
+ const gchar *value;
+
+ if (!form)
+ return FALSE;
+
+ value = g_hash_table_lookup (form, "code");
+
+ if (value && *value && out_authorization_code) {
+ any_set = TRUE;
+ *out_authorization_code = g_strdup (value);
+ } else {
+ value = g_hash_table_lookup (form, "error");
+
+ if (value && *value && out_error_code) {
+ any_set = TRUE;
+ *out_error_code = g_strdup (value);
+ }
+
+ value = g_hash_table_lookup (form, "error_description");
+
+ if (value && *value && out_error_description) {
+ any_set = TRUE;
+ *out_error_description = g_strdup (value);
+ }
+ }
+
+ return any_set;
+}
+
/**
* e_oauth2_service_util_extract_from_uri:
* @in_uri: a URI returned from the server
@@ -1963,33 +1999,22 @@ e_oauth2_service_util_extract_from_uri (const gchar *in_uri,
return FALSE;
if (g_uri_get_query (uri)) {
- GHashTable *uri_query = soup_form_decode (g_uri_get_query (uri));
-
- if (uri_query) {
- const gchar *value;
+ GHashTable *form = soup_form_decode (g_uri_get_query (uri));
- value = g_hash_table_lookup (uri_query, "code");
+ if (form) {
+ any_set = eos_util_extract_from_form (form, out_authorization_code, out_error_code, out_error_description);
- if (value && *value && out_authorization_code) {
- any_set = TRUE;
- *out_authorization_code = g_strdup (value);
- } else {
- value = g_hash_table_lookup (uri_query, "error");
-
- if (value && *value && out_error_code) {
- any_set = TRUE;
- *out_error_code = g_strdup (value);
- }
+ g_hash_table_unref (form);
+ }
+ }
- value = g_hash_table_lookup (uri_query, "error_description");
+ if (!any_set && g_uri_get_fragment (uri)) {
+ GHashTable *form = soup_form_decode (g_uri_get_fragment (uri));
- if (value && *value && out_error_description) {
- any_set = TRUE;
- *out_error_description = g_strdup (value);
- }
- }
+ if (form) {
+ any_set = eos_util_extract_from_form (form, out_authorization_code, out_error_code, out_error_description);
- g_hash_table_unref (uri_query);
+ g_hash_table_unref (form);
}
}