Skip to content

Commit

Permalink
Merge pull request #56 from abhishek-ram/fixes-0320
Browse files Browse the repository at this point in the history
Fixes 0320
  • Loading branch information
abhishek-ram committed Apr 17, 2019
2 parents 3132987 + 8f72e43 commit 6d3e37c
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 20 deletions.
58 changes: 39 additions & 19 deletions pyas2/as2lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,36 @@
from string import Template


def decompress_message(message, payload):
""" Function for decompressing the message """
decompressed_content = None
if payload.get_content_type() == 'application/pkcs7-mime' \
and payload.get_param('smime-type') == 'compressed-data':
models.Log.objects.create(message=message, status='S',
text=_(u'Decompressing the payload'))
message.compressed = True

# Decode the data to binary if its base64 encoded
compressed_content = payload.get_payload()
try:
compressed_content.encode('ascii')
compressed_content = base64.b64decode(payload.get_payload())
except UnicodeDecodeError:
pass

pyas2init.logger.debug(
'Decompressing the payload:\n%s' % compressed_content)
try:
decompressed_content = as2utils.decompress_payload(
compressed_content)

except Exception, e:
raise as2utils.As2DecompressionFailed(
'Failed to decompress message,exception message is %s' % e)

return message, decompressed_content


def save_message(message, payload, raw_payload):
""" Function decompresses, decrypts and verifies the received AS2 message
Takes an AS2 message as input and returns the actual payload ex. X12 message """
Expand Down Expand Up @@ -79,6 +109,12 @@ def save_message(message, payload, raw_payload):
except Exception, msg:
raise as2utils.As2DecryptionFailed('Failed to decrypt message, exception message is %s' % msg)

# Check for compression before signature check
message, decompressed_content = decompress_message(message, payload)
if decompressed_content:
payload = email.message_from_string(decompressed_content)
raw_payload = decompressed_content

# Check if message from this partner are expected to be signed
if message.partner.signature and payload.get_content_type() != 'multipart/signed':
raise as2utils.As2InsufficientSecurity(
Expand Down Expand Up @@ -124,25 +160,9 @@ def save_message(message, payload, raw_payload):
mic_content = as2utils.canonicalize2(payload)

# Check if the message has been compressed and if so decompress it
if payload.get_content_type() == 'application/pkcs7-mime' \
and payload.get_param('smime-type') == 'compressed-data':
models.Log.objects.create(message=message, status='S', text=_(u'Decompressing the payload'))
message.compressed = True

# Decode the data to binary if its base64 encoded
compressed_content = payload.get_payload()
try:
compressed_content.encode('ascii')
compressed_content = base64.b64decode(payload.get_payload())
except UnicodeDecodeError:
pass

pyas2init.logger.debug('Decompressing the payload:\n%s' % compressed_content)
try:
decompressed_content = as2utils.decompress_payload(compressed_content)
payload = email.message_from_string(decompressed_content)
except Exception, e:
raise as2utils.As2DecompressionFailed('Failed to decompress message,exception message is %s' % e)
message, decompressed_content = decompress_message(message, payload)
if decompressed_content:
payload = email.message_from_string(decompressed_content)

# Saving the message mic for sending it in the MDN
if mic_content:
Expand Down
4 changes: 3 additions & 1 deletion pyas2/as2utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ def canonicalize(msg):
class CompressedDataAttr(univ.Sequence):
componentType = namedtype.NamedTypes(
namedtype.NamedType('compressionAlgorithm', univ.ObjectIdentifier()),
namedtype.OptionalNamedType('parameters', univ.Any()),
)


Expand Down Expand Up @@ -311,7 +312,8 @@ def compress_payload(payload):


def decompress_payload(payload):
decoded_content, substrate = decoder.decode(payload, asn1Spec=CompressedDataMain())
decoded_content, substrate = decoder.decode(
payload, asn1Spec=CompressedDataMain())
compressed_content = decoded_content.getComponentByName('compressedData').getComponentByName('payload').\
getComponentByName('content')
return zlib.decompress(compressed_content.asOctets())
Expand Down

0 comments on commit 6d3e37c

Please sign in to comment.