Update the Authentication object

This change updates the Authentication object, taking into account
the recent changes made to the Credential object hierarchy. A new
comprehensive unit test suite has been added for the Authentication
object. Usage of the object in the PyKMIP server has also been
updated to reflect these changes.
This commit is contained in:
Peter Hamilton 2018-02-26 10:12:21 -05:00
parent f72995490f
commit 8d492fcda4
4 changed files with 1097 additions and 23 deletions

View File

@ -265,37 +265,120 @@ class TimeStamp(DateTime):
super(TimeStamp, self).__init__(value, enums.Tags.TIME_STAMP)
# 6.6
class Authentication(Struct):
"""
A struct representing an Authentication bundle.
def __init__(self, credential=None):
Attributes:
credentials: A list of Credential structs to be used for
authentication.
"""
def __init__(self, credentials=None):
"""
Construct an Authentication struct.
Args:
credentials (list): A list of Credential structs to be used for
authentication. Optional, defaults to None.
"""
super(Authentication, self).__init__(enums.Tags.AUTHENTICATION)
self.credential = credential
def read(self, istream):
super(Authentication, self).read(istream)
tstream = utils.BytearrayStream(istream.read(self.length))
self._credentials = []
self.credentials = credentials
# Read the credential
self.credential = objects.Credential()
self.credential.read(tstream)
@property
def credentials(self):
return self._credentials
self.is_oversized(tstream)
@credentials.setter
def credentials(self, value):
if value is None:
self._credentials = []
elif isinstance(value, list):
credentials = []
for i in range(len(value)):
credential = value[i]
if not isinstance(credential, objects.Credential):
raise TypeError(
"Credentials must be a list of Credential structs. "
"Item {} has type: {}".format(i + 1, type(credential))
)
credentials.append(credential)
self._credentials = credentials
else:
raise TypeError(
"Credentials must be a list of Credential structs."
)
def write(self, ostream):
tstream = utils.BytearrayStream()
def read(self, input_stream):
"""
Read the data encoding the Authentication struct and decode it into
its constituent parts.
# Write the credential
self.credential.write(tstream)
Args:
input_stream (stream): A data stream containing encoded object
data, supporting a read method; usually a BytearrayStream
object.
"""
super(Authentication, self).read(input_stream)
local_stream = utils.BytearrayStream(input_stream.read(self.length))
# Write the length and value of the protocol version
self.length = tstream.length()
super(Authentication, self).write(ostream)
ostream.write(tstream.buffer)
credentials = []
while self.is_tag_next(enums.Tags.CREDENTIAL, local_stream):
credential = objects.Credential()
credential.read(local_stream)
credentials.append(credential)
if len(credentials) == 0:
raise ValueError("Authentication encoding missing credentials.")
self._credentials = credentials
def validate(self):
# TODO (peter-hamilton) Finish implementation.
pass
self.is_oversized(local_stream)
def write(self, output_stream):
"""
Write the data encoding the Authentication struct to a stream.
Args:
output_stream (stream): A data stream in which to encode object
data, supporting a write method; usually a BytearrayStream
object.
"""
local_stream = utils.BytearrayStream()
if len(self._credentials) == 0:
raise ValueError("Authentication struct missing credentials.")
for credential in self._credentials:
credential.write(local_stream)
self.length = local_stream.length()
super(Authentication, self).write(output_stream)
output_stream.write(local_stream.buffer)
def __eq__(self, other):
if isinstance(other, Authentication):
if self.credentials != other.credentials:
return False
else:
return True
else:
return NotImplemented
def __ne__(self, other):
if isinstance(other, Authentication):
return not (self == other)
else:
return NotImplemented
def __repr__(self):
args = ", ".join([
"credentials={}".format([x for x in self.credentials])
])
return "Authentication({})".format(args)
def __str__(self):
credentials = ", ".join([str(x) for x in self.credentials])
return "{'credentials': [" + credentials + "]}"
# 6.7

View File

