Fix site blocklist with address hash based blocking and move checking to server-side
This commit is contained in:
parent
70cc982e2e
commit
bc76bf291a
3 changed files with 63 additions and 30 deletions
|
@ -1,7 +1,6 @@
|
||||||
import time
|
import time
|
||||||
import re
|
import re
|
||||||
import html
|
import html
|
||||||
import hashlib
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from Plugin import PluginManager
|
from Plugin import PluginManager
|
||||||
|
@ -26,9 +25,20 @@ class SiteManagerPlugin(object):
|
||||||
filter_storage = ContentFilterStorage(site_manager=self)
|
filter_storage = ContentFilterStorage(site_manager=self)
|
||||||
|
|
||||||
def add(self, address, *args, **kwargs):
|
def add(self, address, *args, **kwargs):
|
||||||
if filter_storage.isSiteblocked(address):
|
should_ignore_block = kwargs.get("ignore_block") or kwargs.get("settings")
|
||||||
details = filter_storage.getSiteblockDetails(address)
|
if should_ignore_block:
|
||||||
raise Exception("Site blocked: %s" % html.escape(details.get("reason", "unknown reason")))
|
block_details = None
|
||||||
|
elif filter_storage.isSiteblocked(address):
|
||||||
|
block_details = filter_storage.getSiteblockDetails(address)
|
||||||
|
else:
|
||||||
|
address_hashed = filter_storage.getSiteAddressHashed(address)
|
||||||
|
if filter_storage.isSiteblocked(address_hashed):
|
||||||
|
block_details = filter_storage.getSiteblockDetails(address_hashed)
|
||||||
|
else:
|
||||||
|
block_details = None
|
||||||
|
|
||||||
|
if block_details:
|
||||||
|
raise Exception("Site blocked: %s" % html.escape(block_details.get("reason", "unknown reason")))
|
||||||
else:
|
else:
|
||||||
return super(SiteManagerPlugin, self).add(address, *args, **kwargs)
|
return super(SiteManagerPlugin, self).add(address, *args, **kwargs)
|
||||||
|
|
||||||
|
@ -79,6 +89,17 @@ class UiWebsocketPlugin(object):
|
||||||
self.response(to, filter_storage.file_content["mutes"])
|
self.response(to, filter_storage.file_content["mutes"])
|
||||||
|
|
||||||
# Siteblock
|
# Siteblock
|
||||||
|
@flag.no_multiuser
|
||||||
|
@flag.admin
|
||||||
|
def actionSiteblockIgnoreAddSite(self, to, site_address):
|
||||||
|
if site_address in filter_storage.site_manager.sites:
|
||||||
|
return {"error": "Site already added"}
|
||||||
|
else:
|
||||||
|
if filter_storage.site_manager.need(site_address, ignore_block=True):
|
||||||
|
return "ok"
|
||||||
|
else:
|
||||||
|
return {"error": "Invalid address"}
|
||||||
|
|
||||||
@flag.no_multiuser
|
@flag.no_multiuser
|
||||||
@flag.admin
|
@flag.admin
|
||||||
def actionSiteblockAdd(self, to, site_address, reason=None):
|
def actionSiteblockAdd(self, to, site_address, reason=None):
|
||||||
|
@ -97,6 +118,18 @@ class UiWebsocketPlugin(object):
|
||||||
def actionSiteblockList(self, to):
|
def actionSiteblockList(self, to):
|
||||||
self.response(to, filter_storage.file_content["siteblocks"])
|
self.response(to, filter_storage.file_content["siteblocks"])
|
||||||
|
|
||||||
|
@flag.admin
|
||||||
|
def actionSiteblockGet(self, to, site_address):
|
||||||
|
if filter_storage.isSiteblocked(site_address):
|
||||||
|
res = filter_storage.getSiteblockDetails(site_address)
|
||||||
|
else:
|
||||||
|
site_address_hashed = filter_storage.getSiteAddressHashed(site_address)
|
||||||
|
if filter_storage.isSiteblocked(site_address_hashed):
|
||||||
|
res = filter_storage.getSiteblockDetails(site_address_hashed)
|
||||||
|
else:
|
||||||
|
res = {"error": "Site block not found"}
|
||||||
|
self.response(to, res)
|
||||||
|
|
||||||
# Include
|
# Include
|
||||||
@flag.no_multiuser
|
@flag.no_multiuser
|
||||||
def actionFilterIncludeAdd(self, to, inner_path, description=None, address=None):
|
def actionFilterIncludeAdd(self, to, inner_path, description=None, address=None):
|
||||||
|
@ -202,11 +235,11 @@ class UiRequestPlugin(object):
|
||||||
address = self.resolveDomain(address)
|
address = self.resolveDomain(address)
|
||||||
|
|
||||||
if address:
|
if address:
|
||||||
address_sha256 = "0x" + hashlib.sha256(address.encode("utf8")).hexdigest()
|
address_hashed = filter_storage.getSiteAddressHashed(address)
|
||||||
else:
|
else:
|
||||||
address_sha256 = None
|
address_hashed = None
|
||||||
|
|
||||||
if filter_storage.isSiteblocked(address) or filter_storage.isSiteblocked(address_sha256):
|
if filter_storage.isSiteblocked(address) or filter_storage.isSiteblocked(address_hashed):
|
||||||
site = self.server.site_manager.get(config.homepage)
|
site = self.server.site_manager.get(config.homepage)
|
||||||
if not extra_headers:
|
if not extra_headers:
|
||||||
extra_headers = {}
|
extra_headers = {}
|
||||||
|
|
|
@ -3,12 +3,14 @@ import json
|
||||||
import logging
|
import logging
|
||||||
import collections
|
import collections
|
||||||
import time
|
import time
|
||||||
|
import hashlib
|
||||||
|
|
||||||
from Debug import Debug
|
from Debug import Debug
|
||||||
from Plugin import PluginManager
|
from Plugin import PluginManager
|
||||||
from Config import config
|
from Config import config
|
||||||
from util import helper
|
from util import helper
|
||||||
|
|
||||||
|
|
||||||
class ContentFilterStorage(object):
|
class ContentFilterStorage(object):
|
||||||
def __init__(self, site_manager):
|
def __init__(self, site_manager):
|
||||||
self.log = logging.getLogger("ContentFilterStorage")
|
self.log = logging.getLogger("ContentFilterStorage")
|
||||||
|
@ -114,16 +116,32 @@ class ContentFilterStorage(object):
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def getSiteAddressHashed(self, address):
|
||||||
|
return "0x" + hashlib.sha256(address.encode("ascii")).hexdigest()
|
||||||
|
|
||||||
def isSiteblocked(self, address):
|
def isSiteblocked(self, address):
|
||||||
if address in self.file_content["siteblocks"] or address in self.include_filters["siteblocks"]:
|
if address in self.file_content["siteblocks"] or address in self.include_filters["siteblocks"]:
|
||||||
return True
|
return True
|
||||||
else:
|
return False
|
||||||
return False
|
|
||||||
|
|
||||||
def getSiteblockDetails(self, address):
|
def getSiteblockDetails(self, address):
|
||||||
details = self.file_content["siteblocks"].get(address)
|
details = self.file_content["siteblocks"].get(address)
|
||||||
if not details:
|
if not details:
|
||||||
details = self.include_filters["siteblocks"].get(address)
|
address_sha256 = self.getSiteAddressHashed(address)
|
||||||
|
details = self.file_content["siteblocks"].get(address_sha256)
|
||||||
|
|
||||||
|
if not details:
|
||||||
|
includes = self.file_content.get("includes", {}).values()
|
||||||
|
for include in includes:
|
||||||
|
include_site = self.site_manager.get(include["address"])
|
||||||
|
if not include_site:
|
||||||
|
continue
|
||||||
|
content = include_site.storage.loadJson(include["inner_path"])
|
||||||
|
details = content.get("siteblocks").get(address)
|
||||||
|
if details:
|
||||||
|
details["include"] = include
|
||||||
|
break
|
||||||
|
|
||||||
return details
|
return details
|
||||||
|
|
||||||
# Search and remove or readd files of an user
|
# Search and remove or readd files of an user
|
||||||
|
|
|
@ -62,25 +62,7 @@ class Page extends ZeroFrame {
|
||||||
}
|
}
|
||||||
|
|
||||||
async updateSiteblockDetails(address) {
|
async updateSiteblockDetails(address) {
|
||||||
var address_sha256 = await sha256hex(address)
|
var block = await this.cmdp("siteblockGet", address)
|
||||||
var blocks = await this.cmdp("siteblockList")
|
|
||||||
if (blocks[address] || blocks[address_sha256]) {
|
|
||||||
block = blocks[address]
|
|
||||||
} else {
|
|
||||||
var includes = await this.cmdp("filterIncludeList", {all_sites: true, filters: true})
|
|
||||||
for (let include of includes) {
|
|
||||||
if (include["siteblocks"][address]) {
|
|
||||||
var block = include["siteblocks"][address]
|
|
||||||
block["include"] = include
|
|
||||||
}
|
|
||||||
if (include["siteblocks"][address_sha256]) {
|
|
||||||
var block = include["siteblocks"][address_sha256]
|
|
||||||
block["include"] = include
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.blocks = blocks
|
|
||||||
var reason = block["reason"]
|
var reason = block["reason"]
|
||||||
if (!reason) reason = "Unknown reason"
|
if (!reason) reason = "Unknown reason"
|
||||||
var date = new Date(block["date_added"] * 1000)
|
var date = new Date(block["date_added"] * 1000)
|
||||||
|
@ -95,7 +77,7 @@ class Page extends ZeroFrame {
|
||||||
document.getElementById("visit").style.opacity = "1"
|
document.getElementById("visit").style.opacity = "1"
|
||||||
document.getElementById("visit").onclick = () => {
|
document.getElementById("visit").onclick = () => {
|
||||||
if (block["include"])
|
if (block["include"])
|
||||||
this.cmd("siteAdd", address, () => { this.cmd("wrapperReload") })
|
this.cmd("siteblockIgnoreAddSite", address, () => { this.cmd("wrapperReload") })
|
||||||
else
|
else
|
||||||
this.cmd("siteblockRemove", address, () => { this.cmd("wrapperReload") })
|
this.cmd("siteblockRemove", address, () => { this.cmd("wrapperReload") })
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue