rootMux := http.NewServeMux()
rootMux.Handle("/api/", http.StripPrefix("/api", api))
+ var handler http.Handler = rootMux
+
// Create a handler chain with Timeout, Logger and CORS middleware
// Timeout middleware will be executed first, then Logger, then CORS
- handler := timeoutMiddleware(middleware.Logger(middleware.CORS(rootMux)))
+ if len(utils.Settings.AllowedHosts) == 0 {
+ logger.Println("Warning: ALLOWED_HOSTS is empty, CORS will not allow any cross-origin requests")
+ } else {
+ handler = middleware.CORS(rootMux)
+ }
+ handler = timeoutMiddleware(middleware.Logger(handler))
// Create the server without ReadTimeout/WriteTimeout (managed by middleware)
server := &http.Server{
import (
"context"
"net/http"
+ "slices"
"strings"
"time"
origin := r.Header.Get("Origin")
// Check if origin is in allowed hosts
- allowed := false
- for _, host := range utils.Settings.AllowedHosts {
- if origin == host {
- allowed = true
- break
- }
- }
+ allowed := slices.Contains(utils.Settings.AllowedHosts, origin)
// Set CORS headers if origin is allowed
if allowed {
w.Header().Set("Access-Control-Allow-Origin", origin)
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
- w.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Disposition")
w.Header().Set("Access-Control-Allow-Credentials", "true")
}
Development: false,
SecretToken: GenerateSecretToken(),
LogoutAfterDays: 30,
- AllowedHosts: []string{"http://localhost:5173", "http://127.0.0.1:5173"},
+ AllowedHosts: []string{},
Indent: 0,
AllowRegistration: false,
}
"installation_help": "Du kannst DailyTxT auch wie eine App installieren. Das geht über die Einstellungen des Browsers, wird aber nicht von jedem Browser unterstützt. Aktuell wurde keine Installation erkannt.<br/> \n<ul>\n<li>Android: \"Zum Startbildschirm hinzufügen\"</li>\n<li>Apple: \"Teilen\" -> \"Zum Home-Bildschirm\"</li>\n</ul>",
"language": "Sprache",
"language_auto_detect": "Sprache anhand des Browsers ermitteln. Aktuell:",
+ "language.help_translate": "Deine Sprache ist nicht enthalten? Dann hilf mit bei der Übersetzung! Infos dazu findest du hier:",
"language_not_available": "Die Sprache <code>{browserLanguage}</code> ist nicht verfügbar. Es wird die Standardsprache <code>{defaultLanguage}</code> verwendet.",
"language.reload_info": "Manche Änderungen werden erst nach einem Neuladen der Seite sichtbar.",
"language_X_used": "wird verwendet",
"installation_help": "You can also install DailyTxT like an app. This is done through the browser settings, but it is not supported by every browser. Currently, no installation has been detected.<br/>\n<ul>\n<li>Android: \"Add to Home screen\"</li>\n<li>Apple: \"Share\" -> \"Add to Home Screen\"</li>\n</ul>",
"language": "Language",
"language_auto_detect": "Determine language based on the browser. Currently:",
+ "language.help_translate": "Your language is not included? Then help to translate! You can find information about this here:",
"language_not_available": "The language <code>{browserLanguage}</code> is not available. The default language <code>{defaultLanguage}</code> is used.",
"language.reload_info": "Some changes only become visible after reloading the page.",
"language_X_used": "is used",
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
- proxy_read_timeout 600s; # allow long-running exports/uploads
+ proxy_set_header Origin $http_origin;
+ proxy_read_timeout 6000s; # allow long-running exports/uploads
}
# Service worker, manifest and assets should be served as-is