summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÖzgür Kesim <oec@codeblau.de>2025-08-19 15:38:54 +0200
committerÖzgür Kesim <oec@codeblau.de>2025-08-19 15:38:54 +0200
commit167a740e9f8fb9da33944ab1ba88df1197a15f7c (patch)
treebcbd5a0a193df54e0f6e1062ae221f6d29424195
parentb8b3496807f7fa187f15f291daab50a00ebe9f37 (diff)
added auth, numbers
-rw-r--r--genesungswuensche.go (renamed from genesungswünsche.go)38
1 files changed, 30 insertions, 8 deletions
diff --git a/genesungswünsche.go b/genesungswuensche.go
index e9ed63a..8347d43 100644
--- a/genesungswünsche.go
+++ b/genesungswuensche.go
@@ -529,7 +529,6 @@ func escapeHTML(s string) string {
// indexHandler serves the main HTML page
func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) {
- log.Println("access from", r.RemoteAddr)
emails, err := s.parseMaildir()
if err != nil {
http.Error(w, "Error reading emails", http.StatusInternalServerError)
@@ -697,6 +696,10 @@ func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) {
white-space: pre-wrap;
}
+ ol li {
+ color: #333;
+ }
+
@media (max-width: 768px) {
.from {
font-size: 13px;
@@ -720,7 +723,9 @@ func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) {
<body>
<h1>Genesungswünsche</h1>
<div id="email-list">
+ <ol reversed>
{{range .}}
+ <li>
<div class="email-item {{if .IsRead}}read{{end}}" data-id="{{.ID}}" data-filename="{{.FileName}}" data-subdir="{{.Subdir}}">
<input type="checkbox" class="email-toggle" id="toggle-{{.ID}}">
<label for="toggle-{{.ID}}" class="email-header">
@@ -742,7 +747,9 @@ func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) {
</button>
</div>
</div>
+ </li>
{{end}}
+ </ol>
</div>
<script>
@@ -782,7 +789,7 @@ func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) {
}
function markAsRead(filename, emailItem, autoExpand = false, button = null) {
- fetch('/api/mark-read', {
+ fetch('/genesung/api/mark-read', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -822,7 +829,7 @@ func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) {
}
function markAsUnread(filename, emailItem, button) {
- fetch('/api/mark-unread', {
+ fetch('/genesung/api/mark-unread', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -978,15 +985,30 @@ func (s *Server) markUnreadHandler(w http.ResponseWriter, r *http.Request) {
})
}
+func auth(handler http.HandlerFunc) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ user, pass, ok := r.BasicAuth()
+
+ if !ok || user != "secret" || pass != "lair" {
+ w.Header().Set("WWW-Authenticate", `Basic realm="Genesung"`)
+ http.Error(w, "Unauthorized", http.StatusUnauthorized)
+ return
+ }
+
+ log.Println("authorized access from", r.Header.Get("X-Forwarded-For"))
+ handler(w, r)
+ }
+}
+
func main() {
if len(os.Args) < 2 {
fmt.Println("Usage: go run maildir-server.go <maildir-path> [port]")
- fmt.Println("Example: go run maildir-server.go ~/Maildir 8080")
+ fmt.Println("Example: go run maildir-server.go ~/Maildir 4242")
os.Exit(1)
}
maildirPath := os.Args[1]
- port := "8080"
+ port := "4242"
if len(os.Args) >= 3 {
port = os.Args[2]
}
@@ -995,9 +1017,9 @@ func main() {
maildirPath: maildirPath,
}
- http.HandleFunc("/", server.indexHandler)
- http.HandleFunc("/api/mark-read", server.markReadHandler)
- http.HandleFunc("/api/mark-unread", server.markUnreadHandler)
+ http.HandleFunc("/", auth(server.indexHandler))
+ http.HandleFunc("/genesung/api/mark-read", auth(server.markReadHandler))
+ http.HandleFunc("/genesung/api/mark-unread", auth(server.markUnreadHandler))
fmt.Printf("Starting server on http://localhost:%s\n", port)
fmt.Printf("Serving emails from: %s\n", maildirPath)