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) }