Skip to content

Commit 198b48a

Browse files
martinpittallisonkarlitskaya
authored andcommitted
ws: Drop TLS support
That has been deprecated since 2019 when we introduced cockpit-tls in commit ace21c8. It's now getting in the way with the upcoming support for post-quantum certificates, which we'll only do in c-tls. Now the only thing that the `--no-tls` option does is to disable the TLS redirection. Part of https://issues.redhat.com/browse/COCKPIT-1330
1 parent 0f95719 commit 198b48a

File tree

7 files changed

+32
-248
lines changed

7 files changed

+32
-248
lines changed

doc/man/pages/cockpit-ws.8.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ seconds if nobody logs in, or after the last user is disconnected.
4848
*ListenStream* directive in the *cockpit.socket* file in the usual
4949
*systemd* manner.
5050
*--no-tls*::
51-
Don't use TLS.
51+
Disable http to https redirection.
5252
*--for-tls-proxy*::
5353
Tell *cockpit-ws* that it is running behind a local reverse proxy
5454
that does the TLS termination. Then Cockpit puts https:// URLs into

src/common/cockpitwebserver.c

Lines changed: 11 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,12 @@
4040

4141
#include "cockpitwebrequest-private.h"
4242

43-
/* Used during testing */
44-
gboolean cockpit_webserver_want_certificate = FALSE;
45-
4643
guint cockpit_webserver_request_timeout = 30;
4744
const gsize cockpit_webserver_request_maximum = 8192;
4845

