Skip to content

Commit 8fb05bd

Browse files
committed
Fully enable KMIP 2.0 support for the server
This changes adds all of the final core updates necessary to allow KMIP 2.0 message encoding/decoding support for the PyKMIP server. Request and responses now dynamically adjust the KMIP version they encode/decode under based on the KMIP version included in their header segments. Extra server logging has also been added to show the KMIP version specified by the client request. Message tests have been updated to reflect these changes.
1 parent 1c879e2 commit 8fb05bd

File tree

5 files changed

+33
-5
lines changed

5 files changed

+33
-5
lines changed

kmip/core/messages/contents.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,11 @@ def protocol_version_to_kmip_version(value):
277277
return enums.KMIPVersion.KMIP_1_4
278278
else:
279279
return None
280+
elif value.major == 2:
281+
if value.minor == 0:
282+
return enums.KMIPVersion.KMIP_2_0
283+
else:
284+
return None
280285
else:
281286
return None
282287

kmip/core/messages/messages.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ def read(self, istream, kmip_version=enums.KMIPVersion.KMIP_1_0):
6262
self.protocol_version = contents.ProtocolVersion()
6363
self.protocol_version.read(tstream, kmip_version=kmip_version)
6464

65+
kmip_version = contents.protocol_version_to_kmip_version(
66+
self.protocol_version
67+
)
68+
6569
# Read the maximum response size if it is present
6670
if self.is_tag_next(Tags.MAXIMUM_RESPONSE_SIZE, tstream):
6771
self.maximum_response_size = contents.MaximumResponseSize()
@@ -185,6 +189,10 @@ def read(self, istream, kmip_version=enums.KMIPVersion.KMIP_1_0):
185189
self.protocol_version = contents.ProtocolVersion()
186190
self.protocol_version.read(tstream, kmip_version=kmip_version)
187191

192+
kmip_version = contents.protocol_version_to_kmip_version(
193+
self.protocol_version
194+
)
195+
188196
self.time_stamp = contents.TimeStamp()
189197
self.time_stamp.read(tstream, kmip_version=kmip_version)
190198

@@ -467,6 +475,10 @@ def read(self, istream, kmip_version=enums.KMIPVersion.KMIP_1_0):
467475
self.request_header = RequestHeader()
468476
self.request_header.read(istream, kmip_version=kmip_version)
469477

478+
kmip_version = contents.protocol_version_to_kmip_version(
479+
self.request_header.protocol_version
480+
)
481+
470482
self.batch_items = []
471483
for _ in range(self.request_header.batch_count.value):
472484
batch_item = RequestBatchItem()
@@ -507,6 +519,10 @@ def read(self, istream, kmip_version=enums.KMIPVersion.KMIP_1_0):
507519
self.response_header = ResponseHeader()
508520
self.response_header.read(istream, kmip_version=kmip_version)
509521

522+
kmip_version = contents.protocol_version_to_kmip_version(
523+
self.response_header.protocol_version
524+
)
525+
510526
self.batch_items = []
511527
for _ in range(self.response_header.batch_count.value):
512528
batch_item = ResponseBatchItem()

kmip/services/kmip_client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1576,8 +1576,10 @@ def _build_protocol_version(self):
15761576
return ProtocolVersion(1, 2)
15771577
elif self.kmip_version == enums.KMIPVersion.KMIP_1_3:
15781578
return ProtocolVersion(1, 3)
1579-
else:
1579+
elif self.kmip_version == enums.KMIPVersion.KMIP_1_4:
15801580
return ProtocolVersion(1, 4)
1581+
else:
1582+
return ProtocolVersion(2, 0)
15811583

15821584
def _build_request_message(self, credential, batch_items):
15831585
protocol_version = self._build_protocol_version()

kmip/services/server/engine.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,11 @@ def process_request(self, request, credential=None):
213213

214214
# Process the protocol version
215215
self._set_protocol_version(header.protocol_version)
216+
self._logger.debug(
217+
"Request specified KMIP version: {0}".format(
218+
header.protocol_version
219+
)
220+
)
216221

217222
# Process the maximum response size
218223
max_response_size = None

kmip/tests/unit/core/messages/test_messages.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ def setUp(self):
174174
self.encoding_kmip_2_0 = utils.BytearrayStream(
175175
b'\x42\x00\x7A\x01\x00\x00\x00\x70'
176176
b'\x42\x00\x69\x01\x00\x00\x00\x20'
177-
b'\x42\x00\x6A\x02\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00'
178-
b'\x42\x00\x6B\x02\x00\x00\x00\x04\x00\x00\x00\x01\x00\x00\x00\x00'
177+
b'\x42\x00\x6A\x02\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00'
178+
b'\x42\x00\x6B\x02\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00'
179179
b'\x42\x00\x92\x09\x00\x00\x00\x08\x00\x00\x00\x00\x4F\x9A\x54\xE5'
180180
b'\x42\x01\x55\x08\x00\x00\x00\x20'
181181
b'\xD3\xC3\xBF\x31\xB8\xBF\xBB\xEF\x53\x12\x0F\xD0\x95\x1B\xE5\x38'
@@ -229,7 +229,7 @@ def test_read_kmip_2_0(self):
229229
)
230230

231231
self.assertEqual(
232-
contents.ProtocolVersion(major=1, minor=1),
232+
contents.ProtocolVersion(major=2, minor=0),
233233
response_header.protocol_version
234234
)
235235
self.assertEqual(0x4F9A54E5, response_header.time_stamp.value)
@@ -250,7 +250,7 @@ def test_write_kmip_2_0(self):
250250
stream when including KMIP 2.0 fields.
251251
"""
252252
response_header = messages.ResponseHeader(
253-
protocol_version=contents.ProtocolVersion(major=1, minor=1),
253+
protocol_version=contents.ProtocolVersion(major=2, minor=0),
254254
time_stamp=contents.TimeStamp(value=0x4F9A54E5),
255255
server_hashed_password=(
256256
b'\xD3\xC3\xBF\x31\xB8\xBF\xBB\xEF'

0 commit comments

Comments
 (0)