diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..91e685d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "html/staticsimponic"] + path = html/staticsimponic + url = https://git.simponic.xyz/simponic/static.simponic.xyz +[submodule "html/the-abstraction-engine"] + path = html/the-abstraction-engine + url = https://git.simponic.xyz/simponic/the-abstraction-engine diff --git a/compile.sh b/compile.sh index 46ae743..31addf8 100755 --- a/compile.sh +++ b/compile.sh @@ -2,8 +2,9 @@ set -e -mkdir -p dist +git submodule update --init --recursive +mkdir -p dist pwd=$PWD for source in "html" "gemini" "gopher"; do diff --git a/html/build.sh b/html/build.sh index 722e1d3..816c324 100755 --- a/html/build.sh +++ b/html/build.sh @@ -1,5 +1,23 @@ #!/bin/sh +mkdir -p ../dist/public_html + cp -r ./public ../dist/public_html +mv staticsimponic/turing-machine ../dist/public_html +mv staticsimponic/euler-golf ../dist/public_html +mv staticsimponic/godel-explorer ../dist/public_html + +cd the-abstraction-engine/ +npm install +npm run build +cd .. +cp -r the-abstraction-engine/dist ../dist/public_html/the-abstraction-engine + +mkdir -p ../dist/fruitvote +cd fruitvote +go build -o ../../dist/fruitvote/fruitvote +cd .. +cp start.sh ../dist/fruitvote/start.sh echo "finished building HTML" + diff --git a/html/fruitvote/.gitignore b/html/fruitvote/.gitignore new file mode 100644 index 0000000..ba2906d --- /dev/null +++ b/html/fruitvote/.gitignore @@ -0,0 +1 @@ +main diff --git a/html/fruitvote/main.go b/html/fruitvote/main.go new file mode 100644 index 0000000..73c1c17 --- /dev/null +++ b/html/fruitvote/main.go @@ -0,0 +1,57 @@ +package main + +import ( + "flag" + "fmt" + "net" + "net/http" + "os" + "os/exec" + "strings" +) + +func indexHandler(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte("Hello, this is a Unix socket HTTP server in Go!")) +} + +func main() { + socketPath, users := getArgs() + os.Remove(socketPath) + + listener, err := net.Listen("unix", socketPath) + if err != nil { + panic(err) + } + os.Chmod(socketPath, 0700) + defer listener.Close() + + for _, user := range strings.Split(users, ",") { + setACL(socketPath, user) + } + + mux := http.NewServeMux() + mux.HandleFunc("/", indexHandler) + + http.Serve(listener, mux) +} + +func setACL(socketPath, user string) { + cmd := exec.Command("setfacl", "-m", "u:"+user+":rwx", socketPath) + if err := cmd.Run(); err != nil { + panic("failed to set ACL: " + err.Error()) + } +} + +func getArgs() (string, string) { + socketPath := flag.String("socket-path", "/tmp/go-server.sock", "Path to the Unix socket") + users := flag.String("users", "", "Comma-separated list of users for ACL") + flag.Parse() + + if *users == "" { + fmt.Println("You must specify at least one user with --users") + os.Exit(1) + } + + return *socketPath, *users +} diff --git a/html/public/css/style.css b/html/public/css/style.css new file mode 100644 index 0000000..a4f243f --- /dev/null +++ b/html/public/css/style.css @@ -0,0 +1,77 @@ +/* Basic Reset */ +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + background-color: #2a2a2a; /* Dark background */ + color: #f4c2c2; /* Soft pink text, typical of a girly 90s vibe */ + font-family: "Comic Sans MS", "Chalkboard SE", sans-serif; /* Retro, playful font */ + + padding: 20px; +} + +a { + color: #ff47da; /* Bright pink for links */ + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +button, +input[type="submit"], +input[type="button"] { + background-color: #ff69b4; /* Bright pink for buttons */ + border: none; + color: white; + padding: 10px 20px; + text-transform: uppercase; + font-family: "Comic Sans MS", "Chalkboard SE", sans-serif; + cursor: pointer; + transition: background-color 0.3s ease; +} + +button:hover, +input[type="submit"]:hover, +input[type="button"]:hover { + background-color: #ff1493; /* Darker pink on hover */ +} + +input[type="text"], +input[type="password"], +textarea { + background-color: #333; /* Darker elements for inputs */ + border: 1px solid #f4c2c2; /* Soft pink border */ + color: #f4c2c2; /* Soft pink text */ + padding: 10px; +} + +/* Example of styling a specific component differently */ +.special-button { + background-color: #ff47da; /* A different shade of pink */ + border-radius: 20px; /* Rounded edges for a more playful look */ +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: #ff69b4; + margin-bottom: 20px; +} + +p { + margin-bottom: 20px; +} + +li { + margin-left: 20px; +} diff --git a/html/public/fruitvote/GoPage.php b/html/public/fruitvote/GoPage.php new file mode 100644 index 0000000..c3a7d34 --- /dev/null +++ b/html/public/fruitvote/GoPage.php @@ -0,0 +1,88 @@ +page = $page; + $this->socket = $socket; + $this->template = $template; + + // test if socket exists + if (!file_exists($socket)) { + // start the server + exec($start_cmd); + } + + for ($i = 0; $i < 10; $i++) { + if (file_exists($socket)) { + break; + } + usleep(100_000); // wait 100ms + } + + if (!file_exists($socket)) { + throw new Exception("Could not start server"); + } + } + public function go() { + $ch = curl_init(); + $url = "http://localhost".$this->page; + + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_UNIX_SOCKET_PATH, $this->socket); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + + // forward headers + $headers = array(); + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) == "HTTP_") { + $key = str_replace(" ", "-", ucwords(strtolower(str_replace("_", " ", substr($key, 5))))); + $headers[] = "$key: $value"; + } + } + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + + // forward params depending on http method + if ($_SERVER['REQUEST_METHOD'] == "POST" || $_SERVER['REQUEST_METHOD'] == "PUT" || $_SERVER['REQUEST_METHOD'] == "DELETE") { + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents('php://input')); + } else { + $url .= "?".$_SERVER['QUERY_STRING']; + } + + // forward cookies + $cookie = array(); + foreach ($_COOKIE as $key => $value) { + $cookie[] = "$key=$value"; + } + + $output = curl_exec($ch); + curl_close($ch); + + // forward headers back to client + $headers = explode("\n", $output); + foreach ($headers as $header) { + if (strpos($header, "HTTP/") === false) { + header($header); + } + } + + // forward cookies back to client + $cookie = explode("\n", $output); + foreach ($cookie as $cookie) { + if (strpos($cookie, "Set-Cookie:") !== false) { + header($cookie); + } + } + + return $output; + } + + public function render() { + $response = $this->go(); + $template = file_get_contents($this->template); + return str_replace("{{content}}", $response, $template); + } +} diff --git a/html/public/fruitvote/index.php b/html/public/fruitvote/index.php new file mode 100644 index 0000000..1abfb0c --- /dev/null +++ b/html/public/fruitvote/index.php @@ -0,0 +1,7 @@ +render(); +?> diff --git a/html/public/img/penguin.gif b/html/public/img/penguin.gif new file mode 100644 index 0000000..48bd0e2 Binary files /dev/null and b/html/public/img/penguin.gif differ diff --git a/html/public/index.php b/html/public/index.php index 3ed5805..004a131 100644 --- a/html/public/index.php +++ b/html/public/index.php @@ -1,19 +1,49 @@ you are at my tilde.club page right now! hi!
-$ch = curl_init(); -$url = "http:/localhost"; -$unix = "/home/simponic/http.sock"; + +this is a penguin
-if (defined('CURLOPT_UNIX_SOCKET_PATH')) { - curl_setopt($ch, CURLOPT_UNIX_SOCKET_PATH, $unix); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +here you can:
- $response = curl_exec($ch); - echo $response; -} ++here are some stuffs i like: +
+here are some stuffs i don\'t like: +