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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user