added privacy policy page and about section, improved dir check, fixed crash when idexer is disabled

This commit is contained in:
partisan 2025-01-05 19:23:53 +01:00
parent 61266c461a
commit 5ae97da6d0
18 changed files with 698 additions and 107 deletions

View file

@ -18,44 +18,44 @@ func loadUserSettings(w http.ResponseWriter, r *http.Request) UserSettings {
var settings UserSettings
saveRequired := false
// Load theme
if cookie, err := r.Cookie("theme"); err == nil {
settings.Theme = cookie.Value
} else {
settings.Theme = "dark"
saveRequired = true
}
// Determine if the selected theme is dark
settings.IsThemeDark = settings.Theme == "dark" || settings.Theme == "night" || settings.Theme == "black" || settings.Theme == "latte"
// Load site language
if cookie, err := r.Cookie("site_language"); err == nil {
settings.SiteLanguage = cookie.Value
} else {
// If no site language is set, use Accept-Language or default to "en"
acceptLang := r.Header.Get("Accept-Language")
if acceptLang != "" {
settings.SiteLanguage = normalizeLangCode(strings.Split(acceptLang, ",")[0])
for _, cd := range AllCookies {
// Attempt to read the cookie
if cookie, err := r.Cookie(cd.Name); err == nil {
// Use SetValue to update the correct UserSettings field
cd.SetValue(&settings, cookie.Value)
} else {
settings.SiteLanguage = "en" // Default language
// If cookie is missing and you want a default value, set it here
switch cd.Name {
case "theme":
// Default theme to "dark" if missing
cd.SetValue(&settings, "dark")
saveRequired = true
case "site_language":
// Fallback to Accept-Language or "en"
acceptLang := r.Header.Get("Accept-Language")
if acceptLang != "" {
cd.SetValue(&settings, normalizeLangCode(acceptLang))
} else {
cd.SetValue(&settings, "en")
}
saveRequired = true
case "safe":
// Default safe to ""
cd.SetValue(&settings, "")
saveRequired = true
// etc. for other cookies if needed
}
}
saveRequired = true
}
// Load search language (can be empty)
if cookie, err := r.Cookie("search_language"); err == nil {
settings.SearchLanguage = cookie.Value
}
// Load safe search
if cookie, err := r.Cookie("safe"); err == nil {
settings.SafeSearch = cookie.Value
} else {
settings.SafeSearch = ""
saveRequired = true
}
// If theme was set, update IsThemeDark just to be sure
// Alternatively do it inside SetValue for "theme"
settings.IsThemeDark = settings.Theme == "dark" ||
settings.Theme == "night" ||
settings.Theme == "black" ||
settings.Theme == "latte"
// Save any new default cookies that might have been triggered
if saveRequired {
saveUserSettings(w, settings)
}
@ -66,38 +66,16 @@ func loadUserSettings(w http.ResponseWriter, r *http.Request) UserSettings {
func saveUserSettings(w http.ResponseWriter, settings UserSettings) {
expiration := time.Now().Add(90 * 24 * time.Hour)
http.SetCookie(w, &http.Cookie{
Name: "theme",
Value: settings.Theme,
Path: "/",
Expires: expiration,
Secure: true,
SameSite: http.SameSiteStrictMode,
})
http.SetCookie(w, &http.Cookie{
Name: "site_language",
Value: settings.SiteLanguage,
Path: "/",
Expires: expiration,
Secure: true,
SameSite: http.SameSiteStrictMode,
})
http.SetCookie(w, &http.Cookie{
Name: "search_language",
Value: settings.SearchLanguage,
Path: "/",
Expires: expiration,
Secure: true,
SameSite: http.SameSiteStrictMode,
})
http.SetCookie(w, &http.Cookie{
Name: "safe",
Value: settings.SafeSearch,
Path: "/",
Expires: expiration,
Secure: true,
SameSite: http.SameSiteStrictMode,
})
for _, cd := range AllCookies {
http.SetCookie(w, &http.Cookie{
Name: cd.Name,
Value: cd.GetValue(settings),
Path: "/",
Expires: expiration,
Secure: true,
SameSite: http.SameSiteStrictMode,
})
}
printDebug("settings saved: %v", settings)
}
@ -193,3 +171,84 @@ func isValidLangCode(lang string) bool {
}
return false
}
// CookieDefinition describes how a single cookie is handled
type CookieDefinition struct {
Name string
// GetValue extracts the corresponding field from UserSettings
GetValue func(UserSettings) string
// SetValue updates the corresponding field in UserSettings
SetValue func(*UserSettings, string)
// Description used in privacy table or docs
Description string
}
// AllCookies defines every cookie we handle in a single slice.
// Add or remove entries here, and the rest updates automatically.
var AllCookies = []CookieDefinition{
{
Name: "theme",
Description: "Stores the selected theme (dark, light, etc.)",
GetValue: func(s UserSettings) string {
return s.Theme
},
SetValue: func(s *UserSettings, val string) {
s.Theme = val
s.IsThemeDark = (val == "dark" || val == "night" || val == "black" || val == "latte")
},
},
{
Name: "site_language",
Description: "Stores the preferred site language.",
GetValue: func(s UserSettings) string {
return s.SiteLanguage
},
SetValue: func(s *UserSettings, val string) {
s.SiteLanguage = val
},
},
{
Name: "search_language",
Description: "Stores the preferred language for search results.",
GetValue: func(s UserSettings) string {
return s.SearchLanguage
},
SetValue: func(s *UserSettings, val string) {
s.SearchLanguage = val
},
},
{
Name: "safe",
Description: "Stores the Safe Search setting.",
GetValue: func(s UserSettings) string {
return s.SafeSearch
},
SetValue: func(s *UserSettings, val string) {
s.SafeSearch = val
},
},
}
type CookieRow struct {
Name string
Value string
Description string
Expiration string
}
func generateCookieTable(r *http.Request) []CookieRow {
var rows []CookieRow
for _, cd := range AllCookies {
value := "[Not Set]"
if cookie, err := r.Cookie(cd.Name); err == nil {
value = cookie.Value
}
rows = append(rows, CookieRow{
Name: cd.Name,
Value: value,
Description: cd.Description,
Expiration: "90 days",
})
}
return rows
}