Fix: Datenschutz Hintergrundbild + Dog-Refresh nach Anlegen (SW by-v928)
- dogs.py: welcome-dashboard Foto-Queries filtern jetzt auch nach user_id - worlds.js: Background Cache-Key enthält user_id (kein Cross-User Leakage) - worlds.js: Worlds.refresh(appState) neu - dog-profile.js: Worlds.refresh() nach Hund anlegen aufrufen
This commit is contained in:
parent
2a3afa0604
commit
00457f52f9
6 changed files with 25 additions and 9 deletions
|
|
@ -406,7 +406,7 @@ async def serve_media(path: str, request: _Request):
|
||||||
raise _HE(404, "Nicht gefunden.")
|
raise _HE(404, "Nicht gefunden.")
|
||||||
return _media_response(filepath)
|
return _media_response(filepath)
|
||||||
|
|
||||||
APP_VER = "927" # muss mit APP_VER in app.js übereinstimmen
|
APP_VER = "928" # muss mit APP_VER in app.js übereinstimmen
|
||||||
|
|
||||||
@app.get("/.well-known/assetlinks.json")
|
@app.get("/.well-known/assetlinks.json")
|
||||||
async def assetlinks():
|
async def assetlinks():
|
||||||
|
|
|
||||||
|
|
@ -191,23 +191,24 @@ async def get_welcome_dashboard(dog_id: int, user=Depends(get_current_user)):
|
||||||
raise HTTPException(404, "Hund nicht gefunden.")
|
raise HTTPException(404, "Hund nicht gefunden.")
|
||||||
|
|
||||||
# Hintergrundfoto: Querformat-Bilder bevorzugt, tagesweise rotierend
|
# Hintergrundfoto: Querformat-Bilder bevorzugt, tagesweise rotierend
|
||||||
|
# user_id-Filter als zweite Sicherungsebene (dog_id-Ownership bereits oben geprüft)
|
||||||
photos = conn.execute(
|
photos = conn.execute(
|
||||||
"""SELECT dm.url FROM diary_media dm
|
"""SELECT dm.url FROM diary_media dm
|
||||||
JOIN diary d ON d.id = dm.diary_id
|
JOIN diary d ON d.id = dm.diary_id
|
||||||
WHERE d.dog_id=? AND dm.media_type='image'
|
WHERE d.dog_id=? AND d.user_id=? AND dm.media_type='image'
|
||||||
AND dm.img_width IS NOT NULL AND dm.img_width > dm.img_height
|
AND dm.img_width IS NOT NULL AND dm.img_width > dm.img_height
|
||||||
ORDER BY d.datum DESC, d.id DESC, dm.id ASC""",
|
ORDER BY d.datum DESC, d.id DESC, dm.id ASC""",
|
||||||
(dog_id,)
|
(dog_id, user["id"])
|
||||||
).fetchall()
|
).fetchall()
|
||||||
# Fallback: Bilder ohne Dimensionsdaten (vor dem Backfill hochgeladen)
|
# Fallback: Bilder ohne Dimensionsdaten (vor dem Backfill hochgeladen)
|
||||||
if not photos:
|
if not photos:
|
||||||
photos = conn.execute(
|
photos = conn.execute(
|
||||||
"""SELECT dm.url FROM diary_media dm
|
"""SELECT dm.url FROM diary_media dm
|
||||||
JOIN diary d ON d.id = dm.diary_id
|
JOIN diary d ON d.id = dm.diary_id
|
||||||
WHERE d.dog_id=? AND dm.media_type='image'
|
WHERE d.dog_id=? AND d.user_id=? AND dm.media_type='image'
|
||||||
AND dm.img_width IS NULL
|
AND dm.img_width IS NULL
|
||||||
ORDER BY d.datum DESC, d.id DESC, dm.id ASC""",
|
ORDER BY d.datum DESC, d.id DESC, dm.id ASC""",
|
||||||
(dog_id,)
|
(dog_id, user["id"])
|
||||||
).fetchall()
|
).fetchall()
|
||||||
random_photo = None
|
random_photo = None
|
||||||
if photos:
|
if photos:
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Router, State-Management, Navigation, Initialisierung.
|
Router, State-Management, Navigation, Initialisierung.
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const APP_VER = '927'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
const APP_VER = '928'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
||||||
const APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt
|
const APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt
|
||||||
const IS_STAGING = location.hostname === 'staging.banyaro.app';
|
const IS_STAGING = location.hostname === 'staging.banyaro.app';
|
||||||
// Cache-Bust-Parameter nach Update-Reload sofort entfernen
|
// Cache-Bust-Parameter nach Update-Reload sofort entfernen
|
||||||
|
|
|
||||||
|
|
@ -1388,6 +1388,9 @@ window.Page_dog_profile = (() => {
|
||||||
// Dog Switcher in Header + Sidebar aktualisieren
|
// Dog Switcher in Header + Sidebar aktualisieren
|
||||||
App.renderDogSwitcher?.();
|
App.renderDogSwitcher?.();
|
||||||
|
|
||||||
|
// Welten neu laden damit HUND-Welt den neuen Hund zeigt
|
||||||
|
window.Worlds?.refresh(_appState);
|
||||||
|
|
||||||
await _render();
|
await _render();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -924,7 +924,8 @@ window.Worlds = (() => {
|
||||||
|
|
||||||
async function _loadDailyImage(dog) {
|
async function _loadDailyImage(dog) {
|
||||||
if (!dog) return null;
|
if (!dog) return null;
|
||||||
const todayKey = 'bg3_' + new Date().toISOString().slice(0, 10);
|
const userId = _state?.user?.id || 'anon';
|
||||||
|
const todayKey = `bg3_${userId}_` + new Date().toISOString().slice(0, 10);
|
||||||
const cached = _wLoad(todayKey);
|
const cached = _wLoad(todayKey);
|
||||||
if (cached?.data) return cached.data;
|
if (cached?.data) return cached.data;
|
||||||
try {
|
try {
|
||||||
|
|
@ -1689,6 +1690,17 @@ window.Worlds = (() => {
|
||||||
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');
|
||||||
}
|
}
|
||||||
|
|
||||||
return { init, show, hide, navigateTo, openConfig: _openConfigModal, get _visible() { return _visible; } };
|
function refresh(appState) {
|
||||||
|
if (appState) _state = appState;
|
||||||
|
localStorage.removeItem('w3_dogs');
|
||||||
|
_bgUrl = null;
|
||||||
|
if (_visible) {
|
||||||
|
if (_cur === 0) _renderJetzt();
|
||||||
|
else if (_cur === 1) _renderHund();
|
||||||
|
else _renderWelt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { init, show, hide, navigateTo, refresh, openConfig: _openConfigModal, get _visible() { return _visible; } };
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Offline-Cache + Push Notifications + Tile-Cache
|
Offline-Cache + Push Notifications + Tile-Cache
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const CACHE_VERSION = 'by-v927';
|
const CACHE_VERSION = 'by-v928';
|
||||||
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
||||||
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
|
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten
|
||||||
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
|
const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue