This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new b70d682  [OPENMEETINGS-2247] connect-src is hacked for Safari
b70d682 is described below

commit b70d682d43409eccf8dac9ef49e834a20cc03bfd
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Fri Apr 17 16:55:52 2020 +0700

    [OPENMEETINGS-2247] connect-src is hacked for Safari
---
 .../java/org/apache/openmeetings/IApplication.java |  1 +
 .../db/dao/basic/ConfigurationDao.java             |  4 ++++
 .../apache/openmeetings/web/app/Application.java   | 28 ++++++++++++++++++++++
 3 files changed, 33 insertions(+)

diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java 
b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
index 159f2cf..9eecb1f 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/IApplication.java
@@ -48,4 +48,5 @@ public interface IApplication {
 
        //WS
        void publishWsTopic(IClusterWsMessage msg);
+       String getWsUrl();
 }
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 65656cb..745029d 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
@@ -134,6 +134,7 @@ import org.apache.openjpa.event.RemoteCommitProvider;
 import org.apache.openjpa.event.TCPRemoteCommitProvider;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.dao.server.OAuth2Dao;
 import org.apache.openmeetings.db.dao.user.UserDao;
@@ -180,6 +181,8 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
        private UserDao userDao;
        @Autowired
        private OAuth2Dao oauthDao;
+       @Autowired
+       private IApplication app;
 
        public void updateClusterAddresses(String addresses) throws 
UnknownHostException {
                OpenJPAConfiguration cfg = 
((OpenJPAEntityManagerSPI)OpenJPAPersistence.cast(em)).getConfiguration();
@@ -651,6 +654,7 @@ public class ConfigurationDao implements 
IDataProviderDao<Configuration> {
                        addCspRule(cspConfig, CSPDirective.MEDIA_SRC, 
getCspMediaSrc());
                        addCspRule(cspConfig, CSPDirective.SCRIPT_SRC, 
getCspScriptSrc());
                        addCspRule(cspConfig, CSPDirective.STYLE_SRC, 
getCspStyleSrc());
+                       addCspRule(cspConfig, CSPDirective.CONNECT_SRC, 
app.getWsUrl(), false); // special code for Safari browser
                        if (!Strings.isEmpty(getGaCode())) {
                                // 
https://developers.google.com/tag-manager/web/csp#universal_analytics_google_analytics
                                addCspRule(cspConfig, CSPDirective.IMG_SRC, 
"https://www.google-analytics.com";);
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 7f81153..630a710 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -167,6 +167,7 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
        final HazelcastInstance hazelcast = 
Hazelcast.getOrCreateHazelcastInstance(new XmlConfigBuilder().build());
        private ITopic<IClusterWsMessage> hazelWsTopic;
        private String serverId;
+       private String wsUrl;
 
        @Autowired
        private ApplicationContext ctx;
@@ -260,6 +261,12 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
                                                
wresp.setHeader("X-XSS-Protection", "1; mode=block");
                                                
wresp.setHeader("Strict-Transport-Security", "max-age=31536000; 
includeSubDomains; preload");
                                                
wresp.setHeader("X-Content-Type-Options", "nosniff");
+                                               if (wsUrl == null) {
+                                                       wsUrl = 
getWsUrl(cycle.getRequest().getUrl());
+                                                       if (wsUrl != null) {
+                                                               
cfgDao.updateCsp();
+                                                       }
+                                               }
                                        }
                                }
                        }
@@ -616,4 +623,25 @@ public class Application extends 
AuthenticatedWebApplication implements IApplica
        public void publishWsTopic(IClusterWsMessage msg) {
                hazelWsTopic.publish(msg);
        }
+
+       @Override
+       public String getWsUrl() {
+               return wsUrl;
+       }
+
+       private static String getWsUrl(Url reqUrl) {
+               if (!reqUrl.isFull()) {
+                       return null;
+               }
+               final boolean insecure = 
"http".equalsIgnoreCase(reqUrl.getProtocol());
+               String delim = ":";
+               String port = reqUrl.getPort() == null || reqUrl.getPort() < 0 
? "" : String.valueOf(reqUrl.getPort());
+               if (!port.isEmpty() && ((insecure && 80 == reqUrl.getPort()) || 
(!insecure && 443 == reqUrl.getPort()))) {
+                       port = "";
+               }
+               if (port.isEmpty()) {
+                       delim = "";
+               }
+               return String.format("%s://%s%s%s", insecure ? "ws" : "wss", 
reqUrl.getHost(), delim, port);
+       }
 }

Reply via email to