mirror of
https://github.com/wassname/talk.git
synced 2026-06-28 18:45:55 +08:00
111 lines
2.5 KiB
JavaScript
111 lines
2.5 KiB
JavaScript
const debug = require('debug')('talk:services:domainlist');
|
|
const _ = require('lodash');
|
|
const SettingsService = require('./settings');
|
|
|
|
/**
|
|
* The root domainlist object.
|
|
* @type {Object}
|
|
*/
|
|
class Domainlist {
|
|
|
|
constructor() {
|
|
this.lists = {
|
|
whitelist: [],
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Loads domains white list in from the database
|
|
*/
|
|
load() {
|
|
return SettingsService
|
|
.retrieve()
|
|
.then((settings) => {
|
|
|
|
// Insert the settings domains whitelist.
|
|
this.upsert(settings.domains);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Inserts the domains whitelist data
|
|
* @param {Array} list list of domains to be set to the whitelist
|
|
*/
|
|
upsert(lists) {
|
|
|
|
// Add the domains to this array and also be sure are all unique domains
|
|
if (!('whitelist' in lists)) {
|
|
return;
|
|
}
|
|
|
|
this.lists['whitelist'] = Domainlist.parseList(lists['whitelist']);
|
|
debug(`Added ${lists['whitelist'].length} domains to the whitelist.`);
|
|
|
|
return Promise.resolve(this);
|
|
}
|
|
|
|
/**
|
|
* Tests the url to see if it contains any of the whitelisted domains.
|
|
* @param {String} url value to match.
|
|
* @return {Boolean} true if the url contains any of the domains, false otherwise.
|
|
*/
|
|
match(list, url) {
|
|
|
|
const domainToMatch = Domainlist.parseURL(url);
|
|
|
|
// This will return true in the event that at least one blockword is found
|
|
// in the phrase.
|
|
for (let i = 0; i < list.length; i++) {
|
|
if (list[i] === domainToMatch) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
// We've walked over all the whitelisted domains, and haven't had a
|
|
// mismatch... It is not an allowed domain!
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Parses the list content.
|
|
* @param {Array} list array of domains to parse for a list.
|
|
* @return {Array} the parsed list
|
|
*/
|
|
static parseList(list) {
|
|
return _.uniq(list.map((domain) => Domainlist.parseURL(domain)));
|
|
}
|
|
|
|
/**
|
|
* Parses the URL.
|
|
* @param {String} url url to parse for a domain.
|
|
* @return {String} the domain
|
|
*/
|
|
static parseURL(url){
|
|
let domain;
|
|
|
|
// removes protocol and get domain
|
|
if (url.indexOf('://') > -1) {
|
|
domain = url.split('/')[2];
|
|
} else {
|
|
domain = url.split('/')[0];
|
|
}
|
|
|
|
// remove port number
|
|
domain = domain.split(':')[0];
|
|
|
|
return domain.toLowerCase();
|
|
}
|
|
|
|
static urlCheck(url) {
|
|
const dl = new Domainlist();
|
|
|
|
return dl.load()
|
|
.then(() => {
|
|
return dl.match(dl.lists['whitelist'], url);
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = Domainlist;
|