Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
target-branch: "nightly"
open-pull-requests-limit: 20
35 changes: 35 additions & 0 deletions .github/workflows/clang.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: clang-format-lint

on:
pull_request:
branches: [master, nightly]
types: [opened, synchronize, edited, reopened]

jobs:
lint:
name: Clang Format Lint
runs-on: ubuntu-latest
strategy:
fail-fast: false # false to test all, true to fail entire job if any fail
matrix:
inplace: [ true, false ] # removed ubuntu_18_04 for now

steps:
- name: Checkout
uses: actions/checkout@v2

- name: Clang format lint
uses: DoozyX/clang-format-lint-action@v0.13
with:
source: './sunshine'
extensions: 'cpp,h'
clangFormatVersion: 13
style: file
inplace: ${{ matrix.inplace }}

- name: Upload Artifacts
if: ${{ matrix.inplace == true }}
uses: actions/upload-artifact@v2
with:
name: sunshine
path: sunshine/
82 changes: 42 additions & 40 deletions sunshine/confighttp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ bool authenticate(resp_https_t response, req_https_t request) {
}

//If credentials are shown, redirect the user to a /welcome page
if(config::sunshine.username.empty()){
send_redirect(response,request,"/welcome");
if(config::sunshine.username.empty()) {
send_redirect(response, request, "/welcome");
return false;
}

Expand Down Expand Up @@ -202,8 +202,8 @@ void getPasswordPage(resp_https_t response, req_https_t request) {

void getWelcomePage(resp_https_t response, req_https_t request) {
print_req(request);
if(!config::sunshine.username.empty()){
send_redirect(response,request,"/");
if(!config::sunshine.username.empty()) {
send_redirect(response, request, "/");
return;
}
std::string header = read_file(WEB_DIR "header-no-nav.html");
Expand Down Expand Up @@ -496,16 +496,18 @@ void savePassword(resp_https_t response, req_https_t request) {
auto newPassword = inputTree.count("newPassword") > 0 ? inputTree.get<std::string>("newPassword") : "";
auto confirmPassword = inputTree.count("confirmNewPassword") > 0 ? inputTree.get<std::string>("confirmNewPassword") : "";
if(newUsername.length() == 0) newUsername = username;
if(newUsername.length() == 0){
if(newUsername.length() == 0) {
outputTree.put("status", false);
outputTree.put("error", "Invalid Username");
} else {
}
else {
auto hash = util::hex(crypto::hash(password + config::sunshine.salt)).to_string();
if(config::sunshine.username.empty() || (username == config::sunshine.username && hash == config::sunshine.password)) {
if(newPassword.empty() || newPassword != confirmPassword) {
outputTree.put("status", false);
outputTree.put("error", "Password Mismatch");
} else {
}
else {
http::save_user_creds(config::sunshine.credentials_file, newUsername, newPassword);
http::reload_user_creds(config::sunshine.credentials_file);
outputTree.put("status", true);
Expand Down Expand Up @@ -555,9 +557,9 @@ void savePin(resp_https_t response, req_https_t request) {
}
}

void unpairAll(resp_https_t response, req_https_t request){
void unpairAll(resp_https_t response, req_https_t request) {
if(!authenticate(response, request)) return;

print_req(request);

pt::ptree outputTree;
Expand All @@ -571,9 +573,9 @@ void unpairAll(resp_https_t response, req_https_t request){
outputTree.put("status", true);
}

void closeApp(resp_https_t response, req_https_t request){
void closeApp(resp_https_t response, req_https_t request) {
if(!authenticate(response, request)) return;

print_req(request);

pt::ptree outputTree;
Expand All @@ -597,35 +599,35 @@ void start() {
ctx->use_certificate_chain_file(config::nvhttp.cert);
ctx->use_private_key_file(config::nvhttp.pkey, boost::asio::ssl::context::pem);
https_server_t server { ctx, 0 };
server.default_resource = not_found;
server.resource["^/$"]["GET"] = getIndexPage;
server.resource["^/pin$"]["GET"] = getPinPage;
server.resource["^/apps$"]["GET"] = getAppsPage;
server.resource["^/clients$"]["GET"] = getClientsPage;
server.resource["^/config$"]["GET"] = getConfigPage;
server.resource["^/password$"]["GET"] = getPasswordPage;
server.resource["^/welcome$"]["GET"] = getWelcomePage;
server.resource["^/troubleshooting$"]["GET"] = getTroubleshootingPage;
server.resource["^/api/pin"]["POST"] = savePin;
server.resource["^/api/apps$"]["GET"] = getApps;
server.resource["^/api/apps$"]["POST"] = saveApp;
server.resource["^/api/config$"]["GET"] = getConfig;
server.resource["^/api/config$"]["POST"] = saveConfig;
server.resource["^/api/password$"]["POST"] = savePassword;
server.resource["^/api/apps/([0-9]+)$"]["DELETE"] = deleteApp;
server.resource["^/api/clients/unpair$"]["POST"] = unpairAll;
server.resource["^/api/apps/close"]["POST"] = closeApp;
server.resource["^/images/favicon.ico$"]["GET"] = getFaviconImage;
server.resource["^/images/logo-sunshine-45.png$"]["GET"] = getSunshineLogoImage;
server.resource["^/third_party/bootstrap.min.css$"]["GET"] = getBootstrapCss;
server.resource["^/third_party/bootstrap.bundle.min.js$"]["GET"] = getBootstrapJs;
server.resource["^/fontawesome/css/all.min.css$"]["GET"] = getFontAwesomeCss;
server.resource["^/fontawesome/webfonts/fa-brands-400.ttf$"]["GET"] = getFontAwesomeBrands;
server.resource["^/fontawesome/webfonts/fa-solid-900.ttf$"]["GET"] = getFontAwesomeSolid;
server.resource["^/third_party/vue.js$"]["GET"] = getVueJs;
server.config.reuse_address = true;
server.config.address = "0.0.0.0"s;
server.config.port = port_https;
server.default_resource = not_found;
server.resource["^/$"]["GET"] = getIndexPage;
server.resource["^/pin$"]["GET"] = getPinPage;
server.resource["^/apps$"]["GET"] = getAppsPage;
server.resource["^/clients$"]["GET"] = getClientsPage;
server.resource["^/config$"]["GET"] = getConfigPage;
server.resource["^/password$"]["GET"] = getPasswordPage;
server.resource["^/welcome$"]["GET"] = getWelcomePage;
server.resource["^/troubleshooting$"]["GET"] = getTroubleshootingPage;
server.resource["^/api/pin"]["POST"] = savePin;
server.resource["^/api/apps$"]["GET"] = getApps;
server.resource["^/api/apps$"]["POST"] = saveApp;
server.resource["^/api/config$"]["GET"] = getConfig;
server.resource["^/api/config$"]["POST"] = saveConfig;
server.resource["^/api/password$"]["POST"] = savePassword;
server.resource["^/api/apps/([0-9]+)$"]["DELETE"] = deleteApp;
server.resource["^/api/clients/unpair$"]["POST"] = unpairAll;
server.resource["^/api/apps/close"]["POST"] = closeApp;
server.resource["^/images/favicon.ico$"]["GET"] = getFaviconImage;
server.resource["^/images/logo-sunshine-45.png$"]["GET"] = getSunshineLogoImage;
server.resource["^/third_party/bootstrap.min.css$"]["GET"] = getBootstrapCss;
server.resource["^/third_party/bootstrap.bundle.min.js$"]["GET"] = getBootstrapJs;
server.resource["^/fontawesome/css/all.min.css$"]["GET"] = getFontAwesomeCss;
server.resource["^/fontawesome/webfonts/fa-brands-400.ttf$"]["GET"] = getFontAwesomeBrands;
server.resource["^/fontawesome/webfonts/fa-solid-900.ttf$"]["GET"] = getFontAwesomeSolid;
server.resource["^/third_party/vue.js$"]["GET"] = getVueJs;
server.config.reuse_address = true;
server.config.address = "0.0.0.0"s;
server.config.port = port_https;

try {
server.bind();
Expand Down
3 changes: 2 additions & 1 deletion sunshine/httpcommon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ int init() {
}
if(user_creds_exist(config::sunshine.credentials_file)) {
if(reload_user_creds(config::sunshine.credentials_file)) return -1;
} else {
}
else {
BOOST_LOG(info) << "Open the Web UI to set your new username and password and getting started";
}
return 0;
Expand Down
2 changes: 1 addition & 1 deletion sunshine/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
#include "rtsp.h"
#include "thread_pool.h"
#include "upnp.h"
#include "video.h"
#include "version.h"
#include "video.h"

#include "platform/common.h"
extern "C" {
Expand Down
4 changes: 2 additions & 2 deletions sunshine/nvhttp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -765,7 +765,7 @@ void cancel(resp_https_t response, req_https_t request) {
void appasset(resp_https_t response, req_https_t request) {
print_req<SimpleWeb::HTTPS>(request);

auto args = request->parse_query_string();
auto args = request->parse_query_string();
auto app_image = proc::proc.get_app_image(util::from_view(args.at("appid")));

std::ifstream in(app_image, std::ios::binary);
Expand Down Expand Up @@ -934,7 +934,7 @@ void start() {
tcp.join();
}

void erase_all_clients(){
void erase_all_clients() {
map_id_client.clear();
save_state();
}
Expand Down
2 changes: 1 addition & 1 deletion sunshine/platform/linux/audio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ std::unique_ptr<mic_t> microphone(const std::uint8_t *mapping, int channels, std
});

pa_buffer_attr pa_attr = {};
pa_attr.maxlength = frame_size * 8;
pa_attr.maxlength = frame_size * 8;

int status;

Expand Down
2 changes: 1 addition & 1 deletion sunshine/platform/linux/x11grab.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void freeCursorCtx(cursor_ctx_raw_t *ctx);
void freeDisplay(_XDisplay *xdisplay);

using cursor_ctx_t = util::safe_ptr<cursor_ctx_raw_t, freeCursorCtx>;
using xdisplay_t = util::safe_ptr<_XDisplay, freeDisplay>;
using xdisplay_t = util::safe_ptr<_XDisplay, freeDisplay>;

class cursor_t {
public:
Expand Down
4 changes: 2 additions & 2 deletions sunshine/platform/windows/misc.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
#ifndef SUNSHINE_WINDOWS_MISC_H
#define SUNSHINE_WINDOWS_MISC_H

#include <string_view>
#include <windows.h>
#include <winnt.h>
#include <string_view>

namespace platf {
void print_status(const std::string_view &prefix, HRESULT status);
HDESK syncThreadDesktop();
}
} // namespace platf

#endif
22 changes: 12 additions & 10 deletions sunshine/process.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@

#include "process.h"

#include <filesystem>
#include <string>
#include <vector>
#include <filesystem>

#include <boost/algorithm/string.hpp>
#include <boost/filesystem.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/property_tree/ptree.hpp>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>

#include "main.h"
#include "utility.h"
Expand Down Expand Up @@ -112,9 +112,11 @@ int proc_t::execute(int app_id) {
if(proc.cmd.empty()) {
BOOST_LOG(debug) << "Executing [Desktop]"sv;
placebo = true;
} else {
boost::filesystem::path working_dir = proc.working_dir.empty() ?
boost::filesystem::path(proc.cmd).parent_path() : boost::filesystem::path(proc.working_dir);
}
else {
boost::filesystem::path working_dir = proc.working_dir.empty() ?
boost::filesystem::path(proc.cmd).parent_path() :
boost::filesystem::path(proc.working_dir);
if(proc.output.empty() || proc.output == "null"sv) {
BOOST_LOG(info) << "Executing: ["sv << proc.cmd << ']';
_process = bp::child(_process_handle, proc.cmd, _env, bp::start_dir(working_dir), bp::std_out > bp::null, bp::std_err > bp::null, ec);
Expand Down Expand Up @@ -195,22 +197,22 @@ std::vector<ctx_t> &proc_t::get_apps() {
/// Returns default image if image configuration is not set.
/// returns http content-type header compatible image type
std::string proc_t::get_app_image(int app_id) {
auto app_index = app_id -1;
auto app_index = app_id - 1;
if(app_index < 0 || app_index >= _apps.size()) {
BOOST_LOG(error) << "Couldn't find app with ID ["sv << app_id << ']';
return SUNSHINE_ASSETS_DIR "/box.png";
}

auto app_image_path = _apps[app_index].image_path;
if (app_image_path.empty()) {
if(app_image_path.empty()) {
return SUNSHINE_ASSETS_DIR "/box.png";
}

auto image_extension = std::filesystem::path(app_image_path).extension().string();
boost::to_lower(image_extension);

std::error_code code;
if (!std::filesystem::exists(app_image_path, code) || image_extension != ".png") {
if(!std::filesystem::exists(app_image_path, code) || image_extension != ".png") {
return SUNSHINE_ASSETS_DIR "/box.png";
}

Expand Down Expand Up @@ -351,7 +353,7 @@ std::optional<proc::proc_t> parse(const std::string &file_name) {
ctx.working_dir = parse_env_val(this_env, *working_dir);
}

if (image_path) {
if(image_path) {
ctx.image_path = parse_env_val(this_env, *image_path);
}

Expand Down
4 changes: 2 additions & 2 deletions sunshine/utility.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ struct argument_type<T(U)> { typedef U type; };
x &operator=(x &&) noexcept = default; \
x();

#define KITTY_DEFAULT_CONSTR_MOVE(x) \
x(x &&) noexcept = default; \
#define KITTY_DEFAULT_CONSTR_MOVE(x) \
x(x &&) noexcept = default; \
x &operator=(x &&) noexcept = default;

#define KITTY_DEFAULT_CONSTR_MOVE_THROW(x) \
Expand Down
4 changes: 2 additions & 2 deletions sunshine/video.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1280,7 +1280,7 @@ void captureThreadSync() {
ctx.shutdown_event->raise(true);
ctx.join_event->raise(true);
}
});
});

while(encode_run_sync(synced_session_ctxs, ctx) == encode_e::reinit) {}
}
Expand All @@ -1296,7 +1296,7 @@ void capture_async(
auto lg = util::fail_guard([&]() {
images->stop();
shutdown_event->raise(true);
});
});

auto ref = capture_thread_async.ref();
if(!ref) {
Expand Down