Improve avatar cache handling by adding fallback directory creation and enhancing read logic

This commit is contained in:
Leon Bösche
2026-01-29 23:12:12 +01:00
parent a2884a9891
commit 07975c4fbe

View File

@@ -65,32 +65,50 @@ func avatarCachePath(cfg *config.Config, userID string, ext string) string {
} }
func writeAvatarCache(cfg *config.Config, userID string, ext string, data []byte) error { func writeAvatarCache(cfg *config.Config, userID string, ext string, data []byte) error {
p := avatarCachePath(cfg, userID, ext)
return os.WriteFile(p, data, 0644)
}
func readAvatarCache(cfg *config.Config, userID string) ([]byte, string, error) {
dir := cfg.AvatarCacheDir dir := cfg.AvatarCacheDir
if dir == "" { if dir == "" {
dir = "/var/cache/b0esche/avatars" dir = "/var/cache/b0esche/avatars"
} }
entries, err := os.ReadDir(dir) // Try to create the directory; if it fails, fall back to temp dir
if err != nil { if err := os.MkdirAll(dir, 0755); err != nil {
return nil, "", err fmt.Printf("[WARN] failed to create avatar cache dir %s: %v; trying fallback to tmp dir\n", dir, err)
fallback := filepath.Join(os.TempDir(), "b0esche_avatars")
if err2 := os.MkdirAll(fallback, 0755); err2 != nil {
return fmt.Errorf("failed to create avatar cache dir: %v; fallback failed: %v", err, err2)
}
dir = fallback
} }
for _, e := range entries { p := filepath.Join(dir, fmt.Sprintf("%s%s", userID, ext))
if strings.HasPrefix(e.Name(), userID+".") { return os.WriteFile(p, data, 0644)
p := filepath.Join(dir, e.Name()) }
b, err := os.ReadFile(p)
if err != nil { func readAvatarCache(cfg *config.Config, userID string) ([]byte, string, error) {
return nil, "", err checkDirs := []string{cfg.AvatarCacheDir}
if checkDirs[0] == "" {
checkDirs[0] = "/var/cache/b0esche/avatars"
}
// Also check fallback tmp dir
checkDirs = append(checkDirs, filepath.Join(os.TempDir(), "b0esche_avatars"))
for _, dir := range checkDirs {
entries, err := os.ReadDir(dir)
if err != nil {
continue
}
for _, e := range entries {
if strings.HasPrefix(e.Name(), userID+".") {
p := filepath.Join(dir, e.Name())
b, err := os.ReadFile(p)
if err != nil {
return nil, "", err
}
ext := filepath.Ext(e.Name())
ct := mime.TypeByExtension(ext)
if ct == "" {
ct = "application/octet-stream"
}
return b, ct, nil
} }
ext := filepath.Ext(e.Name())
ct := mime.TypeByExtension(ext)
if ct == "" {
ct = "application/octet-stream"
}
return b, ct, nil
} }
} }
return nil, "", fmt.Errorf("cache miss") return nil, "", fmt.Errorf("cache miss")