87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
import uuid
|
|
|
|
import fixtures
|
|
try:
|
|
# requests_kerberos won't be available on py3, it doesn't work with py3.
|
|
import requests_kerberos
|
|
except ImportError:
|
|
requests_kerberos = None
|
|
|
|
from keystoneauth1 import fixture as ks_fixture
|
|
from keystoneauth1.tests.unit import utils as test_utils
|
|
|
|
|
|
class KerberosMock(fixtures.Fixture):
|
|
|
|
def __init__(self, requests_mock):
|
|
super(KerberosMock, self).__init__()
|
|
|
|
self.challenge_header = 'Negotiate %s' % uuid.uuid4().hex
|
|
self.pass_header = 'Negotiate %s' % uuid.uuid4().hex
|
|
self.requests_mock = requests_mock
|
|
|
|
def setUp(self):
|
|
super(KerberosMock, self).setUp()
|
|
|
|
if requests_kerberos is None:
|
|
return
|
|
|
|
m = fixtures.MockPatchObject(requests_kerberos.HTTPKerberosAuth,
|
|
'generate_request_header',
|
|
self._generate_request_header)
|
|
|
|
self.header_fixture = self.useFixture(m)
|
|
|
|
m = fixtures.MockPatchObject(requests_kerberos.HTTPKerberosAuth,
|
|
'authenticate_server',
|
|
self._authenticate_server)
|
|
|
|
self.authenticate_fixture = self.useFixture(m)
|
|
|
|
def _generate_request_header(self, *args, **kwargs):
|
|
return self.challenge_header
|
|
|
|
def _authenticate_server(self, response):
|
|
self.called_auth_server = True
|
|
return response.headers.get('www-authenticate') == self.pass_header
|
|
|
|
def mock_auth_success(
|
|
self,
|
|
token_id=None,
|
|
token_body=None,
|
|
method='POST',
|
|
url=test_utils.TestCase.TEST_ROOT_URL + 'v3/auth/tokens'):
|
|
if not token_id:
|
|
token_id = uuid.uuid4().hex
|
|
if not token_body:
|
|
token_body = ks_fixture.V3Token()
|
|
|
|
self.called_auth_server = False
|
|
|
|
response_list = [{'text': 'Fail',
|
|
'status_code': 401,
|
|
'headers': {'WWW-Authenticate': 'Negotiate'}},
|
|
{'headers': {'X-Subject-Token': token_id,
|
|
'Content-Type': 'application/json',
|
|
'WWW-Authenticate': self.pass_header},
|
|
'status_code': 200,
|
|
'json': token_body}]
|
|
|
|
self.requests_mock.register_uri(method,
|
|
url,
|
|
response_list=response_list)
|
|
|
|
return token_id, token_body
|