huge commit for some reason

This commit is contained in:
Sarmonsiill 2022-03-22 08:41:57 +00:00
parent a55dbd0b42
commit 39e1f76a04
3 changed files with 167 additions and 13 deletions

5
go.mod
View File

@ -4,5 +4,8 @@ go 1.16
require (
github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 // indirect
github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975 // indirect
github.com/mattn/go-sqlite3 v1.14.8
github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce
github.com/twharmon/gouid v0.3.0
)

6
go.sum
View File

@ -1,4 +1,10 @@
github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25 h1:EFT6MH3igZK/dIVqgGbTqWVvkZ7wJ5iGN03SVtvvdd8=
github.com/jcelliott/lumber v0.0.0-20160324203708-dd349441af25/go.mod h1:sWkGw/wsaHtRsT9zGQ/WyJCotGWG/Anow/9hsAcBWRw=
github.com/mattn/go-sqlite3 v1.14.8 h1:gDp86IdQsN/xWjIEmr9MF6o9mpksUgh0fu+9ByFxzIU=
github.com/mattn/go-sqlite3 v1.14.8/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975 h1:zm/Rb2OsnLWCY88Njoqgo4X6yt/lx3oBNWhepX0AOMU=
github.com/nanobox-io/golang-scribble v0.0.0-20190309225732-aa3e7c118975/go.mod h1:4Mct/lWCFf1jzQTTAaWtOI7sXqmG+wBeiBfT4CxoaJk=
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9Hv8eCYJYvIGUTN2/KLq1pT6CjEc=
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4=
github.com/twharmon/gouid v0.3.0 h1:IQ6Zx0ozy2PCNdPNZ/PLjN+Z6BFPUbELq0/SL0sxCJE=
github.com/twharmon/gouid v0.3.0/go.mod h1:Ruorlc0y7P3Dy3IwLks8m6Rt96O+inLQO3El93ShqdU=

View File

