Smalyshev has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/338030 )

Change subject: Allow whitelisted remote services
......................................................................

Allow whitelisted remote services

Bug: T155127
Change-Id: Iae1b19c0f6674bb14db0fd5fb308f08e1e621f9d
---
M 
blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/WikibaseContextListener.java
M blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/geo/GeoService.java
M 
blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/LabelService.java
M dist/src/script/runBlazegraph.sh
4 files changed, 80 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/wikidata/query/rdf 
refs/changes/30/338030/1

diff --git 
a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/WikibaseContextListener.java
 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/WikibaseContextListener.java
index c5d651d..7bf98ff 100644
--- 
a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/WikibaseContextListener.java
+++ 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/WikibaseContextListener.java
@@ -1,5 +1,11 @@
 package org.wikidata.query.rdf.blazegraph;
 
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.List;
 import java.util.Map;
 
 import javax.servlet.ServletContextEvent;
@@ -24,6 +30,7 @@
 
 import com.bigdata.bop.BOpContextBase;
 import com.bigdata.bop.IValueExpression;
+import com.bigdata.rdf.graph.impl.bd.GASService;
 import com.bigdata.rdf.internal.IV;
 import com.bigdata.rdf.internal.constraints.DateBOp.DateOp;
 import com.bigdata.rdf.sail.sparql.PrefixDeclProcessor;
@@ -34,31 +41,58 @@
 import com.bigdata.rdf.sparql.ast.FunctionRegistry.Factory;
 import com.bigdata.rdf.sparql.ast.eval.AST2BOpUtility;
 import com.bigdata.rdf.sparql.ast.eval.AbstractServiceFactoryBase;
+import com.bigdata.rdf.sparql.ast.eval.SampleServiceFactory;
+import com.bigdata.rdf.sparql.ast.eval.SliceServiceFactory;
+import com.bigdata.rdf.sparql.ast.eval.ValuesServiceFactory;
 import com.bigdata.rdf.sparql.ast.service.IServiceOptions;
+import com.bigdata.rdf.sparql.ast.service.RemoteServiceFactoryImpl;
 import com.bigdata.rdf.sparql.ast.service.RemoteServiceOptions;
+import com.bigdata.rdf.sparql.ast.service.SPARQLVersion;
 import com.bigdata.rdf.sparql.ast.service.ServiceCall;
 import com.bigdata.rdf.sparql.ast.service.ServiceCallCreateParams;
+import com.bigdata.rdf.sparql.ast.service.ServiceFactory;
 import com.bigdata.rdf.sparql.ast.service.ServiceRegistry;
-import com.bigdata.service.fts.FTS;
+import com.bigdata.rdf.store.BDS;
 
 /**
  * Context listener to enact configurations we need on initialization.
  */
