Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
chadgates committed Mar 18, 2024
2 parents 8add140 + af63a9b commit 0d88e38
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 11 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 <[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
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Release History

## 1.4.3 - 2023-01-25

* fix: update pyopenssl version to resovle pyca/cryptography#7959

## 1.4.2 - 2022-12-11

* fix: update the black version to fix github ci pipeline
Expand Down
2 changes: 1 addition & 1 deletion pyas2lib/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from pyas2lib.as2 import Organization
from pyas2lib.as2 import Partner

__version__ = "1.4.1"
__version__ = "1.4.3"


__all__ = [
Expand Down
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
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
install_requires = [
"asn1crypto==1.5.1",
"oscrypto==1.3.0",
"pyOpenSSL==21.0.0",
"pyOpenSSL==23.2.0",
]

tests_require = [
Expand All @@ -27,7 +27,7 @@
long_description="Docs for this project are maintained at "
"https://github.com/abhishek-ram/pyas2-lib/blob/"
"master/README.md",
version="1.4.2",
version="1.4.3",
author="Abhishek Ram",
author_email="[email protected]",
packages=find_packages(where=".", exclude=("test*",)),
Expand Down

0 comments on commit 0d88e38

Please sign in to comment.