5757RUNNER_VERIFY_SSL_CERT = 'verify_ssl_cert'
5858RUNNER_USERNAME = 'username'
5959RUNNER_PASSWORD = 'password'
60- RUNNER_HOSTS_BLACKLIST = 'hosts_blacklist'
60+ RUNNER_URL_HOSTS_BLACKLIST = 'url_hosts_blacklist'
61+ RUNNER_URL_HOSTS_WHITELIST = 'url_hosts_whitelist'
6162
6263# Lookup constants for action params
6364ACTION_AUTH = 'auth'
@@ -96,11 +97,17 @@ def pre_run(self):
9697 self ._http_proxy = self .runner_parameters .get (RUNNER_HTTP_PROXY , None )
9798 self ._https_proxy = self .runner_parameters .get (RUNNER_HTTPS_PROXY , None )
9899 self ._verify_ssl_cert = self .runner_parameters .get (RUNNER_VERIFY_SSL_CERT , None )
99- self ._hosts_blacklist = self .runner_parameters .get (RUNNER_HOSTS_BLACKLIST , [])
100+ self ._url_hosts_blacklist = self .runner_parameters .get (RUNNER_URL_HOSTS_BLACKLIST , [])
101+ self ._url_hosts_whitelist = self .runner_parameters .get (RUNNER_URL_HOSTS_WHITELIST , [])
100102
101103 def run (self , action_parameters ):
102104 client = self ._get_http_client (action_parameters )
103105
106+ if self ._url_hosts_blacklist and self ._url_hosts_whitelist :
107+ msg = ('"url_hosts_blacklist" and "url_hosts_whitelist" parameters are mutually '
108+ 'exclusive. Only one should be provided.' )
109+ raise ValueError (msg )
110+
104111 try :
105112 result = client .run ()
106113 except requests .exceptions .Timeout as e :
@@ -152,7 +159,8 @@ def _get_http_client(self, action_parameters):
152159 timeout = timeout , allow_redirects = self ._allow_redirects ,
153160 proxies = proxies , files = files , verify = self ._verify_ssl_cert ,
154161 username = self ._username , password = self ._password ,
155- hosts_blacklist = self ._hosts_blacklist )
162+ url_hosts_blacklist = self ._url_hosts_blacklist ,
163+ url_hosts_whitelist = self ._url_hosts_whitelist )
156164
157165 @staticmethod
158166 def _get_result_status (status_code ):
@@ -164,7 +172,7 @@ class HTTPClient(object):
164172 def __init__ (self , url = None , method = None , body = '' , params = None , headers = None , cookies = None ,
165173 auth = None , timeout = 60 , allow_redirects = False , proxies = None ,
166174 files = None , verify = False , username = None , password = None ,
167- hosts_blacklist = None ):
175+ url_hosts_blacklist = None , url_hosts_whitelist = None ):
168176 if url is None :
169177 raise Exception ('URL must be specified.' )
170178
@@ -194,7 +202,8 @@ def __init__(self, url=None, method=None, body='', params=None, headers=None, co
194202 self .verify = verify
195203 self .username = username
196204 self .password = password
197- self .hosts_blacklist = hosts_blacklist or []
205+ self .url_hosts_blacklist = url_hosts_blacklist or []
206+ self .url_hosts_whitelist = url_hosts_whitelist or []
198207
199208 def run (self ):
200209 results = {}
@@ -207,6 +216,11 @@ def run(self):
207216 if is_url_blacklisted :
208217 raise ValueError ('URL "%s" is blacklisted' % (self .url ))
209218
219+ is_url_whitelisted = self ._is_url_whitelisted (url = self .url )
220+
221+ if not is_url_whitelisted :
222+ raise ValueError ('URL "%s" is not whitelisted' % (self .url ))
223+
210224 try :
211225 if json_content :
212226 # cast params (body) to dict
@@ -316,24 +330,46 @@ def _cast_object(self, value):
316330
317331 def _is_url_blacklisted (self , url ):
318332 """
319- Verify if the provided URL is blacklisted via hosts_blacklist runner parameter.
333+ Verify if the provided URL is blacklisted via url_hosts_blacklist runner parameter.
320334 """
321- if not self .hosts_blacklist :
335+ if not self .url_hosts_blacklist :
322336 # Blacklist is empty
323337 return False
324338
339+ host = self ._get_host_from_url (url = url )
340+
341+ if host in self .url_hosts_blacklist :
342+ return True
343+
344+ return False
345+
346+ def _is_url_whitelisted (self , url ):
347+ """
348+ Verify if the provided URL is whitelisted via url_hosts_whitelist runner parameter.
349+ """
350+ if not self .url_hosts_whitelist :
351+ return True
352+
353+ host = self ._get_host_from_url (url = url )
354+
355+ if host in self .url_hosts_whitelist :
356+ return True
357+
358+ return False
359+
360+ def _get_host_from_url (self , url ):
361+ """
362+ Return sanitized host (netloc) value from the provided url.
363+ """
325364 parsed = urlparse .urlparse (url )
326365
327- # Remove the port and []
366+ # Remove port and []
328367 host = parsed .netloc .replace ('[' , '' ).replace (']' , '' )
329368
330369 if parsed .port is not None :
331370 host = host .replace (':%s' % (parsed .port ), '' )
332371
333- if host in self .hosts_blacklist :
334- return True
335-
336- return False
372+ return host
337373
338374
339375def get_runner ():
0 commit comments