@ -1348,7 +1348,7 @@ class KMIPProxy(KMIP):
authentication = None
if credential is not None:
authentication = Authentication(credential)
authentication = Authentication([credential])
batch_count = BatchCount(len(batch_items))
req_header = messages.RequestHeader(protocol_version=protocol_version,

View File

@ -328,7 +328,10 @@ class KmipEngine(object):
# Process the authentication credentials
if header.authentication:
auth_credentials = header.authentication.credential
if header.authentication.credentials:
auth_credentials = header.authentication.credentials[0]
else:
auth_credentials = None
else:
auth_credentials = None

View File

@ -0,0 +1,988 @@
# Copyright (c) 2018 The Johns Hopkins University/Applied Physics Laboratory
# All Rights Reserved.
#
# 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 testtools
from kmip.core import enums
from kmip.core import objects
from kmip.core import utils
from kmip.core.messages import contents
class TestAuthentication(testtools.TestCase):
"""
Test suite for the Authentication struct.
"""
def setUp(self):
super(TestAuthentication, self).setUp()
# Encoding obtained from the KMIP 1.1 testing document, Section 11.1.
#
# This encoding matches the following set of values:
# Authentication
# Credential
# CredentialType - Username and Password
# CredentialValue
# Username - Fred
# Password - password1
self.username_password_encoding = utils.BytearrayStream(
b'\x42\x00\x0C\x01\x00\x00\x00\x48'
b'\x42\x00\x23\x01\x00\x00\x00\x40'
b'\x42\x00\x24\x05\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00'
b'\x42\x00\x25\x01\x00\x00\x00\x28'
b'\x42\x00\x99\x07\x00\x00\x00\x04'
b'\x46\x72\x65\x64\x00\x00\x00\x00'
b'\x42\x00\xA1\x07\x00\x00\x00\x09'
b'\x70\x61\x73\x73\x77\x6F\x72\x64\x31\x00\x00\x00\x00\x00\x00\x00'
)
self.encoding_missing_credentials = utils.BytearrayStream(
b'\x42\x00\x0C\x01\x00\x00\x00\x00'
)
# Encoding obtained from the KMIP 1.1 testing document, Section 11.2.
#
# This encoding matches the following set of values:
# Authentication
# Credential
# CredentialType - Device
# CredentialValue
# Device Serial Number - serNum123456
# Password - secret
# Device Identifier - devID2233
# Network Identifier - netID9000
# Machine Identifier - machineID1
# Media Identifier - mediaID313
self.device_encoding = utils.BytearrayStream(
b'\x42\x00\x0C\x01\x00\x00\x00\xA8'
b'\x42\x00\x23\x01\x00\x00\x00\xA0'
b'\x42\x00\x24\x05\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00'
b'\x42\x00\x25\x01\x00\x00\x00\x88'
b'\x42\x00\xB0\x07\x00\x00\x00\x0C'
b'\x73\x65\x72\x4E\x75\x6D\x31\x32\x33\x34\x35\x36\x00\x00\x00\x00'
b'\x42\x00\xA1\x07\x00\x00\x00\x06'
b'\x73\x65\x63\x72\x65\x74\x00\x00'
b'\x42\x00\xA2\x07\x00\x00\x00\x09'
b'\x64\x65\x76\x49\x44\x32\x32\x33\x33\x00\x00\x00\x00\x00\x00\x00'
b'\x42\x00\xAB\x07\x00\x00\x00\x09'
b'\x6E\x65\x74\x49\x44\x39\x30\x30\x30\x00\x00\x00\x00\x00\x00\x00'
b'\x42\x00\xA9\x07\x00\x00\x00\x0A'
b'\x6D\x61\x63\x68\x69\x6E\x65\x49\x44\x31\x00\x00\x00\x00\x00\x00'
b'\x42\x00\xAA\x07\x00\x00\x00\x0A'
b'\x6D\x65\x64\x69\x61\x49\x44\x33\x31\x33\x00\x00\x00\x00\x00\x00'
)
# Encoding obtained from the KMIP 1.1 testing document, combining
# encodings from Sections 11.1 and 11.2.
#
# This encoding matches the following set of values:
# Authentication
# Credential
# CredentialType - Username and Password
# CredentialValue
# Username - Fred
# Password - password1
# Credential
# CredentialType - Device
# CredentialValue
# Device Serial Number - serNum123456
# Password - secret
# Device Identifier - devID2233
# Network Identifier - netID9000
# Machine Identifier - machineID1
# Media Identifier - mediaID313
self.multiple_credentials_encoding = utils.BytearrayStream(
b'\x42\x00\x0C\x01\x00\x00\x00\xF0'
b'\x42\x00\x23\x01\x00\x00\x00\x40'
b'\x42\x00\x24\x05\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00'
b'\x42\x00\x25\x01\x00\x00\x00\x28'
b'\x42\x00\x99\x07\x00\x00\x00\x04'
b'\x46\x72\x65\x64\x00\x00\x00\x00'
b'\x42\x00\xA1\x07\x00\x00\x00\x09'
b'\x70\x61\x73\x73\x77\x6F\x72\x64\x31\x00\x00\x00\x00\x00\x00\x00'
b'\x42\x00\x23\x01\x00\x00\x00\xA0'
b'\x42\x00\x24\x05\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00'
b'\x42\x00\x25\x01\x00\x00\x00\x88'
b'\x42\x00\xB0\x07\x00\x00\x00\x0C'
b'\x73\x65\x72\x4E\x75\x6D\x31\x32\x33\x34\x35\x36\x00\x00\x00\x00'
b'\x42\x00\xA1\x07\x00\x00\x00\x06'
b'\x73\x65\x63\x72\x65\x74\x00\x00'
b'\x42\x00\xA2\x07\x00\x00\x00\x09'
b'\x64\x65\x76\x49\x44\x32\x32\x33\x33\x00\x00\x00\x00\x00\x00\x00'
b'\x42\x00\xAB\x07\x00\x00\x00\x09'
b'\x6E\x65\x74\x49\x44\x39\x30\x30\x30\x00\x00\x00\x00\x00\x00\x00'
b'\x42\x00\xA9\x07\x00\x00\x00\x0A'
b'\x6D\x61\x63\x68\x69\x6E\x65\x49\x44\x31\x00\x00\x00\x00\x00\x00'
b'\x42\x00\xAA\x07\x00\x00\x00\x0A'
b'\x6D\x65\x64\x69\x61\x49\x44\x33\x31\x33\x00\x00\x00\x00\x00\x00'
)
def tearDown(self):
super(TestAuthentication, self).tearDown()
def test_init(self):
"""
Test that an Authentication struct can be constructed without
arguments.
"""
authentication = contents.Authentication()
self.assertEqual([], authentication.credentials)
def test_init_with_args(self):
"""
Test that an Authentication struct can be constructed with arguments.
"""
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="John",
password="abc123"
)
)
]
)
self.assertEqual(1, len(authentication.credentials))
self.assertEqual(
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="John",
password="abc123"
)
),
authentication.credentials[0]
)
def test_invalid_credentials(self):
"""
Test that a TypeError is raised when an invalid value is used to set
the credentials of an Authentication struct.
"""
kwargs = {'credentials': 'invalid'}
self.assertRaisesRegexp(
TypeError,
"Credentials must be a list of Credential structs.",
contents.Authentication,
**kwargs
)
authentication = contents.Authentication()
args = (authentication, "credentials", 'invalid')
self.assertRaisesRegexp(
TypeError,
"Credentials must be a list of Credential structs.",
setattr,
*args
)
def test_invalid_credentials_list(self):
"""
Test that a TypeError is raised when an invalid list is used to set
the credentials of an Authentication struct.
"""
kwargs = {
'credentials': [
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="John",
password="abc123"
)
),
'invalid'
]
}
self.assertRaisesRegexp(
TypeError,
"Credentials must be a list of Credential structs. Item 2 has "
"type: {}".format(type('invalid')),
contents.Authentication,
**kwargs
)
authentication = contents.Authentication()
args = (
authentication,
"credentials",
[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="John",
password="abc123"
)
),
'invalid'
]
)
self.assertRaisesRegexp(
TypeError,
"Credentials must be a list of Credential structs. Item 2 has "
"type: {}".format(type('invalid')),
setattr,
*args
)
def test_read(self):
"""
Test that an Authentication struct can be read from a data stream.
"""
# Test with a single UsernamePasswordCredential.
authentication = contents.Authentication()
self.assertEqual([], authentication.credentials)
authentication.read(self.username_password_encoding)
self.assertEqual(1, len(authentication.credentials))
self.assertEqual(
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
authentication.credentials[0]
)
# Test with a single DeviceCredential.
authentication = contents.Authentication()
self.assertEqual([], authentication.credentials)
authentication.read(self.device_encoding)
self.assertEqual(1, len(authentication.credentials))
self.assertEqual(
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
),
authentication.credentials[0]
)
# Test with multiple Credentials.
authentication = contents.Authentication()
self.assertEqual([], authentication.credentials)
authentication.read(self.multiple_credentials_encoding)
self.assertEqual(2, len(authentication.credentials))
self.assertEqual(
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
authentication.credentials[0]
)
self.assertEqual(
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
),
authentication.credentials[1]
)
def test_read_missing_credentials(self):
"""
Test that a ValueError gets raised when attempting to read an
Authentication struct from a data stream missing credentials data.
"""
authentication = contents.Authentication()
self.assertEqual([], authentication.credentials)
args = (self.encoding_missing_credentials, )
self.assertRaisesRegexp(
ValueError,
"Authentication encoding missing credentials.",
authentication.read,
*args
)
def test_write(self):
"""
Test that an Authentication struct can be written to a data stream.
"""
# Test with a single UsernamePasswordCredential.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
stream = utils.BytearrayStream()
authentication.write(stream)
self.assertEqual(len(self.username_password_encoding), len(stream))
self.assertEqual(str(self.username_password_encoding), str(stream))
# Test with a single DeviceCredential.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
stream = utils.BytearrayStream()
authentication.write(stream)
self.assertEqual(len(self.device_encoding), len(stream))
self.assertEqual(str(self.device_encoding), str(stream))
# Test with multiple Credentials.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
stream = utils.BytearrayStream()
authentication.write(stream)
self.assertEqual(len(self.multiple_credentials_encoding), len(stream))
self.assertEqual(str(self.multiple_credentials_encoding), str(stream))
def test_write_missing_credentials(self):
"""
Test that a ValueError gets raised when attempting to write a
Authentication struct missing credentials data to a data stream.
"""
authentication = contents.Authentication()
stream = utils.BytearrayStream()
args = (stream, )
self.assertRaisesRegexp(
ValueError,
"Authentication struct missing credentials.",
authentication.write,
*args
)
def test_equal_on_equal(self):
"""
Test that the equality operator returns True when comparing two
Authentication structs with the same data.
"""
a = contents.Authentication()
b = contents.Authentication()
self.assertTrue(a == b)
self.assertTrue(b == a)
# Test with a single UsernamePasswordCredential.
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
self.assertTrue(a == b)
self.assertTrue(b == a)
# Test with a single DeviceCredential.
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
self.assertTrue(a == b)
self.assertTrue(b == a)
# Test with multiple Credentials.
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
self.assertTrue(a == b)
self.assertTrue(b == a)
def test_equal_on_not_equal_credentials(self):
"""
Test that the equality operator returns False when comparing two
Authentication structs with different credentials.
"""
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
self.assertFalse(a == b)
self.assertFalse(b == a)
def test_equal_on_type_mismatch(self):
"""
Test that the equality operator returns False when comparing two
Authentication structs with different types.
"""
a = contents.Authentication()
b = 'invalid'
self.assertFalse(a == b)
self.assertFalse(b == a)
def test_not_equal_on_equal(self):
"""
Test that the inequality operator returns False when comparing two
Authentication structs with the same data.
"""
a = contents.Authentication()
b = contents.Authentication()
self.assertFalse(a != b)
self.assertFalse(b != a)
# Test with a single UsernamePasswordCredential.
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
self.assertFalse(a != b)
self.assertFalse(b != a)
# Test with a single DeviceCredential.
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
self.assertFalse(a != b)
self.assertFalse(b != a)
# Test with multiple Credentials.
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
self.assertFalse(a != b)
self.assertFalse(b != a)
def test_not_equal_on_not_equal_credentials(self):
"""
Test that the inequality operator returns True when comparing two
Authentication structs with different credentials.
"""
a = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
b = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
self.assertTrue(a != b)
self.assertTrue(b != a)
def test_not_equal_on_type_mismatch(self):
"""
Test that the inequality operator returns True when comparing two
Authentication structs with different types.
"""
a = contents.Authentication()
b = 'invalid'
self.assertTrue(a != b)
self.assertTrue(b != a)
def test_repr(self):
"""
Test that repr can be applied to an Authentication struct.
"""
# Test with a UsernamePasswordCredential.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
expected = (
"Authentication("
"credentials=["
"Credential("
"credential_type=CredentialType.USERNAME_AND_PASSWORD, "
"credential_value=UsernamePasswordCredential("
"username='Fred', "
"password='password1'))])"
)
observed = repr(authentication)
self.assertEqual(expected, observed)
# Test with a DeviceCredential.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
expected = (
"Authentication("
"credentials=["
"Credential("
"credential_type=CredentialType.DEVICE, "
"credential_value=DeviceCredential("
"device_serial_number='serNum123456', "
"password='secret', "
"device_identifier='devID2233', "
"network_identifier='netID9000', "
"machine_identifier='machineID1', "
"media_identifier='mediaID313'))])"
)
observed = repr(authentication)
self.assertEqual(expected, observed)
# Test with multiple Credentials.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
expected = (
"Authentication("
"credentials=["
"Credential("
"credential_type=CredentialType.USERNAME_AND_PASSWORD, "
"credential_value=UsernamePasswordCredential("
"username='Fred', "
"password='password1')), "
"Credential("
"credential_type=CredentialType.DEVICE, "
"credential_value=DeviceCredential("
"device_serial_number='serNum123456', "
"password='secret', "
"device_identifier='devID2233', "
"network_identifier='netID9000', "
"machine_identifier='machineID1', "
"media_identifier='mediaID313'))])"
)
observed = repr(authentication)
self.assertEqual(expected, observed)
def test_str(self):
"""
Test that str can be applied to an Authentication struct.
"""
# Test with a UsernamePasswordCredential.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
)
]
)
expected = str({
"credentials": [
{
"credential_type":
enums.CredentialType.USERNAME_AND_PASSWORD,
"credential_value": str({
"username": "Fred",
"password": "password1"
})
}
]
})
observed = str(authentication)
self.assertEqual(expected, observed)
# Test with a DeviceCredential.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
expected = str({
"credentials": [
{
"credential_type": enums.CredentialType.DEVICE,
"credential_value": str({
"device_serial_number": "serNum123456",
"password": "secret",
"device_identifier": "devID2233",
"network_identifier": "netID9000",
"machine_identifier": "machineID1",
"media_identifier": "mediaID313"
})
}
]
})
observed = str(authentication)
self.assertEqual(expected, observed)
# Test with multiple Credentials.
authentication = contents.Authentication(
credentials=[
objects.Credential(
credential_type=enums.CredentialType.USERNAME_AND_PASSWORD,
credential_value=objects.UsernamePasswordCredential(
username="Fred",
password="password1"
)
),
objects.Credential(
credential_type=enums.CredentialType.DEVICE,
credential_value=objects.DeviceCredential(
device_serial_number="serNum123456",
password="secret",
device_identifier="devID2233",
network_identifier="netID9000",
machine_identifier="machineID1",
media_identifier="mediaID313"
)
)
]
)
expected = str({
"credentials": [
{
"credential_type":
enums.CredentialType.USERNAME_AND_PASSWORD,
"credential_value": str({
"username": "Fred",
"password": "password1"
})
},
{
"credential_type": enums.CredentialType.DEVICE,
"credential_value": str({
"device_serial_number": "serNum123456",
"password": "secret",
"device_identifier": "devID2233",
"network_identifier": "netID9000",
"machine_identifier": "machineID1",
"media_identifier": "mediaID313"
})
}
]
})
observed = str(authentication)
self.assertEqual(expected, observed)