This commit is contained in:
SpikeHD
2022-06-05 21:12:14 -07:00
11 changed files with 158 additions and 26 deletions

94
src-tauri/Cargo.lock generated
View File

@@ -2,6 +2,15 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 3 version = 3
[[package]]
name = "addr2line"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b"
dependencies = [
"gimli",
]
[[package]] [[package]]
name = "adler" name = "adler"
version = "1.0.2" version = "1.0.2"
@@ -207,6 +216,21 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "backtrace"
version = "0.3.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61"
dependencies = [
"addr2line",
"cc",
"cfg-if 1.0.0",
"libc",
"miniz_oxide",
"object",
"rustc-demangle",
]
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.13.0" version = "0.13.0"
@@ -722,11 +746,13 @@ dependencies = [
"futures-util", "futures-util",
"http", "http",
"hudsucker", "hudsucker",
"is_elevated",
"lazy_static", "lazy_static",
"open", "open",
"rcgen", "rcgen",
"registry", "registry",
"reqwest", "reqwest",
"runas",
"rustls-pemfile", "rustls-pemfile",
"serde", "serde",
"serde_json", "serde_json",
@@ -974,6 +1000,15 @@ version = "2.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71"
[[package]]
name = "failure"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
dependencies = [
"backtrace",
]
[[package]] [[package]]
name = "fastrand" name = "fastrand"
version = "1.7.0" version = "1.7.0"
@@ -1288,6 +1323,12 @@ dependencies = [
"wasi 0.10.2+wasi-snapshot-preview1", "wasi 0.10.2+wasi-snapshot-preview1",
] ]
[[package]]
name = "gimli"
version = "0.26.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4"
[[package]] [[package]]
name = "gio" name = "gio"
version = "0.15.11" version = "0.15.11"
@@ -1773,6 +1814,15 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b"
[[package]]
name = "is_elevated"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5299060ff5db63e788015dcb9525ad9b84f4fd9717ed2cbdeba5018cbf42f9b5"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.10.3" version = "0.10.3"
@@ -2041,6 +2091,12 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "minisign-verify"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.5.1" version = "0.5.1"
@@ -2320,6 +2376,15 @@ dependencies = [
"objc", "objc",
] ]
[[package]]
name = "object"
version = "0.28.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "oid-registry" name = "oid-registry"
version = "0.4.0" version = "0.4.0"
@@ -3108,6 +3173,22 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "runas"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a620b0994a180cdfa25c0439e6d58c0628272571501880d626ffff58e96a0799"
dependencies = [
"cc",
"which",
]
[[package]]
name = "rustc-demangle"
version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.3.3" version = "0.3.3"
@@ -3779,6 +3860,7 @@ checksum = "a34cef4a0ebee0230baaa319b1709c4336f4add550149d2b005a9a5dc5d33617"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"attohttpc", "attohttpc",
"base64",
"bincode", "bincode",
"cocoa", "cocoa",
"dirs-next", "dirs-next",
@@ -3792,6 +3874,7 @@ dependencies = [
"heck 0.4.0", "heck 0.4.0",
"http", "http",
"ignore", "ignore",
"minisign-verify",
"notify-rust", "notify-rust",
"objc", "objc",
"once_cell", "once_cell",
@@ -3823,6 +3906,7 @@ dependencies = [
"webkit2gtk", "webkit2gtk",
"webview2-com", "webview2-com",
"windows 0.30.0", "windows 0.30.0",
"zip 0.6.2",
] ]
[[package]] [[package]]
@@ -4606,6 +4690,16 @@ dependencies = [
"cc", "cc",
] ]
[[package]]
name = "which"
version = "3.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724"
dependencies = [
"failure",
"libc",
]
[[package]] [[package]]
name = "wildmatch" name = "wildmatch"
version = "2.1.0" version = "2.1.0"

View File

