diff --git a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/AbstractEncryptedNode.java b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/AbstractEncryptedNode.java index efaeb8f59..903703236 100644 --- a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/AbstractEncryptedNode.java +++ b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/AbstractEncryptedNode.java @@ -11,8 +11,11 @@ package org.cryptomator.webdav.jackrabbit.resources; import java.io.IOException; import java.nio.file.AtomicMoveNotSupportedException; import java.nio.file.Files; +import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.BasicFileAttributeView; +import java.nio.file.attribute.FileTime; import java.util.List; import org.apache.commons.io.FilenameUtils; @@ -132,6 +135,27 @@ abstract class AbstractEncryptedNode implements DavResource { @Override public void setProperty(DavProperty property) throws DavException { getProperties().add(property); + + LOG.info("Set property {}", property.getName()); + + try { + final Path path = ResourcePathUtils.getPhysicalPath(this); + if (DavPropertyName.CREATIONDATE.equals(property.getName()) && property.getValue() instanceof String) { + final String createDateStr = (String) property.getValue(); + final FileTime createTime = FileTimeUtils.fromRfc1123String(createDateStr); + final BasicFileAttributeView attrView = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS); + attrView.setTimes(null, null, createTime); + LOG.info("Updating Creation Date: {}", createTime.toString()); + } else if (DavPropertyName.GETLASTMODIFIED.equals(property.getName()) && property.getValue() instanceof String) { + final String lastModifiedTimeStr = (String) property.getValue(); + final FileTime lastModifiedTime = FileTimeUtils.fromRfc1123String(lastModifiedTimeStr); + final BasicFileAttributeView attrView = Files.getFileAttributeView(path, BasicFileAttributeView.class, LinkOption.NOFOLLOW_LINKS); + attrView.setTimes(lastModifiedTime, null, null); + LOG.info("Updating Last Modified Date: {}", lastModifiedTime.toString()); + } + } catch (IOException e) { + throw new DavException(DavServletResponse.SC_INTERNAL_SERVER_ERROR); + } } @Override diff --git a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/FileTimeUtils.java b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/FileTimeUtils.java index 3608bc3b4..583527242 100644 --- a/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/FileTimeUtils.java +++ b/main/core/src/main/java/org/cryptomator/webdav/jackrabbit/resources/FileTimeUtils.java @@ -9,6 +9,7 @@ package org.cryptomator.webdav.jackrabbit.resources; import java.nio.file.attribute.FileTime; +import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @@ -25,4 +26,9 @@ final class FileTimeUtils { return DateTimeFormatter.RFC_1123_DATE_TIME.format(date); } + static FileTime fromRfc1123String(String string) { + final Instant instant = Instant.from(DateTimeFormatter.RFC_1123_DATE_TIME.parse(string)); + return FileTime.from(instant); + } + }