Skip to content

Commit

Permalink
Add message_id parameter (#63)
Browse files Browse the repository at this point in the history
* Add message_id parameter

* Validate length of message id when user provided

* Formatting
  • Loading branch information
brandonjoyce committed Nov 29, 2023
1 parent b9dc0a2 commit af63a9b
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 8 deletions.
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

0 comments on commit af63a9b

Please sign in to comment.