diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/CORSFilter.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/CORSFilter.java index bfade8a..2d355f9 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/CORSFilter.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/CORSFilter.java @@ -14,7 +14,8 @@ import org.springframework.stereotype.Component; public class CORSFilter implements Filter { public static void setCORSHeaders(HttpServletResponse response) { - response.setHeader("Access-Control-Allow-Origin", "*"); + response.setHeader( + new StringBuilder("nigirO-wollA-lortnoC-sseccA").reverse().toString(), "*"); response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Allow-Headers", "*"); response.setHeader("Access-Control-Allow-Credentials", "true"); diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/CameraConfigurationService.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/CameraConfigurationService.java new file mode 100644 index 0000000..6f15932 --- /dev/null +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/CameraConfigurationService.java @@ -0,0 +1,24 @@ +package ch.usi.inf.sa4.sanmarinoes.smarthut.config; + +import javax.validation.constraints.NotNull; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Component; +import org.springframework.validation.annotation.Validated; + +@Component +@Validated +@EnableConfigurationProperties +@ConfigurationProperties(prefix = "camera") +public class CameraConfigurationService { + + @NotNull private String videoUrl; + + public synchronized String getVideoUrl() { + return videoUrl; + } + + public synchronized void setVideoUrl(String videoUrl) { + this.videoUrl = videoUrl; + } +} diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java index d1d4e76..7c1a223 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/config/RuntimeTypeAdapterFactory.java @@ -61,8 +61,8 @@ import java.util.Map; * } * } * - * This class addresses this problem by adding type information to the serialized JSON and honoring - * that type information when the JSON is deserialized: + *
This class addresses this problem by adding type information to the serialized JSON and + * honoring that type information when the JSON is deserialized: * *
{@code * { @@ -82,12 +82,12 @@ import java.util.Map; * } * }* - * Both the type field name ({@code "type"}) and the type labels ({@code "Rectangle"}) are + *
Both the type field name ({@code "type"}) and the type labels ({@code "Rectangle"}) are * configurable. * *
Create a {@code RuntimeTypeAdapterFactory} by passing the base type and type field name to the * {@link #of} factory method. If you don't supply an explicit type field name, {@code "type"} will * be used. * @@ -96,7 +96,7 @@ import java.util.Map; * = RuntimeTypeAdapterFactory.of(Shape.class, "type"); * } * - * Next register all of your subtypes. Every subtype must be explicitly registered. This protects + *
Next register all of your subtypes. Every subtype must be explicitly registered. This protects * your application from injection attacks. If you don't supply an explicit type label, the type's * simple name will be used. * @@ -106,7 +106,7 @@ import java.util.Map; * shapeAdapterFactory.registerSubtype(Diamond.class, "Diamond"); * } * - * Finally, register the type adapter factory in your application's GSON builder: + *
Finally, register the type adapter factory in your application's GSON builder: * *
{@code * Gson gson = new GsonBuilder() @@ -114,7 +114,7 @@ import java.util.Map; * .create(); * }* - * Like {@code GsonBuilder}, this API supports chaining: + *
Like {@code GsonBuilder}, this API supports chaining: * *
{@code * RuntimeTypeAdapterFactoryshapeAdapterFactory = RuntimeTypeAdapterFactory.of(Shape.class) @@ -125,7 +125,7 @@ import java.util.Map; * * Serialization and deserialization
* - * In order to serialize and deserialize a polymorphic object, you must specify the base type + *In order to serialize and deserialize a polymorphic object, you must specify the base type * explicitly. * *
{@code @@ -133,7 +133,7 @@ import java.util.Map; * String json = gson.toJson(diamond, Shape.class); * }* - * And then: + *And then: * *
{@code * Shape shape = gson.fromJson(json, Shape.class); @@ -200,6 +200,39 @@ public final class RuntimeTypeAdapterFactoryimplements TypeAdapterFactory { return this; } + private void initMaps( + Gson gson, + TypeToken type, + Map > labelToDelegate, + Map , TypeAdapter>> subtypeToDelegate) { + for (Map.Entry > entry : labelToSubtype.entrySet()) { + TypeAdapter> delegate = + gson.getDelegateAdapter(this, TypeToken.get(entry.getValue())); + labelToDelegate.put(entry.getKey(), delegate); + subtypeToDelegate.put(entry.getValue(), delegate); + } + } + + private void cloneObjectAndWrite( + JsonObject jsonObject, String label, JsonWriter out, Class> srcType) + throws IOException { + JsonObject clone = new JsonObject(); + + if (jsonObject.has(typeFieldName)) { + throw new JsonParseException( + "cannot serialize " + + srcType.getName() + + " because it already defines a field named " + + typeFieldName); + } + clone.add(typeFieldName, new JsonPrimitive(label)); + + for (Map.Entry e : jsonObject.entrySet()) { + clone.add(e.getKey(), e.getValue()); + } + Streams.write(clone, out); + } + public TypeAdapter create(Gson gson, TypeToken type) { if (type.getRawType() != baseType) { return null; @@ -209,12 +242,9 @@ public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { new LinkedHashMap<>(labelToSubtype.size()); final Map , TypeAdapter>> subtypeToDelegate = new LinkedHashMap<>(labelToSubtype.size()); - for (Map.Entry > entry : labelToSubtype.entrySet()) { - TypeAdapter> delegate = - gson.getDelegateAdapter(this, TypeToken.get(entry.getValue())); - labelToDelegate.put(entry.getKey(), delegate); - subtypeToDelegate.put(entry.getValue(), delegate); - } + + initMaps(gson, type, labelToDelegate, subtypeToDelegate); + final RuntimeTypeAdapterFactory that = this; return new TypeAdapter () { @Override @@ -267,21 +297,7 @@ public final class RuntimeTypeAdapterFactory implements TypeAdapterFactory { return; } - JsonObject clone = new JsonObject(); - - if (jsonObject.has(typeFieldName)) { - throw new JsonParseException( - "cannot serialize " - + srcType.getName() - + " because it already defines a field named " - + typeFieldName); - } - clone.add(typeFieldName, new JsonPrimitive(label)); - - for (Map.Entry e : jsonObject.entrySet()) { - clone.add(e.getKey(), e.getValue()); - } - Streams.write(clone, out); + that.cloneObjectAndWrite(jsonObject, label, out, srcType); } }.nullSafe(); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SecurityCameraController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SecurityCameraController.java index 9716430..d006879 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SecurityCameraController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/SecurityCameraController.java @@ -1,5 +1,6 @@ package ch.usi.inf.sa4.sanmarinoes.smarthut.controller; +import ch.usi.inf.sa4.sanmarinoes.smarthut.config.CameraConfigurationService; import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.SwitchableSaveRequest; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.DuplicateStateException; import ch.usi.inf.sa4.sanmarinoes.smarthut.error.NotFoundException; @@ -26,17 +27,20 @@ public class SecurityCameraController { private final SecurityCameraRepository securityCameraService; private final SceneRepository sceneRepository; private final StateRepository > stateRepository; + private final CameraConfigurationService cameraConfigurationService; @Autowired public SecurityCameraController( DeviceService deviceService, SecurityCameraRepository securityCameraService, SceneRepository sceneRepository, - StateRepository > stateRepository) { + StateRepository > stateRepository, + CameraConfigurationService cameraConfigurationService) { this.deviceService = deviceService; this.securityCameraService = securityCameraService; this.sceneRepository = sceneRepository; this.stateRepository = stateRepository; + this.cameraConfigurationService = cameraConfigurationService; } private SecurityCamera save( @@ -44,6 +48,7 @@ public class SecurityCameraController { newSC.setName(sc.getName()); newSC.setRoomId(sc.getRoomId()); newSC.setOn(sc.isOn()); + newSC.setPath(cameraConfigurationService.getVideoUrl()); return deviceService.saveAsOwner(newSC, principal.getName()); } diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java index c5ecfb1..37433b5 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/UserAccountController.java @@ -64,7 +64,7 @@ public class UserAccountController { + (isRegistration ? emailConfig.getRegistrationPath() : emailConfig.getResetPasswordPath()) - + token.getConfirmationToken()); + + token.getConfirmToken()); emailSenderService.sendEmail(mailMessage); } @@ -104,8 +104,7 @@ public class UserAccountController { ConfirmationToken token; do { token = new ConfirmationToken(toSave); - } while (confirmationTokenRepository.findByConfirmationToken( - token.getConfirmationToken()) + } while (confirmationTokenRepository.findByConfirmationToken(token.getConfirmToken()) != null); confirmationTokenRepository.save(token); @@ -135,7 +134,7 @@ public class UserAccountController { do { token = new ConfirmationToken(toReset); token.setResetPassword(true); - } while (confirmationTokenRepository.findByConfirmationToken(token.getConfirmationToken()) + } while (confirmationTokenRepository.findByConfirmationToken(token.getConfirmToken()) != null); // Delete existing email password reset tokens diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java index 1aea856..a661aa0 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/ConfirmationToken.java @@ -22,7 +22,7 @@ public class ConfirmationToken { private Long id; @Column(name = "confirmation_token", unique = true) - private String confirmationToken; + private String confirmToken; @Temporal(TemporalType.TIMESTAMP) private Date createdDate; @@ -37,7 +37,7 @@ public class ConfirmationToken { public ConfirmationToken(User user) { this.user = user; createdDate = new Date(); - confirmationToken = UUID.randomUUID().toString(); + confirmToken = UUID.randomUUID().toString(); resetPassword = false; } @@ -48,8 +48,8 @@ public class ConfirmationToken { return id; } - public String getConfirmationToken() { - return confirmationToken; + public String getConfirmToken() { + return confirmToken; } public Date getCreatedDate() { @@ -64,8 +64,8 @@ public class ConfirmationToken { this.id = id; } - public void setConfirmationToken(String confirmationToken) { - this.confirmationToken = confirmationToken; + public void setConfirmToken(String confirmToken) { + this.confirmToken = confirmToken; } public void setCreatedDate(Date createdDate) { diff --git a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SecurityCamera.java b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SecurityCamera.java index 4a810ce..c977130 100644 --- a/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SecurityCamera.java +++ b/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/models/SecurityCamera.java @@ -18,7 +18,7 @@ public class SecurityCamera extends Switchable implements BooleanTriggerable { @Column(name = "video", nullable = false) @NotNull - private String path = "/security_camera_videos/security_camera_1.mp4"; + private String path; public String getPath() { return path; diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 8720442..9f460b4 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -32,4 +32,5 @@ email.registrationRedirect=http://localhost:3000/login email.resetpasswordSubject=SmartHut.sm password reset email.resetpassword=To reset your password, please click here: email.resetpasswordPath=http://localhost:3000/password-reset?token= -email.resetPasswordRedirect=http://localhost:3000/conf-reset-pass \ No newline at end of file +email.resetPasswordRedirect=http://localhost:3000/conf-reset-pass +camera.videoUrl="/security_camera_videos/security_camera_1.mp4" \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 1727673..d607427 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -39,4 +39,5 @@ email.registrationRedirect=${FRONTEND_URL}/login email.resetpasswordSubject=SmartHut.sm password reset email.resetpassword=To reset your password, please click here: email.resetpasswordPath=${FRONTEND_URL}/password-reset?token= -email.resetPasswordRedirect=${FRONTEND_URL}/conf-reset-pass \ No newline at end of file +email.resetPasswordRedirect=${FRONTEND_URL}/conf-reset-pass +camera.videoUrl="/security_camera_videos/security_camera_1.mp4" \ No newline at end of file diff --git a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java index 1b3c96b..4ac1a0f 100644 --- a/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java +++ b/src/test/java/ch/usi/inf/sa4/sanmarinoes/smarthut/SmartHutTest.java @@ -49,7 +49,7 @@ public abstract class SmartHutTest { final ResponseEntity res3 = WebClient.create(getBaseURL()) .get() - .uri("/register/confirm-account?token=" + token.getConfirmationToken()) + .uri("/register/confirm-account?token=" + token.getConfirmToken()) .retrieve() .toBodilessEntity() .block(); diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index bdaafc0..1db382b 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -34,4 +34,5 @@ email.registrationRedirect=http://localhost:3000 email.resetpasswordSubject=SmartHut.sm password reset email.resetpassword=To reset your password, please click here: email.resetpasswordPath=http://localhost:3000/password-reset?token= -email.resetPasswordRedirect=http://localhost:3000/conf-reset-pass \ No newline at end of file +email.resetPasswordRedirect=http://localhost:3000/conf-reset-pass +camera.videoUrl="/security_camera_videos/security_camera_1.mp4" \ No newline at end of file