From 5ba9bae02c96ab66b07249348c0c1ff0bf9405a7 Mon Sep 17 00:00:00 2001 From: metacryst Date: Tue, 8 Apr 2025 11:53:18 -0500 Subject: [PATCH] init --- .gitignore | 1 + UI/index.html | 12 +++++ UI/index.js | 0 UI/lightning.png | Bin 0 -> 15593 bytes UI/shield.png | Bin 0 -> 8535 bytes go.mod | 5 ++ go.sum | 2 + main.go | 114 ++++++++++++++++++++++++++++++++++++++++++ readme.md | 1 + src/betaSignups.go | 96 +++++++++++++++++++++++++++++++++++ src/uiserver.go | 14 ++++++ ssl/index.js | 32 ++++++++++++ ssl/package-lock.json | 58 +++++++++++++++++++++ ssl/package.json | 16 ++++++ 14 files changed, 351 insertions(+) create mode 100644 .gitignore create mode 100644 UI/index.html create mode 100644 UI/index.js create mode 100644 UI/lightning.png create mode 100644 UI/shield.png create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 readme.md create mode 100644 src/betaSignups.go create mode 100644 src/uiserver.go create mode 100644 ssl/index.js create mode 100644 ssl/package-lock.json create mode 100644 ssl/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/UI/index.html b/UI/index.html new file mode 100644 index 0000000..a609c39 --- /dev/null +++ b/UI/index.html @@ -0,0 +1,12 @@ + + + + Admin + + + + + + + + \ No newline at end of file diff --git a/UI/index.js b/UI/index.js new file mode 100644 index 0000000..e69de29 diff --git a/UI/lightning.png b/UI/lightning.png new file mode 100644 index 0000000000000000000000000000000000000000..39ff0844e479184d05931ad5517f4af7d28bac16 GIT binary patch literal 15593 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 Qw7nx#QPfnZk+TZ>KPjx27XSbN literal 0 HcmV?d00001 diff --git a/UI/shield.png b/UI/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..1602e5355e231a68a8b053673fffc8695dcded28 GIT binary patch literal 8535 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 literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f4e2ed2 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module Admin + +go 1.22.0 + +require github.com/gorilla/websocket v1.5.3 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..25a9fc4 --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/main.go b/main.go new file mode 100644 index 0000000..6d294aa --- /dev/null +++ b/main.go @@ -0,0 +1,114 @@ +// main.go +package main + +import ( + "fmt" + "log" + "net/http" + "net/http/httputil" + "net/url" + "strings" + "sync" + "time" + "Admin/src" +) + +type RequestInfo struct { + Timestamp string `json:"timestamp"` + Host string `json:"host"` + IP string `json:"ip"` + Path string `json:"path"` + Method string `json:"method"` +} + +// Global store for request logs +var ( + requests []RequestInfo + mu sync.Mutex +) + +func isLocalIP(ipStr string) bool { + if ipStr == "[::1]" { + return true + } + return false +} + +func loggingMiddleware(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + ip := r.RemoteAddr + cleanIP, _, _ := strings.Cut(ip, ":") // Split at first colon, ignore port + cleanIP = strings.Trim(cleanIP, "[]") // Remove IPv6 brackets + cleanIP = strings.TrimPrefix(cleanIP, "::ffff:") + + path := r.URL.Path[1:] + if path == "" { + path = "/" + } + + now := time.Now() + formattedTime := fmt.Sprintf("%d.%d %d:%02d:%02d%s", + now.Month(), now.Day(), now.Hour()%12, now.Minute(), now.Second(), + map[bool]string{true: "am", false: "pm"}[now.Hour() < 12]) + + ipWithPort := r.RemoteAddr + ipWithPort = ipWithPort[:strings.LastIndex(ipWithPort, ":")] // Trim port for isLocalIP + if isLocalIP(ipWithPort) { + log.Printf("%s %s %s", r.Host, cleanIP, path) + } else { + log.Printf("%s %s \033[33m%s%s\033[0m", formattedTime, cleanIP, r.Host, path) + } + + // Add request info to global store + mu.Lock() + requests = append(requests, RequestInfo{ + Timestamp: time.Now().Format(time.RFC3339), // e.g., "2025-03-26T12:34:56Z" + Host: r.Host, + IP: cleanIP, + Path: path, + Method: r.Method, + }) + mu.Unlock() + + next(w, r) + } +} + +func outsideHandler(w http.ResponseWriter, r *http.Request) { + if r.Host == "america.sun.museum" { + target, _ := url.Parse("http://localhost:8000") + proxy := httputil.NewSingleHostReverseProxy(target) + r.Host = target.Host + proxy.ServeHTTP(w, r) + return + } else + if r.Host == "admin.sun.museum" { + src.BetaSignupHandler(w, r) + return + } + + fmt.Fprintf(w, "Hello, World! You're from outside.") +} + +func rootHandler(w http.ResponseWriter, r *http.Request) { + ip := r.RemoteAddr + ip = ip[:strings.LastIndex(ip, ":")] // Trim port + if isLocalIP(ip) { + src.UIServer(w, r) + } else { + outsideHandler(w, r) + } +} + +func main() { + log.SetFlags(0) + http.HandleFunc("/", loggingMiddleware(rootHandler)) + + certFile := "/etc/letsencrypt/live/parchment.page/fullchain.pem" + keyFile := "/etc/letsencrypt/live/parchment.page/privkey.pem" + log.Println("Server running on port 3000") + err := http.ListenAndServeTLS(":3000", certFile, keyFile, nil) + if err != nil { + log.Fatalf("Server failed: %v", err) + } +} \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..61e86fa --- /dev/null +++ b/readme.md @@ -0,0 +1 @@ +```sudo go run *.go``` \ No newline at end of file diff --git a/src/betaSignups.go b/src/betaSignups.go new file mode 100644 index 0000000..d01b605 --- /dev/null +++ b/src/betaSignups.go @@ -0,0 +1,96 @@ +package src + +import ( + "encoding/json" + "fmt" + "log" + "net/http" + "os" + "path/filepath" + "time" +) + +type SignupRequest struct { + Email string `json:"email"` +} + +func BetaSignupHandler(w http.ResponseWriter, r *http.Request) { + log.Printf("\033[33m%s \033[0m ", "betahandler") + + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS") + w.Header().Set("Access-Control-Allow-Headers", "Content-Type") + + if r.Method == http.MethodOptions { + w.WriteHeader(http.StatusOK) + return + } + + if r.Method != http.MethodPost { + log.Printf("\033[33m%s %s\033[0m ", "Method not allowed: ", r.Method) + http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) + return + } + + // Parse JSON request + var req SignupRequest + if err := json.NewDecoder(r.Body).Decode(&req); err != nil { + http.Error(w, "Invalid request", http.StatusBadRequest) + return + } + + // Get home directory + homeDir, err := os.UserHomeDir() + if err != nil { + log.Printf("Error getting home directory: %v", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + // Check if email folder exists + folderPath := filepath.Join(homeDir, "Admin", "beta_signups", req.Email) + if _, err := os.Stat(folderPath); !os.IsNotExist(err) { + log.Printf("\033[31memail already exists!\033[0m") + http.Error(w, "Email already exists", http.StatusBadRequest) + return + } + + // Create directory + err = os.MkdirAll(folderPath, 0755) + if err != nil { + log.Printf("Error creating directory: %v", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + // Format date and time + now := time.Now() + formattedDate := now.Format("1.2.2006") // M.D format + formattedTime := now.Format("3:04pm") // h:mma format + csvLine := fmt.Sprintf("\n%s,%s %s", req.Email, formattedDate, formattedTime) + + // Append to CSV file + csvFilePath := filepath.Join(homeDir, "Admin", "beta_signups.csv") + err = os.MkdirAll(filepath.Dir(csvFilePath), 0755) + if err != nil { + log.Printf("Error creating CSV directory: %v", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + f, err := os.OpenFile(csvFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + log.Printf("Error opening CSV file: %v", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + defer f.Close() + + if _, err := f.WriteString(csvLine); err != nil { + log.Printf("Error appending to CSV: %v", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return + } + + w.WriteHeader(http.StatusOK) +} \ No newline at end of file diff --git a/src/uiserver.go b/src/uiserver.go new file mode 100644 index 0000000..7c9a2ca --- /dev/null +++ b/src/uiserver.go @@ -0,0 +1,14 @@ +package src + +import ( + "net/http" +) + +func UIServer(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/" { + http.ServeFile(w, r, "./UI/index.html") + return + } + + http.FileServer(http.Dir("./UI")).ServeHTTP(w, r) +} \ No newline at end of file diff --git a/ssl/index.js b/ssl/index.js new file mode 100644 index 0000000..1c0e33f --- /dev/null +++ b/ssl/index.js @@ -0,0 +1,32 @@ +/* 1. Shut down Admin and run this file 'npm run start' */ + +/* 2. Run this command */ +// sudo certbot certonly \ +// --dns-route53 \ +// -d '*.parchment.page' \ +// -d quill.sun.museum \ +// -d admin.sun.museum \ +// -d scraper.sun.museum \ +// -d ai.sun.museum \ +// -d america.sun.museum + + +import http from 'http'; +import httpProxy from 'http-proxy'; +const proxy = httpProxy.createProxyServer({}); + +const server = http.createServer((req, res) => { + // Forward all requests from port 3000 to port 80 + proxy.web(req, res, { target: 'http://localhost:80' }); +}); + +server.listen(3000, () => { + console.log('Proxy server is running on port 3000 and forwarding requests to port 80'); +}); + + +/* 2024-12-30 Notes*/ +// Switched to AWS certification so Parchment Users can have wildcard domains (*.parchment.page) +// AWS must now be used for all domains +// pip3 install certbot-dns-route53 +// https://chatgpt.com/c/66fc4450-a570-8005-a177-1d1eb6c738e8 \ No newline at end of file diff --git a/ssl/package-lock.json b/ssl/package-lock.json new file mode 100644 index 0000000..ac4b590 --- /dev/null +++ b/ssl/package-lock.json @@ -0,0 +1,58 @@ +{ + "name": "ssl", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ssl", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "http-proxy": "^1.18.1" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + } + } +} diff --git a/ssl/package.json b/ssl/package.json new file mode 100644 index 0000000..842ad14 --- /dev/null +++ b/ssl/package.json @@ -0,0 +1,16 @@ +{ + "name": "ssl", + "version": "1.0.0", + "type": "module", + "description": "", + "main": "index.js", + "scripts": { + "start": "node index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "http-proxy": "^1.18.1" + } +}