Repository: openmeetings Updated Branches: refs/heads/master e15564d0c -> 4140b5028
[OPENMEETINGS-1805] possibility to allow rest calls from specific addresses is added Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/4140b502 Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/4140b502 Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/4140b502 Branch: refs/heads/master Commit: 4140b50281cfd1b1ca49c987852e00434170d130 Parents: e15564d Author: Maxim Solodovnik <[email protected]> Authored: Tue Dec 26 15:44:09 2017 +0700 Committer: Maxim Solodovnik <[email protected]> Committed: Tue Dec 26 15:44:35 2017 +0700 ---------------------------------------------------------------------- .../db/dao/basic/ConfigurationDao.java | 10 ++++ .../installation/ImportInitvalues.java | 2 + .../util/OpenmeetingsVariables.java | 10 ++++ .../main/webapp/WEB-INF/classes/cxf-servlet.xml | 3 ++ .../webservice/util/AllowOriginProvider.java | 51 ++++++++++++++++++++ 5 files changed, 76 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/4140b502/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java ---------------------------------------------------------------------- diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java index 27bc446..c370666 100644 --- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java @@ -42,6 +42,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_KEYCODE_ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MAX_UPLOAD_SIZE; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_BITRATE; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_RATE; +import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REST_ALLOW_ORIGIN; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SIP_ENABLED; import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_APP_NAME; import static org.apache.openmeetings.util.OpenmeetingsVariables.DEFAULT_BASE_URL; @@ -68,6 +69,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.setDefaultLang; import static org.apache.openmeetings.util.OpenmeetingsVariables.setExtProcessTtl; import static org.apache.openmeetings.util.OpenmeetingsVariables.setGaCode; import static org.apache.openmeetings.util.OpenmeetingsVariables.setMaxUploadSize; +import static org.apache.openmeetings.util.OpenmeetingsVariables.setRestAllowOrigin; import static org.apache.openmeetings.util.OpenmeetingsVariables.setRoomSettings; import static org.apache.openmeetings.util.OpenmeetingsVariables.setSipEnabled; @@ -346,6 +348,9 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> { case CONFIG_DEFAULT_TIMEZONE: reloadTimezone(); break; + case CONFIG_REST_ALLOW_ORIGIN: + reloadRestAllowOrigin(); + break; } return entity; } @@ -413,6 +418,10 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> { OpenmeetingsVariables.setDefaultTimezone(defaultTzName); } + private void reloadRestAllowOrigin() { + setRestAllowOrigin(getString(CONFIG_REST_ALLOW_ORIGIN, null)); + } + public void reinit() { reloadMaxUpload(); reloadCrypt(); @@ -424,6 +433,7 @@ public class ConfigurationDao implements IDataProviderDao<Configuration> { reloadAudioRate(); reloadAudioBitrate(); reloadTimezone(); + reloadRestAllowOrigin(); reloadRoomSettings(); } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/4140b502/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java ---------------------------------------------------------------------- diff --git a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java index 4cfde7b..cc66f0c 100644 --- a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java +++ b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java @@ -70,6 +70,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_SOAP; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REMINDER_MESSAGE; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REPLY_TO_ORGANIZER; +import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REST_ALLOW_ORIGIN; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_ALLOW_REMOTE; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS; import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SCREENSHARING_FPS_SHOW; @@ -337,6 +338,7 @@ public class ImportInitvalues { addCfg(list, CONFIG_REMINDER_MESSAGE, null, Configuration.Type.string, "Reminder message to notify about upcoming appointment, generated message will be used if not set", VER_2_0); addCfg(list, CONFIG_MP4_AUDIO_RATE, String.valueOf(getAudioRate()), Configuration.Type.number, "Audio sampling rate (in Hz) for MP4 video", "4.0.1"); addCfg(list, CONFIG_MP4_AUDIO_BITRATE, String.valueOf(getAudioBitrate()), Configuration.Type.string, "Audio bitrate for MP4 video", "4.0.1"); + addCfg(list, CONFIG_REST_ALLOW_ORIGIN, null, Configuration.Type.string, "List of addresses browser Ajax REST requests are allowed from", "4.0.2"); return list; } public void loadConfiguration(InstallationConfig cfg) { http://git-wip-us.apache.org/repos/asf/openmeetings/blob/4140b502/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java ---------------------------------------------------------------------- diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java index a3fb710..b17fbcd 100644 --- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java +++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java @@ -92,6 +92,7 @@ public class OpenmeetingsVariables { public static final String CONFIG_REMINDER_MESSAGE = "reminder.message"; public static final String CONFIG_MP4_AUDIO_RATE = "mp4.audio.rate"; public static final String CONFIG_MP4_AUDIO_BITRATE = "mp4.audio.bitrate"; + public static final String CONFIG_REST_ALLOW_ORIGIN = "rest.allow.origin"; public static final String HEADER_XFRAME_SAMEORIGIN = "SAMEORIGIN"; public static final String HEADER_CSP_SELF = "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:;"; @@ -129,6 +130,7 @@ public class OpenmeetingsVariables { private static int audioRate = 22050; private static String audioBitrate = "32k"; private static String defaultTimezone = "Europe/Berlin"; + private static String restAllowOrigin = null; private OpenmeetingsVariables() {} @@ -255,4 +257,12 @@ public class OpenmeetingsVariables { public static void setDefaultTimezone(String timezone) { defaultTimezone = timezone; } + + public static String getRestAllowOrigin() { + return restAllowOrigin; + } + + public static void setRestAllowOrigin(String allowOrigin) { + restAllowOrigin = allowOrigin; + } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/4140b502/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml ---------------------------------------------------------------------- diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml index 7fcf407..eb52f5b 100644 --- a/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml +++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/cxf-servlet.xml @@ -55,6 +55,9 @@ <bean id="userDtoMessageBodyWriter" class="org.apache.openmeetings.webservice.util.UserMessageBodyWriter" /> <bean id="omParamProvider" class="org.apache.openmeetings.webservice.util.OmParamConverterProvider"/> </jaxrs:providers> + <jaxrs:outInterceptors> + <bean id="allowOriginProvider" class="org.apache.openmeetings.webservice.util.AllowOriginProvider"/> + </jaxrs:outInterceptors> </jaxrs:server> <jaxws:endpoint id="calendarServiceWS" address="/CalendarService" implementor="#calendarWebService"/> <jaxws:endpoint id="errorServiceWS" address="/ErrorService" implementor="#errorWebService" /> http://git-wip-us.apache.org/repos/asf/openmeetings/blob/4140b502/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AllowOriginProvider.java ---------------------------------------------------------------------- diff --git a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AllowOriginProvider.java b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AllowOriginProvider.java new file mode 100644 index 0000000..f238102 --- /dev/null +++ b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/util/AllowOriginProvider.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License") + you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.openmeetings.webservice.util; + +import static org.apache.openmeetings.util.OpenmeetingsVariables.getRestAllowOrigin; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.Phase; +import org.apache.wicket.util.string.Strings; + +public class AllowOriginProvider extends AbstractOutDatabindingInterceptor { + public AllowOriginProvider() { + super(Phase.MARSHAL); + } + + @Override + public void handleMessage(Message outMessage) { + final String allowOrigin = getRestAllowOrigin(); + if (!Strings.isEmpty(allowOrigin)) { + @SuppressWarnings("unchecked") + Map<String, List<String>> headers = (Map<String, List<String>>)outMessage.get(Message.PROTOCOL_HEADERS); + if (headers == null) { + headers = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + outMessage.put(Message.PROTOCOL_HEADERS, headers); + } + headers.put("Access-Control-Allow-Origin", Arrays.asList(allowOrigin)); + } + } +}
