Sunshine v2025.118.151840
Self-hosted game stream host for Moonlight.
nvhttp.h
Go to the documentation of this file.
1
5// macros
6#pragma once
7
8// standard includes
9#include <string>
10
11// lib includes
12#include <Simple-Web-Server/server_https.hpp>
13#include <boost/property_tree/ptree.hpp>
14
15// local includes
16#include "crypto.h"
17#include "thread_safe.h"
18
22namespace nvhttp {
23
29 constexpr auto VERSION = "7.1.431.-1";
30
34 constexpr auto GFE_VERSION = "3.23.0.74";
35
39 constexpr auto PORT_HTTP = 0;
40
44 constexpr auto PORT_HTTPS = -5;
45
52 void
53 start();
54
60 void
61 setup(const std::string &pkey, const std::string &cert);
62
63 class SunshineHTTPS: public SimpleWeb::HTTPS {
64 public:
65 SunshineHTTPS(boost::asio::io_context &io_context, boost::asio::ssl::context &ctx):
66 SimpleWeb::HTTPS(io_context, ctx) {}
67
68 virtual ~SunshineHTTPS() {
69 // Gracefully shutdown the TLS connection
70 SimpleWeb::error_code ec;
71 shutdown(ec);
72 }
73 };
74
82
84 struct {
85 std::string uniqueID = {};
86 std::string cert = {};
87 std::string name = {};
88 } client;
89
90 std::unique_ptr<crypto::aes_t> cipher_key = {};
91 std::vector<uint8_t> clienthash = {};
92
93 std::string serversecret = {};
94 std::string serverchallenge = {};
95
96 struct {
98 std::shared_ptr<typename SimpleWeb::ServerBase<SimpleWeb::HTTP>::Response>,
99 std::shared_ptr<typename SimpleWeb::ServerBase<SunshineHTTPS>::Response>>
100 response;
101 std::string salt = {};
102 } async_insert_pin;
103
108 };
109
114 void
115 remove_session(const pair_session_t &sess);
116
127 void
128 getservercert(pair_session_t &sess, boost::property_tree::ptree &tree, const std::string &pin);
129
142 void
143 clientchallenge(pair_session_t &sess, boost::property_tree::ptree &tree, const std::string &challenge);
144
152 void
153 serverchallengeresp(pair_session_t &sess, boost::property_tree::ptree &tree, const std::string &encrypted_response);
154
169 void
170 clientpairingsecret(pair_session_t &sess, std::shared_ptr<safe::queue_t<crypto::x509_t>> &add_cert, boost::property_tree::ptree &tree, const std::string &client_pairing_secret);
171
181 bool
182 pin(std::string pin, std::string name);
183
190 int
191 unpair_client(std::string uniqueid);
192
200 boost::property_tree::ptree
202
209 void
211} // namespace nvhttp
Definition nvhttp.h:63
Definition thread_safe.h:261
Definition utility.h:460
Declarations for cryptography functions.
Contains all the functions and variables related to the nvhttp (GameStream) server.
Definition nvhttp.cpp:39
constexpr auto GFE_VERSION
The GFE version we are replicating.
Definition nvhttp.h:34
int unpair_client(std::string uuid)
Remove single client.
Definition nvhttp.cpp:1202
PAIR_PHASE
Definition nvhttp.h:75
@ SERVERCHALLENGERESP
Sunshine is in the server challenge response phase.
@ CLIENTCHALLENGE
Sunshine is in the client challenge phase.
@ NONE
Sunshine is not in a pairing phase.
@ CLIENTPAIRINGSECRET
Sunshine is in the client pairing secret phase.
@ GETSERVERCERT
Sunshine is in the get server certificate phase.
constexpr auto PORT_HTTPS
The HTTPS port, as a difference from the config port.
Definition nvhttp.h:44
constexpr auto VERSION
The protocol version.
Definition nvhttp.h:29
void start()
Start the nvhttp server.
Definition nvhttp.cpp:1057
void setup(const std::string &pkey, const std::string &cert)
Setup the nvhttp server.
Definition nvhttp.cpp:1051
constexpr auto PORT_HTTP
The HTTP port, as a difference from the config port.
Definition nvhttp.h:39
bool pin(std::string pin, std::string name)
Compare the user supplied pin to the Moonlight pin.
Definition nvhttp.cpp:641
void erase_all_clients()
Remove all paired clients.
Definition nvhttp.cpp:1194
pt::ptree get_all_clients()
Get all paired clients.
Definition nvhttp.cpp:786
void remove_session(const pair_session_t &sess)
removes the temporary pairing session
Definition nvhttp.cpp:335
Definition nvhttp.h:83
PAIR_PHASE last_phase
used as a security measure to prevent out of order calls
Definition nvhttp.h:107
Declarations for thread-safe data structures.