Skip to content

Commit

Permalink
Merge pull request #203 from jason5ng32/dev
Browse files Browse the repository at this point in the history
Add Whois Search
  • Loading branch information
jason5ng32 authored May 9, 2024
2 parents d35a2cc + 2111d0a commit 38f1b8f
Show file tree
Hide file tree
Showing 26 changed files with 672 additions and 139 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,11 @@ Notes: You can use my demo for free, and you can also deploy it yourself.
* 🛑 **DNS Leak Test**: Shows DNS endpoint data to evaluate the risk of DNS leaks when using VPNs or proxies.
* 🚀 **Speed Test**:Test your network speed with edge networks.
* 🚏 **Proxy Rule Testing**: Test the rule settings of proxy software to ensure their correctness.
* 🌐 **Global Latency Test**: Performe lantency tests on servers located in different regions around the world.
* ⏱️ **Global Latency Test**: Performe lantency tests on servers located in different regions around the world.
* 📡 **MTR Test**: Perform MTR tests on servers located in different regions around the world.
* 🔦 **DNS Resolver**: Performs DNS resolution of a domain name from multiple sources and obtains real-time resolution results that can be used for contamination determination.
* 🚧 **Censorship Check**: Check if a website is blocked in some countries.
* 📓 **Whois Search**: Perform whois information search for domain names or IP addresses
* 🌗 **Dark Mode**: Automatically toggles between dark and daylight modes based on system settings, with an option for manual switching.
* 📱 **Minimalist Mode**: A mobile-optimized mode that shortens page length for quick access to essential information..
* 🔍 **Search IP Information**: Provides a tool for querying information about any IP address.
Expand Down
3 changes: 2 additions & 1 deletion README_FR.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,11 @@ Notes: Vous pouvez utiliser ma démo gratuitement et vous pouvez également la d
* 🛑 **Test de fuite DNS** : Affiche les données de point de terminaison DNS pour évaluer le risque de fuites DNS lors de l'utilisation de VPN ou de proxies.
* 🚀 **Test de vitesse** : Testez la vitesse de votre réseau avec des réseaux de pointe.
* 🚏 **Test de règles** : Teste si les paramètres de règles fonctionnent correctement avec le logiciel de proxy.
* 🌐 **Test de latence mondiale** : Effectue des tests de latence sur des serveurs situés dans différentes régions du monde.
* ⏱️ **Test de latence mondiale** : Effectue des tests de latence sur des serveurs situés dans différentes régions du monde.
* 📡 **Test MTR** : Effectue des tests MTR sur des serveurs situés dans différentes régions du monde.
* 🔦 **Résolveur DNS** : effectue la résolution DNS d'un nom de domaine à partir de plusieurs sources, obtient les résultats de la résolution en temps réel et peut être utilisé pour la détermination de la contamination.
* 🚧 **Test de Censorship**: Vérifier si un site est bloqué dans certains pays.
* 📓 **Recherche Whois** : Effectuer une recherche d'informations Whois pour les noms de domaine ou les adresses IP
* 🌗 **Mode sombre** : Bascule automatiquement entre les modes sombre et clair en fonction des paramètres du système, avec une option de basculement manuel.
* 📱 **Mode minimaliste** : Un mode optimisé pour les mobiles qui réduit la longueur de la page pour un accès rapide aux informations essentielles.
* 🔍 **Recherche d'informations sur l'adresse IP** : Fournit un outil pour interroger des informations sur n'importe quelle adresse IP.
Expand Down
3 changes: 2 additions & 1 deletion README_ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,11 @@
* 🛑 **DNS 泄露检测**:查看 DNS 出口信息,以便查看在 VPN/代理的情况下,是否存在 DNS 泄露隐私的风险
* 🚀 **网速测试**:利用边缘网络进行网速测试
* 🚏 **代理规则测试**:配合代理软件的规则设置,测试规则设置是否正常
* 🌐 **全球延迟测试**:从分布在全球的多个服务器进行延迟测试,了解你与全球网络的连接速度
* ⏱️ **全球延迟测试**:从分布在全球的多个服务器进行延迟测试,了解你与全球网络的连接速度
* 📡 **MTR 测试**:从分布在全球的多个服务器进行 MTR 测试,了解你与全球的连接路径
* 🔦 **DNS 解析器**:从多个渠道对域名进行 DNS 解析,获取实时的解析结果,可用于污染判断
* 🚧 **封锁测试**:检查特定的网站在部分国家是否被封锁
* 📓 **Whois 查询**:对域名或 IP 进行 whois 信息查询
* 🌗 **暗黑模式**:根据系统设置自动切换暗黑/白天模式,也可以手动切换
* 📱 **简约模式**:为移动版提供的专门模式,缩短页面长度,快速查看最重要的信息
* 🔍 **查任意 IP 信息**:可以通过小工具查询任意 IP 的信息
Expand Down
56 changes: 56 additions & 0 deletions api/whois.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import whoiser from 'whoiser';

function isValidIP(ip) {
const ipv4Pattern =
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
const ipv6Pattern =
/^(([0-9a-fA-F]{1,4}:){7}([0-9a-fA-F]{1,4})|(([0-9a-fA-F]{1,4}:){0,6}([0-9a-fA-F]{1,4})?::([0-9a-fA-F]{1,4}:){0,6}([0-9a-fA-F]{1,4})?))$/;
return ipv4Pattern.test(ip) || ipv6Pattern.test(ip);
};

