diff --git a/src/confighttp.cpp b/src/confighttp.cpp index 2c7d3b21a39..cc571bf2b27 100644 --- a/src/confighttp.cpp +++ b/src/confighttp.cpp @@ -673,7 +673,8 @@ namespace confighttp { // TODO: Input Validation pt::read_json(ss, inputTree); std::string pin = inputTree.get("pin"); - outputTree.put("status", nvhttp::pin(pin)); + std::string name = inputTree.get("name"); + outputTree.put("status", nvhttp::pin(pin, name)); } catch (std::exception &e) { BOOST_LOG(warning) << "SavePin: "sv << e.what(); diff --git a/src/nvhttp.cpp b/src/nvhttp.cpp index bd00cb3a85c..34c693ddfb6 100644 --- a/src/nvhttp.cpp +++ b/src/nvhttp.cpp @@ -112,9 +112,15 @@ namespace nvhttp { std::string pkey; } conf_intern; + struct named_cert_t { + std::string name; + std::string cert; + }; + struct client_t { std::string uniqueID; std::vector certs; + std::vector named_certs; }; struct pair_session_t { @@ -195,7 +201,15 @@ namespace nvhttp { cert_node.put_value(cert); cert_nodes.push_back(std::make_pair(""s, cert_node)); } - node.add_child("certs"s, cert_nodes); + + pt::ptree named_cert_nodes; + for (auto &named_cert : client.named_certs) { + pt::ptree named_cert_node; + named_cert_node.put("name"s, named_cert.name); + named_cert_node.put("cert"s, named_cert.cert); + named_cert_nodes.push_back(std::make_pair(""s, named_cert_node)); + } + node.add_child("named_certs"s, named_cert_nodes); nodes.push_back(std::make_pair(""s, node)); } @@ -243,8 +257,21 @@ namespace nvhttp { client.uniqueID = uniqID; + // Import from old format for (auto &[_, el] : device_node.get_child("certs")) { - client.certs.emplace_back(el.get_value()); + named_cert_t named_cert; + named_cert.name = ""s; + named_cert.cert = el.get_value(); + client.named_certs.emplace_back(named_cert); + client.certs.emplace_back(named_cert.cert); + } + + for (auto &[_, el] : device_node.get_child("named_certs")) { + named_cert_t named_cert; + named_cert.name = el.get_child("name").get_value(); + named_cert.cert = el.get_child("cert").get_value(); + client.named_certs.emplace_back(named_cert); + client.certs.emplace_back(named_cert.cert); } } } @@ -560,15 +587,16 @@ namespace nvhttp { /** * @brief Compare the user supplied pin to the Moonlight pin. * @param pin The user supplied pin. + * @param name The user supplied name. * @return `true` if the pin is correct, `false` otherwise. * * EXAMPLES: * ```cpp - * bool pin_status = nvhttp::pin("1234"); + * bool pin_status = nvhttp::pin("1234", "laptop"); * ``` */ bool - pin(std::string pin) { + pin(std::string pin, std::string name) { pt::ptree tree; if (map_id_sess.empty()) { return false; @@ -594,6 +622,13 @@ namespace nvhttp { auto &sess = std::begin(map_id_sess)->second; getservercert(sess, tree, pin); + // set up named cert + auto &client = map_id_client[sess.client.uniqueID]; + named_cert_t named_cert; + named_cert.name = name; + named_cert.cert = sess.client.cert; + client.named_certs.emplace_back(named_cert); + // response to the request for pin std::ostringstream data; pt::write_xml(data, tree); @@ -970,6 +1005,9 @@ namespace nvhttp { for (auto &cert : client.certs) { cert_chain.add(crypto::x509(cert)); } + for (auto &named_cert : client.named_certs) { + cert_chain.add(crypto::x509(named_cert.cert)); + } } auto add_cert = std::make_shared>(30); diff --git a/src/nvhttp.h b/src/nvhttp.h index 3be24b3de06..0a5862514c4 100644 --- a/src/nvhttp.h +++ b/src/nvhttp.h @@ -43,7 +43,7 @@ namespace nvhttp { void start(); bool - pin(std::string pin); + pin(std::string pin, std::string name); void erase_all_clients(); } // namespace nvhttp diff --git a/src_assets/common/assets/web/pin.html b/src_assets/common/assets/web/pin.html index edb9b814a5d..fe18c49c66e 100644 --- a/src_assets/common/assets/web/pin.html +++ b/src_assets/common/assets/web/pin.html @@ -11,7 +11,8 @@

PIN Pairing

- + +
@@ -37,8 +38,9 @@

PIN Pairing

document.querySelector("#form").addEventListener("submit", (e) => { e.preventDefault(); let pin = document.querySelector("#pin-input").value; + let name = document.querySelector("#name-input").value; document.querySelector("#status").innerHTML = ""; - let b = JSON.stringify({ pin: pin }); + let b = JSON.stringify({ pin: pin, name: name }); fetch("/api/pin", { method: "POST", body: b }) .then((response) => response.json()) .then((response) => { @@ -47,6 +49,7 @@

PIN Pairing

"#status" ).innerHTML = ``; document.querySelector("#pin-input").value = ""; + document.querySelector("#name-input").value = ""; } else { document.querySelector( "#status"