Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add message_id parameter #63

Merged
merged 3 commits into from
Nov 29, 2023
Merged
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 <[email protected]> @abhishek-ram
* Chad Gates @chadgates
* Bruno Ribeiro da Silva <[email protected]> @loop0
* Robin C Samuel @robincsamuel
- Abhishek Ram <[email protected]> @abhishek-ram
- Chad Gates @chadgates
- Bruno Ribeiro da Silva <[email protected]> @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="[email protected]",
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 "[email protected]")

: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, "[email protected]")

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
Loading