added privacy policy page and about section, improved dir check, fixed crash when idexer is disabled
This commit is contained in:
parent
61266c461a
commit
5ae97da6d0
18 changed files with 698 additions and 107 deletions
189
user-settings.go
189
user-settings.go
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue