Merge pull request #1921 from jberry-suse/obs_operator-robustness

obs_operator: improve robustness
This commit is contained in:
Jimmy Berry 2019-03-26 18:42:08 -05:00 committed by GitHub
commit 83e05fab2a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -55,13 +55,16 @@ class RequestHandler(BaseHTTPRequestHandler):
self.end_headers()
return
with OSCRequestEnvironment(self) as oscrc_file:
func = getattr(self, 'handle_{}'.format(path_prefix.replace('/', '_')))
command = func(path_parts[2:], query)
try:
with OSCRequestEnvironment(self) as oscrc_file:
func = getattr(self, 'handle_{}'.format(path_prefix.replace('/', '_')))
command = func(path_parts[2:], query)
self.end_headers()
if command and not self.execute(oscrc_file, command):
self.write_string('failed')
self.end_headers()
if command and not self.execute(oscrc_file, command):
self.write_string('failed')
except OSCRequestEnvironmentException as e:
self.write_string(str(e))
def do_POST(self):
action = self.path.lstrip('/')
@ -79,16 +82,19 @@ class RequestHandler(BaseHTTPRequestHandler):
if self.debug:
print('data: {}'.format(data))
with OSCRequestEnvironment(self, user) as oscrc_file:
func = getattr(self, 'handle_{}'.format(action))
commands = func(data)
self.end_headers()
try:
with OSCRequestEnvironment(self, user) as oscrc_file:
func = getattr(self, 'handle_{}'.format(action))
commands = func(data)
self.end_headers()
for command in commands:
self.write_string('$ {}\n'.format(' '.join(command)))
if not self.execute(oscrc_file, command):
self.write_string('failed')
break
for command in commands:
self.write_string('$ {}\n'.format(' '.join(command)))
if not self.execute(oscrc_file, command):
self.write_string('failed')
break
except OSCRequestEnvironmentException as e:
self.write_string(str(e))
def data_parse(self):
data = self.rfile.read(int(self.headers['Content-Length']))
@ -98,12 +104,12 @@ class RequestHandler(BaseHTTPRequestHandler):
if self.apiurl:
return self.apiurl
origin = self.headers.get('Origin')
if not origin:
host = self.headers.get('Host')
if not host:
return None
# Strip port if present.
domain = urlparse(origin).netloc.split(':', 2)[0]
domain = host.split(':', 2)[0]
if '.' not in domain:
return None
@ -111,6 +117,16 @@ class RequestHandler(BaseHTTPRequestHandler):
domain_parent = '.'.join(domain.split('.')[1:])
return 'https://api.{}'.format(domain_parent)
def origin_domain_get(self):
origin = self.headers.get('Origin')
if origin is not None:
# Strip port if present.
domain = urlparse(origin).netloc.split(':', 2)[0]
if '.' in domain:
return '.'.join(domain.split('.')[1:])
return None
def session_get(self):
if self.session:
return self.session
@ -210,24 +226,30 @@ class OSCRequestEnvironment(object):
def __enter__(self):
apiurl = self.handler.apiurl_get()
if not apiurl:
origin_domain = self.handler.origin_domain_get()
if not apiurl or (origin_domain and not apiurl.endswith(origin_domain)):
self.handler.send_response(400)
self.handler.end_headers()
return
if not apiurl:
raise OSCRequestEnvironmentException('unable to determine apiurl')
else:
raise OSCRequestEnvironmentException('origin does not match host domain')
session = self.handler.session_get()
if not session:
self.handler.send_response(401)
self.handler.end_headers()
return
raise OSCRequestEnvironmentException('unable to determine session')
if self.handler.debug:
print('apiurl: {}'.format(apiurl))
print('session: {}'.format(session))
self.handler.send_response(200)
self.handler.send_header('Content-type', 'text/plain')
self.handler.send_header('Access-Control-Allow-Credentials', 'true')
self.handler.send_header('Access-Control-Allow-Origin', self.handler.headers.get('Origin'))
if origin_domain:
self.handler.send_header('Access-Control-Allow-Credentials', 'true')
self.handler.send_header('Access-Control-Allow-Origin', self.handler.headers.get('Origin'))
self.cookiejar_file = tempfile.NamedTemporaryFile()
self.oscrc_file = tempfile.NamedTemporaryFile()
@ -244,6 +266,9 @@ class OSCRequestEnvironment(object):
self.cookiejar_file.__exit__(exc_type, exc_val, exc_tb)
self.oscrc_file.__exit__(exc_type, exc_val, exc_tb)
class OSCRequestEnvironmentException(Exception):
pass
def main(args):
RequestHandler.apiurl = args.apiurl
RequestHandler.session = args.session