198 lines
4.5 KiB
Go
198 lines
4.5 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"html/template"
|
|
"log"
|
|
"net/http"
|
|
"sync"
|
|
)
|
|
|
|
// User struktura za uporabniške podatke
|
|
type User struct {
|
|
ID int
|
|
Username string
|
|
Password string
|
|
Email string
|
|
FullName string
|
|
}
|
|
|
|
// In-memory shranjevanje uporabnikov
|
|
var (
|
|
users = make(map[string]*User)
|
|
usersMux = &sync.RWMutex{}
|
|
lastID = 0
|
|
)
|
|
|
|
// Template cache
|
|
var templates *template.Template
|
|
|
|
func init() {
|
|
// Privzeti uporabniki
|
|
addUser("jnovak", "secure123", "janez.novak@securebank.si", "Janez Novak")
|
|
addUser("mpetric", "banking456", "maja.petric@securebank.si", "Maja Petrič")
|
|
}
|
|
|
|
func addUser(username, password, email, fullName string) {
|
|
usersMux.Lock()
|
|
defer usersMux.Unlock()
|
|
lastID++
|
|
users[username] = &User{
|
|
ID: lastID,
|
|
Username: username,
|
|
Password: password,
|
|
Email: email,
|
|
FullName: fullName,
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
// Nastavimo port preko command line argumenta
|
|
var port = flag.String("port", "8080", "Port na katerem se bo zagnal server")
|
|
flag.Parse()
|
|
|
|
// Naložimo HTML predloge
|
|
var err error
|
|
templates, err = template.ParseGlob("templates/*.html")
|
|
if err != nil {
|
|
log.Fatal("Napaka pri nalaganju predlog:", err)
|
|
}
|
|
|
|
// Statične datoteke (CSS)
|
|
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static/"))))
|
|
|
|
// Routes
|
|
http.HandleFunc("/", homeHandler)
|
|
http.HandleFunc("/register", registerHandler)
|
|
http.HandleFunc("/login", loginHandler)
|
|
http.HandleFunc("/dashboard", dashboardHandler)
|
|
http.HandleFunc("/logout", logoutHandler)
|
|
|
|
// Zagon strežnika
|
|
fmt.Printf("SecureBank aplikacija se zaganja na portu %s\n", *port)
|
|
fmt.Printf("Dostop: http://localhost:%s\n", *port)
|
|
|
|
serverAddr := ":" + *port
|
|
log.Fatal(http.ListenAndServe(serverAddr, nil))
|
|
}
|
|
|
|
func homeHandler(w http.ResponseWriter, r *http.Request) {
|
|
templates.ExecuteTemplate(w, "home.html", nil)
|
|
}
|
|
|
|
func registerHandler(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method == "GET" {
|
|
templates.ExecuteTemplate(w, "register.html", nil)
|
|
return
|
|
}
|
|
|
|
if r.Method == "POST" {
|
|
username := r.FormValue("username")
|
|
password := r.FormValue("password")
|
|
email := r.FormValue("email")
|
|
fullName := r.FormValue("fullName")
|
|
|
|
//Validacija
|
|
if username == "" || password == "" || email == "" || fullName == "" {
|
|
templates.ExecuteTemplate(w, "register.html", map[string]string{
|
|
"Error": "Vsa polja so obvezna!",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Preverimo če uporabnik že obstaja
|
|
usersMux.RLock()
|
|
_, exists := users[username]
|
|
usersMux.RUnlock()
|
|
|
|
if exists {
|
|
templates.ExecuteTemplate(w, "register.html", map[string]string{
|
|
"Error": "Uporabniško ime že obstaja!",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Dodamo novega uporabnika
|
|
addUser(username, password, email, fullName)
|
|
|
|
// Preusmeri na prijavo
|
|
http.Redirect(w, r, "/login?registered=1", http.StatusSeeOther)
|
|
return
|
|
}
|
|
}
|
|
|
|
func loginHandler(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method == "GET" {
|
|
data := map[string]string{}
|
|
if r.URL.Query().Get("registered") == "1" {
|
|
data["Success"] = "Registracija je bila uspešna! Sedaj se lahko prijavite."
|
|
}
|
|
templates.ExecuteTemplate(w, "login.html", data)
|
|
return
|
|
}
|
|
|
|
if r.Method == "POST" {
|
|
username := r.FormValue("username")
|
|
password := r.FormValue("password")
|
|
|
|
// Preverimo podatke
|
|
usersMux.RLock()
|
|
user, exists := users[username]
|
|
usersMux.RUnlock()
|
|
|
|
if !exists || user.Password != password {
|
|
templates.ExecuteTemplate(w, "login.html", map[string]string{
|
|
"Error": "Napačno uporabniško ime ali geslo!",
|
|
})
|
|
return
|
|
}
|
|
|
|
// Uspešna prijava - preusmeri na dashboard
|
|
// POZOR: Brez session management za demo!
|
|
http.Redirect(w, r, "/dashboard?user="+username, http.StatusSeeOther)
|
|
return
|
|
}
|
|
}
|
|
|
|
func dashboardHandler(w http.ResponseWriter, r *http.Request) {
|
|
username := r.URL.Query().Get("user")
|
|
if username == "" {
|
|
http.Redirect(w, r, "/login", http.StatusSeeOther)
|
|
return
|
|
}
|
|
|
|
usersMux.RLock()
|
|
user, exists := users[username]
|
|
usersMux.RUnlock()
|
|
|
|
if !exists {
|
|
http.Redirect(w, r, "/login", http.StatusSeeOther)
|
|
return
|
|
}
|
|
|
|
// Simuliramo "bančne" podatke
|
|
accounts := []map[string]interface{}{
|
|
{
|
|
"Name": "Glavni račun",
|
|
"Number": "SI56 1234 5678 9012 345",
|
|
"Balance": "€2,456.78",
|
|
},
|
|
{
|
|
"Name": "Varčevalni račun",
|
|
"Number": "SI56 1234 5678 9012 999",
|
|
"Balance": "€15,230.45",
|
|
},
|
|
}
|
|
|
|
data := map[string]interface{}{
|
|
"User": user,
|
|
"Accounts": accounts,
|
|
}
|
|
|
|
templates.ExecuteTemplate(w, "dashboard.html", data)
|
|
}
|
|
|
|
func logoutHandler(w http.ResponseWriter, r *http.Request) {
|
|
http.Redirect(w, r, "/", http.StatusSeeOther)
|
|
}
|