@@ -16,9 +16,9 @@ tauri-build = { version = "1.0.0-rc.8", features = [] }
[dependencies] [dependencies]
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
tauri = { version = "1.0.0-rc.9", features = ["api-all"] } tauri = { version = "1.0.0-rc.9", features = ["api-all", "updater"] }
# For process info # Access system process info.
sysinfo = "0.23.12" sysinfo = "0.23.12"
# ZIP-archive library. # ZIP-archive library.
@@ -38,6 +38,10 @@ open = "2.1.2"
serde_json = "1" serde_json = "1"
base64 = "0.13.0" base64 = "0.13.0"
# System process elevation.
is_elevated = "0.1.2"
runas = "0.2.1"
# Dependencies for the HTTP(S) proxy. # Dependencies for the HTTP(S) proxy.
http = "0.2" http = "0.2"
hudsucker = "0.17.2" hudsucker = "0.17.2"

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<!-- Force installer to run as Administrator. -->
<Property Id="MSIUSEREALADMINDETECTION" Value="1" />
</Fragment>
</Wix>

View File

@@ -27,9 +27,10 @@ lazy_static! {
} }
fn main() { fn main() {
// Start the game process watcher.
process_watcher(); process_watcher();
// Make BG folder if it doesn't exist // Make BG folder if it doesn't exist.
let bg_folder = format!("{}/bg", system_helpers::install_location()); let bg_folder = format!("{}/bg", system_helpers::install_location());
if !std::path::Path::new(&bg_folder).exists() { if !std::path::Path::new(&bg_folder).exists() {
std::fs::create_dir_all(&bg_folder).unwrap(); std::fs::create_dir_all(&bg_folder).unwrap();
@@ -51,6 +52,7 @@ fn main() {
system_helpers::open_in_browser, system_helpers::open_in_browser,
system_helpers::copy_file, system_helpers::copy_file,
system_helpers::install_location, system_helpers::install_location,
system_helpers::is_elevated,
proxy::set_proxy_addr, proxy::set_proxy_addr,
proxy::generate_ca_files, proxy::generate_ca_files,
unzip::unzip, unzip::unzip,
@@ -74,17 +76,17 @@ fn process_watcher() {
// Start a thread so as to not block the main thread. // Start a thread so as to not block the main thread.
thread::spawn(|| { thread::spawn(|| {
let mut s = System::new_all(); let mut system = System::new_all();
loop { loop {
// Refresh system info // Refresh system info
s.refresh_all(); system.refresh_all();
// Grab the game process name // Grab the game process name
let proc = WATCH_GAME_PROCESS.lock().unwrap().to_string(); let proc = WATCH_GAME_PROCESS.lock().unwrap().to_string();
if !&proc.is_empty() { if !&proc.is_empty() {
let proc_with_name = s.processes_by_exact_name(&proc); let proc_with_name = system.processes_by_exact_name(&proc);
let mut exists = false; let mut exists = false;
for _p in proc_with_name { for _p in proc_with_name {
@@ -108,7 +110,7 @@ fn is_game_running() -> bool {
// Grab the game process name // Grab the game process name
let proc = WATCH_GAME_PROCESS.lock().unwrap().to_string(); let proc = WATCH_GAME_PROCESS.lock().unwrap().to_string();
return !&proc.is_empty(); return !proc.is_empty();
} }
#[tauri::command] #[tauri::command]
@@ -147,8 +149,8 @@ async fn req_get(url: String) -> String {
} }
#[tauri::command] #[tauri::command]
async fn get_theme_list(dataDir: String) -> Vec<HashMap<String, String>> { async fn get_theme_list(data_dir: String) -> Vec<HashMap<String, String>> {
let theme_loc = format!("{}/themes", dataDir); let theme_loc = format!("{}/themes", data_dir);
// Ensure folder exists // Ensure folder exists
if !std::path::Path::new(&theme_loc).exists() { if !std::path::Path::new(&theme_loc).exists() {

View File

@@ -164,7 +164,7 @@ pub fn generate_ca_files(path: &str) {
params.key_usages = vec![ params.key_usages = vec![
KeyUsagePurpose::DigitalSignature, KeyUsagePurpose::DigitalSignature,
KeyUsagePurpose::KeyCertSign, KeyUsagePurpose::KeyCertSign,
KeyUsagePurpose::CrlSign, KeyUsagePurpose::CrlSign
]; ];
// Create certificate. // Create certificate.
@@ -203,7 +203,7 @@ pub fn generate_ca_files(path: &str) {
*/ */
pub fn install_ca_files(path: &str) { pub fn install_ca_files(path: &str) {
if cfg!(target_os = "windows") { if cfg!(target_os = "windows") {
run_command(format!("certutil -addstore -f \"ROOT\" {}\\ca\\cert.crt", path).to_string()); run_command(format!("certutil -user -addstore \"Root\" {}\\ca\\cert.crt", path).to_string());
} else { } else {
run_command(format!("security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain {}/ca/cert.crt", path).to_string()); run_command(format!("security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain {}/ca/cert.crt", path).to_string());
} }

View File

@@ -85,4 +85,9 @@ pub fn install_location() -> String {
exe_path.pop(); exe_path.pop();
return exe_path.to_str().unwrap().to_string(); return exe_path.to_str().unwrap().to_string();
}
#[tauri::command]
pub fn is_elevated() -> bool {
return is_elevated::is_elevated();
} }

View File

@@ -31,7 +31,7 @@
}, },
"bundle": { "bundle": {
"active": true, "active": true,
"category": "DeveloperTool", "category": "Game",
"copyright": "", "copyright": "",
"deb": { "deb": {
"depends": [] "depends": []
@@ -45,7 +45,8 @@
"icons/icon.ico" "icons/icon.ico"
], ],
"identifier": "xyz.grasscutters", "identifier": "xyz.grasscutters",
"longDescription": "", "shortDescription": "A game launcher.",
"longDescription": "A launcher for a certain anime game that proxies all related game traffic to external servers.",
"macOS": { "macOS": {
"entitlements": null, "entitlements": null,
"exceptionDomain": "", "exceptionDomain": "",
@@ -53,20 +54,30 @@
"providerShortName": null, "providerShortName": null,
"signingIdentity": null "signingIdentity": null
}, },
"resources": [], "resources": [
"shortDescription": "", "lang/*.json"
],
"targets": "all", "targets": "all",
"windows": { "windows": {
"allowDowngrades": false,
"certificateThumbprint": null, "certificateThumbprint": null,
"digestAlgorithm": "sha256", "digestAlgorithm": "sha256",
"timestampUrl": "" "timestampUrl": "",
"wix": {
"fragmentPaths": ["resources/wix.wxs"]
}
} }
}, },
"security": { "security": {
"csp": "default-src 'self' https://asset.localhost; img-src 'self'; img-src https://* asset: https://asset.localhost" "csp": "default-src 'self' https://asset.localhost; img-src 'self'; img-src https://* asset: https://asset.localhost"
}, },
"updater": { "updater": {
"active": false "active": false,
"dialog": true,
"endpoints": [
"https://api.grasscutters.xyz/cultivation/update?version={{current_version}}"
],
"pubkey": ""
}, },
"windows": [ "windows": [
{ {

View File

@@ -18,7 +18,7 @@ import Game from './components/menu/Game'
import RightBar from './components/RightBar' import RightBar from './components/RightBar'
import { getConfigOption, setConfigOption } from '../utils/configuration' import { getConfigOption, setConfigOption } from '../utils/configuration'
import { invoke } from '@tauri-apps/api' import { invoke } from '@tauri-apps/api'
import { appDir, dataDir } from '@tauri-apps/api/path' import { dataDir } from '@tauri-apps/api/path'
import { appWindow } from '@tauri-apps/api/window' import { appWindow } from '@tauri-apps/api/window'
import { convertFileSrc } from '@tauri-apps/api/tauri' import { convertFileSrc } from '@tauri-apps/api/tauri'
import { getTheme, loadTheme } from '../utils/themes' import { getTheme, loadTheme } from '../utils/themes'
@@ -87,7 +87,7 @@ class App extends React.Component<IProps, IState> {
const theme = await getConfigOption('theme') const theme = await getConfigOption('theme')
if (theme && theme !== 'default') { if (theme && theme !== 'default') {
const themeObj = await getTheme(theme) const themeObj = await getTheme(theme)
loadTheme(themeObj, document) await loadTheme(themeObj, document)
} }
if(!custom_bg || !/png|jpg|jpeg$/.test(custom_bg)) { if(!custom_bg || !/png|jpg|jpeg$/.test(custom_bg)) {
@@ -103,7 +103,7 @@ class App extends React.Component<IProps, IState> {
}, this.forceUpdate) }, this.forceUpdate)
} }
} else { } else {
const isUrl = /^(?:http(s)?:\/\/)/gm.test(custom_bg) const isUrl = /^http(s)?:\/\//gm.test(custom_bg)
if (!isUrl) { if (!isUrl) {
const isValid = await invoke('dir_exists', { const isValid = await invoke('dir_exists', {

View File

@@ -18,11 +18,19 @@ async function generateCertificates() {
await invoke('generate_ca_files', { path: await dataDir() + '\\cultivation' }) await invoke('generate_ca_files', { path: await dataDir() + '\\cultivation' })
} }
async function generateCertInfo() {
console.log({
certificatePath: await dataDir() + '\\cultivation\\ca',
isAdmin: await invoke('is_elevated')
})
alert('check your dev console and send that in #cultivation')
}
function none() { function none() {
alert('none') alert('none')
} }
class Test extends React.Component<any, any>{ class Debug extends React.Component<any, any>{
render() { render() {
return ( return (
<div className="App"> <div className="App">
@@ -30,9 +38,10 @@ class Test extends React.Component<any, any>{
<button onClick={startProxy}>start proxy</button> <button onClick={startProxy}>start proxy</button>
<button onClick={stopProxy}>stop proxy</button> <button onClick={stopProxy}>stop proxy</button>
<button onClick={generateCertificates}>generate certificates</button> <button onClick={generateCertificates}>generate certificates</button>
<button onClick={generateCertInfo}>generate certificate info</button>
</div> </div>
) )
} }
} }
export default Test export default Debug

View File

@@ -19,7 +19,7 @@
#playButton .BigButton { #playButton .BigButton {
height: 100%; height: 100%;
box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.2); box-shadow: 0 0 5px 3px rgba(0, 0, 0, 0.2);
} }
#serverControls { #serverControls {
@@ -39,7 +39,7 @@
#serverControls .CheckboxDisplay { #serverControls .CheckboxDisplay {
margin-right: 6px; margin-right: 6px;
box-shadow: 0px 0px 5px 4px rgba(0, 0, 0, 0.2); box-shadow: 0 0 5px 4px rgba(0, 0, 0, 0.2);
} }
#serverControls .Checkbox label { #serverControls .Checkbox label {
@@ -80,7 +80,7 @@
border-radius: 6px; border-radius: 6px;
height: 18px; height: 18px;
box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.2); box-shadow: 0 0 5px 3px rgba(0, 0, 0, 0.2);
} }
.ServerConfig .TextInputWrapper { .ServerConfig .TextInputWrapper {

View File

@@ -39,7 +39,7 @@ const defaultTheme = {
export async function getThemeList() { export async function getThemeList() {
// Do some invoke to backend to get the theme list // Do some invoke to backend to get the theme list
const themes = await invoke('get_theme_list', { const themes = await invoke('get_theme_list', {
dataDir: `${await dataDir()}/cultivation` data_dir: `${await dataDir()}/cultivation`
}) as BackendThemeList[] }) as BackendThemeList[]
const list: ThemeList[] = [ const list: ThemeList[] = [
// ALWAYS include default theme // ALWAYS include default theme