Files
chrome-extenstions/foxyproxy/content/import-account.js
2026-01-20 21:53:59 +03:30

98 lines
3.2 KiB
JavaScript

import {App} from './app.js';
import {Proxies} from './options-proxies.js';
import {Spinner} from './spinner.js';
import {Toggle} from './toggle.js';
import {Nav} from './nav.js';
// ---------- Import FoxyProxy Account (Side Effect) -------
class ImportAccount {
static {
this.username = document.querySelector('.import-account #username');
this.password = document.querySelector('.import-account #password');
Toggle.password(this.password.nextElementSibling);
document.querySelector('.import-account button[data-i18n="import"]').addEventListener('click', () => this.process());
}
static async process() {
// --- check username/password
const username = this.username.value.trim();
const password = this.password.value.trim();
if (!username || !password) {
alert(browser.i18n.getMessage('userPassError'));
return;
}
Spinner.show();
const options = [...document.querySelectorAll('.import-account .account-options select')].map(i => i.value);
// Array(3) [ "https", "hostname", "alt" ]
const url = options.includes('alt') ?
'https://bilestoad.com/webservices/get-accounts.php' :
'https://getfoxyproxy.org/webservices/get-accounts.php';
const ip = options.includes('ip');
const socks = options.includes('socks5');
const https = options.includes('https');
const proxyDiv = document.querySelector('div.proxy-div');
const docFrag = document.createDocumentFragment();
// --- fetch data
const data = await this.getAccount(url, username, password);
if (data) {
data.forEach(i => {
// proxy template
const pxy = {
active: true,
title: i.hostname.split('.')[0],
type: socks ? 'socks5' : https ? 'https' : 'http',
hostname: ip ? i.ip : i.hostname,
port: socks ? i.socks5_port : https ? i.ssl_port : i.port[0],
username: i.username,
password: i.password,
// convert UK to ISO 3166-1 GB
cc: i.country_code === 'UK' ? 'GB' : i.country_code,
city: i.city,
// random color will be set
color: '',
pac: '',
pacString: '',
proxyDNS: true,
include: [],
exclude: [],
tabProxy: [],
};
docFrag.append(Proxies.addProxy(pxy));
});
proxyDiv.append(docFrag);
Nav.get('proxies');
}
Spinner.hide();
}
static async getAccount(url, username, password) {
// --- fetch data
return fetch(url, {
method: 'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: `username=${encodeURIComponent(username)}&password=${encodeURIComponent(password)}`
})
.then(response => response.json())
.then(data => {
if (!Array.isArray(data) || !data[0]?.hostname) {
App.notify(browser.i18n.getMessage('error'));
return;
}
// import active accounts only
data = data.filter(i => i.active === 'true');
// sort by country
data.sort((a, b) => a.country.localeCompare(b.country));
return data;
})
.catch(error => App.notify(browser.i18n.getMessage('error') + '\n\n' + error.message));
}
}