diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/FilesWebService.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/FilesWebService.java index 0cddee96515f41ff2aaa402f5cecc4df694856e3..11da30f1a788be5bfd130074a521a9942d0af58c 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/FilesWebService.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/restapi/FilesWebService.java @@ -19,7 +19,7 @@ */ package org.olat.core.commons.services.doceditor.collabora.restapi; -import static org.olat.core.commons.services.doceditor.wopi.WopiRestHelper.getAsIso6801; +import static org.olat.core.commons.services.doceditor.wopi.WopiRestHelper.getAsIso8601; import static org.olat.core.commons.services.doceditor.wopi.WopiRestHelper.getFirstRequestHeader; import java.io.InputStream; @@ -108,7 +108,7 @@ public class FilesWebService { .withUserId(access.getIdentity().getKey().toString()) .withUserFriendlyName(userManager.getUserDisplayName(access.getIdentity())) .withVersion(String.valueOf(metadata.getRevisionNr())) - .withLastModifiedTime(getAsIso6801(metadata.getLastModified())) + .withLastModifiedTime(getAsIso8601(metadata.getLastModified())) .withUserCanWrite(access.isCanEdit()) .withDisablePrint(Boolean.FALSE) .withUserCanNotWriteRelative(Boolean.TRUE) @@ -195,7 +195,7 @@ public class FilesWebService { boolean updated = collaboraService.updateContent(access, fileInputStream); if (updated) { PutFileVO putFileVO = PutFileVO.builder() - .withLastModifiedTime(getAsIso6801(new Date())) + .withLastModifiedTime(getAsIso8601(new Date())) .build(); logPutFileResponse(putFileVO); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java index d212cbc2ed76410ab6314d8d4cadf2951cf93d99..7b2db3188f76e7935aac12a4b6c78871802f9c2b 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Service.java @@ -21,6 +21,7 @@ package org.olat.core.commons.services.doceditor.office365; import java.io.InputStream; import java.util.Collection; +import java.util.Locale; import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; @@ -56,7 +57,7 @@ public interface Office365Service { Collection<String> getContentSecurityPolicyUrls(); - String getEditorActionUrl(VFSMetadata vfsMetadata); + String getEditorActionUrl(VFSMetadata vfsMetadata, Mode mode, Locale locale); boolean isSupportingFormat(String suffix, Mode mode); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java index 0444398c73a9db33855b991433294d101eb81d00..0d0ece0ed0a4c69707d42c6d8ed768406c7ff6a8 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/Office365ServiceImpl.java @@ -26,6 +26,7 @@ import java.util.Calendar; import java.util.Collection; import java.util.Date; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import javax.annotation.PostConstruct; @@ -241,33 +242,47 @@ public class Office365ServiceImpl implements Office365Service, GenericEventListe } @Override - public String getEditorActionUrl(VFSMetadata vfsMetadata) { - StringBuilder wopiPath = new StringBuilder(); - wopiPath.append(Settings.getServerContextPathURI()); - wopiPath.append(RestSecurityHelper.SUB_CONTEXT); - wopiPath.append("/office365/wopi/files/"); - wopiPath.append(vfsMetadata.getUuid()); + public String getEditorActionUrl(VFSMetadata vfsMetadata, Mode mode, Locale locale) { + String rawActionUrl = getRawActionUrl(vfsMetadata, mode); + String wopiSrcUrl = getWopiSrcUrl(vfsMetadata); StringBuilder urlSb = new StringBuilder(); - urlSb.append(getEditorBaseUrl(vfsMetadata)); - urlSb.append("WOPISrc="); - urlSb.append(StringHelper.urlEncodeUTF8(wopiPath.toString())); + urlSb.append(urlParser.stripQuery(rawActionUrl)); + urlSb.append("?"); + urlSb.append("WOPISrc"); + urlSb.append("="); + urlSb.append(StringHelper.urlEncodeUTF8(wopiSrcUrl)); + String languageParameter = urlParser.getLanguageParameter(rawActionUrl); + if (languageParameter != null) { + urlSb.append("&"); + urlSb.append(languageParameter); + urlSb.append("="); + urlSb.append(locale.toString()); + } + String url = urlSb.toString(); log.debug("Editor action URL: " + url); return url; } - private String getEditorBaseUrl(VFSMetadata vfsMetadata) { + private String getRawActionUrl(VFSMetadata vfsMetadata, Mode mode) { String suffix = FileUtils.getFileSuffix(vfsMetadata.getFilename()); - Action action = wopiService.getAction(getDiscovery(), "edit", suffix); - if (action == null) { + Action action = null; + if (Mode.EDIT.equals(mode)) { + action = wopiService.getAction(getDiscovery(), "edit", suffix); + } else if (Mode.VIEW.equals(mode)) { action = wopiService.getAction(getDiscovery(), "view", suffix); } + return action != null? action.getUrlSrc(): null; + } - String url = action != null? action.getUrlSrc(): null; - // replace all url query parameters - url = url!= null? url.substring(0, url.indexOf("?") + 1): null; - return url; + private String getWopiSrcUrl(VFSMetadata vfsMetadata) { + StringBuilder wopiPath = new StringBuilder(); + wopiPath.append(Settings.getServerContextPathURI()); + wopiPath.append(RestSecurityHelper.SUB_CONTEXT); + wopiPath.append("/office365/wopi/files/"); + wopiPath.append(vfsMetadata.getUuid()); + return wopiPath.toString(); } @Override diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParser.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParser.java index 1a272ad397a7d40bc69c98f3c697fb80b79c3844..84a013872f48a2566ebcc3a7a939ccc6e3ebee5e 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParser.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParser.java @@ -35,6 +35,8 @@ import org.springframework.stereotype.Service; class UrlParser { private static final OLog log = Tracing.createLoggerFor(UrlParser.class); + + private static final String LANGUAGE_PARAMETER = "UI_LLCC"; String getProtocolAndDomain(String url) { try { @@ -49,8 +51,22 @@ class UrlParser { return null; } - private String stripQuery(String url) { - return url!= null && url.indexOf("?") > -1? url.substring(0, url.indexOf("?")): null; + String stripQuery(String url) { + return url != null && url.indexOf("?") > -1? url.substring(0, url.indexOf("?")): null; + } + + String getLanguageParameter(String url) { + int languageParameterIndey = url.indexOf(LANGUAGE_PARAMETER); + if (languageParameterIndey > -1) { + int start = url.lastIndexOf("<", languageParameterIndey); + if (start > -1) { + int end = url.lastIndexOf("=", languageParameterIndey); + if (end > -1) { + return url.substring(start + 1, end); + } + } + } + return null; } } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java index 47e49b93ca6587d6ea6ac65533b87181c96edd66..eaab1548af3e96931f36c8b6ddb8750ca483dece 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java @@ -19,6 +19,8 @@ */ package org.olat.core.commons.services.doceditor.office365.restapi; +import static org.olat.core.commons.services.doceditor.wopi.WopiRestHelper.getAsIso8601; + import java.io.InputStream; import java.util.List; import java.util.Map.Entry; @@ -119,6 +121,7 @@ public class Office365WebService { .withUserId(access.getIdentity().getKey().toString()) .withUserFriendlyName(userManager.getUserDisplayName(access.getIdentity())) .withVersion(String.valueOf(metadata.getRevisionNr())) + .withLastModifiedTime(getAsIso8601(metadata.getLastModified())) .withSupportsGetLock(true) .withSupportsLocks(true) .withSupportsExtendedLockLength(true) diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365EditorController.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365EditorController.java index 45b381f0bf7f42b07e6bf0956252b203676f83e9..4a25848618ef9aa27319db7d8fffd35011b7ea85 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365EditorController.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365EditorController.java @@ -66,10 +66,14 @@ public class Office365EditorController extends BasicController { mainVC.contextPut("warning", translate("editor.warning.no.metadata")); } else { Access access = office365Service.createAccess(vfsMetadata, getIdentity(), secCallback); - String actionUrl = office365Service.getEditorActionUrl(vfsMetadata); - mainVC.contextPut("actionUrl", actionUrl); - mainVC.contextPut("accessToken", access.getToken()); - mainVC.contextPut("accessTokenTtl", access.getExpiresAt().getTime()); + String actionUrl = office365Service.getEditorActionUrl(vfsMetadata, secCallback.getMode(), getLocale()); + if (actionUrl == null) { + mainVC.contextPut("warning", translate("editor.warning.no.metadata")); + } else { + mainVC.contextPut("actionUrl", actionUrl); + mainVC.contextPut("accessToken", access.getToken()); + mainVC.contextPut("accessTokenTtl", access.getExpiresAt().getTime()); + } } putInitialPanel(mainVC); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiRestHelper.java b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiRestHelper.java index 3419a8f19a0bffb4620467f47adb076d1e932fa8..4642099a7ef1c56c7fba47d7e8f5e859370a7f80 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiRestHelper.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/wopi/WopiRestHelper.java @@ -39,12 +39,12 @@ public class WopiRestHelper { return requestHeader != null && !requestHeader.isEmpty()? requestHeader.get(0): null; } - public static String getLastModifiedAsIso6801(File file) { + public static String getLastModifiedAsIso8601(File file) { long lastModified = file.lastModified(); return Instant.ofEpochMilli(lastModified).toString(); } - public static String getAsIso6801(Date date) { + public static String getAsIso8601(Date date) { long lastModified = date.getTime(); return Instant.ofEpochMilli(lastModified).toString(); } diff --git a/src/test/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParserTest.java b/src/test/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParserTest.java index 0fd957284bc0c78d0f916438364d881b8a81a092..af1b1a9c934b773eee04210bff5dcf7666f59c8c 100644 --- a/src/test/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParserTest.java +++ b/src/test/java/org/olat/core/commons/services/doceditor/office365/manager/UrlParserTest.java @@ -41,5 +41,33 @@ public class UrlParserTest { assertThat(protocolAndDomain).isEqualTo("https://FFC-excel.officeapps.live.com"); } + + @Test + public void shouldStripQuery() { + String url = "https://FFC-excel.officeapps.live.com/x/_layouts/xlembed.aspx?<ui=UI_LLCC&><rs=DC_LLCC&><dchat=DISABLE_CHAT&><hid=HOST_SESSION_ID&><sc=SESSION_CONTEXT&><wopisrc=WOPI_SOURCE&>"; + + String strippedUrl = sut.stripQuery(url); + + assertThat(strippedUrl).isEqualTo("https://FFC-excel.officeapps.live.com/x/_layouts/xlembed.aspx"); + } + + @Test + public void shouldGetLanguageParameter() { + String url = "https://FFC-excel.officeapps.live.com/x/_layouts/xlembed.aspx?<ui=UI_LLCC&><rs=DC_LLCC&><dchat=DISABLE_CHAT&><hid=HOST_SESSION_ID&><sc=SESSION_CONTEXT&><wopisrc=WOPI_SOURCE&>"; + + String languageParameter = sut.getLanguageParameter(url); + + assertThat(languageParameter).isEqualTo("ui"); + } + + @Test + public void shouldGetLanguageParameterNotFound() { + String url = "https://FFC-excel.officeapps.live.com/x/_layouts/xlembed.aspx?<rs=DC_LLCC&><dchat=DISABLE_CHAT&><hid=HOST_SESSION_ID&><sc=SESSION_CONTEXT&><wopisrc=WOPI_SOURCE&>"; + + String languageParameter = sut.getLanguageParameter(url); + + assertThat(languageParameter).isNull(); + } + }