4946
struct _CockpitWebServer {
5047
GObject parent_instance;
5148

52-
GTlsCertificate *certificate;
5349
GString *ssl_exception_prefix;
5450
GString *url_root;
5551
gint request_timeout;
@@ -67,7 +63,6 @@ struct _CockpitWebServer {
6763
enum
6864
{
6965
PROP_0,
70-
PROP_CERTIFICATE,
7166
PROP_SSL_EXCEPTION_PREFIX,
7267
PROP_FLAGS,
7368
PROP_URL_ROOT,
@@ -132,7 +127,6 @@ cockpit_web_server_finalize (GObject *object)
132127
{
133128
CockpitWebServer *server = COCKPIT_WEB_SERVER (object);
134129

135-
g_clear_object (&server->certificate);
136130
g_hash_table_destroy (server->requests);
137131
if (server->main_context)
138132
g_main_context_unref (server->main_context);
@@ -155,10 +149,6 @@ cockpit_web_server_get_property (GObject *object,
155149

156150
switch (prop_id)
157151
{
158-
case PROP_CERTIFICATE:
159-
g_value_set_object (value, server->certificate);
160-
break;
161-
162152
case PROP_SSL_EXCEPTION_PREFIX:
163153
g_value_set_string (value, server->ssl_exception_prefix->str);
164154
break;
@@ -191,10 +181,6 @@ cockpit_web_server_set_property (GObject *object,
191181

192182
switch (prop_id)
193183
{
194-
case PROP_CERTIFICATE:
195-
server->certificate = g_value_dup_object (value);
196-
break;
197-
198184
case PROP_SSL_EXCEPTION_PREFIX:
199185
g_string_assign (server->ssl_exception_prefix, g_value_get_string (value));
200186
break;
@@ -345,15 +331,6 @@ cockpit_web_server_class_init (CockpitWebServerClass *klass)
345331
gobject_class->set_property = cockpit_web_server_set_property;
346332
gobject_class->get_property = cockpit_web_server_get_property;
347333

348-
g_object_class_install_property (gobject_class,
349-
PROP_CERTIFICATE,
350-
g_param_spec_object ("certificate", NULL, NULL,
351-
G_TYPE_TLS_CERTIFICATE,
352-
G_PARAM_READABLE |
353-
G_PARAM_WRITABLE |
354-
G_PARAM_CONSTRUCT_ONLY |
355-
G_PARAM_STATIC_STRINGS));
356-
357334
g_object_class_install_property (gobject_class, PROP_SSL_EXCEPTION_PREFIX,
358335
g_param_spec_string ("ssl-exception-prefix", NULL, NULL, "",
359336
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
@@ -396,11 +373,9 @@ cockpit_web_server_class_init (CockpitWebServerClass *klass)
396373
}
397374

398375
CockpitWebServer *
399-
cockpit_web_server_new (GTlsCertificate *certificate,
400-
CockpitWebServerFlags flags)
376+
cockpit_web_server_new (CockpitWebServerFlags flags)
401377
{
402378
return g_object_new (COCKPIT_TYPE_WEB_SERVER,
403-
"certificate", certificate,
404379
"flags", flags,
405380
NULL);
406381
}
@@ -957,13 +932,6 @@ static gboolean
957932
should_suppress_request_error (GError *error,
958933
gsize received)
959934
{
960-
if (g_error_matches (error, G_TLS_ERROR, G_TLS_ERROR_EOF) ||
961-
g_error_matches (error, G_TLS_ERROR, G_TLS_ERROR_NOT_TLS))
962-
{
963-
g_debug ("request error: %s", error->message);
964-
return TRUE;
965-
}
966-
967935
/* If no bytes received, then don't worry about ECONNRESET and friends */
968936
if (received > 0)
969937
return FALSE;
@@ -1085,17 +1053,6 @@ cockpit_web_request_start_input (CockpitWebRequest *self)
10851053
g_source_attach (self->source, self->web_server->main_context);
10861054
}
10871055

1088-
static gboolean
1089-
cockpit_web_request_on_accept_certificate (GTlsConnection *conn,
1090-
GTlsCertificate *peer_cert,
1091-
GTlsCertificateFlags errors,
1092-
gpointer user_data)
1093-
{
1094-
/* Only used during testing */
1095-
g_assert (cockpit_webserver_want_certificate == TRUE);
1096-
return TRUE;
1097-
}
1098-
10991056
static gboolean
11001057
cockpit_web_request_on_socket_input (GSocket *socket,
11011058
GIOCondition condition,
@@ -1106,7 +1063,6 @@ cockpit_web_request_on_socket_input (GSocket *socket,
11061063
GInputVector vector[1] = { { &first_byte, 1 } };
11071064
gint flags = G_SOCKET_MSG_PEEK;
11081065
GError *error = NULL;
1109-
GIOStream *tls_stream;
11101066
gssize num_read;
11111067
g_auto(CockpitControlMessages) ccm = COCKPIT_CONTROL_MESSAGES_INIT;
11121068

@@ -1153,47 +1109,19 @@ cockpit_web_request_on_socket_input (GSocket *socket,
11531109

11541110
/*
11551111
* TLS streams are guaranteed to start with octet 22.. this way we can distinguish them
1156-
* from regular HTTP requests
1112+
* from regular HTTP requests. cockpit-ws no longer handles TLS.
11571113
*/
11581114
if (first_byte == 22 || first_byte == 0x80)
11591115
{
1160-
if (self->web_server->certificate == NULL)
1161-
{
1162-
g_warning ("Received unexpected TLS connection and no certificate was configured");
1163-
cockpit_web_request_finish (self);
1164-
return FALSE;
1165-
}
1166-
1167-
tls_stream = g_tls_server_connection_new (self->io,
1168-
self->web_server->certificate,
1169-
&error);
1170-
if (tls_stream == NULL)
1171-
{
1172-
g_warning ("couldn't create new TLS stream: %s", error->message);
1173-
cockpit_web_request_finish (self);
1174-
g_error_free (error);
1175-
return FALSE;
1176-
}
1177-
1178-
if (cockpit_webserver_want_certificate)
1179-
{
1180-
g_object_set (tls_stream, "authentication-mode", G_TLS_AUTHENTICATION_REQUESTED, NULL);
1181-
g_signal_connect (tls_stream, "accept-certificate", G_CALLBACK (cockpit_web_request_on_accept_certificate), NULL);
1182-
}
1183-
1184-
g_object_unref (self->io);
1185-
self->io = G_IO_STREAM (tls_stream);
1186-
}
1187-
else
1188-
{
1189-
if (self->web_server->certificate || self->web_server->flags & COCKPIT_WEB_SERVER_REDIRECT_TLS)
1190-
{
1191-
/* non-TLS stream; defer redirection check until after header parsing */
1192-
if (cockpit_web_server_get_flags (self->web_server) & COCKPIT_WEB_SERVER_REDIRECT_TLS)
1193-
self->check_tls_redirect = TRUE;
1194-
}
1116+
g_warning ("Received unexpected TLS connection; use cockpit-tls for TLS termination");
1117+
cockpit_web_request_finish (self);
1118+
return FALSE;
11951119
}
11961120

1121+
/* Defer redirection check until after header parsing */
1122+
if (cockpit_web_server_get_flags (self->web_server) & COCKPIT_WEB_SERVER_REDIRECT_TLS)
1123+
self->check_tls_redirect = TRUE;
1124+
11971125
cockpit_web_request_start_input (self);
11981126

11991127
/* No longer run *this* source */
@@ -1322,9 +1250,6 @@ cockpit_web_request_get_host (CockpitWebRequest *self)
13221250
const gchar *
13231251
cockpit_web_request_get_protocol (CockpitWebRequest *self)
13241252
{
1325-
if (G_IS_TLS_CONNECTION (self->io))
1326-
return "https";
1327-
13281253
if (self->web_server && self->web_server->flags & COCKPIT_WEB_SERVER_FOR_TLS_PROXY)
13291254
return "https";
13301255

@@ -1369,17 +1294,11 @@ cockpit_web_request_get_remote_address (CockpitWebRequest *self)
13691294
return g_strdup (tmp);
13701295
}
13711296

1372-
g_autoptr(GIOStream) base = NULL;
1373-
if (G_IS_TLS_CONNECTION (self->io))
1374-
g_object_get (self->io, "base-io-stream", &base, NULL);
1375-
else
1376-
base = g_object_ref (self->io);
1377-
13781297
/* This is definitely a socket */
1379-
g_return_val_if_fail (G_IS_SOCKET_CONNECTION (base), NULL);
1298+
g_return_val_if_fail (G_IS_SOCKET_CONNECTION (self->io), NULL);
13801299

13811300
/* ...but it might be a unix socket. NB: GInetSocketAddress includes IPv6. */
1382-
g_autoptr(GSocketAddress) remote = g_socket_connection_get_remote_address (G_SOCKET_CONNECTION (base), NULL);
1301+
g_autoptr(GSocketAddress) remote = g_socket_connection_get_remote_address (G_SOCKET_CONNECTION (self->io), NULL);
13831302
if (remote && G_IS_INET_SOCKET_ADDRESS (remote))
13841303
return g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (remote)));
13851304

src/common/cockpitwebserver.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ typedef enum {
9090
} CockpitWebServerFlags;
9191

9292

93-
CockpitWebServer * cockpit_web_server_new (GTlsCertificate *certificate,
94-
CockpitWebServerFlags flags);
93+
CockpitWebServer * cockpit_web_server_new (CockpitWebServerFlags flags);
9594

9695
void cockpit_web_server_start (CockpitWebServer *self);
9796

src/common/test-webserver.c

Lines changed: 7 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -75,26 +75,16 @@ static void
7575
fixture_setup (Fixture *fixture,
7676
const TestCase *test_case)
7777
{
78-
GTlsCertificate *cert = NULL;
79-
GError *error = NULL;
8078
GInetAddress *inet;
8179
gchar *str = NULL;
8280
gint port;
81+
GError *error = NULL;
8382

8483
inet = cockpit_test_find_non_loopback_address ();
8584
/* this can fail in environments with only localhost */
8685
if (inet != NULL)
8786
str = g_inet_address_to_string (inet);
8887

89-
if (test_case->use_cert)
90-
{
91-
cert = g_tls_certificate_new_from_file (SRCDIR "/src/ws/mock-combined.crt", &error);
92-
g_assert_no_error (error);
93-
94-
/* don't require system SSL cert database in build environments */
95-
cockpit_expect_possible_log ("GLib-Net", G_LOG_LEVEL_WARNING, "couldn't load TLS file database: * No such file or directory");
96-
}
97-
9888
gchar *address;
9989
if (test_case->local_only)
10090
address = "127.0.0.1";
@@ -103,8 +93,7 @@ fixture_setup (Fixture *fixture,
10393
else
10494
address = NULL;
10595

106-
fixture->web_server = cockpit_web_server_new (cert, test_case->server_flags);
107-
g_clear_object (&cert);
96+
fixture->web_server = cockpit_web_server_new (test_case->server_flags);
10897

10998
if (test_case && test_case->forwarded_for_header)
11099
cockpit_web_server_set_forwarded_for_header (fixture->web_server, test_case->forwarded_for_header);
@@ -470,14 +459,6 @@ perform_http_request (const gchar *hostport,
470459
return perform_request (hostport, request, length, FALSE);
471460
}
472461

473-
static gchar *
474-
perform_https_request (const gchar *hostport,
475-
const gchar *request,
476-
gsize *length)
477-
{
478-
return perform_request (hostport, request, length, TRUE);
479-
}
480-
481462
static gboolean
482463
on_shell_index_html (CockpitWebServer *server,
483464
CockpitWebRequest *request,
@@ -534,81 +515,7 @@ test_webserver_not_found (Fixture *fixture,
534515
g_free (resp);
535516
}
536517

537-
static void
538-
test_webserver_tls (Fixture *fixture,
539-
const TestCase *test_case)
540-
{
541-
gchar *resp;
542-
gsize length;
543-
544-
g_signal_connect (fixture->web_server, "handle-resource", G_CALLBACK (on_shell_index_html), NULL);
545-
resp = perform_https_request (fixture->localport, "GET /shell/index.html HTTP/1.0\r\nHost:test\r\n\r\n", &length);
546-
g_assert (resp != NULL);
547-
g_assert_cmpuint (length, >, 0);
548518

549-
cockpit_assert_strmatch (resp, "HTTP/* 200 *\r\nContent-Length: *\r\n\r\n<!DOCTYPE html>*");
550-
g_free (resp);
551-
}
552-
553-
static gboolean
554-
on_big_header (CockpitWebServer *server,
555-
CockpitWebRequest *request,
556-
const gchar *path,
557-
GHashTable *headers,
558-
CockpitWebResponse *response,
559-
gpointer user_data)
560-
{
561-
GBytes *bytes;
562-
const gchar *big_header;
563-
564-
big_header = g_hash_table_lookup (headers, "BigHeader");
565-
g_assert (big_header);
566-
g_assert_cmpint (strlen (big_header), ==, 7000);
567-
g_assert_cmpint (big_header[strlen (big_header) - 1], ==, '1');
568-
569-
bytes = g_bytes_new_static ("OK", 2);
570-
cockpit_web_response_content (response, NULL, bytes, NULL);
571-
g_bytes_unref (bytes);
572-
return TRUE;
573-
}
574-
575-
static void
576-
test_webserver_tls_big_header (Fixture *fixture,
577-
const TestCase *test_case)
578-
{
579-
g_autofree gchar *req = NULL;
580-
g_autofree gchar *resp = NULL;
581-
gsize length;
582-
583-
/* max request size is 8KiB (2 * cockpit_webserver_request_maximum), stay slightly below that */
584-
req = g_strdup_printf ("GET /test HTTP/1.0\r\nHost:test\r\nBigHeader: %07000i\r\n\r\n", 1);
585-
586-
g_signal_connect (fixture->web_server, "handle-resource", G_CALLBACK (on_big_header), NULL);
587-
resp = perform_https_request (fixture->localport, req, &length);
588-
g_assert (resp != NULL);
589-
g_assert_cmpuint (length, >, 0);
590-
591-
cockpit_assert_strmatch (resp, "HTTP/* 200 *\r\nContent-Length: 2\r\n*\r\n\r\nOK");
592-
}
593-
594-
static void
595-
test_webserver_tls_request_too_large (Fixture *fixture,
596-
const TestCase *test_case)
597-
{
598-
g_autofree gchar *req = NULL;
599-
g_autofree gchar *resp = NULL;
600-
gsize length;
601-
602-
/* request bigger than 16 KiB should be rejected */
603-
/* FIXME: This really should be 8 KiB, but due to pipelining we reserve twice
604-
* that amount in the buffer */
605-
cockpit_expect_log ("cockpit-protocol", G_LOG_LEVEL_MESSAGE, "received HTTP request that was too large");
606-
req = g_strdup_printf ("GET /test HTTP/1.0\r\nHost:test\r\nBigHeader: %016500i\r\n\r\n", 1);
607-
resp = perform_https_request (fixture->localport, req, &length);
608-
g_assert (resp != NULL);
609-
g_assert_cmpuint (length, ==, 0);
610-
g_assert_cmpstr (resp, ==, "");
611-
}
612519

613520
static void
614521
test_webserver_redirect_notls (Fixture *fixture,
@@ -1008,7 +915,7 @@ test_bad_address (Fixture *fixture,
1008915
{
1009916
gint port;
1010917

1011-
g_autoptr(CockpitWebServer) server = cockpit_web_server_new (NULL, COCKPIT_WEB_SERVER_NONE);
918+
g_autoptr(CockpitWebServer) server = cockpit_web_server_new (COCKPIT_WEB_SERVER_NONE);
1012919
g_autoptr(GError) error = NULL;
1013920
port = cockpit_web_server_add_inet_listener (server, "bad", 0, &error);
1014921
g_assert (port == 0);
@@ -1072,20 +979,13 @@ main (int argc,
1072979
cockpit_test_add ("/web-server/host-header", test_webserver_host_header);
1073980
cockpit_test_add ("/web-server/not-found", test_webserver_not_found);
1074981

1075-
cockpit_test_add ("/web-server/tls", test_webserver_tls,
1076-
.use_cert=TRUE, .expected_protocol="https");
1077-
cockpit_test_add ("/web-server/tls-big-header", test_webserver_tls_big_header,
1078-
.use_cert=TRUE, .expected_protocol="https");
1079-
cockpit_test_add ("/web-server/tls-request-too-large", test_webserver_tls_request_too_large,
1080-
.use_cert=TRUE, .expected_protocol="https");
1081-
1082-
cockpit_test_add ("/web-server/redirect-notls", test_webserver_redirect_notls, .use_cert=TRUE,
982+
cockpit_test_add ("/web-server/redirect-notls", test_webserver_redirect_notls,
1083983
.server_flags=COCKPIT_WEB_SERVER_REDIRECT_TLS);
1084-
cockpit_test_add ("/web-server/no-redirect-localhost", test_webserver_noredirect_localhost, .use_cert=TRUE,
984+
cockpit_test_add ("/web-server/no-redirect-localhost", test_webserver_noredirect_localhost,
1085985
.server_flags=COCKPIT_WEB_SERVER_REDIRECT_TLS);
1086-
cockpit_test_add ("/web-server/no-redirect-exception", test_webserver_noredirect_exception, .use_cert=TRUE,
986+
cockpit_test_add ("/web-server/no-redirect-exception", test_webserver_noredirect_exception,
1087987
.server_flags=COCKPIT_WEB_SERVER_REDIRECT_TLS);
1088-
cockpit_test_add ("/web-server/no-redirect-override", test_webserver_noredirect_override, .use_cert=TRUE,
988+
cockpit_test_add ("/web-server/no-redirect-override", test_webserver_noredirect_override,
1089989
.server_flags=COCKPIT_WEB_SERVER_NONE);
1090990

1091991
cockpit_test_add ("/web-server/handle-resource", test_handle_resource);

0 commit comments

Comments
 (0)