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 re
|
||||
import html
|
||||
import hashlib
|
||||
import os
|
||||
|
||||
from Plugin import PluginManager
|
||||
|
@ -26,9 +25,20 @@ class SiteManagerPlugin(object):
|
|||
filter_storage = ContentFilterStorage(site_manager=self)
|
||||
|
||||
def add(self, address, *args, **kwargs):
|
||||
if filter_storage.isSiteblocked(address):
|
||||
details = filter_storage.getSiteblockDetails(address)
|
||||
raise Exception("Site blocked: %s" % html.escape(details.get("reason", "unknown reason")))
|
||||
should_ignore_block = kwargs.get("ignore_block") or kwargs.get("settings")
|
||||
if should_ignore_block:
|
||||
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:
|
||||
return super(SiteManagerPlugin, self).add(address, *args, **kwargs)
|
||||
|
||||
|
@ -79,6 +89,17 @@ class UiWebsocketPlugin(object):
|
|||
self.response(to, filter_storage.file_content["mutes"])
|
||||
|
||||
# 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.admin
|
||||
def actionSiteblockAdd(self, to, site_address, reason=None):
|
||||
|
@ -97,6 +118,18 @@ class UiWebsocketPlugin(object):
|
|||
def actionSiteblockList(self, to):
|
||||
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
|
||||
@flag.no_multiuser
|
||||
def actionFilterIncludeAdd(self, to, inner_path, description=None, address=None):
|
||||
|
@ -202,11 +235,11 @@ class UiRequestPlugin(object):
|
|||
address = self.resolveDomain(address)
|
||||
|
||||
if address:
|
||||
address_sha256 = "0x" + hashlib.sha256(address.encode("utf8")).hexdigest()
|
||||
address_hashed = filter_storage.getSiteAddressHashed(address)
|
||||
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)
|
||||
if not extra_headers:
|
||||
extra_headers = {}
|
||||
|
|
|
@ -3,12 +3,14 @@ import json
|
|||
import logging
|
||||
import collections
|
||||
import time
|
||||
import hashlib
|
||||
|
||||
from Debug import Debug
|
||||
from Plugin import PluginManager
|
||||
from Config import config
|
||||
from util import helper
|
||||
|
||||
|
||||
class ContentFilterStorage(object):
|
||||
def __init__(self, site_manager):
|
||||
self.log = logging.getLogger("ContentFilterStorage")
|
||||
|
@ -114,16 +116,32 @@ class ContentFilterStorage(object):
|
|||
else:
|
||||
return False
|
||||
|
||||
def getSiteAddressHashed(self, address):
|
||||
return "0x" + hashlib.sha256(address.encode("ascii")).hexdigest()
|
||||
|
||||
def isSiteblocked(self, address):
|
||||
if address in self.file_content["siteblocks"] or address in self.include_filters["siteblocks"]:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def getSiteblockDetails(self, address):
|
||||
details = self.file_content["siteblocks"].get(address)
|
||||
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
|
||||
|
||||
# Search and remove or readd files of an user
|
||||
|
|
|
@ -62,25 +62,7 @@ class Page extends ZeroFrame {
|
|||
}
|
||||
|
||||
async updateSiteblockDetails(address) {
|
||||
var address_sha256 = await sha256hex(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 block = await this.cmdp("siteblockGet", address)
|
||||
var reason = block["reason"]
|
||||
if (!reason) reason = "Unknown reason"
|
||||
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").onclick = () => {
|
||||
if (block["include"])
|
||||
this.cmd("siteAdd", address, () => { this.cmd("wrapperReload") })
|
||||
this.cmd("siteblockIgnoreAddSite", address, () => { this.cmd("wrapperReload") })
|
||||
else
|
||||
this.cmd("siteblockRemove", address, () => { this.cmd("wrapperReload") })
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue