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

View file

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

View file

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