function isValidDomain(domain) {
const domainPattern = /^([a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,}$/i;
return domainPattern.test(domain);
}

export default async (req, res) => {

// 限制只能从指定域名访问
const allowedDomains = ['localhost', ...(process.env.ALLOWED_DOMAINS || '').split(',')];
const referer = req.headers.referer;

if (referer) {
const domain = new URL(referer).hostname;
if (!allowedDomains.includes(domain)) {
return res.status(403).json({ error: 'Access denied' });
}
} else {
return res.status(403).json({ error: 'What are you doing?' });
}

const query = req.query.q;
if (!query) {
return res.status(400).json({ error: 'No address provided' });
}

// 检查 IP 地址是否合法
if (!isValidIP(query) && !isValidDomain(query)) {
return res.status(400).json({ error: 'Invalid IP or address' });
}

if (isValidIP(query)) {
try {
const ipinfo = await whoiser.ip(query, { timeout: 5000,raw: true});
res.json(ipinfo);
} catch (e) {
res.status(500).json({ error: e.message });
}
} else {
try {
const domaininfo = await whoiser.domain(query, { ignorePrivacy: false, timeout: 5000, follow: 2,raw: true});
res.json(domaininfo);
} catch (e) {
res.status(500).json({ error: e.message });
}
}
};
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@
"vue": "^3.4.26",
"vue-i18n": "^9.13.1",
"vue-router": "^4.3.2",
"vuex": "^4.1.0"
"vuex": "^4.1.0",
"whoiser": "^1.17.3"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.4",
Expand Down
2 changes: 2 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import validateConfigs from './api/configs.js';
import dnsResolver from './api/dnsresolver.js';
import rateLimit from 'express-rate-limit';
import { slowDown } from 'express-slow-down'
import whois from './api/whois.js';

dotenv.config();

Expand Down Expand Up @@ -131,6 +132,7 @@ app.get('/api/ipsb', ipsbHandler);
app.get('/api/cfradar', cfHander);
app.get('/api/recaptcha', recaptchaHandler);
app.get('/api/dnsresolver', dnsResolver);
app.get('/api/whois', whois);

// 使用查询参数处理所有配置请求
app.get('/api/configs', validateConfigs);
Expand Down
44 changes: 40 additions & 4 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ import { mappingKeys, navigateCards, keyMap } from "./shortcut.js";
import { ref, computed, watch } from 'vue';
import { useStore } from 'vuex';
import { Modal, Toast } from 'bootstrap';
import { Modal, Toast, Offcanvas } from 'bootstrap';
export default {
Expand Down Expand Up @@ -235,10 +235,10 @@ export default {
infoMask() {
if (this.infoMaskLevel === 0) {
this.$refs.IPCheckRef.ipDataCards.forEach((card) => {
if(card.id === "cloudflare_v6" || card.id === "ipify_v6") {
if (card.id === "cloudflare_v6" || card.id === "ipify_v6") {
card.ip = "2001:4860:4860::8888";
} else {
card.ip = "8.8.8.8";
card.ip = "8.8.8.8";
}
});
this.$refs.webRTCRef.stunServers.forEach((server) => {
Expand All @@ -259,7 +259,7 @@ export default {
card.isp = "Google LLC";
card.asn = "AS15169";
card.asnlink = "https://radar.cloudflare.com/AS15169",
card.mapUrl = '/defaultMap.webp';
card.mapUrl = '/defaultMap.webp';
card.mapUrl_dark = '/defaultMap_dark.webp';
card.showASNInfo = false;
card.isProxy = this.$t('ipInfos.proxyDetect.no');
Expand Down Expand Up @@ -462,6 +462,15 @@ export default {
},
description: this.$t('shortcutKeys.CensorshipCheck'),
},
{
keys: "w",
action: () => {
this.scrollToElement("AdvancedTools", 80);
this.$refs.advancedToolsRef.navigateAndToggleOffcanvas('/whois');
this.$trackEvent('Nav', 'NavClick', 'Whois');
},
description: this.$t('shortcutKeys.Whois'),
},
{
keys: "m",
action: () => {
Expand Down Expand Up @@ -548,13 +557,40 @@ export default {
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
},
// 监听所有 offcanvas,避免同时打开多个导致浏览器崩溃
listenOffcanvas() {
const offcanvasElements = document.querySelectorAll('.offcanvas');
const navElements = document.getElementById('navbarNavAltMarkup');
const navElementsButton = document.querySelector('.navbar-toggler');
offcanvasElements.forEach((element) => {
const instance = Offcanvas.getOrCreateInstance(element); // 确保实例创建成功
element.addEventListener('show.bs.offcanvas', () => {
// 存在 Offcanvas 时关闭导航栏
navElements.classList.remove('show');
navElementsButton.setAttribute('aria-expanded', 'false');
navElementsButton.classList.add('collapsed');
// 关闭所有其他的 offcanvas
offcanvasElements.forEach((offcanvas) => {
if (offcanvas !== element) {
const offcanvasInstance = Offcanvas.getInstance(offcanvas);
if (offcanvasInstance) { // 确保实例有效
offcanvasInstance.hide();
}
}
});
});
});
},
},
mounted() {
this.registerShortcutKeys();
this.setupModalFocus();
this.keyMap = keyMap;
this.sendKeyMap();
this.setInfosLoaded();
this.listenOffcanvas();
window.addEventListener('scroll', this.checkSectionsAndTrack);
},
beforeDestroy() {
Expand Down
Loading

0 comments on commit 38f1b8f

Please sign in to comment.