From 58804fe6c16d0cbf3bac43c0d8ac051c8c3152cb Mon Sep 17 00:00:00 2001 From: Vomitblood Date: Mon, 11 Nov 2024 20:37:45 +0800 Subject: [PATCH] server health check --- .prettierrc | 18 + client/bun.lockb | Bin 181174 -> 185132 bytes client/package.json | 1 + client/src-tauri/Cargo.lock | 399 +++++++++++++++++- client/src-tauri/Cargo.toml | 1 + client/src-tauri/build.rs | 2 +- client/src-tauri/capabilities/default.json | 25 +- client/src-tauri/src/lib.rs | 27 +- client/src-tauri/src/main.rs | 2 +- client/src-tauri/tauri.conf.json | 16 - client/src/components/Generic/Layout.tsx | 118 ------ client/src/components/HeaderBar/HeaderBar.tsx | 2 + .../src/components/HeaderBar/ServerStatus.tsx | 115 +++++ client/src/components/Home/Layout.tsx | 89 ++++ client/src/components/Home/ServerUrlInput.tsx | 18 + client/src/components/Testing/Testing.tsx | 26 +- client/src/lib/jotai.ts | 11 + client/src/pages/index.tsx | 2 +- server/internal/http_server/http_server.go | 11 +- 19 files changed, 719 insertions(+), 164 deletions(-) create mode 100644 .prettierrc delete mode 100644 client/src/components/Generic/Layout.tsx create mode 100644 client/src/components/HeaderBar/ServerStatus.tsx create mode 100644 client/src/components/Home/Layout.tsx create mode 100644 client/src/components/Home/ServerUrlInput.tsx diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..794bbbd --- /dev/null +++ b/.prettierrc @@ -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 +} \ No newline at end of file diff --git a/client/bun.lockb b/client/bun.lockb index 34556dfe41e4285005b4665b3cfdd9bad7f2cd48..3ce0a0f26fdb4a00f2f652c9bcc0c8057dc9cb66 100755 GIT binary patch delta 38582 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 delta 36449 zcmeHwd0dX!`~P#_deR+HB$Y~$r6}4B*&v%G~~A6i_CO7 zXV4Jv_Mof4=hZ>N4FXa$4FU(y>fmiaQ^7ldz6K?}qsrd_rSd+YRNe;E5%hUQovt?M zHBd6>FlbHCti;seiJ1sEcycTuJtZBiu8oy0PY&%Om`xFQ2ucM$1BDa$L7)_>VW>zR z^a3TzTdI6xP->u>DlawF>FmJY1SJEHfs*0zprmgitdb*}o|T<|zG`lR_)`PkC`AR* z;?mNS(Mdf}f%-gtSXO*`u1+@rtq>og%Dq(D5EQ}6ADo^Ymkf^vq@$CE>vTm(lN{Y3 zH`oPMQGIPpTm?@K&u^>_j=v2GWTeLr8;H6(ZEXCE3g+yfSU1lTkw#eZ#~_z_xj!hW zI*Oj6SjfZHBROjaciCO6>!xMESuF9y`4@&j6f|5Z=aarjj z(sa6t^_7N`Ag9jBjY~~|4Z59>lm3mMRBwI*GB{6{KN<-dZi$(h>6sphIohZhA{Wr* zTe|6VupxgXDpJsIf+u5@vI)X*zbq|gq|O3X??{z^|}c=l_eC~OBx zT{aVPqWzmHT~-BMM8kF!tRT7=lp;V~o0pBgUGAkc&=ZtGruBJ3N>&aTl8*`$p-fQn zEJ;<+SEXG+sop&wrOSQ>r7jGFoIDLn9hTfAB`&_HpAxCzpk&BRKg6FrYT>U`^a7<2 zPDi8E=V_ocD6^9?(}xX8(j^8c3ht`ZBT&iT2}*{oRq1k2GH50!8Iqh8mzf!tt4mHx zO3X~o&iVv$>WY{Eb;7C*cx#Jlbg-g8Yd}-1DN0RFOHNJB%0AyrDc25$Qb=LHJZKZK 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¬VNGfAvTzHQb|Pg&ReAA} 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 { - // contexts - const theme = useTheme(); - - return ( - - - - {/* main content goes here buddy */} - - - - CSPJ Application Attacks - - - Secured version - - - - - {/* - 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 - */} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ); -}; diff --git a/client/src/components/HeaderBar/HeaderBar.tsx b/client/src/components/HeaderBar/HeaderBar.tsx index 200abff..f779ce6 100644 --- a/client/src/components/HeaderBar/HeaderBar.tsx +++ b/client/src/components/HeaderBar/HeaderBar.tsx @@ -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", }} > + diff --git a/client/src/components/HeaderBar/ServerStatus.tsx b/client/src/components/HeaderBar/ServerStatus.tsx new file mode 100644 index 0000000..6660f52 --- /dev/null +++ b/client/src/components/HeaderBar/ServerStatus.tsx @@ -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(null); + + const clickEvent = (event: MouseEvent) => { + 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 ( + + {serverConnection === "connecting" && ( + + )} + + + +
{ + checkServerConnection(); + }} + > + + + +
+
+
+ ); +}; diff --git a/client/src/components/Home/Layout.tsx b/client/src/components/Home/Layout.tsx new file mode 100644 index 0000000..d65032e --- /dev/null +++ b/client/src/components/Home/Layout.tsx @@ -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 ( + + + + {/* main content goes here buddy */} + + + + CSPJ Application Attack Simulator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/client/src/components/Home/ServerUrlInput.tsx b/client/src/components/Home/ServerUrlInput.tsx new file mode 100644 index 0000000..3586fba --- /dev/null +++ b/client/src/components/Home/ServerUrlInput.tsx @@ -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 ( + setServerUrl(event.target.value)} + size='small' + value={serverUrl} + /> + ); +}; diff --git a/client/src/components/Testing/Testing.tsx b/client/src/components/Testing/Testing.tsx index 0c36372..63edbde 100644 --- a/client/src/components/Testing/Testing.tsx +++ b/client/src/components/Testing/Testing.tsx @@ -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 ( { p: 0, }} > - + + + } close={close} maximisedState={maximisedState} openButton={ - setOpenState(true)} size="small"> + setOpenState(true)} + size='small' + > } openState={openState} setMaximisedState={setMaximisedState} - title="Testing" + title='Testing' /> ); }; diff --git a/client/src/lib/jotai.ts b/client/src/lib/jotai.ts index c7ae5d2..9e348c6 100644 --- a/client/src/lib/jotai.ts +++ b/client/src/lib/jotai.ts @@ -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("disconnected"); + +// store the url of the backend server +export const serverUrlAtom = atom(""); diff --git a/client/src/pages/index.tsx b/client/src/pages/index.tsx index 779323e..140e3b3 100644 --- a/client/src/pages/index.tsx +++ b/client/src/pages/index.tsx @@ -1,4 +1,4 @@ -import { Layout } from "../components/Generic/Layout"; +import { Layout } from "../components/Home/Layout"; export default function Home() { return ; diff --git a/server/internal/http_server/http_server.go b/server/internal/http_server/http_server.go index 06bc217..415e518 100644 --- a/server/internal/http_server/http_server.go +++ b/server/internal/http_server/http_server.go @@ -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) } }