1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 21:07:35 +00:00

ProtocolServer+LibTLS: Pipe certificate requests from LibTLS to clients

This makes gemini.circumlunar.space (and some more gemini pages) work
again :^)
This commit is contained in:
AnotherTest 2020-08-02 05:27:42 +04:30 committed by Andreas Kling
parent 9d3ffa096a
commit 97256ad977
22 changed files with 161 additions and 3 deletions

View file

@ -111,6 +111,11 @@ void ClientConnection::did_progress_download(Badge<Download>, Download& download
post_message(Messages::ProtocolClient::DownloadProgress(download.id(), download.total_size(), download.downloaded_size()));
}
void ClientConnection::did_request_certificates(Badge<Download>, Download& download)
{
post_message(Messages::ProtocolClient::CertificateRequested(download.id()));
}
OwnPtr<Messages::ProtocolServer::GreetResponse> ClientConnection::handle(const Messages::ProtocolServer::Greet&)
{
return make<Messages::ProtocolServer::GreetResponse>(client_id());
@ -122,4 +127,15 @@ OwnPtr<Messages::ProtocolServer::DisownSharedBufferResponse> ClientConnection::h
return make<Messages::ProtocolServer::DisownSharedBufferResponse>();
}
OwnPtr<Messages::ProtocolServer::SetCertificateResponse> ClientConnection::handle(const Messages::ProtocolServer::SetCertificate& message)
{
auto* download = const_cast<Download*>(m_downloads.get(message.download_id()).value_or(nullptr));
bool success = false;
if (download) {
download->set_certificate(message.certificate(), message.key());
success = true;
}
return make<Messages::ProtocolServer::SetCertificateResponse>(success);
}
}

View file

@ -28,8 +28,8 @@
#include <AK/HashMap.h>
#include <LibIPC/ClientConnection.h>
#include <ProtocolServer/ProtocolServerEndpoint.h>
#include <ProtocolServer/Forward.h>
#include <ProtocolServer/ProtocolServerEndpoint.h>
namespace ProtocolServer {
@ -46,6 +46,7 @@ public:
void did_finish_download(Badge<Download>, Download&, bool success);
void did_progress_download(Badge<Download>, Download&);
void did_request_certificates(Badge<Download>, Download&);
private:
virtual OwnPtr<Messages::ProtocolServer::GreetResponse> handle(const Messages::ProtocolServer::Greet&) override;
@ -53,6 +54,7 @@ private:
virtual OwnPtr<Messages::ProtocolServer::StartDownloadResponse> handle(const Messages::ProtocolServer::StartDownload&) override;
virtual OwnPtr<Messages::ProtocolServer::StopDownloadResponse> handle(const Messages::ProtocolServer::StopDownload&) override;
virtual OwnPtr<Messages::ProtocolServer::DisownSharedBufferResponse> handle(const Messages::ProtocolServer::DisownSharedBuffer&) override;
virtual OwnPtr<Messages::ProtocolServer::SetCertificateResponse> handle(const Messages::ProtocolServer::SetCertificate&);
HashMap<i32, OwnPtr<Download>> m_downloads;
HashMap<i32, RefPtr<AK::SharedBuffer>> m_shared_buffers;

View file

@ -25,8 +25,8 @@
*/
#include <AK/Badge.h>
#include <ProtocolServer/Download.h>
#include <ProtocolServer/ClientConnection.h>
#include <ProtocolServer/Download.h>
namespace ProtocolServer {
@ -59,6 +59,10 @@ void Download::set_response_headers(const HashMap<String, String, CaseInsensitiv
m_response_headers = response_headers;
}
void Download::set_certificate(String, String)
{
}
void Download::did_finish(bool success)
{
m_client.did_finish_download({}, *this, success);
@ -71,4 +75,9 @@ void Download::did_progress(Optional<u32> total_size, u32 downloaded_size)
m_client.did_progress_download({}, *this);
}
void Download::did_request_certificates()
{
m_client.did_request_certificates({}, *this);
}
}

View file

@ -49,6 +49,7 @@ public:
const HashMap<String, String, CaseInsensitiveStringTraits>& response_headers() const { return m_response_headers; }
void stop();
virtual void set_certificate(String, String);
protected:
explicit Download(ClientConnection&);
@ -56,6 +57,7 @@ protected:
void did_finish(bool success);
void did_progress(Optional<u32> total_size, u32 downloaded_size);
void set_status_code(u32 status_code) { m_status_code = status_code; }
void did_request_certificates();
void set_payload(const ByteBuffer&);
void set_response_headers(const HashMap<String, String, CaseInsensitiveStringTraits>&);

View file

@ -31,7 +31,9 @@ namespace ProtocolServer {
class ClientConnection;
class Download;
class GeminiProtocol;
class HttpDownload;
class HttpProtocol;
class HttpsDownload;
class HttpsProtocol;
class Protocol;

View file

@ -59,6 +59,14 @@ GeminiDownload::GeminiDownload(ClientConnection& client, NonnullRefPtr<Gemini::G
m_job->on_progress = [this](Optional<u32> total, u32 current) {
did_progress(total, current);
};
m_job->on_certificate_requested = [this](auto&) {
did_request_certificates();
};
}
void GeminiDownload::set_certificate(String certificate, String key)
{
m_job->set_certificate(move(certificate), move(key));
}
GeminiDownload::~GeminiDownload()

View file

@ -41,6 +41,8 @@ public:
private:
explicit GeminiDownload(ClientConnection&, NonnullRefPtr<Gemini::GeminiJob>);
virtual void set_certificate(String certificate, String key) override;
NonnullRefPtr<Gemini::GeminiJob> m_job;
};

View file

@ -51,6 +51,14 @@ HttpsDownload::HttpsDownload(ClientConnection& client, NonnullRefPtr<HTTP::Https
m_job->on_progress = [this](Optional<u32> total, u32 current) {
did_progress(total, current);
};
m_job->on_certificate_requested = [this](auto&) {
did_request_certificates();
};
}
void HttpsDownload::set_certificate(String certificate, String key)
{
m_job->set_certificate(move(certificate), move(key));
}
HttpsDownload::~HttpsDownload()

View file

@ -41,6 +41,8 @@ public:
private:
explicit HttpsDownload(ClientConnection&, NonnullRefPtr<HTTP::HttpsJob>);
virtual void set_certificate(String certificate, String key) override;
NonnullRefPtr<HTTP::HttpsJob> m_job;
};

View file

@ -3,4 +3,7 @@ endpoint ProtocolClient = 13
// Download notifications
DownloadProgress(i32 download_id, Optional<u32> total_size, u32 downloaded_size) =|
DownloadFinished(i32 download_id, bool success, Optional<u32> status_code, u32 total_size, i32 shbuf_id, IPC::Dictionary response_headers) =|
// Certificate requests
CertificateRequested(i32 download_id) => ()
}

View file

@ -12,4 +12,5 @@ endpoint ProtocolServer = 9
// Download API
StartDownload(URL url, IPC::Dictionary request_headers) => (i32 download_id)
StopDownload(i32 download_id) => (bool success)
SetCertificate(i32 download_id, String certificate, String key) => (bool success)
}