From 1ef045f26a8e0e4bce66a5655d859fa01291568e Mon Sep 17 00:00:00 2001
From: Pierre-Gilles Levallois <pierregilles.levallois@gmail.com>
Date: Thu, 28 Sep 2023 11:19:33 +0200
Subject: [PATCH] dealing with CORS header in Tiles server conf

---
 geoserver/Dockerfile   |   6 +-
 geoserver/conf/web.xml | 291 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 293 insertions(+), 4 deletions(-)
 create mode 100644 geoserver/conf/web.xml

diff --git a/geoserver/Dockerfile b/geoserver/Dockerfile
index 5da5d3b..102186a 100644
--- a/geoserver/Dockerfile
+++ b/geoserver/Dockerfile
@@ -5,11 +5,9 @@ ARG GEOSERVER_PORT=8080
 ENV GEOSERVER_DATA_DIR="/opt/geoserver_data"
 
 COPY ./geoserver_data $GEOSERVER_DATA_DIR
+# Add conf for geoserver (CORS Header allowing)
+COPY ./conf/web.xml  $CATALINA_HOME/webapp/geoserver/WEB-INF/web.xml
 
-# RUN groupadd geoserver && \
-#     useradd geoserver -g geoserver && \
-#     chown -R geoserver:geoserver $GEOSERVER_DATA_DIR && \
-#     chown -R geoserver:geoserver /opt/apache-tomcat*   
 RUN \
     chgrp -R 0 /opt && \
     chmod -R g+rwx /opt
