From a540f1eb0a76e80a53608c7ffd38c0e0f1c69d27 Mon Sep 17 00:00:00 2001 From: skidoodle Date: Tue, 18 Mar 2025 12:55:32 +0100 Subject: [PATCH] add cloudflare --- entrypoints/background.ts | 95 ++++++++++++++++++++++---------------- public/cloudflare.webp | Bin 0 -> 3814 bytes utils/icon.ts | 11 +++-- 3 files changed, 63 insertions(+), 43 deletions(-) create mode 100644 public/cloudflare.webp diff --git a/entrypoints/background.ts b/entrypoints/background.ts index 44b04d5..3523d57 100644 --- a/entrypoints/background.ts +++ b/entrypoints/background.ts @@ -42,7 +42,14 @@ async function handleTabUpdate(url: string) { const apiResponse = await fetch(`https://ip.albert.lol/${ip}`) const apiData = await apiResponse.json() - await updateIcon(apiData.country || null) + const country = apiData.country || null + const asn = apiData.org?.split(' ')[0] + let iconCode = country + if (!iconCode && asn === 'AS13335') { + iconCode = 'cloudflare' + } + + await updateIcon(iconCode) } catch (error) { console.error('Failed to handle tab update:', error) await updateIcon(null) @@ -60,48 +67,56 @@ browser.tabs.onUpdated.addListener(async (_tabId, changeInfo) => { export default defineBackground({ main() { - browser.runtime.onMessage.addListener((request: any, _sender, sendResponse) => { - if (request.type === 'FETCH_SERVER_INFO') { - ;(async () => { - try { - const ip = await resolveARecord(request.hostname) - if (!ip) { - sendResponse({ error: 'DNS resolution failed', data: null }) - return + browser.runtime.onMessage.addListener( + (request: any, _sender, sendResponse) => { + if (request.type === 'FETCH_SERVER_INFO') { + ;(async () => { + try { + const ip = await resolveARecord(request.hostname) + if (!ip) { + sendResponse({ error: 'DNS resolution failed', data: null }) + return + } + + const apiResponse = await fetch(`https://ip.albert.lol/${ip}`) + const apiData = await apiResponse.json() + + const parsed = psl.parse(request.hostname) + const origin = 'domain' in parsed ? parsed.domain : null + + const country = apiData.country || null + const asn = apiData.org?.split(' ')[0] + let iconCode = country + if (!iconCode && asn === 'AS13335') { + iconCode = 'cloudflare' + } + await updateIcon(iconCode) + + sendResponse({ + error: null, + data: { + origin, + ip: apiData.ip, + hostname: apiData.hostname || 'N/A', + country: apiData.country || null, + city: apiData.city || null, + org: apiData.org, + }, + }) + } catch (error) { + await updateIcon(null) + sendResponse({ + error: error instanceof Error ? error.message : 'Unknown error', + data: null, + }) } + })() + return true + } - const apiResponse = await fetch(`https://ip.albert.lol/${ip}`) - const apiData = await apiResponse.json() - - const parsed = psl.parse(request.hostname) - const origin = 'domain' in parsed ? parsed.domain : null - - await updateIcon(apiData.country) - - sendResponse({ - error: null, - data: { - origin, - ip: apiData.ip, - hostname: apiData.hostname || 'N/A', - country: apiData.country || null, - city: apiData.city || null, - org: apiData.org, - }, - }) - } catch (error) { - await updateIcon(null) - sendResponse({ - error: error instanceof Error ? error.message : 'Unknown error', - data: null, - }) - } - })() + sendResponse({ error: 'Unknown request type', data: null }) return true } - - sendResponse({ error: 'Unknown request type', data: null }) - return true - }) + ) }, }) diff --git a/public/cloudflare.webp b/public/cloudflare.webp new file mode 100644 index 0000000000000000000000000000000000000000..396f4b051058e2616f8730349c928a07a82cf9cf GIT binary patch literal 3814 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 Se`imRiUy+)f5(Of1OEp#Irgjo literal 0 HcmV?d00001 diff --git a/utils/icon.ts b/utils/icon.ts index 912f32e..ec143e5 100644 --- a/utils/icon.ts +++ b/utils/icon.ts @@ -1,9 +1,14 @@ export async function updateIcon(countryCode: string | null) { - const validCode = - countryCode?.match(/^[A-Z]{2}$/i)?.[0]?.toLowerCase() || 'unknown' + let validCode + if (countryCode === 'cloudflare') { + validCode = 'cloudflare' + } else { + validCode = + countryCode?.match(/^[A-Z]{2}$/i)?.[0]?.toLowerCase() || 'unknown' + } const loadImageBitmap = async (code: string): Promise => { - const url = browser.runtime.getURL("/") + const url = browser.runtime.getURL('/') try { const response = await fetch(url + `${code}.webp`) if (!response.ok) throw new Error('Flag not found')