Skip to content
Snippets Groups Projects
Commit 2a89c6f6 authored by uhensler's avatar uhensler
Browse files

OO-3938: Set Office 365 language according to OpenOLAT language

parent c8192989
No related branches found
No related tags found
No related merge requests found
Showing with 95 additions and 28 deletions
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
*/ */
package org.olat.core.commons.services.doceditor.collabora.restapi; 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 static org.olat.core.commons.services.doceditor.wopi.WopiRestHelper.getFirstRequestHeader;
import java.io.InputStream; import java.io.InputStream;
...@@ -108,7 +108,7 @@ public class FilesWebService { ...@@ -108,7 +108,7 @@ public class FilesWebService {
.withUserId(access.getIdentity().getKey().toString()) .withUserId(access.getIdentity().getKey().toString())
.withUserFriendlyName(userManager.getUserDisplayName(access.getIdentity())) .withUserFriendlyName(userManager.getUserDisplayName(access.getIdentity()))
.withVersion(String.valueOf(metadata.getRevisionNr())) .withVersion(String.valueOf(metadata.getRevisionNr()))
.withLastModifiedTime(getAsIso6801(metadata.getLastModified())) .withLastModifiedTime(getAsIso8601(metadata.getLastModified()))
.withUserCanWrite(access.isCanEdit()) .withUserCanWrite(access.isCanEdit())
.withDisablePrint(Boolean.FALSE) .withDisablePrint(Boolean.FALSE)
.withUserCanNotWriteRelative(Boolean.TRUE) .withUserCanNotWriteRelative(Boolean.TRUE)
...@@ -195,7 +195,7 @@ public class FilesWebService { ...@@ -195,7 +195,7 @@ public class FilesWebService {
boolean updated = collaboraService.updateContent(access, fileInputStream); boolean updated = collaboraService.updateContent(access, fileInputStream);
if (updated) { if (updated) {
PutFileVO putFileVO = PutFileVO.builder() PutFileVO putFileVO = PutFileVO.builder()
.withLastModifiedTime(getAsIso6801(new Date())) .withLastModifiedTime(getAsIso8601(new Date()))
.build(); .build();
logPutFileResponse(putFileVO); logPutFileResponse(putFileVO);
......
...@@ -21,6 +21,7 @@ package org.olat.core.commons.services.doceditor.office365; ...@@ -21,6 +21,7 @@ package org.olat.core.commons.services.doceditor.office365;
import java.io.InputStream; import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.Locale;
import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.commons.services.doceditor.DocEditor.Mode;
import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback;
...@@ -56,7 +57,7 @@ public interface Office365Service { ...@@ -56,7 +57,7 @@ public interface Office365Service {
Collection<String> getContentSecurityPolicyUrls(); Collection<String> getContentSecurityPolicyUrls();
String getEditorActionUrl(VFSMetadata vfsMetadata); String getEditorActionUrl(VFSMetadata vfsMetadata, Mode mode, Locale locale);
boolean isSupportingFormat(String suffix, Mode mode); boolean isSupportingFormat(String suffix, Mode mode);
......
...@@ -26,6 +26,7 @@ import java.util.Calendar; ...@@ -26,6 +26,7 @@ import java.util.Calendar;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
...@@ -241,33 +242,47 @@ public class Office365ServiceImpl implements Office365Service, GenericEventListe ...@@ -241,33 +242,47 @@ public class Office365ServiceImpl implements Office365Service, GenericEventListe
} }
@Override @Override
public String getEditorActionUrl(VFSMetadata vfsMetadata) { public String getEditorActionUrl(VFSMetadata vfsMetadata, Mode mode, Locale locale) {
StringBuilder wopiPath = new StringBuilder(); String rawActionUrl = getRawActionUrl(vfsMetadata, mode);
wopiPath.append(Settings.getServerContextPathURI()); String wopiSrcUrl = getWopiSrcUrl(vfsMetadata);
wopiPath.append(RestSecurityHelper.SUB_CONTEXT);
wopiPath.append("/office365/wopi/files/");
wopiPath.append(vfsMetadata.getUuid());
StringBuilder urlSb = new StringBuilder(); StringBuilder urlSb = new StringBuilder();
urlSb.append(getEditorBaseUrl(vfsMetadata)); urlSb.append(urlParser.stripQuery(rawActionUrl));
urlSb.append("WOPISrc="); urlSb.append("?");
urlSb.append(StringHelper.urlEncodeUTF8(wopiPath.toString())); 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(); String url = urlSb.toString();
log.debug("Editor action URL: " + url); log.debug("Editor action URL: " + url);
return url; return url;
} }
private String getEditorBaseUrl(VFSMetadata vfsMetadata) { private String getRawActionUrl(VFSMetadata vfsMetadata, Mode mode) {
String suffix = FileUtils.getFileSuffix(vfsMetadata.getFilename()); String suffix = FileUtils.getFileSuffix(vfsMetadata.getFilename());
Action action = wopiService.getAction(getDiscovery(), "edit", suffix); Action action = null;
if (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); action = wopiService.getAction(getDiscovery(), "view", suffix);
} }
return action != null? action.getUrlSrc(): null;
}
String url = action != null? action.getUrlSrc(): null; private String getWopiSrcUrl(VFSMetadata vfsMetadata) {
// replace all url query parameters StringBuilder wopiPath = new StringBuilder();
url = url!= null? url.substring(0, url.indexOf("?") + 1): null; wopiPath.append(Settings.getServerContextPathURI());
return url; wopiPath.append(RestSecurityHelper.SUB_CONTEXT);
wopiPath.append("/office365/wopi/files/");
wopiPath.append(vfsMetadata.getUuid());
return wopiPath.toString();
} }
@Override @Override
......
...@@ -35,6 +35,8 @@ import org.springframework.stereotype.Service; ...@@ -35,6 +35,8 @@ import org.springframework.stereotype.Service;
class UrlParser { class UrlParser {
private static final OLog log = Tracing.createLoggerFor(UrlParser.class); private static final OLog log = Tracing.createLoggerFor(UrlParser.class);
private static final String LANGUAGE_PARAMETER = "UI_LLCC";
String getProtocolAndDomain(String url) { String getProtocolAndDomain(String url) {
try { try {
...@@ -49,8 +51,22 @@ class UrlParser { ...@@ -49,8 +51,22 @@ class UrlParser {
return null; return null;
} }
private String stripQuery(String url) { String stripQuery(String url) {
return url!= null && url.indexOf("?") > -1? url.substring(0, url.indexOf("?")): null; 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;
} }
} }
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
*/ */
package org.olat.core.commons.services.doceditor.office365.restapi; 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.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
...@@ -119,6 +121,7 @@ public class Office365WebService { ...@@ -119,6 +121,7 @@ public class Office365WebService {
.withUserId(access.getIdentity().getKey().toString()) .withUserId(access.getIdentity().getKey().toString())
.withUserFriendlyName(userManager.getUserDisplayName(access.getIdentity())) .withUserFriendlyName(userManager.getUserDisplayName(access.getIdentity()))
.withVersion(String.valueOf(metadata.getRevisionNr())) .withVersion(String.valueOf(metadata.getRevisionNr()))
.withLastModifiedTime(getAsIso8601(metadata.getLastModified()))
.withSupportsGetLock(true) .withSupportsGetLock(true)
.withSupportsLocks(true) .withSupportsLocks(true)
.withSupportsExtendedLockLength(true) .withSupportsExtendedLockLength(true)
......
...@@ -66,10 +66,14 @@ public class Office365EditorController extends BasicController { ...@@ -66,10 +66,14 @@ public class Office365EditorController extends BasicController {
mainVC.contextPut("warning", translate("editor.warning.no.metadata")); mainVC.contextPut("warning", translate("editor.warning.no.metadata"));
} else { } else {
Access access = office365Service.createAccess(vfsMetadata, getIdentity(), secCallback); Access access = office365Service.createAccess(vfsMetadata, getIdentity(), secCallback);
String actionUrl = office365Service.getEditorActionUrl(vfsMetadata); String actionUrl = office365Service.getEditorActionUrl(vfsMetadata, secCallback.getMode(), getLocale());
mainVC.contextPut("actionUrl", actionUrl); if (actionUrl == null) {
mainVC.contextPut("accessToken", access.getToken()); mainVC.contextPut("warning", translate("editor.warning.no.metadata"));
mainVC.contextPut("accessTokenTtl", access.getExpiresAt().getTime()); } else {
mainVC.contextPut("actionUrl", actionUrl);
mainVC.contextPut("accessToken", access.getToken());
mainVC.contextPut("accessTokenTtl", access.getExpiresAt().getTime());
}
} }
putInitialPanel(mainVC); putInitialPanel(mainVC);
......
...@@ -39,12 +39,12 @@ public class WopiRestHelper { ...@@ -39,12 +39,12 @@ public class WopiRestHelper {
return requestHeader != null && !requestHeader.isEmpty()? requestHeader.get(0): null; 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(); long lastModified = file.lastModified();
return Instant.ofEpochMilli(lastModified).toString(); return Instant.ofEpochMilli(lastModified).toString();
} }
public static String getAsIso6801(Date date) { public static String getAsIso8601(Date date) {
long lastModified = date.getTime(); long lastModified = date.getTime();
return Instant.ofEpochMilli(lastModified).toString(); return Instant.ofEpochMilli(lastModified).toString();
} }
......
...@@ -41,5 +41,33 @@ public class UrlParserTest { ...@@ -41,5 +41,33 @@ public class UrlParserTest {
assertThat(protocolAndDomain).isEqualTo("https://FFC-excel.officeapps.live.com"); 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();
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment