diff --git a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java index 3049b02..8e3b2c5 100644 --- a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java +++ b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java @@ -148,6 +148,11 @@ public class PhotoController { model.addAttribute("currentPage", page); String currentUser = (auth != null ? auth.getName() : null); + boolean canComment = partageService.canComment(id, currentUser); + boolean canAdmin = partageService.canAdmin(id, currentUser); + + model.addAttribute("canComment", canComment); + model.addAttribute("canAdmin", canAdmin); model.addAttribute("currentUser", currentUser); model.addAttribute("partages", @@ -181,6 +186,7 @@ public class PhotoController { } + @GetMapping("/photo/{id}/unshare/{email}") public String unshare(@PathVariable Long id, @PathVariable String email) { diff --git a/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java b/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java index d23cc12..9c3a998 100644 --- a/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java +++ b/src/main/java/local/epul4a/fotosharing/repository/PartageRepository.java @@ -1,16 +1,15 @@ package local.epul4a.fotosharing.repository; import local.epul4a.fotosharing.model.Partage; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface PartageRepository extends JpaRepository { - // liste des partages pour une photo + List findByPhoto_Id(Long photoId); - // vérifier si un utilisateur a accès partagé boolean existsByPhoto_IdAndUtilisateur_Email(Long photoId, String email); List findByUtilisateur_Email(String email); + Optional findByPhoto_IdAndUtilisateur_Email(Long photoId, String email); } diff --git a/src/main/java/local/epul4a/fotosharing/security/SecurityService.java b/src/main/java/local/epul4a/fotosharing/security/SecurityService.java index 39f20fb..79d7681 100644 --- a/src/main/java/local/epul4a/fotosharing/security/SecurityService.java +++ b/src/main/java/local/epul4a/fotosharing/security/SecurityService.java @@ -1,48 +1,23 @@ package local.epul4a.fotosharing.security; -import local.epul4a.fotosharing.model.Photo; -import local.epul4a.fotosharing.repository.PartageRepository; -import local.epul4a.fotosharing.repository.PhotoRepository; -import org.springframework.stereotype.Service; - -import javax.naming.ldap.PagedResultsControl; -import java.util.Optional; +import local.epul4a.fotosharing.service.PartageService; import org.springframework.security.core.Authentication; - +import org.springframework.stereotype.Service; @Service("securityService") public class SecurityService { - private final PhotoRepository photoRepository; - private final PartageRepository partageRepository; - - public SecurityService(PhotoRepository photoRepository, PartageRepository partageRepository) { - this.photoRepository = photoRepository; - this.partageRepository = partageRepository; + private final PartageService partageService; + public SecurityService(PartageService partageService) { + this.partageService = partageService; } public boolean canAccessPhoto(Authentication authentication, Long photoId) { - Photo photo = photoRepository.findById(photoId).orElse(null); - if (photo == null) return false; - // PUBLIC → accès total - if (photo.getVisibilite() == Photo.Visibilite.PUBLIC) { - return true; - } - // Pas connecté → rejeter tout sauf PUBLIC if (authentication == null || !authentication.isAuthenticated()) { return false; } String email = authentication.getName(); - // Propriétaire → OK - if (photo.getProprietaire().getEmail().equals(email)) { - return true; - } - // SHARED → vérifier dans la table PARTAGE - if (photo.getVisibilite() == Photo.Visibilite.SHARED) { - return partageRepository.existsByPhoto_IdAndUtilisateur_Email(photoId, email); - } - // PRIVATE par défaut → refus - return false; + // Vérification basée sur les ACL (READ / COMMENT / ADMIN) + return partageService.canView(photoId, email); } } - diff --git a/src/main/java/local/epul4a/fotosharing/service/PartageService.java b/src/main/java/local/epul4a/fotosharing/service/PartageService.java index 3f7e6a2..6a4a4e4 100644 --- a/src/main/java/local/epul4a/fotosharing/service/PartageService.java +++ b/src/main/java/local/epul4a/fotosharing/service/PartageService.java @@ -1,10 +1,17 @@ package local.epul4a.fotosharing.service; import local.epul4a.fotosharing.dto.PartageDTO; +import local.epul4a.fotosharing.model.Partage; + import java.util.List; +import java.util.Optional; public interface PartageService { void share(Long photoId, String targetEmail, String permission, String ownerEmail); void unshare(Long photoId, String targetEmail); List getPartagesForPhoto(Long photoId); + boolean canView(Long photoId, String email); + boolean canComment(Long photoId, String email); + boolean canAdmin(Long photoId, String email); + } diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java index 910e13d..e37e73e 100644 --- a/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PartageServiceImpl.java @@ -75,4 +75,50 @@ public class PartageServiceImpl implements PartageService { if (partage != null) partageRepository.delete(partage); } + + @Override + public boolean canView(Long photoId, String email) { + Photo photo = photoRepository.findById(photoId).orElse(null); + if (photo == null) return false; + // Propriétaire => accès total + if (photo.getProprietaire().getEmail().equals(email)) + return true; + // Photo publique => tout le monde peut voir + if (photo.getVisibilite() == Photo.Visibilite.PUBLIC) + return true; + Partage partage = partageRepository + .findByPhoto_IdAndUtilisateur_Email(photoId, email) + .orElse(null); + return partage != null; // READ / COMMENT / ADMIN + } + + @Override + public boolean canComment(Long photoId, String email) { + Photo photo = photoRepository.findById(photoId).orElse(null); + if (photo == null) return false; + // propriétaire = admin total + if (photo.getProprietaire().getEmail().equals(email)) + return true; + Partage partage = partageRepository + .findByPhoto_IdAndUtilisateur_Email(photoId, email) + .orElse(null); + if (partage == null) return false; + return partage.getPermission() == Partage.Permission.COMMENT + || partage.getPermission() == Partage.Permission.ADMIN; + } + + @Override + public boolean canAdmin(Long photoId, String email) { + Photo photo = photoRepository.findById(photoId).orElse(null); + if (photo == null) return false; + // propriétaire = admin total + if (photo.getProprietaire().getEmail().equals(email)) + return true; + Partage partage = partageRepository + .findByPhoto_IdAndUtilisateur_Email(photoId, email) + .orElse(null); + if (partage == null) return false; + return partage.getPermission() == Partage.Permission.ADMIN; + } + } diff --git a/src/main/resources/templates/photo-detail.html b/src/main/resources/templates/photo-detail.html index fa57d9d..674152a 100644 --- a/src/main/resources/templates/photo-detail.html +++ b/src/main/resources/templates/photo-detail.html @@ -23,6 +23,7 @@
    +
  • Votre rôle :
  • Nom original :
  • Date upload :
  • Visibilité :
  • @@ -34,31 +35,35 @@ -

    Partager la photo

    -
    + + +
    +

    Partager la photo

    -
    - Seul le propriétaire peut partager cette photo. +
    + Vous n’avez pas les droits de gestion du partage.
    +

    Commentaires

    @@ -76,17 +81,22 @@
    -
    -

    Ajouter un commentaire

    -
    -
    - -
    -
    - +

    Connectez-vous pour commenter.

    + +
    + Vous pouvez consulter cette photo, mais pas commenter. +
    + +
    +

    Ajouter un commentaire

    +
    +
    + +
    +

    Voir en grande taille diff --git a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class index c6787a5..4ee2d5a 100644 Binary files a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class and b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class differ diff --git a/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class b/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class index 936e85a..b6fe434 100644 Binary files a/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class and b/target/classes/local/epul4a/fotosharing/repository/PartageRepository.class differ diff --git a/target/classes/local/epul4a/fotosharing/security/SecurityService.class b/target/classes/local/epul4a/fotosharing/security/SecurityService.class index 6312180..7cd567e 100644 Binary files a/target/classes/local/epul4a/fotosharing/security/SecurityService.class and b/target/classes/local/epul4a/fotosharing/security/SecurityService.class differ diff --git a/target/classes/local/epul4a/fotosharing/service/PartageService.class b/target/classes/local/epul4a/fotosharing/service/PartageService.class index cc07511..f8a7628 100644 Binary files a/target/classes/local/epul4a/fotosharing/service/PartageService.class and b/target/classes/local/epul4a/fotosharing/service/PartageService.class differ diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class index 8336e35..c76cfe2 100644 Binary files a/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class and b/target/classes/local/epul4a/fotosharing/service/impl/PartageServiceImpl.class differ diff --git a/target/classes/templates/photo-detail.html b/target/classes/templates/photo-detail.html index fa57d9d..674152a 100644 --- a/target/classes/templates/photo-detail.html +++ b/target/classes/templates/photo-detail.html @@ -23,6 +23,7 @@

      +
    • Votre rôle :
    • Nom original :
    • Date upload :
    • Visibilité :
    • @@ -34,31 +35,35 @@ -

      Partager la photo

      -
      + + +
      +

      Partager la photo

      -
      - Seul le propriétaire peut partager cette photo. +
      + Vous n’avez pas les droits de gestion du partage.
      +

      Commentaires

      @@ -76,17 +81,22 @@
      -
      -

      Ajouter un commentaire

      -
      -
      - -
      -
      - +

      Connectez-vous pour commenter.

      + +
      + Vous pouvez consulter cette photo, mais pas commenter. +
      + +
      +

      Ajouter un commentaire

      +
      +
      + +
      +

      Voir en grande taille