server health check
This commit is contained in:
parent
ebc7e7551e
commit
58804fe6c1
18
.prettierrc
Normal file
18
.prettierrc
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"arrowParens": "always",
|
||||
"bracketSameLine": false,
|
||||
"bracketSpacing": true,
|
||||
"endOfLine": "lf",
|
||||
"htmlWhitespaceSensitivity": "css",
|
||||
"jsxBracketSameLine": false,
|
||||
"jsxSingleQuote": true,
|
||||
"printWidth": 120,
|
||||
"proseWrap": "preserve",
|
||||
"quoteProps": "consistent",
|
||||
"semi": true,
|
||||
"singleAttributePerLine": true,
|
||||
"singleQuote": false,
|
||||
"tabWidth": 2,
|
||||
"trailingComma": "all",
|
||||
"useTabs": false
|
||||
}
|
BIN
client/bun.lockb
BIN
client/bun.lockb
Binary file not shown.
|
@ -18,6 +18,7 @@
|
|||
"@mui/lab": "^6.0.0-beta.14",
|
||||
"@mui/material": "^6.1.6",
|
||||
"@tauri-apps/api": "^2.1.0",
|
||||
"@tauri-apps/plugin-http": "~2",
|
||||
"@types/pg": "^8.11.10",
|
||||
"dotenv": "^16.4.5",
|
||||
"jotai": "^2.10.1",
|
||||
|
|
399
client/src-tauri/Cargo.lock
generated
399
client/src-tauri/Cargo.lock
generated
|
@ -99,6 +99,7 @@ dependencies = [
|
|||
"serde_json",
|
||||
"tauri",
|
||||
"tauri-build",
|
||||
"tauri-plugin-http",
|
||||
"tauri-plugin-log",
|
||||
]
|
||||
|
||||
|
@ -131,6 +132,12 @@ dependencies = [
|
|||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atomic-waker"
|
||||
version = "1.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
version = "1.4.0"
|
||||
|
@ -463,7 +470,7 @@ dependencies = [
|
|||
"bitflags 2.6.0",
|
||||
"block",
|
||||
"cocoa-foundation",
|
||||
"core-foundation",
|
||||
"core-foundation 0.10.0",
|
||||
"core-graphics",
|
||||
"foreign-types",
|
||||
"libc",
|
||||
|
@ -478,7 +485,7 @@ checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d"
|
|||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"block",
|
||||
"core-foundation",
|
||||
"core-foundation 0.10.0",
|
||||
"core-graphics-types",
|
||||
"libc",
|
||||
"objc",
|
||||
|
@ -506,10 +513,39 @@ version = "0.18.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
|
||||
dependencies = [
|
||||
"percent-encoding",
|
||||
"time",
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cookie_store"
|
||||
version = "0.21.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9"
|
||||
dependencies = [
|
||||
"cookie",
|
||||
"document-features",
|
||||
"idna 1.0.3",
|
||||
"log",
|
||||
"publicsuffix",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"time",
|
||||
"url",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation"
|
||||
version = "0.9.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation"
|
||||
version = "0.10.0"
|
||||
|
@ -533,7 +569,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"core-foundation",
|
||||
"core-foundation 0.10.0",
|
||||
"core-graphics-types",
|
||||
"foreign-types",
|
||||
"libc",
|
||||
|
@ -546,7 +582,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"core-foundation",
|
||||
"core-foundation 0.10.0",
|
||||
"libc",
|
||||
]
|
||||
|
||||
|
@ -665,6 +701,12 @@ dependencies = [
|
|||
"syn 2.0.87",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "data-url"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
|
||||
|
||||
[[package]]
|
||||
name = "deranged"
|
||||
version = "0.3.11"
|
||||
|
@ -759,6 +801,15 @@ dependencies = [
|
|||
"syn 2.0.87",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "document-features"
|
||||
version = "0.2.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb6969eaabd2421f8a2775cfd2471a2b634372b4a25d41e3bd647b79912850a0"
|
||||
dependencies = [
|
||||
"litrs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dpi"
|
||||
version = "0.1.1"
|
||||
|
@ -815,6 +866,15 @@ version = "1.2.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
|
||||
|
||||
[[package]]
|
||||
name = "encoding_rs"
|
||||
version = "0.8.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "env_filter"
|
||||
version = "0.1.2"
|
||||
|
@ -1303,6 +1363,25 @@ dependencies = [
|
|||
"syn 2.0.87",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
|
||||
dependencies = [
|
||||
"atomic-waker",
|
||||
"bytes",
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"http",
|
||||
"indexmap 2.6.0",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.12.3"
|
||||
|
@ -1405,6 +1484,7 @@ dependencies = [
|
|||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"httparse",
|
||||
|
@ -1415,6 +1495,24 @@ dependencies = [
|
|||
"want",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-rustls"
|
||||
version = "0.27.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"http",
|
||||
"hyper",
|
||||
"hyper-util",
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
"tokio",
|
||||
"tokio-rustls",
|
||||
"tower-service",
|
||||
"webpki-roots",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hyper-util"
|
||||
version = "0.1.10"
|
||||
|
@ -1591,6 +1689,16 @@ version = "1.0.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
|
||||
dependencies = [
|
||||
"unicode-bidi",
|
||||
"unicode-normalization",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.0.3"
|
||||
|
@ -1832,6 +1940,12 @@ version = "0.7.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
|
||||
|
||||
[[package]]
|
||||
name = "litrs"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.12"
|
||||
|
@ -2596,6 +2710,12 @@ dependencies = [
|
|||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "psl-types"
|
||||
version = "2.0.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac"
|
||||
|
||||
[[package]]
|
||||
name = "ptr_meta"
|
||||
version = "0.1.4"
|
||||
|
@ -2616,6 +2736,16 @@ dependencies = [
|
|||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "publicsuffix"
|
||||
version = "2.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457"
|
||||
dependencies = [
|
||||
"idna 0.3.0",
|
||||
"psl-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
version = "0.32.0"
|
||||
|
@ -2625,6 +2755,55 @@ dependencies = [
|
|||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quinn"
|
||||
version = "0.11.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"pin-project-lite",
|
||||
"quinn-proto",
|
||||
"quinn-udp",
|
||||
"rustc-hash",
|
||||
"rustls",
|
||||
"socket2",
|
||||
"thiserror 1.0.69",
|
||||
"tokio",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quinn-proto"
|
||||
version = "0.11.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"rand 0.8.5",
|
||||
"ring",
|
||||
"rustc-hash",
|
||||
"rustls",
|
||||
"slab",
|
||||
"thiserror 1.0.69",
|
||||
"tinyvec",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quinn-udp"
|
||||
version = "0.5.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da"
|
||||
dependencies = [
|
||||
"cfg_aliases 0.2.1",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"socket2",
|
||||
"tracing",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.37"
|
||||
|
@ -2793,12 +2972,17 @@ checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f"
|
|||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"bytes",
|
||||
"cookie",
|
||||
"cookie_store",
|
||||
"encoding_rs",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"http-body-util",
|
||||
"hyper",
|
||||
"hyper-rustls",
|
||||
"hyper-util",
|
||||
"ipnet",
|
||||
"js-sys",
|
||||
|
@ -2807,11 +2991,17 @@ dependencies = [
|
|||
"once_cell",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"quinn",
|
||||
"rustls",
|
||||
"rustls-pemfile",
|
||||
"rustls-pki-types",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"system-configuration",
|
||||
"tokio",
|
||||
"tokio-rustls",
|
||||
"tokio-util",
|
||||
"tower-service",
|
||||
"url",
|
||||
|
@ -2819,9 +3009,25 @@ dependencies = [
|
|||
"wasm-bindgen-futures",
|
||||
"wasm-streams",
|
||||
"web-sys",
|
||||
"webpki-roots",
|
||||
"windows-registry",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ring"
|
||||
version = "0.17.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"cfg-if",
|
||||
"getrandom 0.2.15",
|
||||
"libc",
|
||||
"spin",
|
||||
"untrusted",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rkyv"
|
||||
version = "0.7.45"
|
||||
|
@ -2873,6 +3079,12 @@ version = "0.1.24"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "2.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152"
|
||||
|
||||
[[package]]
|
||||
name = "rustc_version"
|
||||
version = "0.4.1"
|
||||
|
@ -2882,6 +3094,46 @@ dependencies = [
|
|||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls"
|
||||
version = "0.23.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"ring",
|
||||
"rustls-pki-types",
|
||||
"rustls-webpki",
|
||||
"subtle",
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pemfile"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
|
||||
dependencies = [
|
||||
"rustls-pki-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pki-types"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
|
||||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
version = "0.102.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9"
|
||||
dependencies = [
|
||||
"ring",
|
||||
"rustls-pki-types",
|
||||
"untrusted",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.18"
|
||||
|
@ -3221,6 +3473,12 @@ dependencies = [
|
|||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.9.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
version = "1.2.0"
|
||||
|
@ -3259,6 +3517,12 @@ version = "0.11.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "subtle"
|
||||
version = "2.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
||||
|
||||
[[package]]
|
||||
name = "swift-rs"
|
||||
version = "1.0.7"
|
||||
|
@ -3324,6 +3588,27 @@ dependencies = [
|
|||
"syn 2.0.87",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration"
|
||||
version = "0.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"core-foundation 0.9.4",
|
||||
"system-configuration-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration-sys"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "system-deps"
|
||||
version = "6.2.2"
|
||||
|
@ -3345,7 +3630,7 @@ checksum = "833b4d43383d76d5078d72f3acd977f47eb5b6751eb40baa665d13828e7b79df"
|
|||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"cocoa",
|
||||
"core-foundation",
|
||||
"core-foundation 0.10.0",
|
||||
"core-graphics",
|
||||
"crossbeam-channel",
|
||||
"dispatch",
|
||||
|
@ -3529,6 +3814,49 @@ dependencies = [
|
|||
"walkdir",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tauri-plugin-fs"
|
||||
version = "2.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96ba7d46e86db8c830d143ef90ab5a453328365b0cc834c24edea4267b16aba0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"dunce",
|
||||
"glob",
|
||||
"percent-encoding",
|
||||
"schemars",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_repr",
|
||||
"tauri",
|
||||
"tauri-plugin",
|
||||
"thiserror 1.0.69",
|
||||
"url",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tauri-plugin-http"
|
||||
version = "2.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c752aee1b00ec3c4d4f440095995d9bd2c640b478f2067d1fba388900b82eb96"
|
||||
dependencies = [
|
||||
"data-url",
|
||||
"http",
|
||||
"regex",
|
||||
"reqwest",
|
||||
"schemars",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tauri",
|
||||
"tauri-plugin",
|
||||
"tauri-plugin-fs",
|
||||
"thiserror 1.0.69",
|
||||
"tokio",
|
||||
"url",
|
||||
"urlpattern",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tauri-plugin-log"
|
||||
version = "2.0.2"
|
||||
|
@ -3770,9 +4098,32 @@ dependencies = [
|
|||
"mio",
|
||||
"pin-project-lite",
|
||||
"socket2",
|
||||
"tokio-macros",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-macros"
|
||||
version = "2.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.87",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-rustls"
|
||||
version = "0.26.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
|
||||
dependencies = [
|
||||
"rustls",
|
||||
"rustls-pki-types",
|
||||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.7.12"
|
||||
|
@ -3950,18 +4301,39 @@ dependencies = [
|
|||
"unic-common",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-bidi"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-normalization"
|
||||
version = "0.1.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
|
||||
dependencies = [
|
||||
"tinyvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-segmentation"
|
||||
version = "1.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
|
||||
|
||||
[[package]]
|
||||
name = "untrusted"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
||||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.5.3"
|
||||
|
@ -3969,7 +4341,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada"
|
||||
dependencies = [
|
||||
"form_urlencoded",
|
||||
"idna",
|
||||
"idna 1.0.3",
|
||||
"percent-encoding",
|
||||
"serde",
|
||||
]
|
||||
|
@ -4223,6 +4595,15 @@ dependencies = [
|
|||
"system-deps",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "webpki-roots"
|
||||
version = "0.26.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841c67bff177718f1d4dfefde8d8f0e78f9b6589319ba88312f567fc5841a958"
|
||||
dependencies = [
|
||||
"rustls-pki-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "webview2-com"
|
||||
version = "0.33.0"
|
||||
|
@ -4781,6 +5162,12 @@ dependencies = [
|
|||
"synstructure",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zeroize"
|
||||
version = "1.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
|
||||
|
||||
[[package]]
|
||||
name = "zerovec"
|
||||
version = "0.10.4"
|
||||
|
|
|
@ -23,3 +23,4 @@ serde = { version = "1.0", features = ["derive"] }
|
|||
log = "0.4"
|
||||
tauri = { version = "2.1.0", features = [] }
|
||||
tauri-plugin-log = "2.0.0-rc"
|
||||
tauri-plugin-http = "2"
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
fn main() {
|
||||
tauri_build::build()
|
||||
tauri_build::build()
|
||||
}
|
||||
|
|
|
@ -6,6 +6,27 @@
|
|||
"main"
|
||||
],
|
||||
"permissions": [
|
||||
"core:default"
|
||||
{
|
||||
"identifier": "core:window:default",
|
||||
"permissions": [
|
||||
"core:window:default",
|
||||
"core:window:allow-start-dragging",
|
||||
"core:window:allow-is-fullscreen",
|
||||
"core:window:allow-minimize",
|
||||
"core:window:allow-toggle-maximize",
|
||||
"core:window:allow-close"
|
||||
],
|
||||
"windows": [
|
||||
"main"
|
||||
]
|
||||
},
|
||||
{
|
||||
"identifier": "http:default",
|
||||
"allow": [
|
||||
{
|
||||
"url": "https://ip.vomitblood.com"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
|
@ -1,16 +1,17 @@
|
|||
#[cfg_attr(mobile, tauri::mobile_entry_point)]
|
||||
pub fn run() {
|
||||
tauri::Builder::default()
|
||||
.setup(|app| {
|
||||
if cfg!(debug_assertions) {
|
||||
app.handle().plugin(
|
||||
tauri_plugin_log::Builder::default()
|
||||
.level(log::LevelFilter::Info)
|
||||
.build(),
|
||||
)?;
|
||||
}
|
||||
Ok(())
|
||||
})
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
tauri::Builder::default()
|
||||
.plugin(tauri_plugin_http::init())
|
||||
.setup(|app| {
|
||||
if cfg!(debug_assertions) {
|
||||
app.handle().plugin(
|
||||
tauri_plugin_log::Builder::default()
|
||||
.level(log::LevelFilter::Info)
|
||||
.build(),
|
||||
)?;
|
||||
}
|
||||
Ok(())
|
||||
})
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
|
|
|
@ -2,5 +2,5 @@
|
|||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
|
||||
fn main() {
|
||||
app_lib::run();
|
||||
app_lib::run();
|
||||
}
|
||||
|
|
|
@ -2,22 +2,6 @@
|
|||
"$schema": "../node_modules/@tauri-apps/cli/config.schema.json",
|
||||
"app": {
|
||||
"security": {
|
||||
"capabilities": [
|
||||
{
|
||||
"identifier": "my-identifier",
|
||||
"permissions": [
|
||||
"core:window:default",
|
||||
"core:window:allow-start-dragging",
|
||||
"core:window:allow-is-fullscreen",
|
||||
"core:window:allow-minimize",
|
||||
"core:window:allow-toggle-maximize",
|
||||
"core:window:allow-close"
|
||||
],
|
||||
"windows": [
|
||||
"main"
|
||||
]
|
||||
}
|
||||
],
|
||||
"csp": null
|
||||
},
|
||||
"windows": [
|
||||
|
|
|
@ -1,118 +0,0 @@
|
|||
import {
|
||||
Box,
|
||||
Button,
|
||||
Container,
|
||||
Grid2,
|
||||
Switch,
|
||||
TextField,
|
||||
Typography,
|
||||
useTheme,
|
||||
} from "@mui/material";
|
||||
|
||||
import { HeaderBar } from "../HeaderBar/HeaderBar";
|
||||
import { AttackItem } from "../Home/AttackItem";
|
||||
|
||||
export const Layout = () => {
|
||||
// contexts
|
||||
const theme = useTheme();
|
||||
|
||||
return (
|
||||
<Box
|
||||
sx={{
|
||||
backgroundColor: theme.palette.background.default,
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
height: "100vh",
|
||||
}}
|
||||
>
|
||||
<HeaderBar />
|
||||
<Container
|
||||
maxWidth="lg"
|
||||
sx={{
|
||||
justifyContent: "center",
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
flexGrow: 1,
|
||||
overflow: "auto",
|
||||
p: 1,
|
||||
}}
|
||||
>
|
||||
{/* main content goes here buddy */}
|
||||
<Box
|
||||
sx={{
|
||||
mb: 2,
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: "center",
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
justifyContent: "space-between",
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
sx={{
|
||||
mb: 2,
|
||||
}}
|
||||
variant="h3"
|
||||
>
|
||||
CSPJ Application Attacks
|
||||
</Typography>
|
||||
<Box>
|
||||
Secured version
|
||||
<Switch />
|
||||
</Box>
|
||||
</Box>
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: "center",
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
}}
|
||||
>
|
||||
{/*
|
||||
TODO: implmenent simple ping server to check if the user entered a valid backend url
|
||||
debounce when typing
|
||||
update textfield color based on the response
|
||||
*/}
|
||||
<TextField
|
||||
fullWidth
|
||||
label="Paste your backend URL here"
|
||||
value={process.env.PGHOST}
|
||||
/>
|
||||
</Box>
|
||||
<Button href="https://github.com/cspj-nyp/cspj-application">
|
||||
Need help getting started?
|
||||
</Button>
|
||||
</Box>
|
||||
<Grid2 container spacing={2}>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="SQL Injection" />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="Cross Site Scripting" />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="Command Injection" />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="File Inclusion Attacks" />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="CSRF" />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="Directory Traversal" />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="Insecure Desrialization" />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName="Session Hijacking" />
|
||||
</Grid2>
|
||||
</Grid2>
|
||||
</Container>
|
||||
</Box>
|
||||
);
|
||||
};
|
|
@ -3,6 +3,7 @@ import { WindowButtons } from "./WindowButtons";
|
|||
import { NavigationButtons } from "./NavigationButtons";
|
||||
import { RouteDisplay } from "./RouteDisplay";
|
||||
import { Testing } from "../Testing/Testing";
|
||||
import { ServerStatus } from "./ServerStatus";
|
||||
|
||||
export const HeaderBar = () => {
|
||||
return (
|
||||
|
@ -71,6 +72,7 @@ export const HeaderBar = () => {
|
|||
flexDirection: "row",
|
||||
}}
|
||||
>
|
||||
<ServerStatus />
|
||||
<Testing />
|
||||
<WindowButtons />
|
||||
</Stack>
|
||||
|
|
115
client/src/components/HeaderBar/ServerStatus.tsx
Normal file
115
client/src/components/HeaderBar/ServerStatus.tsx
Normal file
|
@ -0,0 +1,115 @@
|
|||
import { Box, Button, Chip, CircularProgress, Popover, Stack, useTheme } from "@mui/material";
|
||||
import { fetch } from "@tauri-apps/plugin-http";
|
||||
import { useAtom } from "jotai";
|
||||
import { MouseEvent, useState } from "react";
|
||||
import { serverConnectionAtom, serverUrlAtom } from "../../lib/jotai";
|
||||
import { defaultSettings } from "../../lib/settings";
|
||||
import { ServerUrlInput } from "../Home/ServerUrlInput";
|
||||
|
||||
export const ServerStatus = () => {
|
||||
// contexts
|
||||
const theme = useTheme();
|
||||
|
||||
// atoms
|
||||
const [serverConnection, setServerConnection] = useAtom(serverConnectionAtom);
|
||||
const [serverUrl, setServerUrl] = useAtom(serverUrlAtom);
|
||||
|
||||
// use states
|
||||
const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);
|
||||
|
||||
const clickEvent = (event: MouseEvent<HTMLButtonElement>) => {
|
||||
setAnchorEl(event.currentTarget);
|
||||
};
|
||||
|
||||
const dialogCloseEvent = () => {
|
||||
setAnchorEl(null);
|
||||
};
|
||||
|
||||
// function to check server health
|
||||
const checkServerConnection = async () => {
|
||||
fetch(serverUrl + "/health")
|
||||
.then((response) => {
|
||||
if (response.ok) {
|
||||
setServerConnection("connected");
|
||||
} else {
|
||||
setServerConnection("disconnected");
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
setServerConnection("disconnected");
|
||||
});
|
||||
|
||||
// if the server is connected then continue to ping every 5 seconds
|
||||
if (serverConnection === "connected") {
|
||||
setTimeout(checkServerConnection, 5000);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: "center",
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
p: 1,
|
||||
}}
|
||||
>
|
||||
{serverConnection === "connecting" && (
|
||||
<CircularProgress
|
||||
size='20px'
|
||||
sx={{ mr: 1 }}
|
||||
/>
|
||||
)}
|
||||
<Chip
|
||||
color='error'
|
||||
label='Server disconnected'
|
||||
onClick={clickEvent}
|
||||
size='small'
|
||||
/>
|
||||
<Popover
|
||||
anchorEl={anchorEl}
|
||||
anchorOrigin={{
|
||||
vertical: "bottom",
|
||||
horizontal: "center",
|
||||
}}
|
||||
onClose={dialogCloseEvent}
|
||||
open={Boolean(anchorEl)}
|
||||
transformOrigin={{
|
||||
vertical: "top",
|
||||
horizontal: "center",
|
||||
}}
|
||||
sx={{
|
||||
"transform": "translate(0px, 4px)",
|
||||
"& .MuiPaper-root": {
|
||||
borderRadius: defaultSettings.style.radius + "px",
|
||||
},
|
||||
}}
|
||||
>
|
||||
<Stack
|
||||
alignItems='center'
|
||||
display='flex'
|
||||
direction='row'
|
||||
spacing={1}
|
||||
sx={{
|
||||
backgroundColor: "#434446",
|
||||
p: 2,
|
||||
}}
|
||||
>
|
||||
<form
|
||||
onSubmit={() => {
|
||||
checkServerConnection();
|
||||
}}
|
||||
>
|
||||
<ServerUrlInput />
|
||||
<Button
|
||||
type='submit'
|
||||
variant='outlined'
|
||||
>
|
||||
Connect
|
||||
</Button>
|
||||
</form>
|
||||
</Stack>
|
||||
</Popover>
|
||||
</Box>
|
||||
);
|
||||
};
|
89
client/src/components/Home/Layout.tsx
Normal file
89
client/src/components/Home/Layout.tsx
Normal file
|
@ -0,0 +1,89 @@
|
|||
import { Box, Button, Container, Grid2, Switch, TextField, Typography, useTheme } from "@mui/material";
|
||||
|
||||
import { HeaderBar } from "../HeaderBar/HeaderBar";
|
||||
import { AttackItem } from "./AttackItem";
|
||||
import { ServerUrlInput } from "./ServerUrlInput";
|
||||
|
||||
export const Layout = () => {
|
||||
// contexts
|
||||
const theme = useTheme();
|
||||
|
||||
return (
|
||||
<Box
|
||||
sx={{
|
||||
backgroundColor: theme.palette.background.default,
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
height: "100vh",
|
||||
}}
|
||||
>
|
||||
<HeaderBar />
|
||||
<Container
|
||||
maxWidth='lg'
|
||||
sx={{
|
||||
justifyContent: "center",
|
||||
display: "flex",
|
||||
flexDirection: "column",
|
||||
flexGrow: 1,
|
||||
overflow: "auto",
|
||||
p: 1,
|
||||
}}
|
||||
>
|
||||
{/* main content goes here buddy */}
|
||||
<Box
|
||||
sx={{
|
||||
mb: 2,
|
||||
}}
|
||||
>
|
||||
<Box
|
||||
sx={{
|
||||
alignItems: "center",
|
||||
display: "flex",
|
||||
flexDirection: "row",
|
||||
justifyContent: "space-between",
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
sx={{
|
||||
mb: 2,
|
||||
}}
|
||||
variant='h3'
|
||||
>
|
||||
CSPJ Application Attack Simulator
|
||||
</Typography>
|
||||
</Box>
|
||||
<Button href='https://github.com/cspj-nyp/cspj-application'>Need help getting started?</Button>
|
||||
</Box>
|
||||
<Grid2
|
||||
container
|
||||
spacing={2}
|
||||
>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='SQL Injection' />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='Cross Site Scripting' />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='Command Injection' />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='File Inclusion Attacks' />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='CSRF' />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='Directory Traversal' />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='Insecure Desrialization' />
|
||||
</Grid2>
|
||||
<Grid2 size={3}>
|
||||
<AttackItem attackName='Session Hijacking' />
|
||||
</Grid2>
|
||||
</Grid2>
|
||||
</Container>
|
||||
</Box>
|
||||
);
|
||||
};
|
18
client/src/components/Home/ServerUrlInput.tsx
Normal file
18
client/src/components/Home/ServerUrlInput.tsx
Normal file
|
@ -0,0 +1,18 @@
|
|||
import { TextField } from "@mui/material";
|
||||
import { useAtom } from "jotai";
|
||||
import { serverConnectionAtom, serverUrlAtom } from "../../lib/jotai";
|
||||
|
||||
export const ServerUrlInput = () => {
|
||||
// atoms
|
||||
const [serverUrl, setServerUrl] = useAtom(serverUrlAtom);
|
||||
|
||||
return (
|
||||
<TextField
|
||||
fullWidth
|
||||
label='Paste your backend URL here (default: http://localhost:5000)'
|
||||
onChange={(event) => setServerUrl(event.target.value)}
|
||||
size='small'
|
||||
value={serverUrl}
|
||||
/>
|
||||
);
|
||||
};
|
|
@ -1,8 +1,9 @@
|
|||
import { BugReportOutlined } from "@mui/icons-material";
|
||||
import { Box, Button, IconButton, useTheme } from "@mui/material";
|
||||
import { fetch } from "@tauri-apps/plugin-http";
|
||||
import { useState } from "react";
|
||||
import { defaultSettings } from "../../lib/settings";
|
||||
import { FloatingDialog } from "../Generic/FloatingDialog";
|
||||
import { BugReportOutlined } from "@mui/icons-material";
|
||||
|
||||
export const Testing = () => {
|
||||
// contexts
|
||||
|
@ -15,6 +16,12 @@ export const Testing = () => {
|
|||
// functions
|
||||
const close = () => setOpenState(false);
|
||||
|
||||
const testing = () => {
|
||||
fetch("https://ip.vomitblood.com/ping").then((response) => {
|
||||
console.log(response);
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<FloatingDialog
|
||||
body={
|
||||
|
@ -30,19 +37,30 @@ export const Testing = () => {
|
|||
p: 0,
|
||||
}}
|
||||
>
|
||||
<Button onClick={() => {}}>connect to pg</Button>
|
||||
<Box>
|
||||
<Button
|
||||
onClick={() => {
|
||||
testing();
|
||||
}}
|
||||
>
|
||||
test
|
||||
</Button>
|
||||
</Box>
|
||||
</Box>
|
||||
}
|
||||
close={close}
|
||||
maximisedState={maximisedState}
|
||||
openButton={
|
||||
<IconButton onClick={() => setOpenState(true)} size="small">
|
||||
<IconButton
|
||||
onClick={() => setOpenState(true)}
|
||||
size='small'
|
||||
>
|
||||
<BugReportOutlined />
|
||||
</IconButton>
|
||||
}
|
||||
openState={openState}
|
||||
setMaximisedState={setMaximisedState}
|
||||
title="Testing"
|
||||
title='Testing'
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
import { Server } from "http";
|
||||
import { atom } from "jotai";
|
||||
|
||||
// store which page the user is currently on
|
||||
// no actual routing is done here,
|
||||
// full page components are used render the different pages
|
||||
export const routeAtom = atom("index");
|
||||
|
||||
// store the status of connection to backend
|
||||
type ServerConnection = "connected" | "connecting" | "disconnected";
|
||||
export const serverConnectionAtom = atom<ServerConnection>("disconnected");
|
||||
|
||||
// store the url of the backend server
|
||||
export const serverUrlAtom = atom("");
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import { Layout } from "../components/Generic/Layout";
|
||||
import { Layout } from "../components/Home/Layout";
|
||||
|
||||
export default function Home() {
|
||||
return <Layout />;
|
||||
|
|
|
@ -8,16 +8,23 @@ import (
|
|||
"github.com/Vomitblood/cspj-application/server/internal/sql_injection"
|
||||
)
|
||||
|
||||
func healthCheck(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Write([]byte(`{"status": "ok"}`))
|
||||
}
|
||||
|
||||
// setup the http server
|
||||
func ServeApi() {
|
||||
http.HandleFunc("/health", healthCheck)
|
||||
http.HandleFunc("/setup-demo-db", db.SetupDemoDb)
|
||||
http.HandleFunc("/nuke-db", db.NukeDb)
|
||||
http.HandleFunc("/fetch-all-users", db.FetchAllUsers)
|
||||
http.HandleFunc("/execute-sql", sql_injection.ExecuteSql)
|
||||
http.HandleFunc("/secure-execute-sql", sql_injection.SecureExecuteSql)
|
||||
http.HandleFunc("/secure-get-user", sql_injection.SecureGetUser)
|
||||
log.Println("Server is running on http://localhost:3001")
|
||||
if err := http.ListenAndServe(":3001", nil); err != nil {
|
||||
log.Println("Server is running on http://localhost:5000")
|
||||
if err := http.ListenAndServe(":5000", nil); err != nil {
|
||||
log.Fatalf("Failed to start server: %v", err)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue