From 6861f2af57b1dfa20bce13c2f3c5d4c048a9bdd1 Mon Sep 17 00:00:00 2001 From: Sascha Leib Date: Fri, 7 Nov 2025 18:46:17 +0100 Subject: [PATCH] Highlight multi-blocked visits --- admin.css | 6 ++++-- admin.js | 18 ++++++++++-------- captcha.js | 5 ++--- img/captcha.png | Bin 4571 -> 5135 bytes 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/admin.css b/admin.css index 899d43a..8f3cad1 100644 --- a/admin.css +++ b/admin.css @@ -119,12 +119,14 @@ /* Captcha statuses */ &.captcha::before { background-image: url('img/captcha.png') } &.cap_Y::before { background-position-y: -20px } - &.cap_YN::before { background-position-y: -40px } + &.cap_YN::before, &.cap_YYN::before { background-position-y: -40px } &.cap_W::before { background-position-y: -60px } &.cap_H::before { background-position-y: -80px } &.cap_X::before { background-position-y: -100px } - &.cap_YH::before { background-position-y: -120px } + &.cap_YH::before, &.cap_YYH::before { background-position-y: -120px } &.cap_YNH::before { background-position-y: -140px } + &.cap_YY::before { background-position-y: -160px } + &.cap_N::before { background-position-y: -180px } /* Country flags */ /* Note: flag images and CSS adapted from: https://github.com/lafeber/world-flags-sprite/ */ diff --git a/admin.js b/admin.js index 204af86..896711b 100644 --- a/admin.js +++ b/admin.js @@ -416,7 +416,7 @@ BotMon.live = { _client: BotMon.live.data.clients.match(nv.agent) ?? null, // client info _platform: BotMon.live.data.platforms.match(nv.agent), // platform info _captcha: {'X': 0, 'Y': 0, 'N': 0, 'W':0, 'H': 0, - _str: function() { return (this.X > 0 ? 'X' : '') + (this.Y > 0 ? 'Y' : '') + (this.N > 0 ? 'N' : '') + (this.W > 0 ? 'W' : '') + (this.H > 0 ? 'H' : ''); } + _str: function() { return (this.X > 0 ? 'X' : '') + (this.Y > 0 ? (this.Y > 1 ? 'YY' : 'Y') : '') + (this.N > 0 ? 'N' : '') + (this.W > 0 ? 'W' : '') + (this.H > 0 ? 'H' : ''); } } // captcha counter }}; model._visitors.push(visitor); @@ -574,11 +574,13 @@ BotMon.live = { _makeCaptchaTitle: function(cObj) { const cStr = cObj._str(); switch (cStr) { - case 'Y': - case 'NY': return "Blocked."; + case 'Y': return "Blocked."; + case 'YY': return "Blocked multiple times."; case 'YN': return "Solved"; + case 'YYN': return "Solved after multiple attempts"; case 'W': return "Whitelisted"; case 'H': return "HEAD request, no captcha"; + case 'YH': case 'YYH': return "Block & HEAD mixed"; default: return "Undefined: " + cStr; } } @@ -2083,7 +2085,7 @@ BotMon.live = { botList.forEach( (botInfo) => { const bli = makeElement('dd'); bli.appendChild(makeElement('span', {'class': 'has_icon bot bot_' + botInfo.id }, botInfo.name)); - bli.appendChild(makeElement('span', {'class': 'count' }, botInfo.count)); + bli.appendChild(makeElement('span', {'class': 'count' }, botInfo.count || kNoData)); botElement.append(bli) }); } @@ -2098,7 +2100,7 @@ BotMon.live = { ispList.forEach( (netInfo) => { const li = makeElement('dd'); li.appendChild(makeElement('span', {'class': 'has_icon ipaddr ip' + netInfo.typ }, netInfo.name)); - li.appendChild(makeElement('span', {'class': 'count' }, netInfo.count)); + li.appendChild(makeElement('span', {'class': 'count' }, netInfo.count || kNoData)); botIps.append(li) }); } @@ -2111,7 +2113,7 @@ BotMon.live = { countryList.forEach( (cInfo) => { const cLi = makeElement('dd'); cLi.appendChild(makeElement('span', {'class': 'has_icon country ctry_' + cInfo.id.toLowerCase() }, cInfo.name)); - cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count)); + cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count || kNoData)); botCountries.appendChild(cLi); }); } @@ -2210,7 +2212,7 @@ BotMon.live = { usrCtryList.forEach( (cInfo) => { const cLi = makeElement('dd'); cLi.appendChild(makeElement('span', {'class': 'has_icon country ctry_' + cInfo.id.toLowerCase() }, cInfo.name)); - cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count)); + cLi.appendChild(makeElement('span', {'class': 'count' }, cInfo.count || kNoData)); usrCountries.appendChild(cLi); }); } @@ -2234,7 +2236,7 @@ BotMon.live = { pgDd.appendChild(makeElement('span', { 'class': 'count', 'title': pgInfo.count + " page views" - }, pgInfo.count)); + }, pgInfo.count || kNoData)); wmpages.appendChild(pgDd); }); } diff --git a/captcha.js b/captcha.js index c818c97..4a72efe 100644 --- a/captcha.js +++ b/captcha.js @@ -176,11 +176,10 @@ const $BMCaptcha = { (new Date()).toISOString().substring(0, 10) ]; if (performance.now() - $BMCaptcha._st <= 1500) dat.push(performance.now() - $BMCaptcha._st); - const hash = $BMCaptcha.digest.hash(dat.join(';')); // set the cookie: - document.cookie = "DWConfirm=" + encodeURIComponent(hash) + '; path=/; session;' - + (document.location.protocol === 'https:' ? ' secure;' : ''); + document.cookie = "DWConfirm=" + encodeURIComponent($BMCaptcha.digest.hash(dat.join(';'))) + '; path=/; session;'; + // + (document.location.protocol === 'https:' ? ' secure;' : ''); } catch (err) { console.error(err); diff --git a/img/captcha.png b/img/captcha.png index aec43eb5fb3c02d0ce30c5e420c69f6f7128ad7f..fd841fc2006b958574123a2e992e0bbd71bb8fc1 100644 GIT binary patch delta 4879 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 BDun<5 delta 4311 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