From 6f9bbe47abfb09a65be943e4b092a3a1aa172877 Mon Sep 17 00:00:00 2001 From: Subivas Date: Mon, 1 Dec 2025 12:14:57 +0100 Subject: [PATCH] FEAT : Mise en place de l'architecture + instription d'un utilisateur --- .gitignore | 2 +- pom.xml | 9 +++ .../controller/AuthController.java | 57 ++++++++++++++ .../controller/PhotoController.java | 72 ++++++++++++++++++ .../epul4a/fotosharing/model/Commentaire.java | 31 ++++++++ .../epul4a/fotosharing/model/Partage.java | 25 ++++++ .../local/epul4a/fotosharing/model/Photo.java | 32 ++++++++ .../epul4a/fotosharing/model/Utilisateur.java | 34 +++++++++ .../repository/PhotoRepository.java | 7 ++ .../repository/UtilisateurRepository.java | 10 +++ .../security/CustomUserDetails.java | 43 +++++++++++ .../security/CustomUserDetailsService.java | 24 ++++++ .../fotosharing/security/SecurityConfig.java | 63 +++++++++++++++ .../fotosharing/security/SecurityService.java | 30 ++++++++ .../fotosharing/service/PhotoService.java | 11 +++ .../service/impl/PhotoServiceImpl.java | 61 +++++++++++++++ src/main/resources/application.properties | 10 ++- src/main/resources/templates/home.html | 9 +++ src/main/resources/templates/login.html | 23 ++++++ src/main/resources/templates/register.html | 17 +++++ src/main/resources/templates/upload.html | 23 ++++++ target/classes/application.properties | 10 ++- .../controller/AuthController.class | Bin 0 -> 3445 bytes .../controller/PhotoController.class | Bin 0 -> 5187 bytes .../fotosharing/model/Commentaire.class | Bin 0 -> 2360 bytes .../epul4a/fotosharing/model/Partage.class | Bin 0 -> 1738 bytes .../fotosharing/model/Photo$Visibilite.class | Bin 0 -> 1377 bytes .../epul4a/fotosharing/model/Photo.class | Bin 0 -> 2853 bytes .../fotosharing/model/Utilisateur.class | Bin 0 -> 2684 bytes .../repository/PhotoRepository.class | Bin 0 -> 360 bytes .../repository/UtilisateurRepository.class | Bin 0 -> 578 bytes .../security/CustomUserDetails.class | Bin 0 -> 1758 bytes .../security/CustomUserDetailsService.class | Bin 0 -> 2895 bytes .../fotosharing/security/SecurityConfig.class | Bin 0 -> 6417 bytes .../security/SecurityService.class | Bin 0 -> 2179 bytes .../fotosharing/service/PhotoService.class | Bin 0 -> 487 bytes .../service/impl/PhotoServiceImpl.class | Bin 0 -> 5098 bytes target/classes/templates/home.html | 9 +++ target/classes/templates/login.html | 23 ++++++ target/classes/templates/register.html | 17 +++++ target/classes/templates/upload.html | 23 ++++++ 41 files changed, 672 insertions(+), 3 deletions(-) create mode 100644 src/main/java/local/epul4a/fotosharing/controller/AuthController.java create mode 100644 src/main/java/local/epul4a/fotosharing/controller/PhotoController.java create mode 100644 src/main/java/local/epul4a/fotosharing/model/Commentaire.java create mode 100644 src/main/java/local/epul4a/fotosharing/model/Partage.java create mode 100644 src/main/java/local/epul4a/fotosharing/model/Photo.java create mode 100644 src/main/java/local/epul4a/fotosharing/model/Utilisateur.java create mode 100644 src/main/java/local/epul4a/fotosharing/repository/PhotoRepository.java create mode 100644 src/main/java/local/epul4a/fotosharing/repository/UtilisateurRepository.java create mode 100644 src/main/java/local/epul4a/fotosharing/security/CustomUserDetails.java create mode 100644 src/main/java/local/epul4a/fotosharing/security/CustomUserDetailsService.java create mode 100644 src/main/java/local/epul4a/fotosharing/security/SecurityConfig.java create mode 100644 src/main/java/local/epul4a/fotosharing/security/SecurityService.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/PhotoService.java create mode 100644 src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java create mode 100644 src/main/resources/templates/home.html create mode 100644 src/main/resources/templates/login.html create mode 100644 src/main/resources/templates/register.html create mode 100644 src/main/resources/templates/upload.html create mode 100644 target/classes/local/epul4a/fotosharing/controller/AuthController.class create mode 100644 target/classes/local/epul4a/fotosharing/controller/PhotoController.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Commentaire.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Partage.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Photo$Visibilite.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Photo.class create mode 100644 target/classes/local/epul4a/fotosharing/model/Utilisateur.class create mode 100644 target/classes/local/epul4a/fotosharing/repository/PhotoRepository.class create mode 100644 target/classes/local/epul4a/fotosharing/repository/UtilisateurRepository.class create mode 100644 target/classes/local/epul4a/fotosharing/security/CustomUserDetails.class create mode 100644 target/classes/local/epul4a/fotosharing/security/CustomUserDetailsService.class create mode 100644 target/classes/local/epul4a/fotosharing/security/SecurityConfig.class create mode 100644 target/classes/local/epul4a/fotosharing/security/SecurityService.class create mode 100644 target/classes/local/epul4a/fotosharing/service/PhotoService.class create mode 100644 target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class create mode 100644 target/classes/templates/home.html create mode 100644 target/classes/templates/login.html create mode 100644 target/classes/templates/register.html create mode 100644 target/classes/templates/upload.html diff --git a/.gitignore b/.gitignore index 9092a61..245a7b0 100644 --- a/.gitignore +++ b/.gitignore @@ -31,4 +31,4 @@ build/ ### VS Code ### .vscode/ -.env +src/main/resources/application.properties diff --git a/pom.xml b/pom.xml index 8e8d8fd..d221a81 100644 --- a/pom.xml +++ b/pom.xml @@ -83,6 +83,15 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.boot + spring-boot-starter-security + + + jakarta.validation + jakarta.validation-api + + diff --git a/src/main/java/local/epul4a/fotosharing/controller/AuthController.java b/src/main/java/local/epul4a/fotosharing/controller/AuthController.java new file mode 100644 index 0000000..bacef49 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/controller/AuthController.java @@ -0,0 +1,57 @@ +package local.epul4a.fotosharing.controller; + +import local.epul4a.fotosharing.model.Utilisateur; +import local.epul4a.fotosharing.repository.UtilisateurRepository; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; + +import jakarta.validation.Valid; + +@Controller +public class AuthController { + + private final UtilisateurRepository utilisateurRepository; + private final PasswordEncoder passwordEncoder; + + public AuthController(UtilisateurRepository utilisateurRepository, PasswordEncoder passwordEncoder) { + this.utilisateurRepository = utilisateurRepository; + this.passwordEncoder = passwordEncoder; + } + + @GetMapping("/login") + public String loginPage(@RequestParam(value = "error", required = false) String error, + @RequestParam(value = "logout", required = false) String logout, + Model model) { + model.addAttribute("error", error != null); + model.addAttribute("logout", logout != null); + return "login"; + } + + @GetMapping("/register") + public String registerForm(Model model) { + model.addAttribute("utilisateur", new Utilisateur()); + return "register"; + } + + @PostMapping("/register") + public String doRegister(@ModelAttribute("utilisateur") @Valid Utilisateur utilisateur, + BindingResult bindingResult, Model model) { + if (bindingResult.hasErrors()) { + return "register"; + } + + if (utilisateurRepository.findByEmail(utilisateur.getEmail()).isPresent()) { + model.addAttribute("error", "Email déjà utilisé"); + return "register"; + } + + // encoder le mot de passe puis sauvegarder + utilisateur.setMotDePasse(passwordEncoder.encode(utilisateur.getMotDePasse())); + utilisateur.setActif(true); + utilisateurRepository.save(utilisateur); + return "redirect:/login?registered"; + } +} \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java new file mode 100644 index 0000000..44902e5 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/controller/PhotoController.java @@ -0,0 +1,72 @@ +package local.epul4a.fotosharing.controller; + +import local.epul4a.fotosharing.model.Photo; +import local.epul4a.fotosharing.security.CustomUserDetails; +import local.epul4a.fotosharing.service.PhotoService; +import org.springframework.core.io.Resource; +import org.springframework.core.io.PathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.nio.file.Path; + +@Controller +public class PhotoController { + + private final PhotoService photoService; + + public PhotoController(PhotoService photoService) { + this.photoService = photoService; + } + + @GetMapping("/") + public String home() { + return "home"; // créer une page home.html simple + } + + @GetMapping("/upload") + public String uploadForm() { + return "upload"; + } + + @PostMapping("/upload") + public String doUpload(@RequestParam("file") MultipartFile file, + @RequestParam(value="visibilite", defaultValue = "PRIVATE") String visibilite, + @AuthenticationPrincipal CustomUserDetails user, + Model model) { + try { + Photo p = photoService.store(file, visibilite, user.getUsername()); + model.addAttribute("message", "Upload OK : " + p.getId()); + return "redirect:/"; // ou page d'affichage + } catch (Exception e) { + model.addAttribute("error", e.getMessage()); + return "upload"; + } + } + + @GetMapping("/photo/{id}/raw") + public ResponseEntity rawPhoto(@PathVariable("id") String idOrUuid) { + // idOrUuid peut être uuid stocké ou id numeric ; ici on assume uuid + Path p = photoService.loadAsPath(idOrUuid); + Resource r = new PathResource(p); + if (!r.exists()) { + return ResponseEntity.notFound().build(); + } + String contentType = "application/octet-stream"; + try { + // tentative de détection basique + contentType = java.nio.file.Files.probeContentType(p); + } catch (Exception ignored) {} + return ResponseEntity.ok() + .contentType(MediaType.parseMediaType(contentType != null ? contentType : "application/octet-stream")) + .header(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + p.getFileName().toString() + "\"") + .body(r); + } +} + diff --git a/src/main/java/local/epul4a/fotosharing/model/Commentaire.java b/src/main/java/local/epul4a/fotosharing/model/Commentaire.java new file mode 100644 index 0000000..6784c90 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/model/Commentaire.java @@ -0,0 +1,31 @@ +package local.epul4a.fotosharing.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +public class Commentaire { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String contenu; + + private LocalDateTime dateCommentaire; + + @ManyToOne + @JoinColumn(name = "id_photo") + private Photo photo; + + @ManyToOne + @JoinColumn(name = "id_utilisateur") + private Utilisateur auteur; + + // Getters & Setters +} diff --git a/src/main/java/local/epul4a/fotosharing/model/Partage.java b/src/main/java/local/epul4a/fotosharing/model/Partage.java new file mode 100644 index 0000000..9f6aef2 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/model/Partage.java @@ -0,0 +1,25 @@ +package local.epul4a.fotosharing.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Getter +@Setter +public class Partage { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne + @JoinColumn(name = "id_photo") + private Photo photo; + + @ManyToOne + @JoinColumn(name = "id_utilisateur") + private Utilisateur utilisateur; + + // Getters & Setters +} diff --git a/src/main/java/local/epul4a/fotosharing/model/Photo.java b/src/main/java/local/epul4a/fotosharing/model/Photo.java new file mode 100644 index 0000000..5871074 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/model/Photo.java @@ -0,0 +1,32 @@ +package local.epul4a.fotosharing.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Getter +@Setter +public class Photo { + public enum Visibilite { PRIVATE, PUBLIC, SHARED } + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String nomFichierOriginal; + private String uuidFichier; + private LocalDateTime dateUpload; + + @Enumerated(EnumType.STRING) + private Visibilite visibilite; + + @ManyToOne + @JoinColumn(name = "id_utilisateur") + private Utilisateur proprietaire; + + // getters & setters +} diff --git a/src/main/java/local/epul4a/fotosharing/model/Utilisateur.java b/src/main/java/local/epul4a/fotosharing/model/Utilisateur.java new file mode 100644 index 0000000..4e2836e --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/model/Utilisateur.java @@ -0,0 +1,34 @@ +package local.epul4a.fotosharing.model; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Entity +@Getter +@Setter +public class Utilisateur { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String email; + + private String motDePasse; + + private String nom; + + private String prenom; + + private boolean actif = true; + + @OneToMany(mappedBy = "proprietaire") + private List< + Photo> photos; + + // Getters & Setters avec lombok + +} \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/repository/PhotoRepository.java b/src/main/java/local/epul4a/fotosharing/repository/PhotoRepository.java new file mode 100644 index 0000000..ad2074e --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/repository/PhotoRepository.java @@ -0,0 +1,7 @@ +package local.epul4a.fotosharing.repository; + +import local.epul4a.fotosharing.model.Photo; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PhotoRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/repository/UtilisateurRepository.java b/src/main/java/local/epul4a/fotosharing/repository/UtilisateurRepository.java new file mode 100644 index 0000000..5da6862 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/repository/UtilisateurRepository.java @@ -0,0 +1,10 @@ +package local.epul4a.fotosharing.repository; + +import local.epul4a.fotosharing.model.Utilisateur; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UtilisateurRepository extends JpaRepository { + Optional findByEmail(String email); +} \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/security/CustomUserDetails.java b/src/main/java/local/epul4a/fotosharing/security/CustomUserDetails.java new file mode 100644 index 0000000..34917c6 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/security/CustomUserDetails.java @@ -0,0 +1,43 @@ +package local.epul4a.fotosharing.security; + +import local.epul4a.fotosharing.model.Utilisateur; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.Collections; + +public class CustomUserDetails implements UserDetails { + + private final Utilisateur user; + + public CustomUserDetails(Utilisateur user) { + this.user = user; + } + + public Utilisateur getUtilisateur() { + return user; + } + + @Override + public Collection getAuthorities() { + // Si tu veux ajouter des rôles, adapte ici. + return Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")); + } + + @Override + public String getPassword() { + return user.getMotDePasse(); + } + + @Override + public String getUsername() { + return user.getEmail(); + } + + @Override public boolean isAccountNonExpired() { return true; } + @Override public boolean isAccountNonLocked() { return true; } + @Override public boolean isCredentialsNonExpired() { return true; } + @Override public boolean isEnabled() { return user.isActif(); } +} diff --git a/src/main/java/local/epul4a/fotosharing/security/CustomUserDetailsService.java b/src/main/java/local/epul4a/fotosharing/security/CustomUserDetailsService.java new file mode 100644 index 0000000..77cb8f8 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/security/CustomUserDetailsService.java @@ -0,0 +1,24 @@ +package local.epul4a.fotosharing.security; + +import local.epul4a.fotosharing.model.Utilisateur; +import local.epul4a.fotosharing.repository.UtilisateurRepository; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +@Service +public class CustomUserDetailsService implements UserDetailsService { + + private final UtilisateurRepository utilisateurRepository; + + public CustomUserDetailsService(UtilisateurRepository utilisateurRepository) { + this.utilisateurRepository = utilisateurRepository; + } + + @Override + public CustomUserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + Utilisateur u = utilisateurRepository.findByEmail(username) + .orElseThrow(() -> new UsernameNotFoundException("Utilisateur introuvable: " + username)); + return new CustomUserDetails(u); + } +} \ No newline at end of file diff --git a/src/main/java/local/epul4a/fotosharing/security/SecurityConfig.java b/src/main/java/local/epul4a/fotosharing/security/SecurityConfig.java new file mode 100644 index 0000000..254b9db --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/security/SecurityConfig.java @@ -0,0 +1,63 @@ +package local.epul4a.fotosharing.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +@EnableMethodSecurity +public class SecurityConfig { + + private final CustomUserDetailsService customUserDetailsService; + + public SecurityConfig(CustomUserDetailsService customUserDetailsService) { + this.customUserDetailsService = customUserDetailsService; + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + + http + .authorizeHttpRequests(auth -> auth + .requestMatchers("/login", "/register", "/css/**", "/js/**").permitAll() + .anyRequest().authenticated() + ) + .formLogin(form -> form + .loginPage("/login") + .defaultSuccessUrl("/", true) + .permitAll() + ) + .logout(logout -> logout + .logoutSuccessUrl("/login?logout=true") + .permitAll() + ) + .csrf(csrf -> csrf.disable()); + + return http.build(); + } + + @Bean + public UserDetailsService userDetailsService() { + // Spring Security 6.2 utilise ce bean automatiquement + return customUserDetailsService; + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { + // Spring Boot crée automatiquement un DaoAuthenticationProvider interne + return config.getAuthenticationManager(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/src/main/java/local/epul4a/fotosharing/security/SecurityService.java b/src/main/java/local/epul4a/fotosharing/security/SecurityService.java new file mode 100644 index 0000000..ceb6f8d --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/security/SecurityService.java @@ -0,0 +1,30 @@ +package local.epul4a.fotosharing.security; + +import local.epul4a.fotosharing.model.Photo; +import local.epul4a.fotosharing.repository.PhotoRepository; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service("securityService") +public class SecurityService { + + private final PhotoRepository photoRepository; + + public SecurityService(PhotoRepository photoRepository) { + this.photoRepository = photoRepository; + } + + public boolean canAccessPhoto(org.springframework.security.core.Authentication authentication, Long photoId) { + if (authentication == null || !authentication.isAuthenticated()) return false; + String username = authentication.getName(); // email + Optional p = photoRepository.findById(photoId); + if (p.isEmpty()) return false; + Photo photo = p.get(); + if (photo.getVisibilite() == Photo.Visibilite.PUBLIC) return true; + if (photo.getProprietaire() != null && photo.getProprietaire().getEmail().equals(username)) return true; + // TODO: vérifier table partage + return false; + } +} + diff --git a/src/main/java/local/epul4a/fotosharing/service/PhotoService.java b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java new file mode 100644 index 0000000..d6ba100 --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/PhotoService.java @@ -0,0 +1,11 @@ +package local.epul4a.fotosharing.service; + +import local.epul4a.fotosharing.model.Photo; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.nio.file.Path; + +public interface PhotoService { + Photo store(MultipartFile file, String visibilite, String ownerEmail) throws IOException; + Path loadAsPath(String uuidFile); +} diff --git a/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java new file mode 100644 index 0000000..f63168f --- /dev/null +++ b/src/main/java/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.java @@ -0,0 +1,61 @@ +package local.epul4a.fotosharing.service.impl; + +import local.epul4a.fotosharing.model.Photo; +import local.epul4a.fotosharing.model.Utilisateur; +import local.epul4a.fotosharing.repository.PhotoRepository; +import local.epul4a.fotosharing.repository.UtilisateurRepository; +import local.epul4a.fotosharing.service.PhotoService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.nio.file.*; +import java.time.LocalDateTime; +import java.util.UUID; + +@Service +public class PhotoServiceImpl implements PhotoService { + + @Value("${file.upload-dir}") + private String uploadDir; + + private final PhotoRepository photoRepository; + private final UtilisateurRepository utilisateurRepository; + + public PhotoServiceImpl(PhotoRepository photoRepository, UtilisateurRepository utilisateurRepository) { + this.photoRepository = photoRepository; + this.utilisateurRepository = utilisateurRepository; + } + + @Override + public Photo store(MultipartFile file, String visibilite, String ownerEmail) throws IOException { + if (file.isEmpty()) throw new IOException("Fichier vide"); + + // Vérifier taille / type si besoin (ici basique) + String original = StringUtils.cleanPath(file.getOriginalFilename()); + String uuid = UUID.randomUUID().toString() + "-" + original; + + Path uploadPath = Paths.get(uploadDir); + if (!Files.exists(uploadPath)) Files.createDirectories(uploadPath); + + Path target = uploadPath.resolve(uuid); + Files.copy(file.getInputStream(), target, StandardCopyOption.REPLACE_EXISTING); + + Photo p = new Photo(); + p.setNomFichierOriginal(original); + p.setUuidFichier(uuid); + p.setDateUpload(LocalDateTime.now()); + p.setVisibilite(Photo.Visibilite.valueOf(visibilite)); + Utilisateur u = utilisateurRepository.findByEmail(ownerEmail).orElseThrow(() -> new IOException("Utilisateur introuvable")); + p.setProprietaire(u); + + return photoRepository.save(p); + } + + @Override + public Path loadAsPath(String uuidFile) { + return Paths.get(uploadDir).resolve(uuidFile); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a5a0b68..e4ec83b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,7 +3,7 @@ spring.application.name=FotoSharing # =============================== # DATABASE # =============================== -spring.datasource.url=jdbc:mariadb://192.168.124.171:3306/fotoshareDB +spring.datasource.url=jdbc:mariadb://192.168.112.10:3306/fotoshareDB spring.datasource.username=ufoto spring.datasource.password=4AinfoRep-25 # =============================== @@ -12,6 +12,14 @@ spring.datasource.password=4AinfoRep-25 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML +spring.jpa.properties.hibernate.jdbc.time_zone=UTC +# =============================== +# EMPLACEMENT DE STICKAGE +# =============================== +file.upload-dir=/opt/photo-app/uploads +spring.servlet.multipart.max-file-size=20MB +spring.servlet.multipart.max-request-size=20MB \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..576f6b6 --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,9 @@ + + +Accueil + +

