diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java index 7fc9b74e087ea3839c057a97f57724af91ea2095..2b849d84988e0e997f1070e0b0c6948236a26574 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/Form.java @@ -52,6 +52,7 @@ import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.Submit; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; +import org.olat.core.gui.media.ServletUtil; import org.olat.core.gui.translator.Translator; import org.olat.core.logging.AssertException; import org.olat.core.logging.OLog; @@ -325,7 +326,7 @@ public class Form { for(Part part:req.getParts()) { String name = part.getName(); String contentType = part.getContentType(); - String fileName = part.getSubmittedFileName(); + String fileName = getSubmittedFileName(part); if(StringHelper.containsNonWhitespace(fileName)) { File tmpFile = new File(WebappHelper.getTmpDir(), "upload-" + CodeHelper.getGlobalForeverUniqueID()); part.write(tmpFile.getAbsolutePath()); @@ -350,6 +351,19 @@ public class Form { } } + private String getSubmittedFileName(Part part) { + final String disposition = part.getHeader("Content-Disposition"); + if (disposition != null) { + if (disposition.startsWith("form-data")) { + String fileName = ServletUtil.extractQuotedValueFromHeader(disposition, "filename"); + if (fileName != null) { + return fileName; + } + } + } + return null; + } + private boolean isMultipartContent(HttpServletRequest request) { if (!"POST".equalsIgnoreCase(request.getMethod())) { return false; diff --git a/src/main/java/org/olat/core/gui/media/ServletUtil.java b/src/main/java/org/olat/core/gui/media/ServletUtil.java index 44d39873978145b471c4d5d841270ed1dd771515..2aac24e2155bf62969dad3e9fac33f250944cda4 100644 --- a/src/main/java/org/olat/core/gui/media/ServletUtil.java +++ b/src/main/java/org/olat/core/gui/media/ServletUtil.java @@ -628,6 +628,76 @@ public class ServletUtil { return (normalized); } + /** + * Extracts a quoted value from a header that has a given key. For instance if the header is + * <p> + * content-disposition=form-data; name="my field" + * and the key is name then "my field" will be returned without the quotes. + * + * @param header The header + * @param key The key that identifies the token to extract + * @return The token, or null if it was not found + */ + public static String extractQuotedValueFromHeader(final String header, final String key) { + + int keypos = 0; + int pos = -1; + boolean inQuotes = false; + for (int i = 0; i < header.length() - 1; ++i) { //-1 because we need room for the = at the end + //TODO: a more efficient matching algorithm + char c = header.charAt(i); + if (inQuotes) { + if (c == '"') { + inQuotes = false; + } + } else { + if (key.charAt(keypos) == c) { + keypos++; + } else if (c == '"') { + keypos = 0; + inQuotes = true; + } else { + keypos = 0; + } + if (keypos == key.length()) { + if (header.charAt(i + 1) == '=') { + pos = i + 2; + break; + } else { + keypos = 0; + } + } + } + + } + if (pos == -1) { + return null; + } + + int end; + int start = pos; + if (header.charAt(start) == '"') { + start++; + for (end = start; end < header.length(); ++end) { + char c = header.charAt(end); + if (c == '"') { + break; + } + } + return header.substring(start, end); + + } else { + //no quotes + for (end = start; end < header.length(); ++end) { + char c = header.charAt(end); + if (c == ' ' || c == '\t' || c == ';') { + break; + } + } + return header.substring(start, end); + } + } + //fxdiff FXOLAT-118: accept range to deliver videos for iPad protected static class Range { public long start; diff --git a/src/main/java/org/olat/login/oauth/OAuthDispatcher.java b/src/main/java/org/olat/login/oauth/OAuthDispatcher.java index c18b6f7922a6043de3f11682e983ace8a3216ed2..5fa1cf1a407c1ddf84c0d278c43616325e95401f 100644 --- a/src/main/java/org/olat/login/oauth/OAuthDispatcher.java +++ b/src/main/java/org/olat/login/oauth/OAuthDispatcher.java @@ -28,6 +28,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import org.olat.admin.user.delete.service.UserDeletionManager; import org.olat.basesecurity.AuthHelper; import org.olat.basesecurity.Authentication; import org.olat.basesecurity.BaseSecurityManager; @@ -170,6 +171,8 @@ public class OAuthDispatcher implements Dispatcher { DispatcherModule.redirectToDefaultDispatcher(response); } } else { + //update last login date and register active user + UserDeletionManager.getInstance().setIdentityAsActiv(identity); MediaResource mr = ureq.getDispatchResult().getResultingMediaResource(); if (mr instanceof RedirectMediaResource) { RedirectMediaResource rmr = (RedirectMediaResource)mr;