Port to libsoup3

This commit is contained in:
Milan Crha
2022-06-22 08:51:30 -03:00
committed by Georges Basile Stavracas Neto
parent 0fa383a14a
commit 0bd11799dc
10 changed files with 161 additions and 140 deletions
+44 -42
View File
@@ -30,7 +30,7 @@ struct _GcalSimpleServer
GThread *thread;
GMainLoop *thread_mainloop;
SoupServer *server;
gchar *uri;
GUri *uri;
GMutex running_mutex;
GCond running_cond;
@@ -45,7 +45,7 @@ G_DEFINE_TYPE (GcalSimpleServer, gcal_simple_server, G_TYPE_OBJECT)
*/
static void
process_get (SoupMessage *message,
process_get (SoupServerMessage *message,
const gchar *prefix,
const gchar *path)
{
@@ -55,16 +55,16 @@ process_get (SoupMessage *message,
if (g_strcmp0 (path, calendar_path) == 0)
{
g_debug ("Serving empty calendar");
soup_message_set_response (message,
"text/calendar",
SOUP_MEMORY_STATIC,
GCAL_TEST_SERVER_EMPTY_CALENDAR,
strlen (GCAL_TEST_SERVER_EMPTY_CALENDAR));
soup_server_message_set_response (message,
"text/calendar",
SOUP_MEMORY_STATIC,
GCAL_TEST_SERVER_EMPTY_CALENDAR,
strlen (GCAL_TEST_SERVER_EMPTY_CALENDAR));
}
if (g_strcmp0 (path, calendar_file) == 0)
{
g_autoptr (SoupBuffer) buffer = NULL;
g_autoptr (GBytes) bytes = NULL;
GMappedFile *mapping;
g_debug ("Serving calendar.ics");
@@ -72,20 +72,20 @@ process_get (SoupMessage *message,
mapping = g_mapped_file_new (path, FALSE, NULL);
if (!mapping)
{
soup_message_set_status (message, SOUP_STATUS_INTERNAL_SERVER_ERROR);
soup_server_message_set_status (message, SOUP_STATUS_INTERNAL_SERVER_ERROR, NULL);
return;
}
buffer = soup_buffer_new_with_owner (g_mapped_file_get_contents (mapping),
g_mapped_file_get_length (mapping),
mapping,
(GDestroyNotify)g_mapped_file_unref);
soup_message_body_append_buffer (message->response_body, buffer);
bytes = g_bytes_new_with_free_func (g_mapped_file_get_contents (mapping),
g_mapped_file_get_length (mapping),
(GDestroyNotify)g_mapped_file_unref,
mapping);
soup_message_body_append_bytes (soup_server_message_get_response_body (message), bytes);
}
}
static void
process_caldav (SoupMessage *message,
process_caldav (SoupServerMessage *message,
const gchar *path)
{
g_debug ("Processing CalDAV request");
@@ -108,46 +108,44 @@ idle_quit_server_cb (gpointer user_data)
static void
no_auth_handler_cb (SoupServer *server,
SoupMessage *message,
SoupServerMessage *message,
const gchar *path,
GHashTable *query,
SoupClientContext *client,
gpointer user_data)
{
g_debug ("No authenticaton needed");
if (message->method == SOUP_METHOD_GET)
if (g_strcmp0 (soup_server_message_get_method (message), SOUP_METHOD_GET) == 0)
process_get (message, "/public", path);
else if (message->method == SOUP_METHOD_PROPFIND)
else if (g_strcmp0 (soup_server_message_get_method (message), SOUP_METHOD_PROPFIND) == 0)
process_caldav (message, path);
else
soup_message_set_status (message, SOUP_STATUS_NOT_IMPLEMENTED);
soup_server_message_set_status (message, SOUP_STATUS_NOT_IMPLEMENTED, NULL);
}
static void
auth_handler_cb (SoupServer *server,
SoupMessage *message,
SoupServerMessage *message,
const gchar *path,
GHashTable *query,
SoupClientContext *client,
gpointer user_data)
{
g_debug ("Needs authenticaton");
if (message->method == SOUP_METHOD_GET)
if (g_strcmp0 (soup_server_message_get_method (message), SOUP_METHOD_GET) == 0)
process_get (message, "/secret-area", path);
else if (message->method == SOUP_METHOD_PROPFIND)
else if (g_strcmp0 (soup_server_message_get_method (message), SOUP_METHOD_PROPFIND) == 0)
process_caldav (message, path);
else
soup_message_set_status (message, SOUP_STATUS_NOT_IMPLEMENTED);
soup_server_message_set_status (message, SOUP_STATUS_NOT_IMPLEMENTED, NULL);
}
static gboolean
authorize_cb (SoupAuthDomain *domain,
SoupMessage *message,
const char *username,
const char *password,
gpointer user_data)
authorize_cb (SoupAuthDomain *domain,
SoupServerMessage *message,
const char *username,
const char *password,
gpointer user_data)
{
const struct {
const gchar *username;
@@ -183,7 +181,7 @@ run_server_in_thread (gpointer data)
g_autoptr (GMainContext) context = NULL;
g_autoptr (SoupServer) server = NULL;
g_autoptr (GMainLoop) mainloop = NULL;
g_autoslist (SoupURI) uris = NULL;
g_autoslist (GUri) uris = NULL;
g_autoptr (GError) error = NULL;
GcalSimpleServer *self = data;
g_autofree gchar *uri = NULL;
@@ -193,15 +191,15 @@ run_server_in_thread (gpointer data)
mainloop = g_main_loop_new (context, FALSE);
self->thread_mainloop = mainloop;
server = soup_server_new (SOUP_SERVER_SERVER_HEADER, "gcal-simple-server",
server = soup_server_new ("server-header", "gcal-simple-server",
NULL);
/* Anything under /secret-area and /private requires authentication */
domain = soup_auth_domain_basic_new (SOUP_AUTH_DOMAIN_REALM, "GcalSimpleServer",
SOUP_AUTH_DOMAIN_BASIC_AUTH_CALLBACK, authorize_cb,
SOUP_AUTH_DOMAIN_BASIC_AUTH_DATA, self,
SOUP_AUTH_DOMAIN_ADD_PATH, "/secret-area",
domain = soup_auth_domain_basic_new ("realm", "GcalSimpleServer",
"auth-callback", authorize_cb,
"auth-data", self,
NULL);
soup_auth_domain_add_path (domain, "/secret-area");
soup_server_add_auth_domain (server, domain);
soup_server_listen_local (server, 0, SOUP_SERVER_LISTEN_IPV4_ONLY, &error);
@@ -218,8 +216,8 @@ run_server_in_thread (gpointer data)
uris = soup_server_get_uris (server);
g_assert_cmpint (g_slist_length (uris), ==, 1);
uri = soup_uri_to_string (uris->data, FALSE);
self->uri = g_strdup (uri);
self->uri = g_uri_ref (uris->data);
uri = g_uri_to_string_partial (self->uri, G_URI_HIDE_PASSWORD);
g_debug ("Listening on %s", uri);
@@ -252,7 +250,7 @@ gcal_simple_server_finalize (GObject *object)
if (self->thread)
gcal_simple_server_stop (self);
g_clear_pointer (&self->uri, g_free);
g_clear_pointer (&self->uri, g_uri_unref);
G_OBJECT_CLASS (gcal_simple_server_parent_class)->finalize (object);
}
@@ -299,6 +297,7 @@ void
gcal_simple_server_stop (GcalSimpleServer *self)
{
GMainContext *context;
g_autoptr (GSource) source;
g_return_if_fail (GCAL_IS_SIMPLE_SERVER (self));
@@ -309,7 +308,10 @@ gcal_simple_server_stop (GcalSimpleServer *self)
}
context = g_main_loop_get_context (self->thread_mainloop);
soup_add_completion (context, idle_quit_server_cb, self);
source = g_idle_source_new ();
g_source_set_priority (source, G_PRIORITY_DEFAULT);
g_source_set_callback (source, idle_quit_server_cb, self, NULL);
g_source_attach (source, context);
g_mutex_lock (&self->running_mutex);
self->running = FALSE;
@@ -320,11 +322,11 @@ gcal_simple_server_stop (GcalSimpleServer *self)
self->thread = NULL;
}
SoupURI*
GUri*
gcal_simple_server_get_uri (GcalSimpleServer *self)
{
g_return_val_if_fail (GCAL_IS_SIMPLE_SERVER (self), NULL);
g_return_val_if_fail (self->thread != NULL, NULL);
return soup_uri_new (self->uri);
return g_uri_ref (self->uri);
}
+1 -1
View File
@@ -40,6 +40,6 @@ void gcal_simple_server_start (GcalSimpleServ
void gcal_simple_server_stop (GcalSimpleServer *self);
SoupURI* gcal_simple_server_get_uri (GcalSimpleServer *self);
GUri* gcal_simple_server_get_uri (GcalSimpleServer *self);
G_END_DECLS
+9 -9
View File
@@ -59,14 +59,14 @@ discoverer_file (void)
{
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (GMainLoop) mainloop = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GUri) uri = NULL;
g_autofree gchar *uri_str = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/public/calendar");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/public/calendar");
uri_str = soup_uri_to_string (uri, FALSE);
uri_str = g_uri_to_string_partial (uri, G_URI_HIDE_PASSWORD);
mainloop = g_main_loop_new (NULL, FALSE);
@@ -104,14 +104,14 @@ discoverer_webdav_unauthorized (void)
{
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (GMainLoop) mainloop = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GUri) uri = NULL;
g_autofree gchar *uri_str = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/secret-area/calendar");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area/calendar");
uri_str = soup_uri_to_string (uri, FALSE);
uri_str = g_uri_to_string_partial (uri, G_URI_HIDE_PASSWORD);
mainloop = g_main_loop_new (NULL, FALSE);
@@ -149,14 +149,14 @@ discoverer_webdav_auth (void)
{
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (GMainLoop) mainloop = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GUri) uri = NULL;
g_autofree gchar *uri_str = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/secret-area/dav");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area/dav");
uri_str = soup_uri_to_string (uri, FALSE);
uri_str = g_uri_to_string_partial (uri, G_URI_HIDE_PASSWORD);
mainloop = g_main_loop_new (NULL, FALSE);
+60 -39
View File
@@ -19,6 +19,7 @@
*/
#include <libsoup/soup.h>
#include <libedataserver/libedataserver.h>
#include "gcal-simple-server.h"
@@ -33,9 +34,8 @@ init_server (void)
return g_steal_pointer (&server);
}
static void
fail_authenticate_cb (SoupSession *session,
SoupMessage *message,
static gboolean
fail_authenticate_cb (SoupMessage *message,
SoupAuth *auth,
gboolean retrying,
gpointer user_data)
@@ -45,11 +45,12 @@ fail_authenticate_cb (SoupSession *session,
gcal_simple_server_stop (server);
g_assert_not_reached ();
return TRUE;
}
static void
authenticate_cb (SoupSession *session,
SoupMessage *message,
static gboolean
authenticate_cb (SoupMessage *message,
SoupAuth *auth,
gboolean retrying,
gpointer user_data)
@@ -57,19 +58,24 @@ authenticate_cb (SoupSession *session,
g_debug ("Authenticating...");
soup_auth_authenticate (auth, "unicorn", "iamnotahorse");
return TRUE;
}
static void
wrong_authenticate_cb (SoupSession *session,
SoupMessage *message,
static gboolean
wrong_authenticate_cb (SoupMessage *message,
SoupAuth *auth,
gboolean retrying,
gpointer user_data)
{
g_debug ("Authenticating with wrong username...");
if (!retrying)
soup_auth_authenticate (auth, "thyartismurder", "popmusic");
if (retrying)
return FALSE;
soup_auth_authenticate (auth, "thyartismurder", "popmusic");
return TRUE;
}
/*********************************************************************************************************************/
@@ -91,18 +97,20 @@ server_request_no_auth_empty (void)
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (SoupMessage) message = NULL;
g_autoptr (SoupSession) session = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GInputStream) input_stream = NULL;
g_autoptr (GUri) uri = NULL;
g_autoptr (GError) error = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
session = soup_session_new ();
g_signal_connect (session, "authenticate", G_CALLBACK (fail_authenticate_cb), server);
message = soup_message_new_from_uri ("GET", uri);
soup_session_send (session, message, NULL, &error);
g_signal_connect (message, "authenticate", G_CALLBACK (fail_authenticate_cb), server);
input_stream = soup_session_send (session, message, NULL, &error);
g_assert_no_error (error);
g_assert_nonnull (input_stream);
}
/*********************************************************************************************************************/
@@ -113,19 +121,21 @@ server_request_no_auth_ics (void)
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (SoupMessage) message = NULL;
g_autoptr (SoupSession) session = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GInputStream) input_stream = NULL;
g_autoptr (GUri) uri = NULL;
g_autoptr (GError) error = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/public/calendar.ics");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/public/calendar.ics");
session = soup_session_new ();
g_signal_connect (session, "authenticate", G_CALLBACK (fail_authenticate_cb), server);
message = soup_message_new_from_uri ("GET", uri);
soup_session_send (session, message, NULL, &error);
g_signal_connect (message, "authenticate", G_CALLBACK (fail_authenticate_cb), server);
input_stream = soup_session_send (session, message, NULL, &error);
g_assert_no_error (error);
g_assert_nonnull (input_stream);
}
/*********************************************************************************************************************/
@@ -136,19 +146,21 @@ server_request_no_auth_calendar (void)
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (SoupMessage) message = NULL;
g_autoptr (SoupSession) session = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GInputStream) input_stream = NULL;
g_autoptr (GUri) uri = NULL;
g_autoptr (GError) error = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/public/calendar");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/public/calendar");
session = soup_session_new ();
g_signal_connect (session, "authenticate", G_CALLBACK (fail_authenticate_cb), server);
message = soup_message_new_from_uri ("GET", uri);
soup_session_send (session, message, NULL, &error);
g_signal_connect (message, "authenticate", G_CALLBACK (fail_authenticate_cb), server);
input_stream = soup_session_send (session, message, NULL, &error);
g_assert_no_error (error);
g_assert_nonnull (input_stream);
}
/*********************************************************************************************************************/
@@ -159,19 +171,21 @@ server_request_auth_empty (void)
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (SoupMessage) message = NULL;
g_autoptr (SoupSession) session = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GInputStream) input_stream = NULL;
g_autoptr (GUri) uri = NULL;
g_autoptr (GError) error = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/secret-area");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area");
session = soup_session_new ();
g_signal_connect (session, "authenticate", G_CALLBACK (authenticate_cb), server);
message = soup_message_new_from_uri ("GET", uri);
soup_session_send (session, message, NULL, &error);
g_signal_connect (message, "authenticate", G_CALLBACK (authenticate_cb), server);
input_stream = soup_session_send (session, message, NULL, &error);
g_assert_no_error (error);
g_assert_nonnull (input_stream);
}
/*********************************************************************************************************************/
@@ -182,19 +196,21 @@ server_request_auth_calendar (void)
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (SoupMessage) message = NULL;
g_autoptr (SoupSession) session = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GInputStream) input_stream = NULL;
g_autoptr (GUri) uri = NULL;
g_autoptr (GError) error = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/secret-area/calendar");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area/calendar");
session = soup_session_new ();
g_signal_connect (session, "authenticate", G_CALLBACK (authenticate_cb), server);
message = soup_message_new_from_uri ("GET", uri);
soup_session_send (session, message, NULL, &error);
g_signal_connect (message, "authenticate", G_CALLBACK (authenticate_cb), server);
input_stream = soup_session_send (session, message, NULL, &error);
g_assert_no_error (error);
g_assert_nonnull (input_stream);
}
/*********************************************************************************************************************/
@@ -205,19 +221,21 @@ server_request_auth_ics (void)
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (SoupMessage) message = NULL;
g_autoptr (SoupSession) session = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GInputStream) input_stream = NULL;
g_autoptr (GUri) uri = NULL;
g_autoptr (GError) error = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/secret-area/calendar.ics");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area/calendar.ics");
session = soup_session_new ();
g_signal_connect (session, "authenticate", G_CALLBACK (authenticate_cb), server);
message = soup_message_new_from_uri ("GET", uri);
soup_session_send (session, message, NULL, &error);
g_signal_connect (message, "authenticate", G_CALLBACK (authenticate_cb), server);
input_stream = soup_session_send (session, message, NULL, &error);
g_assert_no_error (error);
g_assert_nonnull (input_stream);
}
/*********************************************************************************************************************/
@@ -228,20 +246,23 @@ server_request_auth_wrong (void)
g_autoptr (GcalSimpleServer) server = NULL;
g_autoptr (SoupMessage) message = NULL;
g_autoptr (SoupSession) session = NULL;
g_autoptr (SoupURI) uri = NULL;
g_autoptr (GInputStream) input_stream = NULL;
g_autoptr (GUri) uri = NULL;
g_autoptr (GError) error = NULL;
server = init_server ();
uri = gcal_simple_server_get_uri (server);
soup_uri_set_path (uri, "/secret-area");
e_util_change_uri_component (&uri, SOUP_URI_PATH, "/secret-area");
session = soup_session_new ();
g_signal_connect (session, "authenticate", G_CALLBACK (wrong_authenticate_cb), server);
message = soup_message_new_from_uri ("GET", uri);
soup_session_send (session, message, NULL, &error);
g_signal_connect (message, "authenticate", G_CALLBACK (wrong_authenticate_cb), server);
input_stream = soup_session_send (session, message, NULL, &error);
g_assert_no_error (error);
g_assert_cmpuint (message->status_code, ==, SOUP_STATUS_UNAUTHORIZED);
g_assert_nonnull (input_stream);
g_assert_cmpuint (soup_message_get_status (message), ==, SOUP_STATUS_UNAUTHORIZED);
}
/*********************************************************************************************************************/