feat: visibilité & recherche des partages dirigés #196
CI / lint (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / security (push) Canceled after 0s
CI / build (push) Canceled after 0s
CI / e2e (push) Canceled after 0s

- icône share-2 bleue sur les fichiers partagés dans l'arborescence
- dossier virtuel Partage/ à la racine du home du destinataire (lecture seule /s/{token})
- recherche plein texte couvre les documents reçus (merge search_vaults, share_token)
- cache front invalidé à la création/révocation ; +2 tests non-fuite
This commit is contained in:
2026-10-10 21:23:00 -04:00
parent 49c715199d
commit fdc9f47a0d
19 changed files with 311 additions and 25 deletions
+27
View File
@@ -140,3 +140,30 @@ class TestDirectedShareGate:
assert user_client.get(f"/s/{body['token']}").status_code == 200
admin_client.delete(f"/api/share/{body['id']}")
assert user_client.get(f"/s/{body['token']}").status_code == 404
def test_search_finds_received_share_for_recipient(self, sessions):
# #196 : le contenu du document reçu est cherchable par le destinataire.
admin_client, user_client = sessions
path = _ensure_shared_file()
resp = admin_client.post("/api/share/TestVault", json={
"path": path, "shared_with": ["normaluser"],
})
token = resp.json()["token"]
resp = user_client.get("/api/search", params={"q": "dirigé", "vault": "all"})
assert resp.status_code == 200
hits = [r for r in resp.json()["results"] if r.get("share_token") == token]
assert hits, "le destinataire doit trouver le document reçu via la recherche"
assert hits[0]["vault"] == "home-normaluser"
assert hits[0]["path"].startswith("Partage/")
def test_search_does_not_leak_share_to_other_user(self, sessions):
# Un utilisateur non destinataire ne voit JAMAIS le contenu partagé
# dans ses résultats (le vault source lui est interdit).
admin_client, user_client = sessions
path = _ensure_shared_file()
admin_client.post("/api/share/TestVault", json={
"path": path, "shared_with": ["admin"], # dirigé à admin seul
})
resp = user_client.get("/api/search", params={"q": "dirigé", "vault": "all"})
assert resp.status_code == 200
assert not [r for r in resp.json()["results"] if r.get("share_token")]