diff --git a/defaults/yacy.init b/defaults/yacy.init
index 25e0697a4..cd53877ac 100644
--- a/defaults/yacy.init
+++ b/defaults/yacy.init
@@ -1069,7 +1069,20 @@ augmentation.reflect = false
augmentation.addDoctype = false
augmentation.reparse = false
+# Content control settings
+contentcontrol.enabled = false
+contentcontrol.bookmarklist = contentcontrol
+contentcontrol.mandatoryfilterlist = yacy
+contentcontrol.smwimport.enabled = false
+contentcontrol.smwimport.baseurl =
+contentcontrol.smwimport.purgelistoninit = true
+contentcontrol.smwimport.targetlist = contentcontrol
+contentcontrol.smwimport.defaultcategory = yacy
+
# Interaction settings
+interaction.enabled = false
+interaction.target = yacy
+
interaction.feedback.enabled = true
interaction.feedback.url =
interaction.feedback.accept = false
diff --git a/htroot/ContentControl_p.html b/htroot/ContentControl_p.html
new file mode 100644
index 000000000..d830e834b
--- /dev/null
+++ b/htroot/ContentControl_p.html
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+ #%env/templates/footer.template%#
+
+
diff --git a/htroot/ContentControl_p.java b/htroot/ContentControl_p.java
new file mode 100644
index 000000000..fbf8eccf1
--- /dev/null
+++ b/htroot/ContentControl_p.java
@@ -0,0 +1,77 @@
+import net.yacy.cora.protocol.RequestHeader;
+import de.anomic.server.serverObjects;
+import de.anomic.server.serverSwitch;
+
+public final class ContentControl_p {
+
+ public static serverObjects respond(@SuppressWarnings("unused") final RequestHeader header,
+ final serverObjects post, final serverSwitch env) {
+
+ final serverObjects prop = new serverObjects();
+
+ if (post != null) {
+
+ if (post.containsKey("contentcontrolExtraSettings")) {
+
+ env.setConfig("contentcontrol.smwimport.baseurl",
+ post.get("ccsmwimporturl"));
+
+ env.setConfig("contentcontrol.smwimport.enabled",
+ "on".equals(post.get("ccsmwimport")) ? true : false);
+
+ env.setConfig("contentcontrol.smwimport.purgelistoninit",
+ "on".equals(post.get("ccsmwpurge")) ? true : false);
+
+ env.setConfig("contentcontrol.smwimport.targetlist",
+ post.get("ccsmwimportlist"));
+
+ env.setConfig("contentcontrol.smwimport.defaultcategory",
+ post.get("ccsmwimportcat"));
+
+ }
+
+ if (post.containsKey("contentcontrolSettings")) {
+
+ env.setConfig("contentcontrol.enabled",
+ "on".equals(post.get("contentcontrolenabled")) ? true : false);
+
+ env.setConfig("contentcontrol.mandatoryfilterlist",
+ post.get("contentcontrolmfl"));
+
+ env.setConfig("contentcontrol.bookmarklist",
+ post.get("contentcontrolbml"));
+
+ }
+
+ }
+
+ prop.putHTML("ccsmwimportcat",
+ env.getConfig("contentcontrol.smwimport.defaultcategory", "yacy"));
+
+ prop.putHTML("ccsmwimportlist",
+ env.getConfig("contentcontrol.smwimport.targetlist", "contentcontrol"));
+
+ prop.put("ccsmwpurge_checked", env.getConfigBool(
+ "contentcontrol.smwimport.purgelistoninit", false) ? "1" : "0");
+
+ prop.putHTML("ccsmwimporturl",
+ env.getConfig("contentcontrol.smwimport.baseurl", ""));
+
+ prop.put("ccsmwimport_checked", env.getConfigBool(
+ "contentcontrol.smwimport.enabled", false) ? "1" : "0");
+
+
+ prop.put("contentcontrolenabled_checked",
+ env.getConfigBool("contentcontrol.enabled", false) ? "1" : "0");
+
+ prop.putHTML("contentcontrolmfl",
+ env.getConfig("contentcontrol.mandatoryfilterlist", "yacy"));
+
+ prop.putHTML("contentcontrolbml",
+ env.getConfig("contentcontrol.bookmarklist", ""));
+
+ // return rewrite properties
+ return prop;
+ }
+
+}
diff --git a/htroot/api/yacydoc.html b/htroot/api/yacydoc.html
index 4f3b09448..89236c710 100644
--- a/htroot/api/yacydoc.html
+++ b/htroot/api/yacydoc.html
@@ -13,7 +13,7 @@ you can validate it with http://validator.w3.org/
-

+
This search result can also be retrieved as XML.
Click the API icon to see an example call to the search rss API.
To see a list of all APIs, please visit the API wiki page.
diff --git a/htroot/env/templates/submenuBlacklist.template b/htroot/env/templates/submenuBlacklist.template
index a02bb6c1f..04bb039d5 100644
--- a/htroot/env/templates/submenuBlacklist.template
+++ b/htroot/env/templates/submenuBlacklist.template
@@ -5,5 +5,6 @@
+
\ No newline at end of file
diff --git a/source/de/anomic/crawler/CrawlStacker.java b/source/de/anomic/crawler/CrawlStacker.java
index 66ec72b0c..360f8e667 100644
--- a/source/de/anomic/crawler/CrawlStacker.java
+++ b/source/de/anomic/crawler/CrawlStacker.java
@@ -44,6 +44,7 @@ import net.yacy.cora.document.MultiProtocolURI;
import net.yacy.cora.document.UTF8;
import net.yacy.cora.protocol.Domains;
import net.yacy.cora.protocol.ftp.FTPClient;
+import net.yacy.interaction.contentcontrol.ContentControlFilterUpdateThread;
import net.yacy.kelondro.data.meta.DigestURI;
import net.yacy.kelondro.data.meta.URIMetadata;
import net.yacy.kelondro.logging.Log;
@@ -535,6 +536,27 @@ public final class CrawlStacker {
return "the url '" + url + "' is not in domainList of this network";
}
}
+
+ if (Switchboard.getSwitchboard().getConfigBool(
+ "contentcontrol.enabled", false) == true) {
+
+ if (!Switchboard.getSwitchboard()
+ .getConfig("contentcontrol.mandatoryfilterlist", "")
+ .equals("")) {
+ FilterEngine f = ContentControlFilterUpdateThread.getNetworkFilter();
+ if (f != null) {
+ if (!f.isListed(url, null)) {
+
+ return "the url '"
+ + url
+ + "' does not belong to the network mandatory filter list";
+
+ }
+ }
+ }
+
+ }
+
final boolean local = url.isLocal();
if (this.acceptLocalURLs && local) return null;
if (this.acceptGlobalURLs && !local) return null;
diff --git a/source/de/anomic/data/ymark/YMarkEntry.java b/source/de/anomic/data/ymark/YMarkEntry.java
index bd73bc800..f5ee2397a 100644
--- a/source/de/anomic/data/ymark/YMarkEntry.java
+++ b/source/de/anomic/data/ymark/YMarkEntry.java
@@ -13,6 +13,7 @@ public class YMarkEntry extends TreeMap