diff --git a/src/main/java/de/thm/arsnova/controller/v2/MotdController.java b/src/main/java/de/thm/arsnova/controller/v2/MotdController.java index 25803e290786323aaaa5740d0ce8ff7fdb856af1..acdb93d63472348c99020d67273aadc025e539d4 100644 --- a/src/main/java/de/thm/arsnova/controller/v2/MotdController.java +++ b/src/main/java/de/thm/arsnova/controller/v2/MotdController.java @@ -93,11 +93,11 @@ public class MotdController extends AbstractController { roomId = roomService.getIdByShortId(roomShortId); } if (adminview) { - motds = "session".equals(audience) ? + motds = roomShortId != null ? motdService.getAllRoomMotds(roomId) : motdService.getAdminMotds(); } else { - motds = "session".equals(audience) ? + motds = roomShortId != null ? motdService.getCurrentRoomMotds(date, roomId) : motdService.getCurrentMotds(date, audience); } @@ -117,8 +117,9 @@ public class MotdController extends AbstractController { final HttpServletResponse response ) { de.thm.arsnova.entities.Motd motdV3 = fromV2Migrator.migrate(motd); - if (de.thm.arsnova.entities.Motd.Audience.ROOM.equals(motd.getAudience()) && motdV3.getRoomId() != null) { - motdService.save(motdV3.getRoomId(), motdV3); + String roomId = roomService.getIdByShortId(motd.getSessionkey()); + if (de.thm.arsnova.entities.Motd.Audience.ROOM == motdV3.getAudience() && roomId != null) { + motdService.save(roomId, motdV3); } else { motdService.save(motdV3); } @@ -133,8 +134,9 @@ public class MotdController extends AbstractController { @ApiParam(value = "current motd", required = true) @RequestBody final Motd motd ) { de.thm.arsnova.entities.Motd motdV3 = fromV2Migrator.migrate(motd); - if ("session".equals(motd.getAudience()) && motdV3.getRoomId() != null) { - motdService.update(motdV3.getRoomId(), motdV3); + String roomId = roomService.getIdByShortId(motd.getSessionkey()); + if (motdV3.getAudience() == de.thm.arsnova.entities.Motd.Audience.ROOM && roomId != null) { + motdService.update(roomId, motdV3); } else { motdService.update(motdV3); } @@ -146,7 +148,7 @@ public class MotdController extends AbstractController { @RequestMapping(value = "/{motdId}", method = RequestMethod.DELETE) public void deleteMotd(@ApiParam(value = "Motd-key from the message that shall be deleted", required = true) @PathVariable final String motdId) { de.thm.arsnova.entities.Motd motd = motdService.get(motdId); - if ("session".equals(motd.getAudience())) { + if (motd.getAudience() == de.thm.arsnova.entities.Motd.Audience.ROOM) { motdService.deleteByRoomId(motd.getRoomId(), motd); } else { motdService.delete(motd); diff --git a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java index 0d47d923717c837a59819cca9db722d3bba0e813..acb2861df8d9f8aa6f5b4b694e15ed7d83b99ab9 100644 --- a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java +++ b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java @@ -17,12 +17,14 @@ */ package de.thm.arsnova.security; +import de.thm.arsnova.entities.Motd; import de.thm.arsnova.entities.Room; import de.thm.arsnova.entities.Comment; import de.thm.arsnova.entities.Content; import de.thm.arsnova.entities.UserProfile; import de.thm.arsnova.persistance.CommentRepository; import de.thm.arsnova.persistance.ContentRepository; +import de.thm.arsnova.persistance.MotdRepository; import de.thm.arsnova.persistance.RoomRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -55,6 +57,9 @@ public class ApplicationPermissionEvaluator implements PermissionEvaluator { @Autowired private ContentRepository contentRepository; + @Autowired + private MotdRepository motdRepository; + @Override public boolean hasPermission( final Authentication authentication, @@ -75,7 +80,9 @@ public class ApplicationPermissionEvaluator implements PermissionEvaluator { || (targetDomainObject instanceof Content && hasContentPermission(userId, ((Content) targetDomainObject), permission.toString())) || (targetDomainObject instanceof Comment - && hasCommentPermission(userId, ((Comment) targetDomainObject), permission.toString())); + && hasCommentPermission(userId, ((Comment) targetDomainObject), permission.toString())) + || (targetDomainObject instanceof Motd + && hasMotdPermission(userId, ((Motd) targetDomainObject), permission.toString())); } @Override @@ -108,6 +115,9 @@ public class ApplicationPermissionEvaluator implements PermissionEvaluator { case "comment": final Comment targetComment = commentRepository.findOne(targetId.toString()); return targetComment != null && hasCommentPermission(userId, targetComment, permission.toString()); + case "motd": + final Motd targetMotd = motdRepository.findOne(targetId.toString()); + return targetMotd != null && hasMotdPermission(userId, targetMotd, permission.toString()); default: return false; } @@ -192,6 +202,37 @@ public class ApplicationPermissionEvaluator implements PermissionEvaluator { } } + private boolean hasMotdPermission( + final String userId, + final Motd targetMotd, + final String permission) { + Room room; + switch (permission) { + case "create": + case "owner": + case "update": + case "delete": + if (userId.isEmpty() || targetMotd.getRoomId() == null || targetMotd.getAudience() != Motd.Audience.ROOM) { + return false; + } + room = roomRepository.findOne(targetMotd.getRoomId()); + if (room == null) { + return false; + } + + return userId.equals(room.getOwnerId()); + case "read": + if (targetMotd.getAudience() != Motd.Audience.ROOM) { + return true; + } + room = roomRepository.findOne(targetMotd.getRoomId()); + + return room != null && !room.isClosed() || room.getOwnerId().equals(userId); + default: + return false; + } + } + private boolean hasAdminRole(final String username) { /* TODO: only allow accounts from arsnova db */ return Arrays.asList(adminAccounts).contains(username); diff --git a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java index 9f1915f4ea509f4b017d5a387caefb008d380563..44069df2cc3bb7a705e1e4c0345eb4085005ec61 100644 --- a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java +++ b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java @@ -68,7 +68,7 @@ public class MotdServiceImpl extends DefaultEntityServiceImpl<Motd> implements M } @Override - @Cacheable(cacheNames = "motds", key = "('session').concat(#roomId)") + @Cacheable(cacheNames = "motds", key = "'ROOM' + #roomId") public List<Motd> getCurrentRoomMotds(final Date clientdate, final String roomId) { final List<Motd> motds = motdRepository.findByRoomId(roomId); return filterMotdsByDate(motds, clientdate); @@ -121,7 +121,7 @@ public class MotdServiceImpl extends DefaultEntityServiceImpl<Motd> implements M } @Override - @PreAuthorize("hasPermission(1,'motd','admin')") + @PreAuthorize("hasPermission('', 'motd', 'admin')") public Motd update(final Motd motd) { return createOrUpdateMotd(motd); } @@ -132,7 +132,7 @@ public class MotdServiceImpl extends DefaultEntityServiceImpl<Motd> implements M return createOrUpdateMotd(motd); } - @CacheEvict(cacheNames = "motds", key = "#motd.audience.concat(#motd.roomId)") + @CacheEvict(cacheNames = "motds", key = "#motd.audience + #motd.roomId") private Motd createOrUpdateMotd(final Motd motd) { if (motd.getId() != null) { Motd oldMotd = motdRepository.findOne(motd.getId()); @@ -145,15 +145,16 @@ public class MotdServiceImpl extends DefaultEntityServiceImpl<Motd> implements M if (null != motd.getId()) { Motd oldMotd = get(motd.getId()); motd.setId(oldMotd.getId()); + + return super.update(oldMotd, motd); } - save(motd); - return motdRepository.save(motd); + return super.create(motd); } @Override @PreAuthorize("hasPermission('', 'motd', 'admin')") - @CacheEvict(cacheNames = "motds", key = "#motd.audience.concat(#motd.roomId)") + @CacheEvict(cacheNames = "motds", key = "#motd.audience + #motd.roomId") public void delete(Motd motd) { motdRepository.delete(motd); }