From 6c3ea128af4c1f0513e2303fb364820baa2058ad Mon Sep 17 00:00:00 2001 From: Subivas Date: Wed, 3 Dec 2025 08:36:16 +0100 Subject: [PATCH] =?UTF-8?q?FEAT=20:=20Ajout=20du=20m=C3=A9canisme=20READ,?= =?UTF-8?q?=20COMMENT=20et=20ADMIN=20pour=20les=20photos=20=C3=A0=20partag?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PhotoController.java | 6 +++ .../repository/PartageRepository.java | 7 ++- .../fotosharing/security/SecurityService.java | 39 +++----------- .../fotosharing/service/PartageService.java | 7 +++ .../service/impl/PartageServiceImpl.java | 46 +++++++++++++++++ .../resources/templates/photo-detail.html | 48 +++++++++++------- .../controller/PhotoController.class | Bin 8818 -> 9064 bytes .../repository/PartageRepository.class | Bin 838 -> 1066 bytes .../security/SecurityService.class | Bin 2396 -> 1281 bytes .../fotosharing/service/PartageService.class | Bin 577 -> 728 bytes .../service/impl/PartageServiceImpl.class | Bin 5516 -> 6785 bytes target/classes/templates/photo-detail.html | 48 +++++++++++------- 12 files changed, 127 insertions(+), 74 deletions(-) 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 c6787a5cd6761ff5364536db8b3a1a60f4fb697d..4ee2d5a42635d5006eb5fd3edd0cc9511ec32fd7 100644 GIT binary patch delta 2127 zcmah~X>62L6g_vgZ??9~(CI8JEwYrhz-U4gXiy4962zcJqR^N)fw5MhC7t3A6EiJcCoBfl^{fkmqqB7j zb=!s@He#K?%MDG7m$tTf(dEbU*lb}-5D()8LFnGp{i)=VR9j1OW_$aRbgE5IHGW~; z+(G_EFE)CyO%PbLyrYA;=4a9!UTo*_%TgVksg`s`bM^+Y6Y`>c#y>srvLLwZp7zf6 ziHp;nsn#U{Jc->w?7?1pYT!oC{vck#tM(&-S>Clc5X9?v!#*CkBd}l3c{7N^c&mF# zaG&Ltg@XBZC={`WR5m%pZ|`he;I?{_GM|jIZ;D=!275-VUMAZ2#hTr3!+|6Ap;&_)wJ*l1E8Zd5li}u= zz%jgQkBv9Tar>5d%z6(sX793iW#dtS0lj?c_$e3i*^4Z@g$2&N*6X&8q_bKbQ)J<63&aMJ9mE1V3};ZvM4+3Ii_XNX9B zpW$;jjdd1ZFw2*;iEqBewd1ryE{1^t;8tMvSq}Xu&y}G3ivAiG9p}}VVUU^*HBaN~ z48Gwy==&Dm5!Vs>K%$wvjUJZFDhu_@49qEForCZ319t~-9aiHEeryF=I6jKMUVqj{t5+Y3D3PqL+~4Zhf5#v*s$#cvugM}1LjtE zxtuG4$svnBxLtiKXen_ytfZyH<*^(pMxRb<^c&5@ru*nEq9cHBp7jt8x=%DyNjs&4DPWX8o8jg zek(!^ajO^4IB~VNI9tz|FYXF&igM^ms*x^9l7k+6o zv$&wOG6!KhP+ga8!DCpC$JxDB!^RU>gQwUC*I*NWyYaNCoxAhsiVXD>R7k{zD}DH$ zV#V|r)?DOiz0s%}NvseLsqCFdt8K9yL!`X*Q zBkCqgd^0Qw^p~ItTdCI)?596UAr8=ACfYYnWTe8pLzR|dUgbtTA(fB*3HHbkqmJsD zM0S@84Lh+9P{JIBFu&3F288%OV4yT(MN(o#QeqM+w2@eW6ctICQ_GM`d9;Iig@g^j z3MZjN`Vn$7r7~114YI>E!?Uls71_bT$aY{TpZQZ11kMm(fjXyGo4+L7kX@P3-$wS48pn`7{ANZ(mt?1h4PH%@a#*cH)zWbcB&)Vy( zy-!{-c3E`a>A^h!7OLj0(L1AUVQf%{Ex*0Dw|jNp;#_xc7#kJBJzc$hT`RkDF>Jz9 z4xWzV89b{Wh|be@#1^EVQ;7H6yryqW`-<+qu2r|i@EEqnu?_wDVC<^U_BeK6r*4d2 z8s3Cb9D^9rtKv7rwo9}y{sZw5M?YA%#KK>CIGEIh$h3fizx(U!*IBAYKb~w* zwR%VLtm^4eRj2A5)xe-CsZS)w>=_DkbZu%*$We_7jWiqeY(iNnM7oG8NhI(l z-ZD5_%Q3kdhw!$!rxl}khbY8%81EurtRpzexbM*>vc(S9%9$OaYn0G}Uf6hHL6nv- z@YbRVcTpR8GI_UAoyU5MpJ)qyEGODx60mq84UI7-`V-@bN;QJN72|k*goQ3SX&NMCUaP7nsu2aH!0W6_iq`YghB|K@t^CdP*_1LC* z=A&94Z)z=c<6*4EdgM5-#iJ%K?*a3EUiq?`c#p|Y9x(4KKW}oinO%?3S`Zz$2EQ}w z5SC&VHkb#T$lqK0gKMJ0L;-Jz$5W>N;&juwO(~Bstl%tKOOczZY=9^DzhSQTNRLc;*yubl&V(&qNbp00u`{i8A{nISjOAKVmIy5yk%RvYnKFZ z3C{-w@UE$V``JMU4B(1JD`6=`uPKNnRVB!7NvjY|Da5qFZdcNOieRKs$`c5Fq2KRX z$~lw%`bzqR^k7LA|H1PRd(|!jyV;;g_&g_k*oiXia^;9Xh;VAB zQW2wvDk&UK5AwBD6qmENshByz#-QSaSH&f^LzUovwfRm{Df-fcu?P#48;am2&goD@ KWzQ=$EY&-3?ny>e?duReqLgZ zH6ue3OppsEXyY?cKytDy(@92_$4*LrgAbdZ~-ZPAm#>QCI(R; MhOopK#K9sG0DPPp^Z)<= delta 48 zcmZ3*ag2@Y)W2Q(7#J9A8N@bnsWMIe!nB={dGZ=&Um*r225z7P6N4~=2$&WH09%#{ AFaQ7m diff --git a/target/classes/local/epul4a/fotosharing/security/SecurityService.class b/target/classes/local/epul4a/fotosharing/security/SecurityService.class index 6312180e172523cddf0323dbdea14351da75374a..7cd567e0e428137aee6c23a568617a6ec9166d58 100644 GIT binary patch delta 490 zcmZus%}N4c6g}U}*yzkS>X=sAkDC3>XlAvGpf+uy2!i$^L%0disHOD?F}t2Yh{y;d zTDIsJf_i|SAv!YyLEz%M_nv#tJ?DNO*0rX+|2)3}*v7_<*0IcXqjTOkb&uW7MXTuw z)V(hySMG+ecJyz$rNcx*MbbbDmiH|kL`{qv$RO+O%Eh>jNldB88OUSWYfICG(K-TZ zvvGFPaxcAsVv9}hQ^{vXQy=ytJHmSzyX&EdC?sAkU_pn$N@5+s4D&3}9?a7@ zd4zf&aON0I$c#D^?!^#CfhZfYsaqoAUZ5&4&pILqe5*1RLirx9sG+b~a^7G#L&ODc z5s~{W(*lR~0BWT=#Dt7KSu%WIE7(ZVF@*%u^vnd_cBu5{UBV)kXh(G{V}+JkUTVXk hPK8|sRf&H7X)%dhkmdis8pKu9n04;2@zuLn{{_sjO1J<3 literal 2396 zcmbVNTUQ%Z6#fng3?##)DaEE1tu0^@E-9BvhvWd$4l{9Pg7Q=J z2lR;-T^1KUxO~#J{7brAerG~qNX;tsVP?*pbN09Q{`T$9e}4HDz#YgKS`g6?)zOMJ zfu6_4u93A2dn>!R@mQ99fwtSGZTfcwBB^w#1MTS05YrKdE--F6Wy8wKYR#H5vYU?Y zc-w|+QreT{nrr%d+2YZnDBWGNECsr&+q}0dtBz;-j=LvtqtFz_J-(J*IxUt{rgZ7( zMvuU`s^R*^mJFlbJR54GU@ndX&THt^aRGe-lmEjuf%Z+)u1xRERRmJ0LL;fUbbYJl zn^tzQ>YI*jSh*N3BB|k$j@NNnAQ4ENy24;M?yTjJ#i8b?q3Go_ydf~q)P)_VBCR^J zG4$h#j<;}CpmR(5CDSuEOw07CY%-N@PG$&W;6#Yw8Ni^1AsufcC6GOf4Iz2Dy0ki7 zn44jey|V5&G8on{qGJ?e0@odv30YNnx#=1^@*Br}a+08B$CcT9&EJ-`Zn4+N`E|{( zJb?@Um0W8oqBA<~t8lgzALf^5@5k`~A82@}V-Am4$W09k*KuRTF+t_GrssRpdqIt_ z&sFkvCFI0mS5yOy(ZwKnrBSdkcNhGHlarAbLo;mbcTh*Ko?9~F4T55 zq`P8lSlmezRD&$BC#wIW&8WX^lI6+f3Y&G$9OE`G{cWeRWT;H`rAwf$vSH`TW$AeV ze*&|q!mFlyn96`!MP!%JP!}338op|UJ)w97N(5SiL-w=gWP}* zI{sc&a=HamP1&_;ST&Uc&trEy@bo#`mhOyYc%CF??4(Ju+qQH5f=@yXRIUU_Dt$$Itm3uPt6SR>-oNIwNz-zyue_`|wv_|$v5Af!X zxb_sS(f#4yp${J-E%3cM;xa36E6OXA2e_Gx9^m$O>Rw%D`YC#d+BuSp9%43v{m4EQ zMWB3{2#841r%RlOmvNP?bby|WldefzV-Fm}BMgz4G)nBqWp;Vx>r~y?V_zj!uu6yM z0PlTFrxJAS6OtJrMh0v6jC_60^90)d#zhVNaa{z9JAKc2S>bVsPXu4^-GVQ%&TpKs UU-29#$67JA2u?CTyQOcU@*JS*vEPGv}N=`|Q2{zq{|5 z+dLcdttZC!9sqC!Gw!mMTiiw1Bw;hQFvPX^0xRWixlwMD13rfNnaU}1hSDht?&%Zu zLJRK1T_Wz5a1ZWf$W^@dbncWC<-}mFu3x--St-Lj#Ve#M9inM!)bE9{NW^^-w&H$< zjAq&2q-2}Z*#f29JY5+#C8Sv)<3R}z;o(SK)xLG@a(B1f;b+L_b>$^l(1b@NJcexy zVrf-HMOkGX6|JVb)h;S0C221A>6fsB`lH5q>7hMy#y!kZ5K%-~T*#mt1ltkv|}uU7nq z-$nc(;ZOWEwAG%*98}=Ma}#kv+3(0QF~*Rl9CV~9F-{kIR!McH##%v|unPtZDkaVt zo+0XwM6v*>5a5OdQ(;3I;&CZ1FpfFDhyB%m;KlxDsf#$NK~Axw-mz&;uV>?h+3IH1u32T3B82e3ARgHco3`BE ze-Vp0YDasCMI*6jA{IVk(Tq80Ar?1a5k0U{w4xd};(D5Sa|RMLL^nj#+b$CCu=1OadV;?V#q?Gf zXqG%7JRU+>HZ?u(;-EooV>7t{OVy$xSB|8( z`=V2WT`}Vh^N+sR+!4DqnBz`Y-rG8NxT|r`;65XYe6zxxY&LirTq7Pv&EKBng2y^h zJTVwz(8HiRlIIpMW^ly<$_0330j~`%6Y}s@k!QAga(z|uVvtn%}CG>KRNY;_Zc`l%_kqr9impm`Zomd=`EYc{RBvWIBZO-cwnM6bZ;f8K0 zMUYFj!=Ct3arier+jcmWTG6z_qG^XkVTaigpQY!t^`cOd6lw%)rD%s8g9v$a>)nb> zyNH#Dkd>X07h+e4<+&lsdgbiE$~;o0pcGqwDrCdf5)^|0(NaPu-%gk=!%heEVJg=6 z+6JiXlSws$tU%`F

      +
    • 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