@@ -592,12 +592,7 @@ namespace nvhttp {
592592 std::ostringstream data;
593593
594594 pt::write_xml (data, tree);
595- response->write (data.str ());
596-
597- *response
598- << " HTTP/1.1 404 NOT FOUND\r\n "
599- << data.str ();
600-
595+ response->write (SimpleWeb::StatusCode::client_error_not_found, data.str ());
601596 response->close_connection_after_response = true ;
602597 }
603598
@@ -1268,6 +1263,112 @@ namespace nvhttp {
12681263 response->close_connection_after_response = true ;
12691264 }
12701265
1266+ void
1267+ getClipboard (resp_https_t response, req_https_t request) {
1268+ print_req<SunshineHTTPS>(request);
1269+
1270+ auto named_cert_p = get_verified_cert (request);
1271+
1272+ if (
1273+ !(named_cert_p->perm & PERM::_allow_view)
1274+ || !(named_cert_p->perm & PERM::clipboard_read)
1275+ ) {
1276+ BOOST_LOG (debug) << " Permission Read Clipboard denied for [" << named_cert_p->name << " ] (" << (uint32_t )named_cert_p->perm << " )" ;
1277+
1278+ response->write (SimpleWeb::StatusCode::client_error_unauthorized);
1279+ response->close_connection_after_response = true ;
1280+ return ;
1281+ }
1282+
1283+ auto args = request->parse_query_string ();
1284+ auto clipboard_type = get_arg (args, " type" );
1285+ if (clipboard_type != " text" sv) {
1286+ BOOST_LOG (debug) << " Clipboard type [" << clipboard_type << " ] is not supported!" ;
1287+
1288+ response->write (SimpleWeb::StatusCode::client_error_bad_request);
1289+ response->close_connection_after_response = true ;
1290+ return ;
1291+ }
1292+
1293+ std::list<std::string> connected_uuids = rtsp_stream::get_all_session_uuids ();
1294+
1295+ bool found = !connected_uuids.empty ();
1296+
1297+ if (found) {
1298+ found = (std::find (connected_uuids.begin (), connected_uuids.end (), named_cert_p->uuid ) != connected_uuids.end ());
1299+ }
1300+
1301+ if (!found) {
1302+ BOOST_LOG (debug) << " Client [" << named_cert_p->name << " ] trying to get clipboard is not connected to a stream" ;
1303+
1304+ response->write (SimpleWeb::StatusCode::client_error_forbidden);
1305+ response->close_connection_after_response = true ;
1306+ return ;
1307+ }
1308+
1309+ std::string content = platf::get_clipboard ();
1310+ response->write (content);
1311+ return ;
1312+ }
1313+
1314+ void
1315+ setClipboard (resp_https_t response, req_https_t request) {
1316+ print_req<SunshineHTTPS>(request);
1317+
1318+ auto named_cert_p = get_verified_cert (request);
1319+
1320+ if (
1321+ !(named_cert_p->perm & PERM::_allow_view)
1322+ || !(named_cert_p->perm & PERM::clipboard_set)
1323+ ) {
1324+ BOOST_LOG (debug) << " Permission Write Clipboard denied for [" << named_cert_p->name << " ] (" << (uint32_t )named_cert_p->perm << " )" ;
1325+
1326+ response->write (SimpleWeb::StatusCode::client_error_unauthorized);
1327+ response->close_connection_after_response = true ;
1328+ return ;
1329+ }
1330+
1331+ auto args = request->parse_query_string ();
1332+ auto clipboard_type = get_arg (args, " type" );
1333+ if (clipboard_type != " text" sv) {
1334+ BOOST_LOG (debug) << " Clipboard type [" << clipboard_type << " ] is not supported!" ;
1335+
1336+ response->write (SimpleWeb::StatusCode::client_error_bad_request);
1337+ response->close_connection_after_response = true ;
1338+ return ;
1339+ }
1340+
1341+ std::list<std::string> connected_uuids = rtsp_stream::get_all_session_uuids ();
1342+
1343+ bool found = !connected_uuids.empty ();
1344+
1345+ if (found) {
1346+ found = (std::find (connected_uuids.begin (), connected_uuids.end (), named_cert_p->uuid ) != connected_uuids.end ());
1347+ }
1348+
1349+ if (!found) {
1350+ BOOST_LOG (debug) << " Client [" << named_cert_p->name << " ] trying to set clipboard is not connected to a stream" ;
1351+
1352+ response->write (SimpleWeb::StatusCode::client_error_forbidden);
1353+ response->close_connection_after_response = true ;
1354+ return ;
1355+ }
1356+
1357+ std::string content = request->content .string ();
1358+
1359+ bool success = platf::set_clipboard (content);
1360+
1361+ if (!success) {
1362+ BOOST_LOG (debug) << " Setting clipboard failed!" ;
1363+
1364+ response->write (SimpleWeb::StatusCode::server_error_internal_server_error);
1365+ response->close_connection_after_response = true ;
1366+ }
1367+
1368+ response->write ();
1369+ return ;
1370+ }
1371+
12711372 void
12721373 start () {
12731374 auto shutdown_event = mail::man->event <bool >(mail::shutdown);
@@ -1351,6 +1452,8 @@ namespace nvhttp {
13511452 https_server.resource [" ^/launch$" ][" GET" ] = [&host_audio](auto resp, auto req) { launch (host_audio, resp, req); };
13521453 https_server.resource [" ^/resume$" ][" GET" ] = [&host_audio](auto resp, auto req) { resume (host_audio, resp, req); };
13531454 https_server.resource [" ^/cancel$" ][" GET" ] = cancel;
1455+ https_server.resource [" ^/actions/clipboard$" ][" GET" ] = getClipboard;
1456+ https_server.resource [" ^/actions/clipboard$" ][" POST" ] = setClipboard;
13541457
13551458 https_server.config .reuse_address = true ;
13561459 https_server.config .address = net::af_to_any_address_string (address_family);
0 commit comments