Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions AUTHORS.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
* Abhishek Ram <abhishek.ram@me.com> @abhishek-ram
* Chad Gates @chadgates
* Bruno Ribeiro da Silva <bruno.devpod@gmail.com> @loop0
* Robin C Samuel @robincsamuel
- Abhishek Ram <abhishek.ram@me.com> @abhishek-ram
- Chad Gates @chadgates
- Bruno Ribeiro da Silva <bruno.devpod@gmail.com> @loop0
- Robin C Samuel @robincsamuel
- Brandon Joyce @brandonjoyce
25 changes: 21 additions & 4 deletions pyas2lib/as2.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ def build(
content_type="application/edi-consent",
additional_headers=None,
disposition_notification_to="no-reply@pyas2.com",
message_id=None,
):

"""Function builds the AS2 message. Compresses, signs and encrypts
Expand All @@ -354,6 +355,10 @@ def build(
:param disposition_notification_to:
Email address for disposition-notification-to header entry.
(default "no-reply@pyas2.com")

:param message_id:
A value to be used for the left side of the message id. If not provided a
unique id is generated. (default None)
"""

# Validations
Expand All @@ -372,10 +377,22 @@ def build(
"Encryption of messages is enabled but encrypt key is not set for the receiver."
)

# Generate message id using UUID 1 as it uses both hostname and time
self.message_id = (
email_utils.make_msgid(domain=self.sender.domain).lstrip("<").rstrip(">")
)
if message_id:
self.message_id = f"{message_id}@{self.sender.domain}"
else:
self.message_id = (
email_utils.make_msgid(domain=self.sender.domain)
.lstrip("<")
.rstrip(">")
)

# ensure the total length of the message id is no more than 255 characters
if len(self.message_id) > 255:
raise ValueError(
"Message ID must be no more than 255 characters for "
"compatibility with some AS2 servers. "
f"Current message ID length is {len(self.message_id)}."
)

# Set up the message headers
as2_headers = {
Expand Down
24 changes: 24 additions & 0 deletions pyas2lib/tests/test_basic.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
"""Module for testing the basic features of pyas2."""
import pytest
import socket
from pyas2lib import as2
from . import Pyas2TestCase
Expand Down Expand Up @@ -200,6 +201,29 @@ def test_plain_message_without_domain(self):
out_message.build(self.test_data)
self.assertEqual(out_message.message_id.split("@")[1], socket.getfqdn())

def test_plain_message_with_custom_message_id(self):
"""Test Message building with a custom message id"""

# Build an As2 message to be transmitted to partner
self.org.domain = "example.com"
out_message = as2.Message(self.org, self.partner)
out_message.build(self.test_data, message_id="some_custom_id")
self.assertEqual(out_message.message_id, "some_custom_id@example.com")

def test_invalid_message_id_length_raises_error(self):
"""Test Message building with a custom message id that's invalid"""

# Build an As2 message to be transmitted to partner
self.org.domain = "example.com"
out_message = as2.Message(self.org, self.partner)
very_long_message_id = "a" * 1000
with pytest.raises(ValueError) as excinfo:
out_message.build(self.test_data, message_id=very_long_message_id)
assert (
"Message ID must be no more than 255 characters for compatibility"
in str(excinfo.value)
)

def find_org(self, as2_id):
return self.org

Expand Down