anyone-extension/js/options.js
2025-04-20 19:00:42 +00:00

226 lines
7.5 KiB
JavaScript

const proxyIP = document.getElementById("proxyIP");
const proxyPort = document.getElementById("proxyPort");
const noProxyFor = document.getElementById("noProxyFor");
const saveSettings = document.getElementById("saveSettings");
const disableProxy = document.getElementById("disableProxy");
const statusMessage = document.getElementById("statusMessage");
const checkAnyoneButton = document.getElementById('checkAnyoneButton');
// Validate IP address
function isValidIP(ip) {
const ipRegex = /^(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})$/;
return ipRegex.test(ip);
}
// Validate port number
function isValidPort(port) {
const num = parseInt(port, 10);
return num > 0 && num <= 65535;
}
// Load saved settings on page load
chrome.storage.local.get(["proxyIP", "proxyPort", "proxyType", "noProxyFor"], (settings) => {
if (chrome.runtime.lastError) {
console.error("Error retrieving settings:", chrome.runtime.lastError);
return;
}
proxyIP.value = settings.proxyIP || "";
proxyPort.value = settings.proxyPort || "";
noProxyFor.value = settings.noProxyFor || "";
});
// Function to check internet connectivity with a timeout
function checkInternetConnection(host, port) {
return new Promise((resolve, reject) => {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 5000); // 5 second timeout
const proxyConfig = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "socks5",
host: host,
port: parseInt(port, 10)
},
bypassList: [""]
}
};
chrome.proxy.settings.set({ value: proxyConfig, scope: "regular" }, () => {
if (chrome.runtime.lastError) {
clearTimeout(timeoutId);
reject(chrome.runtime.lastError.message);
return;
}
fetch('https://check.en.anyone.tech', {
method: 'GET',
mode: 'no-cors',
signal: controller.signal
})
.then(response => {
clearTimeout(timeoutId);
if (response.ok) {
resolve(true); // Connection successful
} else {
reject("Failed to connect via proxy"); // Connection failed
}
})
.catch(error => {
clearTimeout(timeoutId);
if (error.name === 'AbortError') {
reject("Connection timed out");
} else {
reject(error.message || "Network error encountered");
}
});
});
});
}
// Function to apply Proxy Settings after saving
function applyProxySettings(host, port, exceptions = []) {
const proxyConfig = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "socks5",
host: host,
port: parseInt(port, 10)
},
bypassList: exceptions.concat([""])
}
};
chrome.proxy.settings.set({ value: proxyConfig, scope: "regular" }, () => {
if (chrome.runtime.lastError) {
statusMessage.textContent = "Error applying proxy: " + chrome.runtime.lastError.message;
statusMessage.style.color = "red";
} else {
console.log(`Proxy applied: ${host}:${port}`);
statusMessage.textContent = `Proxy applied: ${host}:${port}`;
statusMessage.style.color = "#2ecc71";
clearStatusMessage();
}
});
}
// Function to clear status message after a delay
function clearStatusMessage() {
setTimeout(() => {
statusMessage.textContent = "";
}, 5000); // Clear message after 5 seconds (5000 milliseconds)
}
let isCheckingProxy = false;
// Save settings when clicking "Save Settings"
saveSettings.addEventListener("click", () => {
if (isCheckingProxy) return; // If a check is already in progress, do nothing
if (!isValidIP(proxyIP.value)) {
statusMessage.textContent = "Invalid IP address.";
statusMessage.style.color = "red";
return;
}
if (!isValidPort(proxyPort.value)) {
statusMessage.textContent = "Invalid port number. Must be between 1 and 65535.";
statusMessage.style.color = "red";
return;
}
statusMessage.textContent = "Please wait...";
statusMessage.style.color = "#f39c12";
// Disable the saveSettings button
saveSettings.disabled = true;
isCheckingProxy = true;
const noProxyExceptions = noProxyFor.value.split(',').map(ex => ex.trim());
const filteredExceptions = noProxyExceptions.filter(ex => ex !== '');
checkInternetConnection(proxyIP.value, proxyPort.value)
.then(() => {
chrome.storage.local.set({
proxyIP: proxyIP.value,
proxyPort: proxyPort.value,
proxyType: "custom",
noProxyFor: filteredExceptions.join(", "),
proxyEnabled: true
}, () => {
if (chrome.runtime.lastError) {
statusMessage.textContent = "Error saving settings: " + chrome.runtime.lastError.message;
statusMessage.style.color = "red";
} else {
statusMessage.textContent = "Proxy settings saved and connection verified!";
statusMessage.style.color = "#2ecc71";
applyProxySettings(proxyIP.value, proxyPort.value, filteredExceptions);
// Send response to the message sender
chrome.runtime.sendMessage({ action: "updateProxy", type: "custom", proxy: { host: proxyIP.value, port: parseInt(proxyPort.value) }, exceptions: filteredExceptions }, (response) => {
if (chrome.runtime.lastError) {
console.error("Error sending message:", chrome.runtime.lastError);
} else {
console.log("Response received:", response);
}
clearStatusMessage();
});
}
});
})
.catch((error) => {
statusMessage.textContent = `Proxy connection failed: ${error}. Settings not applied.`;
statusMessage.style.color = "red";
chrome.proxy.settings.clear({});
// Send a message indicating proxy setup failed
chrome.runtime.sendMessage({ action: "proxyFailed", error: error }, (response) => {
if (chrome.runtime.lastError) {
console.error("Error sending message:", chrome.runtime.lastError);
} else {
console.log("Response received for proxy failure:", response);
}
clearStatusMessage();
});
})
.finally(() => {
// Re-enable the saveSettings button after the check is complete
saveSettings.disabled = false;
isCheckingProxy = false;
});
});
disableProxy.addEventListener("click", () => {
chrome.proxy.settings.clear({}, () => {
if (chrome.runtime.lastError) {
statusMessage.textContent = "Error disabling proxy: " + chrome.runtime.lastError.message;
statusMessage.style.color = "red";
} else {
statusMessage.textContent = "Proxy has been disabled!";
statusMessage.style.color = "#e74c3c";
clearStatusMessage();
console.log("Proxy settings disabled.");
chrome.storage.local.get(["noProxyFor"], (result) => {
chrome.storage.local.set({
proxyType: null,
noProxyFor: result.noProxyFor,
proxyEnabled: false
}, () => {
if (chrome.runtime.lastError) {
console.error("Error updating storage:", chrome.runtime.lastError);
} else {
chrome.runtime.sendMessage({ action: "disableProxy" });
}
});
});
clearStatusMessage();
}
});
});
// Open Check Anyone page
checkAnyoneButton.addEventListener("click", () => {
window.open("https://check.en.anyone.tech/", "_blank");
});