diff --git a/geoserver/conf/web.xml b/geoserver/conf/web.xml
new file mode 100644
index 0000000..2f1cd06
--- /dev/null
+++ b/geoserver/conf/web.xml
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+    <display-name>GeoServer</display-name>
+  
+      <context-param>
+    <param-name>serviceStrategy</param-name>
+    <!-- Meaning of the different values :
+         
+         PARTIAL-BUFFER2
+         - Partially buffers the first xKb to disk. Once that has buffered, the the 
+           result is streamed to the user. This will allow for most errors to be caught
+           early. 
+           
+         BUFFER
+         - stores the entire response in memory first, before sending it off to
+           the user (may run out of memory)
+
+         SPEED
+         - outputs directly to the response (and cannot recover in the case of an
+           error)
+
+         FILE
+         - outputs to the local filesystem first, before sending it off to the user
+      -->
+    <param-value>PARTIAL-BUFFER2</param-value>
+  </context-param>
+  
+  <context-param>
+    <!-- see comments on the PARTIAL-BUFFER strategy -->
+    <!-- this sets the size of the buffer.  default is "50" = 50kb -->
+
+    <param-name>PARTIAL_BUFFER_STRATEGY_SIZE</param-name>
+    <param-value>50</param-value>
+  </context-param>
+  
+  <!--Can be true or false (defaults to: false). -->
+  <!--When true the JSONP (text/javascript) output format is enabled -->
+  <!--
+  <context-param>
+    <param-name>ENABLE_JSONP</param-name>
+    <param-value>true</param-value>
+  </context-param>
+  -->
+    <!-- 
+    <context-param>
+      <param-name>PROXY_BASE_URL</param-name>
+      <param-value>http://82.58.146.45/geoserver</param-value>
+    </context-param>
+     -->
+   
+     <!--
+    <context-param>
+       <param-name>GEOSERVER_DATA_DIR</param-name>
+        <param-value>C:\eclipse\workspace\geoserver_trunk\cite\confCiteWFSPostGIS</param-value>
+    </context-param> 
+   -->
+    
+    <!-- pick up all spring application contexts -->
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>classpath*:/applicationContext.xml classpath*:/applicationSecurityContext.xml</param-value>
+    </context-param>
+
+    <filter>
+     <filter-name>FlushSafeFilter</filter-name>
+     <filter-class>org.geoserver.filters.FlushSafeFilter</filter-class>
+    </filter>
+     
+    <filter>
+      <filter-name>Set Character Encoding</filter-name>
+      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+      <init-param>
+        <param-name>encoding</param-name>
+        <param-value>UTF-8</param-value>
+      </init-param>
+    </filter>
+
+    <filter>
+     <filter-name>SessionDebugger</filter-name>
+     <filter-class>org.geoserver.filters.SessionDebugFilter</filter-class>
+    </filter>
+
+    <filter>
+    <filter-name>filterChainProxy</filter-name>     
+     <filter-class> org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+    </filter>
+
+    <filter>
+      <filter-name>xFrameOptionsFilter</filter-name>
+      <filter-class>org.geoserver.filters.XFrameOptionsFilter</filter-class>
+    </filter>
+
+   <filter>
+     <filter-name>GZIP Compression Filter</filter-name>
+     <filter-class>org.geoserver.filters.GZIPFilter</filter-class>
+     <init-param>
+         <!-- The compressed-types parameter is a comma-separated list of regular expressions.
+              If a mime type matches any of the regular expressions then it will be compressed.
+              -->
+         <param-name>compressed-types</param-name>
+         <param-value>text/.*,.*xml.*,application/json,application/x-javascript</param-value>
+     </init-param>
+   </filter>
+   
+   <filter>
+     <filter-name>Advanced Dispatch Filter</filter-name>
+     <filter-class>org.geoserver.platform.AdvancedDispatchFilter</filter-class>
+     <!-- 
+     This filter allows for a single mapping to the spring dispatcher. However using /* as a mapping
+     in a servlet mapping causes the servlet path to be "/" of the request. This causes problems with
+     library like wicket and restlet. So this filter fakes the servlet path by assuming the first 
+     component of the path is the mapped path. 
+     -->
+   </filter>
+   
+   <filter>
+    <filter-name>Spring Delegating Filter</filter-name>
+    <filter-class>org.geoserver.filters.SpringDelegatingFilter</filter-class>
+    <!--
+    This filter allows for filters to be loaded via spring rather than 
+    registered here in web.xml.  One thing to note is that for such filters 
+    init() is not called. INstead any initialization is performed via spring 
+    ioc.
+    -->
+   </filter>
+   
+   <filter>
+     <filter-name>Thread locals cleanup filter</filter-name>
+     <filter-class>org.geoserver.filters.ThreadLocalsCleanupFilter</filter-class>
+     <!-- 
+     This filter cleans up thread locals Geotools is setting up for concurrency and performance
+     reasons 
+     -->
+   </filter>
+
+   <!-- Uncomment following filter to enable CORS in Jetty. Do not forget the second config block further down. -->
+    <filter>
+      <filter-name>cross-origin</filter-name>
+      <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
+      <init-param>
+        <param-name>chainPreflight</param-name>
+        <param-value>false</param-value>
+      </init-param>
+      <init-param>
+        <param-name>allowedOrigins</param-name>
+        <param-value>*</param-value>
+      </init-param>
+      <init-param>
+        <param-name>allowedMethods</param-name>
+        <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
+      </init-param>
+      <init-param>
+        <param-name>allowedHeaders</param-name>
+        <param-value>*</param-value>
+      </init-param>
+    </filter>
+    
+   <!-- Uncomment following filter to enable CORS in Tomcat. Do not forget the second config block further down. -->
+    <filter>
+      <filter-name>cross-origin</filter-name>
+      <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
+      <init-param>
+        <param-name>cors.allowed.origins</param-name>
+        <param-value>*</param-value>
+      </init-param>
+      <init-param>
+        <param-name>cors.allowed.methods</param-name>
+        <param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</param-value>
+      </init-param>
+      <init-param>
+        <param-name>cors.allowed.headers</param-name>
+        <param-value>*</param-value>
+      </init-param>
+    </filter>
+
+    <!-- 
+      THIS FILTER MAPPING MUST BE THE FIRST ONE, otherwise we end up with ruined chars in the input from the GUI
+      See the "Note" in the Tomcat character encoding guide:
+      http://wiki.apache.org/tomcat/FAQ/CharacterEncoding
+    -->
+    <filter-mapping>
+      <filter-name>Set Character Encoding</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+   
+   <!-- Uncomment following filter to enable CORS -->
+    <filter-mapping>
+        <filter-name>cross-origin</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+   
+    <filter-mapping>
+      <filter-name>FlushSafeFilter</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    
+    <filter-mapping>
+      <filter-name>SessionDebugger</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <filter-mapping>
+      <filter-name>GZIP Compression Filter</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <filter-mapping>
+      <filter-name>xFrameOptionsFilter</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+   
+    <!-- 
+      If you want to use your security system comment out this one too
+    -->
+    <filter-mapping>
+      <filter-name>filterChainProxy</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    
+    <filter-mapping>
+      <filter-name>Advanced Dispatch Filter</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <filter-mapping>
+      <filter-name>Spring Delegating Filter</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    
+    <filter-mapping>
+      <filter-name>Thread locals cleanup filter</filter-name>
+      <url-pattern>/*</url-pattern>
+    </filter-mapping>
+    
+    <!-- general initializer, should be first thing to execute -->
+    <listener>
+      <listener-class>org.geoserver.GeoserverInitStartupListener</listener-class>
+    </listener>
+    
+    <!-- logging initializer, should execute before spring context startup -->
+    <listener>
+      <listener-class>org.geoserver.logging.LoggingStartupContextListener</listener-class>
+    </listener>
+  
+    <!--  spring context loader -->
+    <listener>
+      <listener-class>org.geoserver.platform.GeoServerContextLoaderListener</listener-class>
+    </listener>
+    
+    <!--  http session listener proxy -->
+    <listener>
+      <listener-class>org.geoserver.platform.GeoServerHttpSessionListenerProxy</listener-class>
+    </listener>
+
+        <!-- request context listener for session-scoped beans -->
+        <listener>
+                <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
+        </listener>
+    
+    <!-- spring dispatcher servlet, dispatches all incoming requests -->
+    <servlet>
+      <servlet-name>dispatcher</servlet-name>
+      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+    </servlet>
+    
+    <!-- single mapping to spring, this only works properly if the advanced dispatch filter is 
+         active -->
+    <servlet-mapping>
+        <servlet-name>dispatcher</servlet-name>
+        <url-pattern>/*</url-pattern>
+    </servlet-mapping>
+    
+    <mime-mapping>
+      <extension>xsl</extension>
+      <mime-type>text/xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+      <extension>sld</extension>
+      <mime-type>text/xml</mime-type>
+    </mime-mapping>
+    <mime-mapping>
+      <extension>json</extension>
+      <mime-type>application/json</mime-type>
+    </mime-mapping>
+  
+    <welcome-file-list>
+        <welcome-file>index.html</welcome-file>
+    </welcome-file-list>
+    
+</web-app>
\ No newline at end of file
-- 
GitLab