implemented check for hotel/ISP paywall
This commit is contained in:
parent
aea4725fb0
commit
e901f1679b
|
@ -63,6 +63,81 @@ module.exports.create = function (deps, conf) {
|
|||
});
|
||||
}
|
||||
|
||||
function checkPaywall() {
|
||||
var PromiseA = require('bluebird');
|
||||
var testDomains = [
|
||||
'daplie.com'
|
||||
, 'duckduckgo.com'
|
||||
, 'google.com'
|
||||
, 'amazon.com'
|
||||
, 'facebook.com'
|
||||
, 'msn.com'
|
||||
, 'yahoo.com'
|
||||
];
|
||||
|
||||
// While this is not being developed behind a paywall the current idea is that
|
||||
// a paywall will either manipulate DNS queries to point to the paywall gate,
|
||||
// or redirect HTTP requests to the paywall gate. So we check for both and
|
||||
// hope we can detect most hotel/ISP paywalls out there in the world.
|
||||
|
||||
return PromiseA.resolve()
|
||||
.then(function () {
|
||||
var dns = PromiseA.promisifyAll(require('dns'));
|
||||
var proms = testDomains.map(function (dom) {
|
||||
return dns.resolve6Async(dom)
|
||||
.catch(function (err) {
|
||||
if (err.code === 'ENODATA') {
|
||||
return dns.resolve4Async(dom);
|
||||
} else {
|
||||
return PromiseA.reject(err);
|
||||
}
|
||||
})
|
||||
.then(function (result) {
|
||||
return result[0];
|
||||
});
|
||||
});
|
||||
|
||||
return PromiseA.all(proms).then(function (addrs) {
|
||||
var unique = addrs.filter(function (value, ind, self) {
|
||||
return value && self.indexOf(value) === ind;
|
||||
});
|
||||
// It is possible some walls might have exceptions that leave some of the domains
|
||||
// we test alone, so we might have more than one unique address even behind an
|
||||
// active paywall.
|
||||
return unique.length < addrs.length;
|
||||
});
|
||||
})
|
||||
.then(function (paywall) {
|
||||
if (paywall) {
|
||||
return paywall;
|
||||
}
|
||||
var request = deps.request.defaults({
|
||||
followRedirect: false
|
||||
, headers: {
|
||||
connection: 'close'
|
||||
}
|
||||
});
|
||||
|
||||
var proms = testDomains.map(function (dom) {
|
||||
return request('https://'+dom).then(function (resp) {
|
||||
if (resp.statusCode >= 300 && resp.statusCode < 400) {
|
||||
return resp.headers.location;
|
||||
} else {
|
||||
return 'https://'+dom;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return PromiseA.all(proms).then(function (urls) {
|
||||
var unique = urls.filter(function (value, ind, self) {
|
||||
return value && self.indexOf(value) === ind;
|
||||
});
|
||||
return unique.length < urls.length;
|
||||
});
|
||||
})
|
||||
;
|
||||
}
|
||||
|
||||
return {
|
||||
init: function (req, res) {
|
||||
if (handleCors(req, res, 'POST')) {
|
||||
|
@ -233,6 +308,22 @@ module.exports.create = function (deps, conf) {
|
|||
});
|
||||
});
|
||||
}
|
||||
, paywall_check: function (req, res) {
|
||||
if (handleCors(req, res, 'GET')) {
|
||||
return;
|
||||
}
|
||||
isAuthorized(req, res, function () {
|
||||
res.setHeader('Content-Type', 'application/json;');
|
||||
|
||||
checkPaywall().then(function (paywall) {
|
||||
res.end(JSON.stringify({paywall: paywall}));
|
||||
}, function (err) {
|
||||
err.message = err.message || err.toString();
|
||||
res.statusCode = 500;
|
||||
res.end(JSON.stringify({error: {message: err.message, code: err.code}}));
|
||||
});
|
||||
});
|
||||
}
|
||||
, _api: api
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue