mirror of
				https://github.com/OpenKMIP/PyKMIP.git
				synced 2025-11-04 05:25:17 +01:00 
			
		
		
		
	This change adds support for the Digest attribute, including updates and unit test suites for all dependent KMIP objects.
		
			
				
	
	
		
			272 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			272 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Copyright (c) 2014 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.
 | 
						|
 | 
						|
from kmip.core.enums import BatchErrorContinuationOption
 | 
						|
from kmip.core.enums import KeyCompressionType
 | 
						|
from kmip.core.enums import Operation
 | 
						|
from kmip.core.enums import ResultStatus
 | 
						|
from kmip.core.enums import ResultReason
 | 
						|
from kmip.core.enums import Tags
 | 
						|
 | 
						|
from kmip.core import objects
 | 
						|
from kmip.core import utils
 | 
						|
 | 
						|
from kmip.core.primitives import Struct
 | 
						|
from kmip.core.primitives import Integer
 | 
						|
from kmip.core.primitives import Enumeration
 | 
						|
from kmip.core.primitives import Boolean
 | 
						|
from kmip.core.primitives import TextString
 | 
						|
from kmip.core.primitives import ByteString
 | 
						|
from kmip.core.primitives import DateTime
 | 
						|
 | 
						|
 | 
						|
# 6.1
 | 
						|
class ProtocolVersion(Struct):
 | 
						|
 | 
						|
    class ProtocolVersionMajor(Integer):
 | 
						|
        def __init__(self, value=None):
 | 
						|
            super(ProtocolVersion.ProtocolVersionMajor, self).\
 | 
						|
                __init__(value, Tags.PROTOCOL_VERSION_MAJOR)
 | 
						|
 | 
						|
    class ProtocolVersionMinor(Integer):
 | 
						|
        def __init__(self, value=None):
 | 
						|
            super(ProtocolVersion.ProtocolVersionMinor, self).\
 | 
						|
                __init__(value, Tags.PROTOCOL_VERSION_MINOR)
 | 
						|
 | 
						|
    def __init__(self,
 | 
						|
                 protocol_version_major=None,
 | 
						|
                 protocol_version_minor=None):
 | 
						|
        super(ProtocolVersion, self).__init__(Tags.PROTOCOL_VERSION)
 | 
						|
 | 
						|
        if protocol_version_major is None:
 | 
						|
            self.protocol_version_major = \
 | 
						|
                ProtocolVersion.ProtocolVersionMajor()
 | 
						|
        else:
 | 
						|
            self.protocol_version_major = protocol_version_major
 | 
						|
 | 
						|
        if protocol_version_minor is None:
 | 
						|
            self.protocol_version_minor = \
 | 
						|
                ProtocolVersion.ProtocolVersionMinor()
 | 
						|
        else:
 | 
						|
            self.protocol_version_minor = protocol_version_minor
 | 
						|
 | 
						|
        self.validate()
 | 
						|
 | 
						|
    def read(self, istream):
 | 
						|
        super(ProtocolVersion, self).read(istream)
 | 
						|
        tstream = utils.BytearrayStream(istream.read(self.length))
 | 
						|
 | 
						|
        # Read the major and minor portions of the version number
 | 
						|
        self.protocol_version_major.read(tstream)
 | 
						|
        self.protocol_version_minor.read(tstream)
 | 
						|
 | 
						|
        self.is_oversized(tstream)
 | 
						|
 | 
						|
    def write(self, ostream):
 | 
						|
        tstream = utils.BytearrayStream()
 | 
						|
 | 
						|
        # Write the major and minor portions of the protocol version
 | 
						|
        self.protocol_version_major.write(tstream)
 | 
						|
        self.protocol_version_minor.write(tstream)
 | 
						|
 | 
						|
        # Write the length and value of the protocol version
 | 
						|
        self.length = tstream.length()
 | 
						|
        super(ProtocolVersion, self).write(ostream)
 | 
						|
        ostream.write(tstream.buffer)
 | 
						|
 | 
						|
    def validate(self):
 | 
						|
        self.__validate()
 | 
						|
 | 
						|
    def __validate(self):
 | 
						|
        if not isinstance(self.protocol_version_major,
 | 
						|
                          ProtocolVersion.ProtocolVersionMajor):
 | 
						|
            msg = "invalid protocol version major"
 | 
						|
            msg += "; expected {0}, received {1}".format(
 | 
						|
                ProtocolVersion.ProtocolVersionMajor,
 | 
						|
                self.protocol_version_major)
 | 
						|
            raise TypeError(msg)
 | 
						|
 | 
						|
        if not isinstance(self.protocol_version_minor,
 | 
						|
                          ProtocolVersion.ProtocolVersionMinor):
 | 
						|
            msg = "invalid protocol version minor"
 | 
						|
            msg += "; expected {0}, received {1}".format(
 | 
						|
                ProtocolVersion.ProtocolVersionMinor,
 | 
						|
                self.protocol_version_minor)
 | 
						|
            raise TypeError(msg)
 | 
						|
 | 
						|
    def __eq__(self, other):
 | 
						|
        if isinstance(other, ProtocolVersion):
 | 
						|
            if ((self.protocol_version_major ==
 | 
						|
                    other.protocol_version_major)
 | 
						|
                    and
 | 
						|
                    (self.protocol_version_minor ==
 | 
						|
                     other.protocol_version_minor)):
 | 
						|
                return True
 | 
						|
            else:
 | 
						|
                return False
 | 
						|
        else:
 | 
						|
            return NotImplemented
 | 
						|
 | 
						|
    def __ne__(self, other):
 | 
						|
        if isinstance(other, ProtocolVersion):
 | 
						|
            return not self.__eq__(other)
 | 
						|
        else:
 | 
						|
            return NotImplemented
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        major = self.protocol_version_major.value
 | 
						|
        minor = self.protocol_version_minor.value
 | 
						|
        return "{0}.{1}".format(major, minor)
 | 
						|
 | 
						|
    @classmethod
 | 
						|
    def create(cls, major, minor):
 | 
						|
        major = cls.ProtocolVersionMajor(major)
 | 
						|
        minor = cls.ProtocolVersionMinor(minor)
 | 
						|
        return ProtocolVersion(major, minor)
 | 
						|
 | 
						|
 | 
						|
