diff --git a/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java b/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java index 56e3b531f881bde3db9d5ace75f9477d5d6f2201..a4e25032b27f5680d4dc60733a7e32052161e81a 100644 --- a/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java +++ b/mozen/src/main/java/mozen/auth/JwtUserDetailsService.java @@ -37,6 +37,5 @@ public class JwtUserDetailsService implements UserDetailsService { grantedAuthorities.add(new SimpleGrantedAuthority(user.getRole().toString())); return new User(user.getUsername(), user.getPassword(), grantedAuthorities); - } - + } } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/auth/WebSecurity.java b/mozen/src/main/java/mozen/auth/WebSecurity.java index b220efd0c98edd7ada7aa0e00140cf8d6979f273..014bb262e4f009c33325be00137db523b436da50 100644 --- a/mozen/src/main/java/mozen/auth/WebSecurity.java +++ b/mozen/src/main/java/mozen/auth/WebSecurity.java @@ -31,6 +31,8 @@ public class WebSecurity extends WebSecurityConfigurerAdapter{ .antMatchers(HttpMethod.GET, "/search").permitAll() .antMatchers(HttpMethod.GET, "/models").permitAll() .antMatchers(HttpMethod.GET, "/models/tags").permitAll() + .antMatchers(HttpMethod.GET, "/user/list").hasRole("ADMIN") + .antMatchers(HttpMethod.GET, "/model/list").hasRole("ADMIN") .anyRequest().authenticated() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())) diff --git a/mozen/src/main/java/mozen/business/IModelManager.java b/mozen/src/main/java/mozen/business/IModelManager.java index f4de25d36f87f08e71355b932978b6c871fcd1be..b559eb864cd679ca60f605c77fea23bd25393160 100644 --- a/mozen/src/main/java/mozen/business/IModelManager.java +++ b/mozen/src/main/java/mozen/business/IModelManager.java @@ -23,6 +23,7 @@ public interface IModelManager { void addTag(TagMessage message); Model getModel(long id); + Collection<Model> getModels(); Collection<TagCategory> getTags(); SearchResult findModel(String name, int page, int size, String sort); diff --git a/mozen/src/main/java/mozen/business/IUserManager.java b/mozen/src/main/java/mozen/business/IUserManager.java index 66e92bfdca25165ab9bd63b3988109f4d66d1460..58cfdf22af7a73bb2bb9ce6a458e574eea4737d7 100644 --- a/mozen/src/main/java/mozen/business/IUserManager.java +++ b/mozen/src/main/java/mozen/business/IUserManager.java @@ -1,13 +1,16 @@ package mozen.business; +import java.util.Collection; + import mozen.messages.SignupMessage; import mozen.model.User; public interface IUserManager { Long addUser(SignupMessage message); - void updateUser(User u); - void removeUser(Long id); + void updateUser(User user, User userToUpdate); + void removeUser(User user, Long id); + Collection<User> getUsers(); User getUser(Long id); User getUserByUsername(String username); diff --git a/mozen/src/main/java/mozen/business/ModelManager.java b/mozen/src/main/java/mozen/business/ModelManager.java index 718f383d435aea15b42c2f7058225be004355f5a..dcaeed6ae7bceb31d799f7bf878bb36b62fb8f66 100644 --- a/mozen/src/main/java/mozen/business/ModelManager.java +++ b/mozen/src/main/java/mozen/business/ModelManager.java @@ -17,6 +17,7 @@ import mozen.messages.ModelMessage; import mozen.messages.TagMessage; import mozen.model.CustomLayer; import mozen.model.Model; +import mozen.model.Role; import mozen.messages.SearchResult; import mozen.model.Tag; import mozen.model.TagCategory; @@ -188,10 +189,12 @@ public class ModelManager implements IModelManager { } private boolean isLayerAuthor(CustomLayer layer, User user) { + if (user.getRole() == Role.ROLE_ADMIN) return true; return layer.getModel().getAuthor() == user; } private boolean isModelAuthor(Model model, User user) { + if (user.getRole() == Role.ROLE_ADMIN) return true; return model.getAuthor() == user; } @@ -218,4 +221,9 @@ public class ModelManager implements IModelManager { return result; } + @Override + public Collection<Model> getModels() { + return modelRepo.findAll(); + } + } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/ModelRepository.java b/mozen/src/main/java/mozen/business/ModelRepository.java index 18120e02b03d1c6e3dc2abeb978fa870665d881b..649ecb322c2ae0f9281381d2fba9f0d9933ed616 100644 --- a/mozen/src/main/java/mozen/business/ModelRepository.java +++ b/mozen/src/main/java/mozen/business/ModelRepository.java @@ -10,10 +10,11 @@ import mozen.model.Model; import mozen.model.Tag; public interface ModelRepository extends PagingAndSortingRepository<Model, Long> { + Collection<Model> findAll(); Page<Model> findByNameContainingIgnoreCase(String name, Pageable pageable); Page<Model> findByNameContainingIgnoreCaseAndTagsIn(String name, Collection<Tag> tags, Pageable pageable); - // @Query("SELECT m FROM Model m WHERE m.name LIKE :name AND m.tags CONTAINS (SELECT t FROM Tag WHERE t.name IN :tags)") <- horrible et c'est même pas complet + // @Query("SELECT m FROM Model m WHERE m.name LIKE :name AND m.tags CONTAINS (SELECT t FROM Tag WHERE t.name IN :tags)") <- enfer absolu // Page<Model> findByNameContainingIgnoreCaseTags(@Param("name") String name, @Param("tags") Collection<String> tags, Pageable pageable); } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/UserManager.java b/mozen/src/main/java/mozen/business/UserManager.java index d42d17db4a84720b33bd5ed2fee343817cf4ea3c..6cbfb6187f113416acbb8ed7efe02aaac593c81d 100644 --- a/mozen/src/main/java/mozen/business/UserManager.java +++ b/mozen/src/main/java/mozen/business/UserManager.java @@ -1,5 +1,7 @@ package mozen.business; +import java.util.Collection; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -19,25 +21,27 @@ public class UserManager implements IUserManager { @Override public Long addUser(SignupMessage message) { - System.err.println("[USER MANAGER] add new user u:"+message.getUsername()+" e:"+message.getEmail()+" p:"+message.getPassword()); + System.err.println("[USER MANAGER] add new user u:" + message.getUsername() + " e:" + message.getEmail() + " p:" + + message.getPassword()); User u = new User(); u.setEmail(message.getEmail()); u.setUsername(message.getUsername()); u.setPassword(bCryptPasswordEncoder.encode(message.getPassword())); - u.setRole(Role.Default); + u.setRole(Role.ROLE_DEFAULT); repo.save(u); return u.getId(); } @Override - public void updateUser(User u) { - repo.save(u); + public void updateUser(User user, User userToUpdate) { + if(isRightUser(user, userToUpdate)) repo.save(userToUpdate); } @Override - public void removeUser(Long id) { - repo.deleteById(id); + public void removeUser(User user, Long id) { + User userToRemove = repo.findById(id).get(); + if(isRightUser(user, userToRemove)) repo.deleteById(id); } @Override @@ -61,5 +65,15 @@ public class UserManager implements IUserManager { public User getUserByUsername(String username) { return repo.findByUsername(username).get(0); } + + @Override + public Collection<User> getUsers() { + return repo.findAll(); + } + + private boolean isRightUser(User userToCheck, User user) { + if (userToCheck.getRole() == Role.ROLE_ADMIN) return true; + return userToCheck.getId().equals(user.getId()); + } } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/business/UserRepository.java b/mozen/src/main/java/mozen/business/UserRepository.java index adb8194a159021a0454d06301815a79e14be196a..e02411aab4fdff33fb1df96e30c96fe61905373a 100644 --- a/mozen/src/main/java/mozen/business/UserRepository.java +++ b/mozen/src/main/java/mozen/business/UserRepository.java @@ -8,4 +8,5 @@ import mozen.model.User; public interface UserRepository extends PagingAndSortingRepository<User, Long> { List<User> findByUsername(String username); + List<User> findAll(); } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/model/Role.java b/mozen/src/main/java/mozen/model/Role.java index 1db11ea5b2a49f5bea6efe93938fd27ff183f19b..1be603d4071e293eb678775395feae224e557082 100644 --- a/mozen/src/main/java/mozen/model/Role.java +++ b/mozen/src/main/java/mozen/model/Role.java @@ -1,5 +1,5 @@ package mozen.model; public enum Role { - Default, Admin + ROLE_DEFAULT, ROLE_ADMIN } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/model/User.java b/mozen/src/main/java/mozen/model/User.java index eb80be64451467d2b2600d5ab96580c5928ea088..f5666c639a6ea834a053a4edaee94ab4b26ab24e 100644 --- a/mozen/src/main/java/mozen/model/User.java +++ b/mozen/src/main/java/mozen/model/User.java @@ -116,14 +116,11 @@ public class User implements Serializable{ this.models = models; } - @JsonIgnore public Role getRole() { return this.role; } public void setRole(Role role) { this.role = role; - } - - + } } \ No newline at end of file diff --git a/mozen/src/main/java/mozen/utils/DatabaseFiller.java b/mozen/src/main/java/mozen/utils/DatabaseFiller.java index 378c8e6b52f20ea74cc8f1789033a84ef8787f55..75e0b15665fc05a8565e28099ff7d8da82b25b75 100644 --- a/mozen/src/main/java/mozen/utils/DatabaseFiller.java +++ b/mozen/src/main/java/mozen/utils/DatabaseFiller.java @@ -47,13 +47,19 @@ public class DatabaseFiller { u1.setEmail("user1@email.com"); u1.setPassword(bCryptPasswordEncoder.encode("1234")); u1.setUsername("user 1"); - u1.setRole(Role.Default); + u1.setRole(Role.ROLE_DEFAULT); User u2 = new User(); u2.setEmail("user2@email.com"); u2.setPassword(bCryptPasswordEncoder.encode("1234")); u2.setUsername("user 2"); - u2.setRole(Role.Admin); + u2.setRole(Role.ROLE_DEFAULT); + + User admin = new User(); + admin.setEmail("admin@admin.admin"); + admin.setPassword(bCryptPasswordEncoder.encode("1234")); + admin.setUsername("admin"); + admin.setRole(Role.ROLE_ADMIN); Model m1 = new Model(); m1.setAuthor(u1); @@ -63,27 +69,6 @@ public class DatabaseFiller { m1.setVotes(0); m1.setAdded(new Date()); m1.setLastModified(new Date()); - - /*Set<Tag> m1tags = new HashSet<Tag>(); - - TagCategory ca1 = new TagCategory(); - ca1.setName("Layer"); - - Tag t1 = new Tag(); - t1.setCategory(ca1); - t1.setName("Conv2D"); - - TagCategory ca2 = new TagCategory(); - ca2.setName("Architecture"); - - Tag t2 = new Tag(); - t2.setCategory(ca2); - t2.setName("VGG19"); - - m1tags.add(t1); - m1tags.add(t2); - m1.setTags(m1tags); - */ m1.setTags(tagLoader("tags.txt")); Set<CustomLayer> m1layers = new HashSet<CustomLayer>(); @@ -99,6 +84,7 @@ public class DatabaseFiller { userRepo.save(u1); userRepo.save(u2); + userRepo.save(admin); modelRepo.save(m1); } diff --git a/mozen/src/main/java/mozen/web/AdminController.java b/mozen/src/main/java/mozen/web/AdminController.java deleted file mode 100644 index 8136b1c98851c20d6fcb4ac6a7927a3d2149e320..0000000000000000000000000000000000000000 --- a/mozen/src/main/java/mozen/web/AdminController.java +++ /dev/null @@ -1,20 +0,0 @@ -package mozen.web; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import mozen.business.IModelManager; -import mozen.business.IUserManager; - -@RestController -@RequestMapping("/admin") -@CrossOrigin -public class AdminController { - @Autowired - IModelManager modelManager; - - @Autowired - IUserManager userManager; -} \ No newline at end of file diff --git a/mozen/src/main/java/mozen/web/ModelController.java b/mozen/src/main/java/mozen/web/ModelController.java index 974687641e599ed620399323d8a8c3489182f1fd..8a19b405e085f86d97f2b0bcb6e0c8ba856cb348 100644 --- a/mozen/src/main/java/mozen/web/ModelController.java +++ b/mozen/src/main/java/mozen/web/ModelController.java @@ -45,7 +45,7 @@ public class ModelController { @GetMapping("") public ResponseEntity<?> getModelDetails(@RequestParam(value = "id", required = false) Long id) { - User user = getUser(); + User user = getCurrentUser(); if(user != null) { return ResponseEntity.ok().body(user.getModels()); } else { @@ -57,7 +57,7 @@ public class ModelController { @PostMapping("") public ResponseEntity<ResponseMessage> addModel(@RequestBody @Valid ModelMessage message) { ResponseMessage response = new ResponseMessage(false, ""); - User user = getUser(); + User user = getCurrentUser(); if(user == null) { response.setError(true); response.setMessage("User unknown"); @@ -78,7 +78,7 @@ public class ModelController { @PutMapping("") public ResponseEntity<ResponseMessage> updateModel(@RequestParam(value = "id", required = true) Long id, @RequestBody @Valid Model model) { ResponseMessage response = new ResponseMessage(false, ""); - User user = getUser(); + User user = getCurrentUser(); if(user == null) { response.setError(true); response.setMessage("User unknown"); @@ -98,7 +98,7 @@ public class ModelController { @DeleteMapping("") public ResponseEntity<ResponseMessage> deleteModel(@RequestParam(value = "id", required = true) Long id) { ResponseMessage response = new ResponseMessage(false, ""); - User user = getUser(); + User user = getCurrentUser(); if(user == null) { response.setError(true); response.setMessage("User unknown"); @@ -115,6 +115,11 @@ public class ModelController { return ResponseEntity.ok(response); } + @GetMapping("/list") + public Collection<Model> getAllModels() { + return modelManager.getModels(); + } + @GetMapping("/tags") public Collection<TagCategory> getTags() { return modelManager.getTags(); @@ -129,7 +134,7 @@ public class ModelController { @PostMapping("/upload") public ResponseEntity<ResponseMessage> uploadModelFile(@RequestParam("file") MultipartFile file, @RequestParam(value = "id", required = true) Long id) { ResponseMessage response = new ResponseMessage(false, ""); - User user = getUser(); + User user = getCurrentUser(); if(user == null) { response.setError(true); response.setMessage("User unknown"); @@ -171,7 +176,7 @@ public class ModelController { @RequestParam(value = "id", required = true) Long id, @RequestParam(value = "name", required = true) String name) { ResponseMessage response = new ResponseMessage(false, ""); - User user = getUser(); + User user = getCurrentUser(); if(user == null) { response.setError(true); response.setMessage("User unknown"); @@ -189,7 +194,7 @@ public class ModelController { return ResponseEntity.ok(response); } - private User getUser() { + private User getCurrentUser() { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (!(auth instanceof AnonymousAuthenticationToken)) { diff --git a/mozen/src/main/java/mozen/web/UserController.java b/mozen/src/main/java/mozen/web/UserController.java index 227b8487c4975a0e59cb1687881e0c2bcee721da..fe4de261347fe0119fb785ad6a473699f8791608 100644 --- a/mozen/src/main/java/mozen/web/UserController.java +++ b/mozen/src/main/java/mozen/web/UserController.java @@ -1,16 +1,22 @@ package mozen.web; +import java.util.Collection; + import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import mozen.business.IUserManager; @@ -32,6 +38,50 @@ public class UserController { return manager.getUserByUsername(username); } + @GetMapping("/list") + public Collection<User> getUserList() { + return manager.getUsers(); + } + + @PostMapping("") + public ResponseEntity<ResponseMessage> changeUserDetails(@RequestParam User userToUpdate) { + ResponseMessage response = new ResponseMessage(false, ""); + User user = getCurrentUser(); + if(user == null) { + response.setError(true); + response.setMessage("User unknown"); + return ResponseEntity.ok(response); + } + + try { + manager.updateUser(user ,userToUpdate); + } catch (Exception e) { + response.setError(true); + response.setMessage(e.getMessage()); + } + + return ResponseEntity.ok().build(); + } + + @DeleteMapping("") + public ResponseEntity<ResponseMessage> deleteUser(@RequestParam Long id) { + ResponseMessage response = new ResponseMessage(false, ""); + User user = getCurrentUser(); + if(user == null) { + response.setError(true); + response.setMessage("User unknown"); + return ResponseEntity.ok(response); + } + + try { + manager.removeUser(user, id); + } catch (Exception e) { + response.setError(true); + response.setMessage(e.getMessage()); + } + return ResponseEntity.ok().build(); + } + @PostMapping("/signup") public ResponseEntity<ResponseMessage> addUser(@RequestBody @Valid SignupMessage message, BindingResult result) { System.err.println("SIGNUP u:"+message.getUsername()+" e:"+message.getEmail()+" p:"+message.getPassword()); @@ -48,4 +98,15 @@ public class UserController { return ResponseEntity.ok(response); } + private User getCurrentUser() { + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + + if (!(auth instanceof AnonymousAuthenticationToken)) { + String username = (String) auth.getPrincipal(); + return manager.getUserByUsername(username); + } else { + return null; + } + } + } \ No newline at end of file