Esempio n. 1
0
    def retry_http_krb_sspi_auth(self, host, req):
        url = req.full_url
        scheme, _, host, path = url.split('/', 3)

        h = HTTPConnection(host) if scheme == 'http:' else HTTPSConnection(
            host)
        headers = dict(req.unredirected_hdrs)
        headers.update(
            dict((k, v) for k, v in req.headers.items() if k not in headers))

        try:
            __, krb_context = kerberos.authGSSClientInit("HTTP@" + host)
            kerberos.authGSSClientStep(krb_context, "")

            negotiate_details = kerberos.authGSSClientResponse(krb_context)

            headers["Connection"] = "Keep-Alive"
            headers["Authorization"] = "Negotiate " + negotiate_details
            h.request(req.get_method(), req.selector, req.data, headers)
            response = h.getresponse()
            return addinfourl(response, response.msg, req.get_full_url(),
                              response.status)
        except:
            # e = sys.exc_info()[0]
            # _log.warning(str(e))
            # _log.warning('Failed Kerberos authentication')
            return None
Esempio n. 2
0
    def s3_open(self, req):
        orig_url = req.get_full_url()
        from botocore.exceptions import ClientError
        try:
            url, headers, stream = _s3_open(orig_url)
            return urllib_response.addinfourl(stream, headers, url)
        except ClientError as err:
            # if no such [KEY], but [KEY]/index.html exists,
            # return that, instead.
            if err.response['Error']['Code'] == 'NoSuchKey':
                try:
                    _, headers, stream = _s3_open(
                        url_util.join(orig_url, 'index.html'))
                    return urllib_response.addinfourl(
                        stream, headers, orig_url)

                except ClientError as err2:
                    if err.response['Error']['Code'] == 'NoSuchKey':
                        # raise original error
                        raise urllib_error.URLError(err)

                    raise urllib_error.URLError(err2)

            raise urllib_error.URLError(err)
Esempio n. 3
0
def gcs_open(req, *args, **kwargs):
    """Open a reader stream to a blob object on GCS
    """
    import spack.util.gcs as gcs_util

    url = url_util.parse(req.get_full_url())
    gcsblob = gcs_util.GCSBlob(url)

    if not gcsblob.exists():
        raise web_util.SpackWebError('GCS blob {0} does not exist'.format(
            gcsblob.blob_path))
    stream = gcsblob.get_blob_byte_stream()
    headers = gcsblob.get_blob_headers()

    return urllib_response.addinfourl(stream, headers, url)
Esempio n. 4
0
 def open_local_file(self, req):
     try:
         host = req.host
         filename = req.selector
         # if that bombs, then go on with original method
         localfile = url.url2pathname(host + filename)
         stats = os.stat(localfile)
         size = stats.st_size
         modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
         mtype = mimetypes.guess_type(filename)[0]
         headers = email.message_from_string(
             'Content-type: %s\nContent-length: %d\nLast-modified: %s\n'
             % (mtype or 'text/plain', size, modified))
         origurl = 'file://' + host + filename
         return addinfourl(open(localfile, 'rb'), headers, origurl)
     except:
         pass
     return url.FileHandler.open_local_file(self, req)
Esempio n. 5
0
    def on_result(self):
        if self._response is None:
            return
        fp = socket._fileobject(self._response, close=True)
        result = urllib_response.addinfourl(fp, self._response.msg,
                                            self._request.get_full_url())
        result.code = self._response.status
        result.msg = self._response.reason

        # Run response processors
        protocol = self._request.get_type()
        method_name = protocol + '_response'
        try:
            for processor in self._processors.get(protocol, []):
                method = getattr(processor, method_name)
                result = method(self.request, result)
                if result:
                    break
        except Exception as err:
            self.on_error(err)
        else:
            if self._on_result:
                self._on_result(result)
Esempio n. 6
0
    def retry_http_ntlm_sspi_auth(self, host, req, authenticatehdr,
                                  auth_header):
        url = req.full_url
        scheme, _, host, path = url.split('/', 3)

        h = HTTPConnection(host) if scheme == 'http:' else HTTPSConnection(
            host)
        headers = dict(req.unredirected_hdrs)
        headers.update(
            dict((k, v) for k, v in req.headers.items() if k not in headers))

        headers["Connection"] = "Keep-Alive"
        headers[auth_header] = "NTLM " + self.get_auth_req()

        h.request(req.get_method(), req.selector, req.data, headers)

        response = h.getresponse()
        response.fp = None  # keep-alive

        ntlmauth = response.headers.get(authenticatehdr)
        if ntlmauth is not None and ntlmauth.startswith('NTLM '):
            challenge = ntlmauth[5:]

            challenge_response = self.create_challenge_response(challenge)

            if challenge_response is None:
                _log.warning('Failed to authenticate using NTLM')
                return None
            headers["Connection"] = "Close"
            headers[auth_header] = "NTLM " + challenge_response

            h.request(req.get_method(), req.selector, req.data, headers)

            response = h.getresponse()

            return addinfourl(response, response.msg, req.get_full_url(),
                              response.status)
Esempio n. 7
0
 def http_error_302(self, req, fp, code, msg, headers):
     infourl = addinfourl(fp, headers, req.get_full_url())
     infourl.status = code
     infourl.code = code
     return infourl
Esempio n. 8
0
 def add_response(self, url, status_code, headers, body=None):
     response = addinfourl(StringIO(body or ''), headers, url, status_code)
     responses = list(self.http_mock.side_effect)
     responses.append(response)
     self.http_mock.side_effect = responses
Esempio n. 9
0
 def http_error_206(self, req, fp, code, msg, hdrs):
     # Range header supported
     r = addinfourl(fp, hdrs, req.get_full_url())
     r.code = code
     r.msg = msg
     return r
Esempio n. 10
0
 def add_response(self, url, status_code, headers, body=None):
     response = addinfourl(StringIO(body or ''), headers, url, status_code)
     responses = list(self.http_mock.side_effect)
     responses.append(response)
     self.http_mock.side_effect = responses
Esempio n. 11
0
 def https_open(self, req):
     resp = addinfourl(StringIO(req.get_header('Cookie')), "mock message",
                       req.get_full_url())
     resp.code = 200
     resp.msg = "OK"
     return resp