diff --git a/beta/beta_signups.csv b/beta/beta_signups.csv new file mode 100644 index 0000000..0182d6f --- /dev/null +++ b/beta/beta_signups.csv @@ -0,0 +1,104 @@ +Email +Abishanka.saha@gmail.com +juancampa@gmail.com +Bgfrazier@gmail.com +kernelsoe@gmail.com +Ekonomy@protonmail.com +kisunnayo@duck.com +Jacob_moya1117@yahoo.com +matias.sjoblom6@gmail.com +Ldelunak5@gmail.com +maxkmobey@icloud.com +W2019fgatfield@gmail.com +montanarinick@gmail.com +abishanka.saha@gmail.com +nate.d.luna@gmail.com +akbir.yfoga@8shield.net +noahflodder@gmail.com +arc360yt@gmail.com +omar.elfanek@gmail.com +aritraneogi2006@gmail.com +parchment.653468@schlosser.xyz +aubertbrennan@gmail.com +"parchment.page.displace612@passmail.net" +augustinamari14@gmail.com +pj@kantak.de +belle.smithies@gmail.com +pratyush.sahoo55@gmail.com +ben@bn0367.com +quigleyoto@gmail.com +bridger.joshua@gmail.com +resstowot@gmail.com +carlosgarciagutierrez.cgagu@gmail.com +samuel@sun.museum +cerca_sesion0u@icloud.com +sherin@hey.com +chankahei123456@gmail.com +ssampaoli@equo.dev +danielrouhana@gmail.com +sunny.gonna@gmail.com +david.regev@gmail.com +tamarindtypex@proton.me +fm100310@gmail.com +guignardmathias@gmail.com +vasconcelos.arthur@gmail.com +happywzm@gmail.com +victordedomenico.du60@gmail.com +hello@marlin.red +voidmelon@skiff.com +iyousifsabah@gmail.com +youvegotcaleb@gmail.com +jaywin.jv@gmail.com +zayn.khan@uconn.edu +john0000wu@gmail.com +Lukasdavisbarrs@gmail.com,2.20 9:35pm +zacharywood92@gmail.com,2.25 7:40pm +TYHSoftware@gmail.com,2.29 4:42pm +arnav@arnavgosain.com,3.1 2:23pm +fvaughan36@gmail.com,4.2 6:51pm +parchment@a.odajay.com,4.4 12:48pm +logan.a.welsh@gmail.com,4.21 12:16pm +andrew@renormalizing.com,4.22 2:10pm +shukur.mukhtarov@gmail.com,4.22 8:40pm +Jf.jessie@gmail.com,4.24 3:02am +dhanraj6174@gmail.com,4.25 12:55am +wenwu@hey.com,5.17 10:54pm +pcnk08@gmail.com,5.23 8:44am +Dainajag@aim.com,7.1 5:33am +Dainajag@aol.com,7.1 5:34am +luckyplukas@gmail.com,7.1 6:49am +yinan@hey.com,7.1 12:21pm +mano@flairvc.com,7.3 1:04pm +kayruss1@gmail.com,7.4 1:47pm +luckyplukas@googlemail.com,7.18 6:44am +rennt@oregonstate.edu,8.6 4:38pm +weconel991@daypey.com,8.22 11:55am +test@test.com,8.22 11:55am +jn,8.28 1:55pm +hart.lucas02@gmail.com,8.28 7:33pm +joe.jbh@proton.me,8.29 5:38pm +theobragstad22@gmail.com,8.29 6:25pm +seandavrancomputerscience@gmail.com,8.30 5:48am +sandavran@gmail.com,8.30 5:49am +harikakondur3@gmail.com,9.5 3:25pm +jacobef2@gmail.com,9.7 12:04am +gregjf@gmail.com,9.9 10:48pm +fnnjfndj@fake.com,9.25 3:10pm +ganeshharshu27@gmail.com,9.25 5:48pm +brayden.a15@gmail.com,9.26 10:48am +fantomhaiv65@gmail.com,9.26 1:40pm +ravidatd@oregonstate.edu,9.26 9:08pm +ethanpeterson55@gmail.com,9.27 12:48pm +craetona@oregonstate.edu,9.27 2:21pm +baumanne@oregonstate.edu,9.27 3:39pm +morgirme@gmail.com,9.29 9:19pm +saakiyama02@gmail.com,9.30 1:04am +randquistcp@gmail.com,10.4 8:52am +mgriffin@ncose.com,10.16 2:40pm +beastern@gmail.com,10.23 8:03pm +jalvarez062001@gmail.com,11.2 4:23pm +intim@oregonstate.edu,11.29 6:42pm +danielburnstech@gmail.com,12.12 11:12am +taykingg@gmail.com,6.19.2025 10:22pm +asdf@pm.me,8.2.2025 7:32pm +pp@pm.me,8.2.2025 7:37pm \ No newline at end of file diff --git a/fullchain.pem b/fullchain.pem new file mode 100644 index 0000000..8a6d86f --- /dev/null +++ b/fullchain.pem @@ -0,0 +1,50 @@ +-----BEGIN CERTIFICATE----- +MIIECzCCA5KgAwIBAgISBXwhSxScclnvXiGv4vODPHAqMAoGCCqGSM49BAMDMDIx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQDEwJF +NTAeFw0yNTA0MDgxNTUxNDlaFw0yNTA3MDcxNTUxNDhaMBsxGTAXBgNVBAMMECou +cGFyY2htZW50LnBhZ2UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASFM3oC5uJD +B9BiyHKvk2LQFDngkMA9W6XHhxuuwi4//XprHY4+kYc+EoSNkz4m5ku5b1FG5wY2 +hzVnnYeyhBdno4ICnTCCApkwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQWMBQGCCsG +AQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBSvq5Yi60F/ +nsb9/R0UGw15Sl/aGjAfBgNVHSMEGDAWgBSfK1/PPCFPnQS37SssxMZwi9LXDTBV +BggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9lNS5vLmxlbmNyLm9y +ZzAiBggrBgEFBQcwAoYWaHR0cDovL2U1LmkubGVuY3Iub3JnLzB2BgNVHREEbzBt +ghAqLnBhcmNobWVudC5wYWdlghBhZG1pbi5zdW4ubXVzZXVtgg1haS5zdW4ubXVz +ZXVtghJhbWVyaWNhLnN1bi5tdXNldW2CEHF1aWxsLnN1bi5tdXNldW2CEnNjcmFw +ZXIuc3VuLm11c2V1bTATBgNVHSAEDDAKMAgGBmeBDAECATAtBgNVHR8EJjAkMCKg +IKAehhxodHRwOi8vZTUuYy5sZW5jci5vcmcvNDMuY3JsMIIBBQYKKwYBBAHWeQIE +AgSB9gSB8wDxAHcADeHyMCvTDcFAYhIJ6lUu/Ed0fLHX6TDvDkIetH5OqjQAAAGW +Fk9RkQAABAMASDBGAiEA0QVjV0yjeKE/jBRAhheZdh63KEQL4jxe5Z5Qt93oa2YC +IQCNcP4pbxlW9vRHvIxFkHO35XjGOShU8IzEuOMMQbQltgB2AMz7D2qFcQll/pWb +U87psnwi6YVcDZeNtql+VMD+TA2wAAABlhZPUakAAAQDAEcwRQIhALXOWF8RBt8M +hKdISAB3oXoqP6gu0sIax6StXNb4hTfLAiB1hHzFz4J7VEFzvmXO2JSLk5rb5mHN +N61RnLwl6lLL2zAKBggqhkjOPQQDAwNnADBkAjBvp6IDen/nyXBbkxYOPhxe6Ej6 +4D6CGTans1DciQ5HxNarxYRk6DpTjMthd9ETYUYCMG1GCvOkpgmNcQfm0aJ5lb54 +tfjEZvG7Xlrzv4EeP7vpovoUlCkIs7+GAB3uaZaaXQ== +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIEVzCCAj+gAwIBAgIRAIOPbGPOsTmMYgZigxXJ/d4wDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw +WhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCRTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNCzqK +a2GOtu/cX1jnxkJFVKtj9mZhSAouWXW0gQI3ULc/FnncmOyhKJdyIBwsz9V8UiBO +VHhbhBRrwJCuhezAUUE8Wod/Bk3U/mDR+mwt4X2VEIiiCFQPmRpM5uoKrNijgfgw +gfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD +ATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSfK1/PPCFPnQS37SssxMZw +i9LXDTAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB +AQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g +BAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu +Y3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAH3KdNEVCQdqk0LKyuNImTKdRJY1C +2uw2SJajuhqkyGPY8C+zzsufZ+mgnhnq1A2KVQOSykOEnUbx1cy637rBAihx97r+ +bcwbZM6sTDIaEriR/PLk6LKs9Be0uoVxgOKDcpG9svD33J+G9Lcfv1K9luDmSTgG +6XNFIN5vfI5gs/lMPyojEMdIzK9blcl2/1vKxO8WGCcjvsQ1nJ/Pwt8LQZBfOFyV +XP8ubAp/au3dc4EKWG9MO5zcx1qT9+NXRGdVWxGvmBFRAajciMfXME1ZuGmk3/GO +koAM7ZkjZmleyokP1LGzmfJcUd9s7eeu1/9/eg5XlXd/55GtYjAM+C4DG5i7eaNq +cm2F+yxYIPt6cbbtYVNJCGfHWqHEQ4FYStUyFnv8sjyqU8ypgZaNJ9aVcWSICLOI +E1/Qv/7oKsnZCWJ926wU6RqG1OYPGOi1zuABhLw61cuPVDT28nQS/e6z95cJXq0e +K1BcaJ6fJZsmbjRgD5p3mvEf5vdQM7MCEvU0tHbsx2I5mHHJoABHb8KVBgWp/lcX +GWiWaeOyB7RP+OfDtvi2OsapxXiV7vNVs7fMlrRjY1joKaqmmycnBvAq14AEbtyL +sVfOS66B8apkeFX2NY4XPEYV4ZSCe8VHPrdrERk2wILG3T/EGmSIkCYVUMSnjmJd +VQD9F6Na/+zmXCc= +-----END CERTIFICATE----- diff --git a/main.go b/main.go index 6d294aa..caf81f9 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( + "crypto/tls" "fmt" "log" "net/http" @@ -56,7 +57,7 @@ func loggingMiddleware(next http.HandlerFunc) http.HandlerFunc { 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) + log.Printf("\033[33m%s\033[0m %s \033[94m%s %s\033[0m", formattedTime, cleanIP, r.Host, path) } // Add request info to global store @@ -74,22 +75,6 @@ func loggingMiddleware(next http.HandlerFunc) http.HandlerFunc { } } -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 @@ -100,15 +85,92 @@ func rootHandler(w http.ResponseWriter, r *http.Request) { } } +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 == "thefiveprinciples.org") { + target, _ := url.Parse("http://localhost:3001") + proxy := httputil.NewSingleHostReverseProxy(target) + r.Host = target.Host + proxy.ServeHTTP(w, r) + return + } else + if(r.Host == "americanforum.net") { + target, _ := url.Parse("http://localhost:3002") + proxy := httputil.NewSingleHostReverseProxy(target) + r.Host = target.Host + proxy.ServeHTTP(w, r) + return + } else + if(r.Host == "hyperia.so") { + target, _ := url.Parse("http://localhost:3003") + proxy := httputil.NewSingleHostReverseProxy(target) + r.Host = target.Host + proxy.ServeHTTP(w, r) + return + } else + if(r.Host == "aryan.so") { + target, _ := url.Parse("http://localhost:3004") + 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 main() { - log.SetFlags(0) + log.SetFlags(0) + + // Your handler with logging middleware 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) + // Load multiple certificates + certs := map[string]*tls.Certificate{} + + loadCert := func(domain string) { + cert, err := tls.LoadX509KeyPair( + "/etc/letsencrypt/live/"+domain+"/fullchain.pem", + "/etc/letsencrypt/live/"+domain+"/privkey.pem", + ) + if err != nil { + log.Fatalf("Failed to load certificate for %s: %v", domain, err) + } + certs[domain] = &cert } -} \ No newline at end of file + + // Example domains + loadCert("parchment.page") + loadCert("hyperia.so") + + // Configure TLS with SNI + tlsConfig := &tls.Config{ + GetCertificate: func(hello *tls.ClientHelloInfo) (*tls.Certificate, error) { + if cert, ok := certs[hello.ServerName]; ok { + return cert, nil + } + // fallback: return any default cert + return certs["hyperia.so"], nil + }, + MinVersion: tls.VersionTLS12, + } + + server := &http.Server{ + Addr: ":3000", + Handler: nil, // uses default http handler + TLSConfig: tlsConfig, + } + + log.Println("🔒 HTTPS server running on port 3000") + log.Fatal(server.ListenAndServeTLS("", "")) // certs handled by tlsConfig +} diff --git a/readme.md b/readme.md index 61e86fa..2ae6fe7 100644 --- a/readme.md +++ b/readme.md @@ -1 +1,3 @@ -```sudo go run *.go``` \ No newline at end of file +```sudo go run *.go``` + +https://uptime.betterstack.com/team/328750/monitors \ No newline at end of file diff --git a/src/betaSignups.go b/src/betaSignups.go index d01b605..3bab693 100644 --- a/src/betaSignups.go +++ b/src/betaSignups.go @@ -70,7 +70,7 @@ func BetaSignupHandler(w http.ResponseWriter, r *http.Request) { csvLine := fmt.Sprintf("\n%s,%s %s", req.Email, formattedDate, formattedTime) // Append to CSV file - csvFilePath := filepath.Join(homeDir, "Admin", "beta_signups.csv") + csvFilePath := filepath.Join(homeDir, "Admin", "beta", "beta_signups.csv") err = os.MkdirAll(filepath.Dir(csvFilePath), 0755) if err != nil { log.Printf("Error creating CSV directory: %v", err) diff --git a/ssl/index.js b/ssl/index.js index 1c0e33f..f9a4d1b 100644 --- a/ssl/index.js +++ b/ssl/index.js @@ -1,14 +1,33 @@ -/* 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 +This server useses two certificates: one for Parchment, which requires +wildcard domains, and one for all the other websites. + +*/ + + + +/* 1. Shut down Admin and run 'npm run start' (in this ssl folder) */ +/* 2.1 Run this command to support Parchment wildcard certs (AWS Authentication) + +sudo certbot certonly \ + --dns-route53 \ + -d '*.parchment.page' +*/ + +/* 2.2 Run this command to support all others + +sudo certbot certonly \ + --standalone \ + -d hyperia.so \ + -d aryan.so \ + -d admin.sun.museum \ + -d america.sun.museum \ + -d noahkurtis.com \ + -d americanforum.net \ + -d thefiveprinciples.org \ + -d government.forum +*/ import http from 'http';