@ -1,27 +1,172 @@
package main
import "fmt"
import "github.com/nanobox-io/golang-scribble"
import (
"database/sql"
"fmt"
"log"
"net/http"
"time"
_ "github.com/mattn/go-sqlite3"
scribble "github.com/nanobox-io/golang-scribble"
"github.com/tomasen/realip"
"github.com/twharmon/gouid"
)
var (
err error
db *sql.DB
)
type Account struct {
Username string
Email string
Pubkey string
Email string
Pubkey string
Desc string
}
const Header = `
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><meta charset="UTF-8"><title>tilde.guru</title><style>:root{--nc-font-sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--nc-font-mono:Consolas,monaco,'Ubuntu Mono','Liberation Mono','Courier New',Courier,monospace;--nc-tx-1:#000000;--nc-tx-2:#1A1A1A;--nc-bg-1:#FFFFFF;--nc-bg-2:#F6F8FA;--nc-bg-3:#E5E7EB;--nc-lk-1:#0070F3;--nc-lk-2:#0366D6;--nc-lk-tx:#FFFFFF;--nc-ac-1:#79FFE1;--nc-ac-tx:#0C4047}@media (prefers-color-scheme:dark){:root{--nc-tx-1:#ffffff;--nc-tx-2:#eeeeee;--nc-bg-1:#000000;--nc-bg-2:#111111;--nc-bg-3:#222222;--nc-lk-1:#3291FF;--nc-lk-2:#0070F3;--nc-lk-tx:#FFFFFF;--nc-ac-1:#7928CA;--nc-ac-tx:#FFFFFF}}*{margin:0;padding:0}address,area,article,aside,audio,blockquote,datalist,details,dl,fieldset,figure,form,iframe,img,input,meter,nav,ol,optgroup,option,output,p,pre,progress,ruby,section,table,textarea,ul,video{margin-bottom:1rem}button,html,input,select{font-family:var(--nc-font-sans)}body{margin:0 auto;max-width:750px;padding:2rem;border-radius:6px;overflow-x:hidden;word-break:break-word;overflow-wrap:break-word;background:var(--nc-bg-1);color:var(--nc-tx-2);font-size:1.03rem;line-height:1.5}::selection{background:var(--nc-ac-1);color:var(--nc-ac-tx)}h1,h2,h3,h4,h5,h6{line-height:1;color:var(--nc-tx-1);padding-top:.875rem}h1,h2,h3{color:var(--nc-tx-1);padding-bottom:2px;margin-bottom:8px;border-bottom:1px solid var(--nc-bg-2)}h4,h5,h6{margin-bottom:.3rem}h1{font-size:2.25rem}h2{font-size:1.85rem}h3{font-size:1.55rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:.875rem}a{color:var(--nc-lk-1)}a:hover{color:var(--nc-lk-2)}abbr:hover{cursor:help}blockquote{padding:1.5rem;background:var(--nc-bg-2);border-left:5px solid var(--nc-bg-3)}abbr{cursor:help}blockquote :last-child{padding-bottom:0;margin-bottom:0}header{background:var(--nc-bg-2);border-bottom:1px solid var(--nc-bg-3);padding:2rem 1.5rem;margin:-2rem calc(0px - (50vw - 50%)) 2rem;padding-left:calc(50vw - 50%);padding-right:calc(50vw - 50%)}header h1,header h2,header h3{padding-bottom:0;border-bottom:0}header>:first-child{margin-top:0;padding-top:0}header>:last-child{margin-bottom:0}a button,button,input[type=button],input[type=reset],input[type=submit]{font-size:1rem;display:inline-block;padding:6px 12px;text-align:center;text-decoration:none;white-space:nowrap;background:var(--nc-lk-1);color:var(--nc-lk-tx);border:0;border-radius:4px;box-sizing:border-box;cursor:pointer;color:var(--nc-lk-tx)}a button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default;opacity:.5;cursor:not-allowed}.button:focus,.button:hover,button:focus,button:hover,input[type=button]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:focus,input[type=submit]:hover{background:var(--nc-lk-2)}code,kbd,pre,samp{font-family:var(--nc-font-mono)}code,kbd,pre,samp{background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px;padding:3px 6px;font-size:.9rem}kbd{border-bottom:3px solid var(--nc-bg-3)}pre{padding:1rem 1.4rem;max-width:100%;overflow:auto}pre code{background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}code pre{display:inline;background:inherit;font-size:inherit;color:inherit;border:0;padding:0;margin:0}details{padding:.6rem 1rem;background:var(--nc-bg-2);border:1px solid var(--nc-bg-3);border-radius:4px}summary{cursor:pointer;font-weight:700}details[open]{padding-bottom:.75rem}details[open] summary{margin-bottom:6px}details[open]>:last-child{margin-bottom:0}dt{font-weight:700}dd::before{content:' '}hr{border:0;border-bottom:1px solid var(--nc-bg-3);margin:1rem auto}fieldset{margin-top:1rem;padding:2rem;border:1px solid var(--nc-bg-3);border-radius:4px}legend{padding:auto .5rem}table{border-collapse:collapse;width:100%}td,th{border:1px solid var(--nc-bg-3);text-align:left;padding:.5rem}th{background:var(--nc-bg-2)}tr:nth-child(even){background:var(--nc-bg-2)}table caption{font-weight:700;margin-bottom:.5rem}textarea{max-width:100%}ol,ul{padding-left:2rem}li{margin-top:.4rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}mark{padding:3px 6px;background:var(--nc-ac-1);color:var(--nc-ac-tx)}input,select,textarea{padding:6px 12px;margin-bottom:.5rem;background:var(--nc-bg-2);color:var(--nc-tx-2);border:1px solid var(--nc-bg-3);border-radius:4px;box-shadow:none;box-sizing:border-box}img{max-width:100%}
@import url("https://fonts.xz.style/serve/fira-code.css");:root{--nc-font-sans:'Fira Code', monospace;--nc-font-mono:'Fira Code', monospace;--nc-tx-1:#FFFFFF;--nc-tx-2:#EEEEEE;--nc-bg-1:#000000;--nc-bg-2:#002700;--nc-bg-3:#005800;--nc-lk-1:#00FF00;--nc-lk-2:#00c200;--nc-lk-tx:#000000;--nc-ac-1:#00FF00;--nc-ac-tx:#000000}</style></head><body>
<div id="content">
<h2>$ Registration _</h2>
<hr>
`
const Footer = `
</div>
</body>
</html>
`
const AddForm = `
<a href="https://tilde.guru">« go back</a><br /><hr />
<form method="POST" action="/signup/add">
username:<br /> <input type="text" name="username"><br />
email:<br /> <input type="email" name="email"><br />
pubkey:<br /> <textarea name="pubkey"></textarea><br />
why do you want to join?:<br /> <textarea name="desc"></textarea><br /><br />
<input type="submit" value="Apply">
</form>
`
const ThankYou = `
<p>Thank you for signing up. You will be contacted soon on your supplied email address.</p>
`
func main() {
fmt.Println("hej")
acc := Account{
Username: "david",
Email: "david@example.org",
Pubkey: "test123",
// initiate sqlite3 connection
db, err = sql.Open("sqlite3", "./ipcheck.db")
if err != nil {
log.Fatal(err)
}
db, err := scribble.New("data", nil)
defer db.Close()
// create database table if it doesn't exist
createQuery := `
CREATE TABLE IF NOT EXISTS ipcheck
(id INTEGER PRIMARY KEY NOT NULL,
ip VARCHAR,
ts VARCHAR)`
_, err = db.Exec(createQuery)
if err != nil {
log.Printf("%q: %s\n", err, createQuery)
}
web()
}
func saveIP(ip string) {
ts := time.Now().Unix()
insertQuery := "INSERT INTO ipcheck (ip, ts) VALUES ('%s', '%d')"
_, err = db.Exec(fmt.Sprintf(insertQuery, ip, ts))
if err != nil {
log.Printf("%q: %s\n", err, insertQuery)
}
}
func checkIP(ip string) int {
stmt, err := db.Prepare("SELECT COUNT(*) FROM ipcheck WHERE ip = ? AND ts > ?")
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
var count int
ts := time.Now().Unix() - 86400
err = stmt.QueryRow(ip, ts).Scan(&count)
if err != nil {
log.Fatal(err)
}
return count
}
func web() {
http.HandleFunc("/signup", ServeIndexPage)
http.HandleFunc("/signup/add", PostForm)
err := http.ListenAndServeTLS(":1985", "server.crt", "server.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
func ServeIndexPage(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/signup" {
http.Error(w, "Get out!", http.StatusNotFound)
return
}
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, fmt.Sprintf("%s%s%s", Header, AddForm, Footer))
return
}
// 86400
func PostForm(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
http.Error(w, "Get out!", http.StatusNotFound)
return
}
if r.URL.Path != "/signup/add" {
http.Error(w, "Get out!", http.StatusNotFound)
return
}
clientIP := realip.FromRequest(r)
count := checkIP(clientIP)
if count > 1 {
http.Error(w, "Too many requests. Please try again in 24 hours.", http.StatusTooManyRequests)
return
}
saveIP(clientIP)
if err := r.ParseForm(); err != nil {
fmt.Fprintf(w, "ParseForm() err: %v", err)
return
}
acc := Account{
Username: r.FormValue("username"),
Email: r.FormValue("email"),
Pubkey: r.FormValue("pubkey"),
Desc: r.FormValue("desc"),
}
uuid := gouid.String(8, gouid.LowerCaseAlphaNum)
jDB, err := scribble.New("data", nil)
if err != nil {
fmt.Println("Error", err)
}
if err := db.Write("acc", "david", acc); err != nil {
err = jDB.Write(
"acc",
fmt.Sprintf("%s_%s", uuid, acc.Username),
acc,
)
if err != nil {
fmt.Println("Error", err)
}
}
log.Printf("%s just registered\n", acc.Username)
w.Header().Set("Content-Type", "text/html; charset=utf-8")
fmt.Fprint(w, fmt.Sprintf("%s%s%s", Header, ThankYou, Footer))
return
}