diff --git a/src/main/java/org/olat/admin/AdminModuleDispatcher.java b/src/main/java/org/olat/admin/AdminModuleDispatcher.java index ced3c8502198b7220b2c100901eaf1afff4a96ca..9225b47a48859a4f434ba50fd1d84a6fa4f89ea8 100644 --- a/src/main/java/org/olat/admin/AdminModuleDispatcher.java +++ b/src/main/java/org/olat/admin/AdminModuleDispatcher.java @@ -47,29 +47,26 @@ import org.olat.core.util.session.UserSessionManager; */ public class AdminModuleDispatcher implements Dispatcher { - private final static String PARAMETER_CMD = "cmd"; - private final static String PARAMETER_MSG = "msg"; - private final static String PARAMETER_MAX_MESSAGE = "maxsessions"; - private final static String PARAMETER_NBR_SESSIONS = "nbrsessions"; - private final static String PARAMETER_SESSIONTIMEOUT ="sec"; + private static final String PARAMETER_CMD = "cmd"; + private static final String PARAMETER_MSG = "msg"; + private static final String PARAMETER_MAX_MESSAGE = "maxsessions"; + private static final String PARAMETER_NBR_SESSIONS = "nbrsessions"; + private static final String PARAMETER_SESSIONTIMEOUT ="sec"; - private final static String CMD_SET_MAINTENANCE_MESSAGE = "setmaintenancemessage"; - private final static String CMD_SET_INFO_MESSAGE = "setinfomessage"; - private final static String CMD_SET_LOGIN_BLOCKED = "setloginblocked"; - private final static String CMD_SET_LOGIN_NOT_BLOCKED = "setloginnotblocked"; - private final static String CMD_SET_MAX_SESSIONS = "setmaxsessions"; - private final static String CMD_INVALIDATE_ALL_SESSIONS = "invalidateallsessions"; - private final static String CMD_INVALIDATE_OLDEST_SESSIONS = "invalidateoldestsessions"; - private final static String CMD_SET_SESSIONTIMEOUT = "sessiontimeout"; + private static final String CMD_SET_MAINTENANCE_MESSAGE = "setmaintenancemessage"; + private static final String CMD_SET_INFO_MESSAGE = "setinfomessage"; + private static final String CMD_SET_LOGIN_BLOCKED = "setloginblocked"; + private static final String CMD_SET_LOGIN_NOT_BLOCKED = "setloginnotblocked"; + private static final String CMD_SET_MAX_SESSIONS = "setmaxsessions"; + private static final String CMD_INVALIDATE_ALL_SESSIONS = "invalidateallsessions"; + private static final String CMD_INVALIDATE_OLDEST_SESSIONS = "invalidateoldestsessions"; + private static final String CMD_SET_SESSIONTIMEOUT = "sessiontimeout"; - - /** - * @see org.olat.core.dispatcher.Dispatcher#execute(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String) - */ + @Override public void execute(HttpServletRequest request, HttpServletResponse response) { String cmd = request.getParameter(PARAMETER_CMD); - if (cmd.equalsIgnoreCase(CMD_SET_MAINTENANCE_MESSAGE) || cmd.equalsIgnoreCase(CMD_SET_INFO_MESSAGE)) { + if (CMD_SET_MAINTENANCE_MESSAGE.equalsIgnoreCase(cmd) || CMD_SET_INFO_MESSAGE.equalsIgnoreCase(cmd)) { handleSetMaintenanceOrInfoMessage(request, response, cmd); } else { if (CoreSpringFactory.getImpl(AdminModule.class).checkSessionAdminToken(request)) { @@ -182,7 +179,4 @@ public class AdminModuleDispatcher implements Dispatcher { DispatcherModule.sendForbidden(request.getPathInfo(), response); } } - - - } diff --git a/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java b/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java index 054876e7a553e6233070e3384a7218ab9f75d46d..7792f1710deffc08849dc4f080c9b63f770327c6 100644 --- a/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java +++ b/src/main/java/org/olat/core/gui/components/link/LinkRenderer.java @@ -323,7 +323,9 @@ public class LinkRenderer extends DefaultComponentRenderer { try(StringOutput href = new StringOutput()) { LinkPopupSettings popup = link.getPopup(); ubu.buildURI(href, new String[] { VelocityContainer.COMMAND_ID }, new String[] { command }, null, AJAXFlags.MODE_NORMAL); - sb.append("href=\"javascript:;\" onclick=\"o_openPopUp('").append(href).append("','") + boolean hasUrl = StringHelper.containsNonWhitespace(link.getUrl()); + String hrefUrl = hasUrl ? link.getUrl() : "javascript:;"; + sb.append("href=\"").append(hrefUrl).append("\" onclick=\"o_openPopUp('").append(href).append("','") .append(popup.getTarget()).append("',").append(popup.getWidth()) .append(",").append(popup.getHeight()).append("); return false;\" "); } catch(IOException e) { diff --git a/src/main/java/org/olat/core/servlets/StaticServlet.java b/src/main/java/org/olat/core/servlets/StaticServlet.java index 43b77cdba4a6a288c24c05907ad3ecf8872c75a5..319696843b400967df81ce3b18e1b9a798d1576a 100644 --- a/src/main/java/org/olat/core/servlets/StaticServlet.java +++ b/src/main/java/org/olat/core/servlets/StaticServlet.java @@ -107,7 +107,7 @@ public class StaticServlet extends HttpServlet { // version provided - remove it int start = pathInfo.indexOf("/", 2); int end = pathInfo.length(); - if(start <= end) { + if(start >= 2 && start <= end) { String staticRelPath = pathInfo.substring(start, end); String normalizedRelPath = ServletUtil.normalizePath(staticRelPath); if (normalizedRelPath == null) { @@ -170,7 +170,7 @@ public class StaticServlet extends HttpServlet { } } // log as error, file exists but wrongly mapped - log.warn("File exists but not mapped using version - use StaticMediaDispatch methods to create URL of static files! invalid URI::" + request.getRequestURI()); + log.warn("File exists but not mapped using version - use StaticMediaDispatch methods to create URL of static files! invalid URI::{}", request.getRequestURI()); } } diff --git a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_de.properties index 884dc5b74b4499bc314b6c4dd6dea90da8db9fc1..390c8c5e2d77c1b43b05be503d4d21ebd273b92b 100644 --- a/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/config/ui/_i18n/LocalStrings_de.properties @@ -26,7 +26,7 @@ chkbx.glossary.inverse.explain=Glossar Menu in Toolbar muss unter "Toolbar" konf chkbx.glossary.onoff=Glossar chkbx.search.onoff=Kurssuche chkbx.menu.onoff=Menu sichtbar f\u00FCr Teilnehmer und Betreuer -chkbx.participantinfo.onoff=Teilnehmer Infos +chkbx.participantinfo.onoff=Teilnehmerinfos chkbx.participantlist.onoff=Teilnehmerliste chkbx.toolbar.explain=Werkzeuge in Toolbar aktivieren: chkbx.toolbar.onoff=Toolbar sichtbar f\u00FCr Teilnehmer diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 8263206fe662a5c9c95ab0227ec7dc145de89c9a..cd939d1abd6c1fe92d992e73c7b7278499528600 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -885,6 +885,8 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if (calendarIsEnabled && userCourseEnv != null) { calendarLink = LinkFactory.createToolLink("calendar",translate("command.calendar"), this, "o_icon_calendar"); calendarLink.setPopup(new LinkPopupSettings(950, 750, "cal")); + calendarLink.setUrl(BusinessControlFactory.getInstance() + .getAuthenticatedURLFromBusinessPathStrings(businessPathEntry, "[Calendar:0]")); calendarLink.setVisible(cc.isCalendarEnabled()); toolbarPanel.addTool(calendarLink); } @@ -1316,6 +1318,10 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if (forumLink != null && forumLink.isVisible()) { doForum(ureq); } + } else if("Calendar".equalsIgnoreCase(type)) { + if (calendarLink != null && calendarLink.isVisible()) { + doCalendar(ureq); + } } else if("Documents".equalsIgnoreCase(type)) { if (documentsLink != null && documentsLink.isVisible()) { activateSubEntries(ureq, doDocuments(ureq), entries); @@ -2060,7 +2066,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im currentToolCtr = emailCtrl; } else { delayedClose = Delayed.email; - }; + } } private BlogToolController doBlog(UserRequest ureq) { @@ -2130,6 +2136,27 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im return null; } + /** + * Open the calendar as sub-controller. + * + * @param ureq The user request + * @return The calendar controller + */ + private CourseCalendarController doCalendar(UserRequest ureq) { + OLATResourceable ores = OresHelper.createOLATResourceableType("Calendar"); + WindowControl swControl = addToHistory(ureq, ores, null); + CourseCalendarController calendarController = new CourseCalendarController(ureq, swControl, getUserCourseEnvironment()); + pushController(ureq, translate("command.calendar"), calendarController); + setActiveTool(calendarLink); + currentToolCtr = calendarController; + return calendarController; + } + + /** + * Open the course calendar as popup. + * + * @param ureq The user request + */ private void launchCalendar(UserRequest ureq) { ControllerCreator ctrlCreator = (lureq, lwControl) -> { ICourse course = CourseFactory.loadCourse(getRepositoryEntry()); diff --git a/src/main/java/org/olat/modules/webFeed/dispatching/FeedMediaDispatcher.java b/src/main/java/org/olat/modules/webFeed/dispatching/FeedMediaDispatcher.java index 7e013b8f5547041db116261db0e2a06fccf55379..f45c717b478b869cd958c55d4636dde65df030b6 100644 --- a/src/main/java/org/olat/modules/webFeed/dispatching/FeedMediaDispatcher.java +++ b/src/main/java/org/olat/modules/webFeed/dispatching/FeedMediaDispatcher.java @@ -166,7 +166,7 @@ public class FeedMediaDispatcher implements Dispatcher, GenericEventListener { try { validatedUriCache.remove(key); } catch (Exception e) { - log.info("Cannot remove this key: " + key); + log.info("Cannot remove this key: {}", key); } } } @@ -186,6 +186,11 @@ public class FeedMediaDispatcher implements Dispatcher, GenericEventListener { } catch(NumberFormatException nfe) { // } + + if(requestedPath == null || requestedPath.length() == 0) { + DispatcherModule.sendBadRequest(request.getRequestURI(), response); + return; + } Path path = null; try { diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java index c0b84c7c3e90f2a39db9a1bf1ba438f77fbba714..668271dea0c88449cef74fa7f0b8195d24d1dbc2 100644 --- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java +++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java @@ -513,7 +513,7 @@ public class CoursesWebService { OLATResource originalOres = olatResourceManager.findResourceable(src.getOlatResource()); boolean isAlreadyLocked = handlerFactory.getRepositoryHandler(src).isLocked(originalOres); LockResult lockResult = handlerFactory.getRepositoryHandler(src).acquireLock(originalOres, ureq.getIdentity()); - + if(lockResult == null || (lockResult != null && lockResult.isSuccess()) && !isAlreadyLocked) { //create new repo entry String name; @@ -601,6 +601,8 @@ public class CoursesWebService { repositoryManager.copyImage(src, preparedEntry); ICourse course = prepareCourse(preparedEntry, shortTitle, longTitle, courseConfigVO); handlerFactory.getRepositoryHandler(src).releaseLock(lockResult); + + log.info(Tracing.M_AUDIT, "Create course {} from template {}", preparedEntry, src); return course; } else { log.info("Course locked"); @@ -672,6 +674,7 @@ public class CoursesWebService { ? NodeAccessType.of(nodeAccessType) : course.getCourseConfig().getNodeAccessType(); // default type CourseFactory.initNodeAccessType(addedEntry, type); + log.info(Tracing.M_AUDIT, "Create course: {}", addedEntry); return prepareCourse(addedEntry, shortTitle, longTitle, courseConfigVO); } catch (Exception e) { throw new WebApplicationException(e); diff --git a/src/main/java/org/olat/user/ui/admin/lifecycle/UserAdminLifecycleConfigurationController.java b/src/main/java/org/olat/user/ui/admin/lifecycle/UserAdminLifecycleConfigurationController.java index 1317b8e2eeb8b3f5c03b8d2322e144990f778c13..ea64d3eafcafa35fcc599ed414c1fc90c3501dba 100644 --- a/src/main/java/org/olat/user/ui/admin/lifecycle/UserAdminLifecycleConfigurationController.java +++ b/src/main/java/org/olat/user/ui/admin/lifecycle/UserAdminLifecycleConfigurationController.java @@ -170,7 +170,7 @@ public class UserAdminLifecycleConfigurationController extends FormBasicControll private TranslationBundle initForm(String labelI18nKey, String textI18nKey, FormItemContainer formLayout) { String text = translate(textI18nKey); StaticTextElement viewEl = uifactory.addStaticTextElement("view." + counter++, labelI18nKey, text, formLayout); - FormLink translationLink = uifactory.addFormLink("translate." + counter++, "translate", null, formLayout, Link.LINK); + FormLink translationLink = uifactory.addFormLink("translate." + counter++, "translation.edit", null, formLayout, Link.LINK); TranslationBundle bundle = new TranslationBundle(textI18nKey, labelI18nKey, viewEl, translationLink); translationLink.setUserObject(bundle); return bundle; diff --git a/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_de.properties index e99014d6e61dc661ff7733e6bdd4ea479b926e54..0ba110225427eb127104ca8438a14168d7db7bbc 100644 --- a/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_de.properties @@ -29,10 +29,10 @@ mail.before.deletion.body.label=Text Benachrichtigung mail.before.deletion.subject=Konto wird gel\u00F6scht mail.before.deletion.subject.label=Betreff Benachrichtigung notification.noNews=Seit diesem Datum haben sich keine neue Benutzer angemeldet -num.day.before.mail.deactivation=Anzhal Tage vor Mailbenachrichtigung -num.day.before.mail.deletion=Anzhal Tage vor Mailbenachrichtigung -num.inactive.day.deactivation=Anzhal Tage vor Deaktivierung -num.inactive.day.deletion=Anzhal Tage vor L\u00F6schung +num.day.before.mail.deactivation=Anzahl Tage vor Mailbenachrichtigung +num.day.before.mail.deletion=Anzahl Tage vor Mailbenachrichtigung +num.inactive.day.deactivation=Anzahl Tage vor Deaktivierung +num.inactive.day.deletion=Anzahl Tage vor L\u00F6schung overview.inactive.user=Deaktivierte Benutzer overview.ready.to.delete.user=Bereits zu l\u00F6schen overview.ready.to.inactivate.user=Benutzer ohne Aktivit\u00E4t @@ -48,3 +48,4 @@ table.name.firstName=Vorname table.name.lastName=Nachname translate=\u00DCbersetzen translate.title=\u00DCbersetzen "{0}" +translation.edit=Bearbeiten diff --git a/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_en.properties index 7f56d05f424f5392d13d7a47f1fafb8117ee2b14..91e6d033147065696d7a176eaf037f59d4aa2118 100644 --- a/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_en.properties @@ -48,3 +48,4 @@ table.name.firstName=Name table.name.lastName=Last name translate=Translate translate.title=Translate "{0}" +translation.edit=Edit diff --git a/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_fr.properties index 012d00978b109b3cbf59d7b9ee67163b82453441..18c3706979345bcc8f89532943be0a3e3646a8a5 100644 --- a/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/user/ui/admin/lifecycle/_i18n/LocalStrings_fr.properties @@ -48,3 +48,4 @@ table.name.firstName=Pr\u00E9nom table.name.lastName=Nom translate=Traduire translate.title=Traduire "{0}" +translation.edit=Éditer diff --git a/src/main/webapp-tomcat/WEB-INF/web.xml b/src/main/webapp-tomcat/WEB-INF/web.xml index f04c3db9f495858d4ec3cf4ff0a8e9d9fa3c55e3..fdb67bd02e09fb42f345f3ed64c2765f37d891e3 100644 --- a/src/main/webapp-tomcat/WEB-INF/web.xml +++ b/src/main/webapp-tomcat/WEB-INF/web.xml @@ -264,4 +264,13 @@ <exception-type>java.lang.Throwable</exception-type> <location>/errors/error.html</location> </error-page> + + <security-constraint> + <web-resource-collection> + <web-resource-name><strong>restricted methods</strong></web-resource-name> + <url-pattern>/*</url-pattern> + <http-method>TRACE</http-method> + </web-resource-collection> + <auth-constraint /> + </security-constraint> </web-app>