# 6.2
 | 
						|
class Operation(Enumeration):
 | 
						|
    ENUM_TYPE = Operation
 | 
						|
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(Operation, self).__init__(value, Tags.OPERATION)
 | 
						|
 | 
						|
 | 
						|
# 6.3
 | 
						|
class MaximumResponseSize(Integer):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(MaximumResponseSize, self).\
 | 
						|
            __init__(value, Tags.MAXIMUM_RESPONSE_SIZE)
 | 
						|
 | 
						|
 | 
						|
# 6.4
 | 
						|
class UniqueBatchItemID(ByteString):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(UniqueBatchItemID, self)\
 | 
						|
            .__init__(value, Tags.UNIQUE_BATCH_ITEM_ID)
 | 
						|
 | 
						|
 | 
						|
# 6.5
 | 
						|
class TimeStamp(DateTime):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(TimeStamp, self).__init__(value, Tags.TIME_STAMP)
 | 
						|
 | 
						|
 | 
						|
# 6.6
 | 
						|
class Authentication(Struct):
 | 
						|
 | 
						|
    def __init__(self, credential=None):
 | 
						|
        super(Authentication, self).__init__(Tags.AUTHENTICATION)
 | 
						|
        self.credential = credential
 | 
						|
 | 
						|
    def read(self, istream):
 | 
						|
        super(Authentication, self).read(istream)
 | 
						|
        tstream = utils.BytearrayStream(istream.read(self.length))
 | 
						|
 | 
						|
        # Read the credential
 | 
						|
        self.credential = objects.Credential()
 | 
						|
        self.credential.read(tstream)
 | 
						|
 | 
						|
        self.is_oversized(tstream)
 | 
						|
 | 
						|
    def write(self, ostream):
 | 
						|
        tstream = utils.BytearrayStream()
 | 
						|
 | 
						|
        # Write the credential
 | 
						|
        self.credential.write(tstream)
 | 
						|
 | 
						|
        # Write the length and value of the protocol version
 | 
						|
        self.length = tstream.length()
 | 
						|
        super(Authentication, self).write(ostream)
 | 
						|
        ostream.write(tstream.buffer)
 | 
						|
 | 
						|
    def validate(self):
 | 
						|
        # TODO (peter-hamilton) Finish implementation.
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
# 6.7
 | 
						|
class AsynchronousIndicator(Boolean):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(AsynchronousIndicator, self).\
 | 
						|
            __init__(value, Tags.ASYNCHRONOUS_INDICATOR)
 | 
						|
 | 
						|
 | 
						|
# 6.8
 | 
						|
class AsynchronousCorrelationValue(ByteString):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(AsynchronousCorrelationValue, self).\
 | 
						|
            __init__(value, Tags.ASYNCHRONOUS_CORRELATION_VALUE)
 | 
						|
 | 
						|
 | 
						|
# 6.9
 | 
						|
class ResultStatus(Enumeration):
 | 
						|
    ENUM_TYPE = ResultStatus
 | 
						|
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(ResultStatus, self).__init__(value, Tags.RESULT_STATUS)
 | 
						|
 | 
						|
 | 
						|
# 6.10
 | 
						|
class ResultReason(Enumeration):
 | 
						|
    ENUM_TYPE = ResultReason
 | 
						|
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(ResultReason, self).__init__(value, Tags.RESULT_REASON)
 | 
						|
 | 
						|
 | 
						|
# 6.11
 | 
						|
class ResultMessage(TextString):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(ResultMessage, self).__init__(value, Tags.RESULT_MESSAGE)
 | 
						|
 | 
						|
 | 
						|
# 6.12
 | 
						|
class BatchOrderOption(Boolean):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(BatchOrderOption, self).\
 | 
						|
            __init__(value, Tags.BATCH_ORDER_OPTION)
 | 
						|
 | 
						|
 | 
						|
# 6.13
 | 
						|
class BatchErrorContinuationOption(Enumeration):
 | 
						|
    ENUM_TYPE = BatchErrorContinuationOption
 | 
						|
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(BatchErrorContinuationOption, self).\
 | 
						|
            __init__(value, Tags.BATCH_ERROR_CONTINUATION_OPTION)
 | 
						|
 | 
						|
 | 
						|
# 6.14
 | 
						|
class BatchCount(Integer):
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(BatchCount, self).__init__(value, Tags.BATCH_COUNT)
 | 
						|
 | 
						|
 | 
						|
# 6.16
 | 
						|
class MessageExtension(Struct):
 | 
						|
    def __init__(self):
 | 
						|
        super(MessageExtension, self).__init__(Tags.MESSAGE_EXTENSION)
 | 
						|
 | 
						|
 | 
						|
# 9.1.3.2.2
 | 
						|
class KeyCompressionType(Enumeration):
 | 
						|
    ENUM_TYPE = KeyCompressionType
 | 
						|
 | 
						|
    def __init__(self, value=None):
 | 
						|
        super(KeyCompressionType, self).\
 | 
						|
            __init__(value, Tags.KEY_COMPRESSION_TYPE)
 |