+@SuppressWarnings("checkstyle:classfanoutcomplexity")
 public class WikibaseContextListener extends BigdataRDFServletContextListener {
 
     private static final Logger log = 
LoggerFactory.getLogger(WikibaseContextListener.class);
 
     /**
-     * Replaces the default Blazegraph services with ones that do not allow
-     * remote services and a label resolution service.
+     * Default service whitelist filename.
+     */
+    public static final String WHITELIST_DEFAULT = "whitelist.txt";
+
+    /**
+     * Whitelist configuration name.
+     */
+    public static final String WHITELIST = 
System.getProperty("wikibaseServiceWhitelist", WHITELIST_DEFAULT);
+
+    /**
+     * Initializes BG service setup to allow whitelisted services.
+     * Also add additional custom services and functions.
      */
     public static void initializeServices() {
-        ServiceRegistry.getInstance().setDefaultServiceFactory(new 
DisableRemotesServiceFactory());
+        // Enable service whitelisting
+        final ServiceRegistry reg = ServiceRegistry.getInstance();
+        reg.setWhitelistEnabled(true);
         LabelService.register();
         GeoService.register();
 
-        // Remove FTS service for now since it allows arbitrary endpoints
-        ServiceRegistry.getInstance().remove(FTS.SEARCH);
+        // Whitelist services we like by default
+        reg.addWhitelistURL(GASService.Options.SERVICE_KEY.toString());
+        reg.addWhitelistURL(ValuesServiceFactory.SERVICE_KEY.toString());
+        reg.addWhitelistURL(BDS.SEARCH_IN_SEARCH.toString());
+        reg.addWhitelistURL(SliceServiceFactory.SERVICE_KEY.toString());
+        reg.addWhitelistURL(SampleServiceFactory.SERVICE_KEY.toString());
+        loadWhitelist(reg);
+
+        // Initialize remote services
+        reg.setDefaultServiceFactory(getDefaultServiceFactory());
 
         // Override date functions so that we can handle them
         // via WikibaseDate
@@ -103,6 +137,36 @@
     }
 
     /**
+     * Get default service factory, with proper options.
+     * @return
+     */
+    private static ServiceFactory getDefaultServiceFactory() {
+        final RemoteServiceOptions options = new RemoteServiceOptions();
+        options.setSPARQLVersion(SPARQLVersion.SPARQL_11);
+        options.setGET(true);
+        return new RemoteServiceFactoryImpl(options);
+    }
+
+    /**
+     * Load whitelist from file.
+     * @param reg
+     */
+    private static void loadWhitelist(final ServiceRegistry reg) {
+        try {
+            List<String> lines = Files.readAllLines(Paths.get(WHITELIST),
+                    StandardCharsets.UTF_8);
+            for (String line : lines) {
+                reg.addWhitelistURL(line);
+            }
+        } catch (FileNotFoundException e) {
+            // ignore file not found
+            log.info("Whitelist file {} not found, ignoring.", WHITELIST);
+        } catch (IOException e) {
+            log.warn("Failed reading from whitelist file");
+        }
+    }
+
+    /**
      * Add standard prefixes to the system.
      * @param uris Wikidata URIs to use
      */
diff --git 
a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/geo/GeoService.java
 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/geo/GeoService.java
index a2751f4..330a6f0 100644
--- 
a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/geo/GeoService.java
+++ 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/geo/GeoService.java
@@ -59,8 +59,12 @@
      * Register the service so it is recognized by Blazegraph.
      */
     public static void register() {
-        ServiceRegistry.getInstance().add(GeoAroundService.SERVICE_KEY, new 
GeoAroundService());
-        ServiceRegistry.getInstance().add(GeoBoxService.SERVICE_KEY, new 
GeoBoxService());
+        final ServiceRegistry reg = ServiceRegistry.getInstance();
+
+        reg.add(GeoAroundService.SERVICE_KEY, new GeoAroundService());
+        reg.addWhitelistURL(GeoAroundService.SERVICE_KEY.toString());
+        reg.add(GeoBoxService.SERVICE_KEY, new GeoBoxService());
+        reg.addWhitelistURL(GeoBoxService.SERVICE_KEY.toString());
     }
 
     @Override
diff --git 
a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/LabelService.java
 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/LabelService.java
index 6b6b773..82e5df9 100644
--- 
a/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/LabelService.java
+++ 
b/blazegraph/src/main/java/org/wikidata/query/rdf/blazegraph/label/LabelService.java
@@ -106,7 +106,9 @@
      * Register the service so it is recognized by Blazegraph.
      */
     public static void register() {
-        ServiceRegistry.getInstance().add(SERVICE_KEY, new LabelService());
+        final ServiceRegistry reg = ServiceRegistry.getInstance();
+        reg.add(SERVICE_KEY, new LabelService());
+        reg.addWhitelistURL(SERVICE_KEY.toString());
     }
 
     @Override
diff --git a/dist/src/script/runBlazegraph.sh b/dist/src/script/runBlazegraph.sh
index 9d1c053..575c1fe 100755
--- a/dist/src/script/runBlazegraph.sh
+++ b/dist/src/script/runBlazegraph.sh
@@ -42,6 +42,7 @@
      
-Dcom.bigdata.rdf.sparql.ast.QueryHints.analyticMaxMemoryPerQuery=1073741824 \
      -DASTOptimizerClass=org.wikidata.query.rdf.blazegraph.WikibaseOptimizers \
      
-Dorg.wikidata.query.rdf.blazegraph.inline.literal.WKTSerializer.noGlobe=$DEFAULT_GLOBE
 \
+     
-Dcom.bigdata.rdf.sail.webapp.client.RemoteRepository.maxRequestURLLength=7168 \
      -DwikibasePrefixes=$DIR/prefixes.conf \
      ${BLAZEGRAPH_OPTS} \
      -jar jetty-runner*.jar \

-- 
To view, visit https://gerrit.wikimedia.org/r/338030
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iae1b19c0f6674bb14db0fd5fb308f08e1e621f9d
Gerrit-PatchSet: 1
Gerrit-Project: wikidata/query/rdf
Gerrit-Branch: master
Gerrit-Owner: Smalyshev <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to