Skip to content

Commit 43c2e55

Browse files
hohodesenfans
andcommitted
Problem: Signatures generated with Python 3.11 are invalid
The signature buffer is affected by the new formatting of string enums. Solution: use the value of the message type enum. Co-authored-by: Olivier Desenfans <[email protected]>
1 parent 8aa9e6f commit 43c2e55

File tree

4 files changed

+55
-3
lines changed

4 files changed

+55
-3
lines changed

src/aleph/sdk/chains/common.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from ecies import decrypt, encrypt
77

88
from aleph.sdk.conf import settings
9+
from aleph.sdk.utils import enum_as_str
910

1011

1112
def get_verification_buffer(message: Dict) -> bytes:
@@ -19,7 +20,16 @@ def get_verification_buffer(message: Dict) -> bytes:
1920
Returns:
2021
bytes: Verification buffer
2122
"""
22-
return "{chain}\n{sender}\n{type}\n{item_hash}".format(**message).encode("utf-8")
23+
24+
# Convert Enum values to strings
25+
return "\n".join(
26+
(
27+
enum_as_str(message["chain"]),
28+
message["sender"],
29+
enum_as_str(message["type"]),
30+
message["item_hash"],
31+
)
32+
).encode()
2333

2434

2535
def get_public_key(private_key):

src/aleph/sdk/utils.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import errno
22
import logging
33
import os
4+
from enum import Enum
45
from pathlib import Path
56
from shutil import make_archive
6-
from typing import Tuple, Type
7+
from typing import Tuple, Type, Union
78
from zipfile import BadZipFile, ZipFile
89

910
from aleph_message.models import MessageType
@@ -76,3 +77,16 @@ def check_unix_socket_valid(unix_socket_path: str) -> bool:
7677
unix_socket_path,
7778
)
7879
return True
80+
81+
82+
def enum_as_str(obj: Union[str, Enum]) -> str:
83+
"""Returns the value of an Enum, or the string itself when passign a string.
84+
85+
Python 3.11 adds a new formatting of string enums.
86+
`str(MyEnum.value)` becomes `MyEnum.value` instead of `value`.
87+
"""
88+
if isinstance(obj, str):
89+
return obj
90+
else:
91+
assert isinstance(obj, Enum)
92+
return obj.value

tests/unit/test_chains.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from aleph_message.models import Chain, ItemType
2+
3+
from aleph.sdk.chains.common import get_verification_buffer
4+
5+
6+
def test_get_verification_buffer():
7+
message = {
8+
"chain": Chain.ETH,
9+
"sender": "0x101d8D16372dBf5f1614adaE95Ee5CCE61998Fc9",
10+
"type": ItemType.inline,
11+
"item_hash": "bd79839bf96e595a06da5ac0b6ba51dea6f7e2591bb913deccded04d831d29f4",
12+
}
13+
assert get_verification_buffer(message) == (
14+
b"ETH\n"
15+
b"0x101d8D16372dBf5f1614adaE95Ee5CCE61998Fc9\n"
16+
b"inline\n"
17+
b"bd79839bf96e595a06da5ac0b6ba51dea6f7e2591bb913deccded04d831d29f4"
18+
)

tests/unit/test_utils.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
from aleph_message.models import (
22
AggregateMessage,
3+
Chain,
34
ForgetMessage,
5+
ItemType,
46
MessageType,
57
PostMessage,
68
ProgramMessage,
79
StoreMessage,
810
)
911

10-
from aleph.sdk.utils import get_message_type_value
12+
from aleph.sdk.utils import enum_as_str, get_message_type_value
1113

1214

1315
def test_get_message_type_value():
@@ -16,3 +18,11 @@ def test_get_message_type_value():
1618
assert get_message_type_value(StoreMessage) == MessageType.store
1719
assert get_message_type_value(ProgramMessage) == MessageType.program
1820
assert get_message_type_value(ForgetMessage) == MessageType.forget
21+
22+
23+
def test_enum_as_str():
24+
assert enum_as_str("simple string") == "simple string"
25+
assert enum_as_str(Chain("ETH")) == "ETH"
26+
assert enum_as_str(Chain.ETH) == "ETH"
27+
assert enum_as_str(ItemType("inline")) == "inline"
28+
assert enum_as_str(ItemType.inline) == "inline"

0 commit comments

Comments
 (0)