125 lines
3.3 KiB
Go
125 lines
3.3 KiB
Go
//
|
|
// Created by vfs on 02.05.2024.
|
|
//
|
|
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"database/sql"
|
|
"regexp"
|
|
|
|
"github.com/gorilla/sessions"
|
|
_ "github.com/lib/pq"
|
|
"github.com/stripe/stripe-go/v78"
|
|
|
|
"crypto/tls"
|
|
|
|
"golang.org/x/crypto/acme/autocert"
|
|
)
|
|
|
|
var users *Usermodel
|
|
var subscriptions *SubscriptionModel
|
|
|
|
var key = []byte("super-secret-key")
|
|
var store = sessions.NewCookieStore(key)
|
|
|
|
var emailrx = regexp.MustCompile("/^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/")
|
|
|
|
func main() {
|
|
addr := flag.String("addr", "127.0.0.1:8080", "HTTP network addr")
|
|
//prodaddr := flag.String("prodaddr", "127.0.0.1:4000", "HTTP network addr")
|
|
prodaddr := flag.String("prodaddr", "45.76.84.7:443", "HTTP network addr")
|
|
|
|
production := flag.Bool("production", false, "Whether to use production port and TLS")
|
|
_ = addr
|
|
flag.Parse()
|
|
log.Println("Hello, Sailor!")
|
|
|
|
stripe.Key = "sk_test_51PGebgKUHKCjyTmc97rfDPcvew6EhqDz2qp3U7XoAMIilAU9IVo2NO4P7ylkTvbBafFVr94trha1VYY32jRWMw2K00Yq7YJXFf"
|
|
|
|
store.MaxAge(0)
|
|
|
|
db, err := sql.Open("postgres", "postgres://elves_database:iK2SoVbDhdCki5n3LxGyP6zKpLspt4@80.240.25.87/elves_database")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
users = &Usermodel{db}
|
|
subscriptions = &SubscriptionModel{db}
|
|
|
|
mux := http.NewServeMux()
|
|
|
|
//rows, err := db.Query("SELECT * FROM accounts")
|
|
//if err != nil {
|
|
// log.Fatal(err)
|
|
//}
|
|
//defer rows.Close()
|
|
|
|
//accounts := make([]*Account, 0)
|
|
//for rows.Next() {
|
|
// acc := new(Account)
|
|
// err := rows.Scan(&acc.id, &acc.Username, &acc.password, &acc.Color)
|
|
// if err != nil {
|
|
// log.Fatal(err)
|
|
// }
|
|
// accounts = append(accounts, acc)
|
|
//}
|
|
|
|
//if err = rows.Err() err != nil {
|
|
// log.Fatal(err)
|
|
//}
|
|
|
|
//for _, acc := range accounts {
|
|
// log.Println(acc)
|
|
//}
|
|
|
|
mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
|
|
|
|
mux.HandleFunc("/favicon.ico", favicon)
|
|
|
|
mux.HandleFunc("/", home)
|
|
mux.HandleFunc("/login", login)
|
|
mux.HandleFunc("/logout", logout)
|
|
mux.HandleFunc("/register", register)
|
|
mux.HandleFunc("/account", require_authenticated_user(account))
|
|
mux.HandleFunc("/deleteaccount", require_authenticated_user(deleteaccount))
|
|
mux.HandleFunc("/subscribe", require_authenticated_user(subscribe_stripe))
|
|
mux.HandleFunc("/managebilling", require_authenticated_user(managebilling))
|
|
mux.HandleFunc("/webhook", webhooks)
|
|
|
|
if *production {
|
|
autocertManager := autocert.Manager{
|
|
Prompt: autocert.AcceptTOS,
|
|
HostPolicy: autocert.HostWhitelist("alfheimgame.com"),
|
|
Email: "vicenteferrarismith@gmail.com",
|
|
Cache: autocert.DirCache("certs"),
|
|
}
|
|
|
|
tlsConfig := &tls.Config{
|
|
GetCertificate: autocertManager.GetCertificate,
|
|
PreferServerCipherSuites: true,
|
|
CurvePreferences: []tls.CurveID{tls.X25519, tls.CurveP256},
|
|
NextProtos: []string{"acme-tls/1"},
|
|
}
|
|
|
|
server := &http.Server{
|
|
Addr: *prodaddr,
|
|
Handler: log_connection(secure_headers(mux)),
|
|
TLSConfig: tlsConfig,
|
|
IdleTimeout: time.Minute,
|
|
ReadTimeout: 5 * time.Second,
|
|
WriteTimeout: 10 * time.Second,
|
|
}
|
|
|
|
log.Fatal(server.ListenAndServeTLS("", ""))
|
|
} else {
|
|
log.Fatal(http.ListenAndServe(*addr, log_connection(secure_headers(mux))))
|
|
}
|
|
}
|