Fix site blocklist with address hash based blocking and move checking to server-side

This commit is contained in:
shortcutme 2020-02-13 17:26:15 +01:00
parent 70cc982e2e
commit bc76bf291a
No known key found for this signature in database
GPG key ID: 5B63BAE6CB9613AE
3 changed files with 63 additions and 30 deletions

View file

@ -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 = {}

View file

@ -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

View file

@ -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") })
}