diff --git a/Dockerfile b/Dockerfile
index c461d23..3418428 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,9 +16,14 @@ FROM scratch
# Kopiere die gebaute Binärdatei
COPY --from=builder /app/password-generator /password-generator
+# Kopiere die templates
+COPY templates/ /templates/
+
+# Kopiere die static files
+COPY static/ /static/
+
# Setze die Umgebungsvariable für die Ports
ENV PORT=8080
# Starte die Anwendung
CMD ["/password-generator"]
-
diff --git a/main.go b/main.go
index 0f11aa3..76ce59b 100644
--- a/main.go
+++ b/main.go
@@ -2,582 +2,76 @@ package main
import (
"crypto/rand"
- "fmt"
+ "html/template"
"log"
"net/http"
)
const (
passwordLength = 32
- // Zeichensatz mit 62 möglichen Zeichen pro Position
chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-
- // Zeichensatz mit 58 möglichen Zeichen pro Position
- // Verwechslungsanfällige Zeichen (0, O, 1, l, I) sind nicht enthalten.
- //
- // ## Security Note: ################################################
- // Der reduzierte Zeichensatz setzt den Keyspace von 10^57 auf 10^56 herab.
- // Die Entropie wird von ~192.6 Bit auf ~190.6 Bit herabgesetzt.
- // Solange die Passwortlänge von 32 Zeichen beibehalten wird ist der
- // Sicherheitsverlust durch einen reduzierten Zeichensatz akzeptabel,
- // weil der Keyspace immer noch so groß ist dass ein erraten praktisch
- // unmöglich ist.
- //
- //const chars = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789"
-
)
+//var tmpl *template.Template
+var templates = make(map[string]*template.Template)
+
+func loadTemplates() {
+ templates["index.html"] = template.Must(template.ParseFiles("templates/base.html", "templates/index.html"))
+ templates["help.html"] = template.Must(template.ParseFiles("templates/base.html", "templates/help.html"))
+ log.Printf("Alle Templates erfolgreich geladen")
+}
+
func generatePassword() string {
password := make([]byte, passwordLength)
_, err := rand.Read(password)
if err != nil {
log.Fatal(err)
}
-
for i := 0; i < passwordLength; i++ {
password[i] = chars[int(password[i])%len(chars)]
}
-
return string(password)
}
func passwordHandler(w http.ResponseWriter, r *http.Request) {
- log.Printf("APIHandler called from %s\n", r.RemoteAddr)
password := generatePassword()
- fmt.Fprint(w, password)
+ w.Header().Set("Content-Type", "text/plain")
+ w.Write([]byte(password))
+}
+
+func indexHandler(w http.ResponseWriter, r *http.Request) {
+ log.Printf("call indexHandler: Request %s %s\n", r.Method, r.URL)
+ password := generatePassword()
+ data := struct {
+ Password string
+ }{
+ Password: password,
+ }
+ err := templates["index.html"].ExecuteTemplate(w, "base.html", data)
+ if err != nil {
+ log.Printf("Fehler beim Rendern des Templates: %v", err)
+ http.Error(w, "Interner Serverfehler", http.StatusInternalServerError)
+ }
}
-// new help handler
func helpHandler(w http.ResponseWriter, r *http.Request) {
- log.Printf("helpHandler called from %s\n", r.RemoteAddr)
- helpHTML := `
-
-
-
- Hilfe
-
-
-
-
-
-
Hilfe: API-Endpunkt
-
- Diese Anwendung bietet einen API-Endpunkt, um Passwörter direkt über die Kommandozeile abzurufen.
- Der Endpunkt gibt das Passwort im Plain-Text-Format zurück.
-