Bienvenue sur FotoSharing

+

Uploader une photo

+

Se déconnecter

+ + diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..7bc3838 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,23 @@ + + + + + Login - FotoSharing + + +

Connexion

+
+
+
+ +
+ +
+ Déconnecté avec succès. +
+
+ Erreur d'authentification. +
+

Créer un compte

+ + diff --git a/src/main/resources/templates/register.html b/src/main/resources/templates/register.html new file mode 100644 index 0000000..1e0c7b8 --- /dev/null +++ b/src/main/resources/templates/register.html @@ -0,0 +1,17 @@ + + + + + Inscription - FotoSharing + + +

Inscription

+
+
+
+
+
+ +
+ + diff --git a/src/main/resources/templates/upload.html b/src/main/resources/templates/upload.html new file mode 100644 index 0000000..09153da --- /dev/null +++ b/src/main/resources/templates/upload.html @@ -0,0 +1,23 @@ + + + + + Upload - FotoSharing + + +

Uploader une photo

+
+
+
+ +
+
+
+ + diff --git a/target/classes/application.properties b/target/classes/application.properties index a5a0b68..e4ec83b 100644 --- a/target/classes/application.properties +++ b/target/classes/application.properties @@ -3,7 +3,7 @@ spring.application.name=FotoSharing # =============================== # DATABASE # =============================== -spring.datasource.url=jdbc:mariadb://192.168.124.171:3306/fotoshareDB +spring.datasource.url=jdbc:mariadb://192.168.112.10:3306/fotoshareDB spring.datasource.username=ufoto spring.datasource.password=4AinfoRep-25 # =============================== @@ -12,6 +12,14 @@ spring.datasource.password=4AinfoRep-25 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MariaDBDialect spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML +spring.jpa.properties.hibernate.jdbc.time_zone=UTC +# =============================== +# EMPLACEMENT DE STICKAGE +# =============================== +file.upload-dir=/opt/photo-app/uploads +spring.servlet.multipart.max-file-size=20MB +spring.servlet.multipart.max-request-size=20MB \ No newline at end of file diff --git a/target/classes/local/epul4a/fotosharing/controller/AuthController.class b/target/classes/local/epul4a/fotosharing/controller/AuthController.class new file mode 100644 index 0000000000000000000000000000000000000000..97793d6ba08b24fccd7492cb8cd0fd1dc10a293f GIT binary patch literal 3445 zcmbtW*-{%v6g@2o2El-Bfk{lf;57n)$8qo~F9D35#9%gCj&Zg@YQ%uhh*@w*oP0rk zz;Ag=`7No6?T}REg{nN{SMm>WPLG5b6@z0}C?w5v_r3Srb5GyyzyA5{4**y3T`OXU zYe?v5LbJf$C3DR*N@lreOwKRKyeH6n#VT9gHGz1#FPB6Mk{Vidv_Tg*Te9jK&FUA;N= zWyZZIymce* ztXDkS*fKMw8ttArg6Uay*%-0P1*SA3UB5)_B^OP1O!4jp@|#lu-qUdw?=wVE zdSff5MUJ}CVV-NOwBa1iYq+4}A}$GB+BJ>;5*ImHAgqz~TC{XT32N~bcgAEzrDB${ zt;phvhO0WRsoYb66dIN=L(83Vq$|rT#0T6PL5$wQ=F_FkA9|~$*nFze9?>zX(r#zk z6Sj9lDwWDMjNzt+TRJ|(M*>%(=zU$CQxY=RF)UL!#ZhkQS-I+SQc_vlg02y*(B0NC zjtQc3!|0e#*imhLUrt#}>X^bb%Semiyk~L0B)DI4s%*15?&2N?Tyu?@KNWUTSNJxL z+E5Gb3-ma$U^#4DmyJNv*SCZy3j&YR|D(l3ZmHMhHrtnDI-}e$>`&uXS>Ewi=B0Dj zoG)=CHLludj-6Az*9H^bqD9#c?GAa@9-Cz&pOD_7U6?XeyW>8jr({6Llv!lNT$s|G zZDeaCN>24I5+MbZ%6469Uf5oOP9bnOlEb<~%4gOy^UD)vCE!20+@ey=N<}qLA`F@~cR*D&0>>I-)OlXNK>{OlEk4#1>9Y) zG%Br!N?$e|&on~p3;#ypLqtYf8ZI~ zf96mObNo)x0O;g*7n0bI4s_!oM|!Jf_!OVyi^ z)W2!0+zt+=_GSKrmiQ5g_^;^Pz=1gK52lU`>=;ZP{fP$g08>X0`ykOALO%`%c>1dj z>v#r<++-*zcPpN_Iq#jT@h)c!YmY#x0$ud ztTU53{yR=Sc!77T9H!EWu4)O@ZJ)kbloJ6}-Bpu1Rh1Qd6T?Ls(a)S7<@a!A`bCpb&mI<^SFZxq2f>1Gn!_m9sv^|e5?ie zPKSz5()8Y~!kpkTpPz7H9?`g3m{okmxgPCc literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/controller/PhotoController.class b/target/classes/local/epul4a/fotosharing/controller/PhotoController.class new file mode 100644 index 0000000000000000000000000000000000000000..ab0a469adaa5c2a5632927738fe02df3945e2c43 GIT binary patch literal 5187 zcmbtY`F|6~75|Pbd4;?&pb)?`p@bO6Ha44Z1#ClOj2)BM;M!nHXq&F3wY7M)tL%;p zG^Kaa`$*3;>3yY1FVZG}Nt51bKlz{9^gFwfkYMGS_6K=)X5YMd^L^iUjNktE^)~?= z!ap-ephZJcM+&V1>&}@=rs0_Gf^lN*oRyOTtwXkJ%fkXK-958wkj5Gf869oV1@<^z z&U6f`RCe~7#=IxJpkVqoSLZxe`kv!hzA;tc{77vqpqJFljO8!cIZMEpXsRWMWFi%n z1%qj{3nU9((Mn?-?JJiY&&+3##hn^9=(r0TSF$Xya%JC^7mbl}Aid%#?s3$TrtJg* zZ3~uE6RugLVH>)8CT`#{Bh|qM+prlO8n)o z>ximSLiK<^#<%je&u|zpH0&0*^9C(OFXXI}v^_VCy+pH8kbjKK40mHRDW1ikOl;og>LzIpKAxBmjlvQHWR^XNW934A^ z_o%>rn0}~i(WtLywhc!xqT#5HQH;?kE9tK4Wz1O@>_9n@IpOgP#&Jx;qdFeLguwlA zDhg7T46ZNH|JJB08Giz4*OOyj*(Hkx$f8xQ>m0YtyyXW+%C^HN1M)adXqeLRUQ7$@ z|KHTmb#qFgz|Pg1LUNoG*ld`*fVa<5kks9H3&F z2(Byn-kgdMX}R*`#S(d2r9(|L^nFZpDCFO-;{*7hK*C!Tcxd&ucOLQb7poX%@FAEQ z=5*vh2(~xHaFTIgMpm{nMFm#f#DQ2A|94gN;5-&I6m-})$JE_)Nh5*kPr%fjtB3Gx ze0mLOSTngv=*Muiek%qcQ%!83ge%8M^$JDPaOw7nZ~Kqhq<>&5nrJ9B)Y>RHwZTWA zLFy=DiJ3J_G7Th%DwJZ*@vuT|tR~+EDFW)_f{u$S|D;)I!^)L~z*8zKe?*`w)>Su> zS|wR3$9z=B$MA86d?5@wfhS_to~=u(m9_szJkR5kIzEL@v&zqrqymTPw_Gu8$M}xP zc6WF4vKZT9^vrVa5f&AJwG*~$9WNK>EdQiA=Wr%Fp_-mq_Bm=?nM}%p&1l}&d?Urr z_>PDcuA8)E!OKsXsuPgRZUP?56}?j*p?+Y*Cta6V3au!PwK) zDsoIB&jvE?U$ydS z>&dbe$WRTT*7Mf9$rg7uVx=}UeQb948W{$Tp7MSPi zJx~#hEEqT4Jo~iH3C~+BmsY-mH7rz3QjB*F;1O<>0@+Tu>4;VtHol|@u45T`e*?T%tSMcuZ*a0k~rv<08#^vzC z9`#{gWsY{J^YO;an`27|+m=vgAJ+5qJFtsi4D{jw9HfMTa2y)HZNfM3O**2Nj`GeAJFz6at*;OXw@z%}YMpun)`mW;e@&08D3$E6$;gMxb3S7?43?%!m;nYC#MWhB&*KoEY`4-Y0YM7n5h9{O` zC6Fy9-+*_frEeKe3gXPnb{!uEW|ncO1%JXk6@MZD1+s#0PYvYVA(s!3a0ju07xQ~C zh%WwHtQQYcZW#M`J3fFBoWfDKydei1EAaP*K+77?5-$;6MO>Q>d6_6|;En2+_!WWf z#iN{kp#tLt29uP4ESRZV(e1=HH>dTfQdvK}l5tld4*Q|E|mX$D6eAZRgPcdubo=1b9^QIdyTMx(b~e>^*H|A Tx`tPQar}kPzvA!s2Ri-(d))Dk literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/model/Commentaire.class b/target/classes/local/epul4a/fotosharing/model/Commentaire.class new file mode 100644 index 0000000000000000000000000000000000000000..5cd2897b87c8eff4a9a915968ecdcd6b88992c35 GIT binary patch literal 2360 zcma)7TTdHD7(HV!2I2%`Ab~)ev`tf+q--x~l7=)bH6(K7T-3Oh`cw_}6ed~EqTSg@ z{Hs<<6sZsW0r^o?&#V`)%}VQ+U4OIZocS(i#vlIs=U)In;K@7+m?~kqj3QG{$ec+dA=sjd~6d8m!Hj|8S__0Ak-F;~KT85d9%*z|+0^gVSH`*)=GXJCWqP==c9 ze$Z3C*9iK3WvtYp5-8{%H)x&h&xC#ROO_V+qRw z3q5Joi1^xoV0B-4Etk|T5p6~Z?{XPeuqseII%JLlH(NQ0zi_yOdbNyoY_JV7wki$< zZs&1-v)b1Yw~xbZfwf;_GPKe=QemVc*4|ZKvq##E z%ui30Q6ZIk9qGr4u-VAE_~1B)!Ts9DM+u|3yZ5Z!Z2vBBEpv~j(j2#g=f;7rXCi(H zv}pu>+&6?w8`=Lu+ZHp2hur6}BZ?;il{+)uCftoGwn= zL(Sggws~m$Orv<9Y?J<~*6Pgp#KVch1lH3TG|iigDO5So{(kVapUrc zXzEAqMU1oAP$t~#1e;++wuzL)TLLu#Cvu^{99cW5{kHOHqXsNSgU&3~#v4=b@H{?M z_AuzZkRiut=|YxH!fEL%!>qJ&$Ey-_uJ(--oKd>t%#xE9U$0G8yQ9sKc2d2U%Ns7< zvFBd~aoAOlwKH60XjEIyCITCo7T@EUwa44|gtt?HH)WAe-gprBh|waWkNLjF__`wK zQ!elZ<5Iz0P|2GYP6}V(>StWL!T9qCHyQFu$^Q5Sx1pOc!)J{gk8ix-=g#vKNfICu4IrsVx06>iO|>hCPV1rxKK4$=v&;$ z5Lz4;TFw>v4tFzzR>p-^bA|5VeumK6xX?zf(D!(NsifHtDCn#*vw7xtkSJXq zAktB}UJp#QOsqcSRb3jT24QQVTW_V3 zUDna4nzk>QHsN|YZuTM&Jg?I0^bw`kyZe<=<&(f_=ox#a>Q$TrrIT}^8SflRy>e{7 zt(X#5W}5~~SdGtt!Wq7vQ!M_9W(mxcEhYE;c1?CGCZ!O_mbJZAI;!K~W87<5)FvM# zbKpHoNHnEaqW{@^f%X2Mul@uGEC>3R)Jcc~S)S6aImgDSvRYK~9S)`?Ps$6;i$I2` zA?pRUqp?Hzx(|2I$9#UYjY5^vy(hhv(_q^a+~d4x_fHEgMC;X`Yt57)Z0KYGBN9B6 zUepw+502lh%Qu#`F&$X3t;H8u2_2eU-U6>z#0}ob82=4peDaP%;4-5*Mhjf8FkX~c z!c~6Yy$!Z!7%g*qh4D2P*BSC=hHtJS$qoK(_{F@(BB49xXE{2 z1ru-!Yg`3xW1U$!zMp}=Bl(pdhQXN-@Ezvplk;2!3fKrCnjR&}MiOmeD}-onlxQK6 z=q|P?eU8;VC80KAd}H$mlB2>*_L&w28G$gmvw>v>aS8qyY0&wG@8NzJ{q#lY2bKr) kIyg`N01w0H=PpV=7@B~7euO@T9kvz2qy9u{6CVTr0Ju_cF8}}l literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/model/Photo$Visibilite.class b/target/classes/local/epul4a/fotosharing/model/Photo$Visibilite.class new file mode 100644 index 0000000000000000000000000000000000000000..5f8d68f9c5b7814e43e280a4f212345ac18508d9 GIT binary patch literal 1377 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 literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/repository/PhotoRepository.class b/target/classes/local/epul4a/fotosharing/repository/PhotoRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..537485a8197ee4a883dcec2f374ac33d1afbf951 GIT binary patch literal 360 zcmbV|O>V+K429o7OZeHa=sB1Luu9uy7bp^_Ie`g7ewf6g$)r`6T#E$<;83Uol}d!v zO&7Lh%liDDPv^rCzzaqJIs#M832CWJqh}gOz%b^|H(z4H!INf@#wz^bP!x~AA@Th FegkOTbou}Q literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/repository/UtilisateurRepository.class b/target/classes/local/epul4a/fotosharing/repository/UtilisateurRepository.class new file mode 100644 index 0000000000000000000000000000000000000000..7e7cb1992bbec3a77f95650051809daba572ab25 GIT binary patch literal 578 zcmbV~Jx;_h5QWEq5SHa9}*|);AA4l0qqI669ot0P>2bU z*c2cE#mM%^`rh*!zrDY_0>BAO0`LSJ8A{MdRk!8h(^TWbWS#6YHgw}wBh&eeml7RE>)hA ifE6yEKZD>&2CxnujQHd;g_kjx2b)~|ZVR?QJ3AjYsJPz% literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/security/CustomUserDetails.class b/target/classes/local/epul4a/fotosharing/security/CustomUserDetails.class new file mode 100644 index 0000000000000000000000000000000000000000..c166fb765293fe09cfaee5dd3be59ebf8de264eb GIT binary patch literal 1758 zcmb7E*-{fh6g?dRlZ1pNtm1+wLK2Ws77+tfVTitjrHG_TU#uZ%pkXqTn(1-*Cm*y* z#nLK2z>l)LJqa*IQs6_n=ic0N?sD$TuixK)0$9On3?Z~>2*=Tm4u+m1eczV0duTX<&@L}~j*##5 zoaairy6bXhol8TQE<@NOi($IZ5?!?`+|+laFokPK?m1ZvT?|ichnQc3#cPzW5{$)hN3ll;kgt*g$~hj# zJxnlY!d;^l_I-6VGs%muMGqBsD{KL0Ej#tL|~m@i*4xcK~v?UZ9Es6unke)*gZnX$oo+@0fK=WE>SBbroDpA`&uSKP9DRC_7m7z}w zUA8?-ZrWDf4L=vVYvS{qSLQRckMvMy?(m)cK4ZKd&|qYk z#T-Q`@FL|`;KUCkUM9Ow(EAPj%_JiMl0<`K-cPhZ;71sxQ<2Tmt;iy(lCKzP<{1s} zM9zv?Y=ytwj32)c{}>aE{L_v6q3{R4IyK<>7$yVA&{^iCDuz(+nE?KLTFZWCD}Mli*NUkC literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/security/CustomUserDetailsService.class b/target/classes/local/epul4a/fotosharing/security/CustomUserDetailsService.class new file mode 100644 index 0000000000000000000000000000000000000000..b9e91841f79083212991e99bd2422e71547c4c7b GIT binary patch literal 2895 zcmcIme^VPp7=AWD4vrIIgd(kNX{Bul*lTUoO0X7EXt4n*fmEzjmt<3}Ty8UWdsM!O zA46xfjC98FZ^zH%_--zclqA$L`bTbm2@7u{$?)lkEiv?$9j`REJ71xo8B(cS1Dd?jIc6rJEuDtFQdN%hxSL55 zu0s}vaf%RoDhR;quTd?BUQsLC`LJ4b9pPt8yo*r-r!Abpdko2%=U3cNc+#JD1F^Q{ z%jXRrHKA66^+=oQnlW&WA>9$5iYy7Y8Ds-v3^zK;cdoaI^SG$#^*)20>Rj6vkC};r zNp!np;WDle3a;cO&7-+p{q=Z-IJDRn+Y>}dcuX+dlRiuQDY7e;Se&u99~%FGIg5793rwvz(bdpXPDK=)z@b{sdY)8V_b&n_)gA<@ijZozD(t4R%}J>O<@0J(zaWA83`40l zt!gliFLWn(VBrpC6Ifz+Kyq)6cl-Q%vBGe=={^~AJmt%9M^klrjFI~z}E&I>o)fd!*~lM(JdKuzJ&u&e*FJo zsNc?yn_!FHG6xrS?HW9q5`(qqdBV@SJP1T!;5&v(EjhKTm;pK!=Z+VpXH-;PTp%LH z=z6$LzodRe(R-nr<~_JU`!{K|Kx2$XGrb3vp8OTY&$No+Bl-@YtM={2Ao`HN$Fw>X zN#hgTq7~`YtkUC$<~{UKpn>ihTp?9$zD%PwGM4@Y#^i5!D~8E^yaT+z$R9Yn^b+Sc zruJ~*Cz5G)Iz;Yuy?2CXg_7Qy?*&+buG!l?PrTwUORO8rZ|tqo#+O xOb^uJ){)MUUJO~>rBR14PvZjplC=Af?B2s7a(G1lEaM67n>70t-(wS_{{VB?R&M|R literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/security/SecurityConfig.class b/target/classes/local/epul4a/fotosharing/security/SecurityConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..1bdaef235ab8cf591f2fd32977c157d51c01d196 GIT binary patch literal 6417 zcmcgx`+F4C8GaAh>?X?q%YsxWYJmu05eFl++66HQ0n`LA%ca2%q$RV zYfCRyEw;AR*52>;TCKXYvF*dpefl@`>3eo&vy{-ErUWhuQt}|oJ3fyj%{lJ|+?Mv^l3=GTm3(~t} znNr}u_{!u)-{*8bOMTXASci;2f5^jnhD3)3caOUs1u7}IW;|nFUUt2Ubpg$)V0uWH zN4$I*S!_sQqlVkCN#Ix~#|_7E10%3pN53qm_35%@7p3Rx$AX|#Gl9TuMmd;sJ#ta= zlk(}Z^aEeu*}9RSMv$e_huB00S$L!r$BGj0sGTfr!Xk6zpYu75o>lkV%dT8M&}I6 zNh60nDcqxBFYXnXZA&BaY|IGC{L%?5GxSurq3ngD;bn_qyhdvb+gTYb-!Ne~#;o)N z##V~32Cgm1&?fr?9%-+Sw@?aPecDv5J~FDBlZNjzo{M9S=`!Hb(9x5|{n($v$2B~F zPY6u3CmM!-%t*@gHOr_F9;It*)=>JUik5Fo+q_$kt)zKKMsFYEt|YyAD;T!Pz3{<|+Ll)z#&~x_>!xuO$5MDy!((_{V6sb# z9;xMuxKaCQRLeQZ`ynv*VOX;TSBB7pfY6nGCp4VI69Vgta>gjzLEO8{we^G)dG}n` z?j4@?1J5uUazvE5s#mP+RZGiJ6qM6X30U1bx3iiTu}Wq&f}>RKC8jNw7?5p28>F7O(n1%JOj1$YEq7pY*Z;HjKG|e z-egr`Z$V(47naayft7UE;FHbnZCQef0`~t&6!NwOio&TV_UPqVupc zTu^m8Z8!^&wUxlOhIu9Mnph2!wA`V=Zm`;JhGSxs^@<)Gw;XxAJU=bHQ(;lbjw?)g zhA>i%qsc@tXVJSu9dNCohA^b^4Ezbnh%25n6!v4Flgc#uO8%mp)BQj)Z?FbNdBnq86cEyw>1y21GK1cQI32%Rq1bN+9hjh_0i!B^>s~O}j4^ z)C#y$9e$#800&p{ZUbGF(VFC?BFT^;D?v-^)?zf0D{kcm2AvDe3s+i>7zsL8bW4ak zYX|iP%t=kQ+Q$5J(HN+S9J^Kn_Y-5>v}f95(7Z|@CvMhgE6{AO#gM?MuC-{wfJ%=i zy49nJYI{xY6FA$oCav&SHLI&nN1Cczom$avuNJ?aUhY~gbyIH*HmQbaLfun=m%6pa zEfkBzpx~B0Q}T+k{BBrYE$>x@LEwRw0=LNaqw$Q%JaDe%!CF>mk;qt(S(+O%@0g=1 ze^|9^@{xFE#B~FOvPLYlXqfOy%c5g%3U)$6c zT*ei0U*M?(+h=M*UFO8I{7Z83^K1pafal0W38-@<*!Je$L8{JMZ3Tv^e6(;w#Ai97 zFXBs)rVnwKGGs6H*xg9z!I;3kO9J=eD!$BPO#)vfo#lMKg0Dsb53yCU^}Ppu>N@Ug zWOXnmb6>N}nY2n8q@a}F$5zow<|-IETX%e@eJ(~RNvnSy;A!Td==5+T$?9D8!3sWE z!6PveS(*iOSPyp5?t_ezoiTE&>ByI=uz>39~VmJzT+&?0BMr<2P`$g2@=& zO^jV&2lsAgOzz+_`T#btRk0a5Y9n68H>&*7z+xQL%C-7bVuEMKTzp4LK zyvFhO`1gJO<+%Pwiu^i$h@V8gpW+u$@0a*Z)cY;|fWLD87VbTdxA894^V9ZiUJrrm K_&eUi=KldZ#R541 literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/security/SecurityService.class b/target/classes/local/epul4a/fotosharing/security/SecurityService.class new file mode 100644 index 0000000000000000000000000000000000000000..5aaecf9d17bb8ce71b8282b82b9c3fd323c967a1 GIT binary patch literal 2179 zcmbVNTUQ%Z7~O{?420n#4QZpbRzwWfw57#LC>D?^8ZMH8ii&F(4&}6ynK&0*{1p8G zKJlVUan%P`pZef$QkVNoQV6WZ7PD67+`hBFZ-2M*=Rd#y0pJe4Nuvb`14$Dpv7d#qZ2D^&zFVSDBP27sB9}#o=Zzq(6A+UVv3s@H)Em?SpnmL z43`NekjW2~PJB}iwH}&q2{{9=ns^PD1t$In4S}{@7K+C>mVgPTGANic+QrBbP9f5(S3@YA^ zbZRk3V-Q0ohA|@0Nx%&isBPt_kZziwn_dQE;N()V9b*_bP%v=~*98jayw40>U7ss0 z&NCg)ty^=MFmV&Nm=5H!>U&Hf8CuFGoADR3S!Y~SV1+XB8I^Z&+rWD!rgZWQzko=? zRb~N|FH|h$q%n;<24+mWkGrP|vX*qDE5D5_ClKg+Ub<`w+|D=m!+#Xi(1t*Ao^hrt zO3IbXQDs~D_pNP*JG~`c=^HF=y{>O2!#zbiCYq~j)&`1Xwj{$nZ)erg)f!5lKwY-w z&f2yNg1FcP7V@R@mUXeAgi0QZbci15vd)zLjq~HOqTSPqPO9+ z-YEn`m4#P3I8~_hL@LG=7;NsxhVtWu?CD?}RG$T8`Z)@wUk-JKxSi$DvL7v3)p~r> zWiRq=c~9vK$eiiqxFTDWjvcikHMB+NUQlc#E*jZ!M^20 zI`f`o%<+3+F1oJt=N&5uBr($`orBGck+ZROqKtHJ}!$!9iQs$kHQs|4B`_QL%; zUFo$p+6Q3w1-WUiv|(VZN^h#A@|nPB^xO5gp$dL1XvuJs9rfy3r(sZ*SlQYo)PTXy zwO$6BT>*g>e+>}vmOJPoLd>Ymd=Gujj$1h7a1>JJ1x|3v#Zc<-SR4cfd`38b2R|N) AK>z>% literal 0 HcmV?d00001 diff --git a/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class b/target/classes/local/epul4a/fotosharing/service/impl/PhotoServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..85216b0baf8ae04945bd5597fbc14dad20dc1259 GIT binary patch literal 5098 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 l{{)r&g3mw3?^=W>XA*zMKk;uQ{|oCD_bdPa literal 0 HcmV?d00001 diff --git a/target/classes/templates/home.html b/target/classes/templates/home.html new file mode 100644 index 0000000..576f6b6 --- /dev/null +++ b/target/classes/templates/home.html @@ -0,0 +1,9 @@ + + +Accueil + +

Bienvenue sur FotoSharing

+

Uploader une photo

+

Se déconnecter

+ + diff --git a/target/classes/templates/login.html b/target/classes/templates/login.html new file mode 100644 index 0000000..7bc3838 --- /dev/null +++ b/target/classes/templates/login.html @@ -0,0 +1,23 @@ + + + + + Login - FotoSharing + + +

Connexion

+
+
+
+ +
+ +
+ Déconnecté avec succès. +
+
+ Erreur d'authentification. +
+

Créer un compte

+ + diff --git a/target/classes/templates/register.html b/target/classes/templates/register.html new file mode 100644 index 0000000..1e0c7b8 --- /dev/null +++ b/target/classes/templates/register.html @@ -0,0 +1,17 @@ + + + + + Inscription - FotoSharing + + +

Inscription

+
+
+
+
+
+ +
+ + diff --git a/target/classes/templates/upload.html b/target/classes/templates/upload.html new file mode 100644 index 0000000..09153da --- /dev/null +++ b/target/classes/templates/upload.html @@ -0,0 +1,23 @@ + + + + + Upload - FotoSharing + + +

Uploader une photo

+
+
+
+ +
+
+
+ +