blob: 36f224acfd7be84fca14b65e3538a4d72fadc7dc (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
#pragma once
#include <string>
#include <queue>
#include <spdlog/logger.h>
#include "ssl.hpp"
#include "discord/waiter.hpp"
#include "discord/websocket.hpp"
class RemoteAuthClient {
public:
RemoteAuthClient();
~RemoteAuthClient();
void Start();
void Stop();
[[nodiscard]] bool IsConnected() const noexcept;
private:
void OnGatewayMessage(const std::string &str);
void HandleGatewayHello(const nlohmann::json &j);
void HandleGatewayNonceProof(const nlohmann::json &j);
void HandleGatewayPendingRemoteInit(const nlohmann::json &j);
void HandleGatewayPendingTicket(const nlohmann::json &j);
void HandleGatewayPendingLogin(const nlohmann::json &j);
void OnRemoteAuthLoginResponse(const std::optional<std::string> &encrypted_token, DiscordError err);
void Init();
void GenerateKey();
std::string GetEncodedPublicKey() const;
std::vector<uint8_t> Decrypt(const unsigned char *in, size_t inlen) const;
void OnWebsocketOpen();
void OnWebsocketClose(const ix::WebSocketCloseInfo &info);
void OnWebsocketMessage(const std::string &str);
void HeartbeatThread();
int m_heartbeat_msec;
Waiter m_heartbeat_waiter;
std::thread m_heartbeat_thread;
Glib::Dispatcher m_dispatcher;
std::queue<std::string> m_dispatch_queue;
std::mutex m_dispatch_mutex;
void OnDispatch();
bool OnTimeout();
sigc::connection m_timeout_conn;
Websocket m_ws;
bool m_connected = false;
std::shared_ptr<spdlog::logger> m_log;
EVP_PKEY_CTX_ptr m_pkey_ctx;
EVP_PKEY_CTX_ptr m_dec_ctx;
EVP_PKEY_ptr m_pkey;
public:
using type_signal_hello = sigc::signal<void()>;
using type_signal_fingerprint = sigc::signal<void(std::string)>;
using type_signal_pending_ticket = sigc::signal<void(Snowflake, std::string, std::string, std::string)>;
using type_signal_pending_login = sigc::signal<void()>;
using type_signal_token = sigc::signal<void(std::string)>;
using type_signal_error = sigc::signal<void(std::string)>;
type_signal_hello signal_hello();
type_signal_fingerprint signal_fingerprint();
type_signal_pending_ticket signal_pending_ticket();
type_signal_pending_login signal_pending_login();
type_signal_token signal_token();
type_signal_error signal_error();
private:
type_signal_hello m_signal_hello;
type_signal_fingerprint m_signal_fingerprint;
type_signal_pending_ticket m_signal_pending_ticket;
type_signal_pending_login m_signal_pending_login;
type_signal_token m_signal_token;
type_signal_error m_signal_error;
};
|