commit:     d4def4496b90aee34ba33027da6d4a00d4be4115
Author:     Gonçalo Negrier Duarte <gonegrier.duarte <AT> gmail <DOT> com>
AuthorDate: Thu Aug 14 14:34:32 2025 +0000
Commit:     David Roman <davidroman96 <AT> gmail <DOT> com>
CommitDate: Thu Aug 14 14:37:04 2025 +0000
URL:        https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=d4def449

dev-python/steam: add 2.0.0, drop 1.6.1
* add patch for `dev-python/pycryptodome` and remove test that relies on 
`dev-python/gevent`

Bug: https://bugs.gentoo.org/879011
Bug: https://bugs.gentoo.org/910098
Signed-off-by: Gonçalo Negrier Duarte <gonegrier.duarte <AT> gmail.com>

 dev-python/steam/Manifest                          |   2 +-
 .../steam-2.0.0-path-pycryptodome-and-gevent.patch | 188 +++++++++++++++++++++
 .../{steam-1.6.1.ebuild => steam-2.0.0.ebuild}     |  12 +-
 3 files changed, 200 insertions(+), 2 deletions(-)

diff --git a/dev-python/steam/Manifest b/dev-python/steam/Manifest
index 9a40ad9f58..60ad0dc288 100644
--- a/dev-python/steam/Manifest
+++ b/dev-python/steam/Manifest
@@ -1 +1 @@
-DIST steam-1.6.1.gh.tar.gz 888055 BLAKE2B 
b02fcfbab0a3fba49eedc66720f50c3c191b01a0361500c5c8bb24c685bc6a463f25185bbb128483d8bd65a63474ed40689dd3174205610438295dd7e9e0b324
 SHA512 
4dcc2777232f0ddd946512edad495385d0132658eeb10e9510e56e472ae5ce193fe1de0e7e36b552aedef792ca2cf4d1a1429ecee535c948c512c5f5055a6632
+DIST steam-2.0.0.gh.tar.gz 675414 BLAKE2B 
9ee5c412a1a7f498a773aaf290bba4b268ea71e929d6cec3cbe6629f4af994cb375aaac102364d5fe3aa5b14c40078a53ecd12adea09ee9bb06f8412d6880994
 SHA512 
7168dc500ae116dc8230abf9405cfd46f9ec9a518e9c0e2ee7902a610dbc2fff92e975061f080c257746979b9fd240d713ced53603b44cbc5361118174eae1b9

diff --git 
a/dev-python/steam/files/steam-2.0.0-path-pycryptodome-and-gevent.patch 
b/dev-python/steam/files/steam-2.0.0-path-pycryptodome-and-gevent.patch
new file mode 100644
index 0000000000..571a48d17a
--- /dev/null
+++ b/dev-python/steam/files/steam-2.0.0-path-pycryptodome-and-gevent.patch
@@ -0,0 +1,188 @@
+From dd8334ce47dbb0c5cc5547094e9800e7789821ce Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Gon=C3=A7alo=20Negrier=20Duarte?=
+ <[email protected]>
+Date: Thu, 14 Aug 2025 15:30:13 +0100
+Subject: [PATCH] dev-python: patched for `dev-python/pycryptodome` and remove
+ test depend on `dev-python/gevent`
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+* Since `dev-python/gevent` was removed in BUG 879011 so
+  tests/test_core_cm.py need to be removed
+
+Signed-off-by: Gonçalo Negrier Duarte <[email protected]>
+---
+ steam/core/crypto.py  |   8 +--
+ tests/test_core_cm.py | 140 ------------------------------------------
+ 2 files changed, 4 insertions(+), 144 deletions(-)
+ delete mode 100644 tests/test_core_cm.py
+
+diff --git a/steam/core/crypto.py b/steam/core/crypto.py
+index 9557ee6..7894dcf 100644
+--- a/steam/core/crypto.py
++++ b/steam/core/crypto.py
+@@ -6,10 +6,10 @@ from os import urandom as random_bytes
+ from struct import pack
+ from base64 import b64decode
+ 
+-from Cryptodome.Hash import MD5, SHA1, HMAC
+-from Cryptodome.PublicKey.RSA import import_key as rsa_import_key, construct 
as rsa_construct
+-from Cryptodome.Cipher import PKCS1_OAEP, PKCS1_v1_5
+-from Cryptodome.Cipher import AES as AES
++from Crypto.Hash import MD5, SHA1, HMAC
++from Crypto.PublicKey.RSA import import_key as rsa_import_key, construct as 
rsa_construct
++from Crypto.Cipher import PKCS1_OAEP, PKCS1_v1_5
++from Crypto.Cipher import AES as AES
+ 
+ 
+ class UniverseKey:
+diff --git a/tests/test_core_cm.py b/tests/test_core_cm.py
+deleted file mode 100644
+index bbc2c27..0000000
+--- a/tests/test_core_cm.py
++++ /dev/null
+@@ -1,140 +0,0 @@
+-import unittest
+-from unittest.mock import patch
+-import gevent
+-import gevent.queue
+-
+-from steam.core.cm import CMClient
+-
+-class CMClient_Scenarios(unittest.TestCase):
+-    test_channel_key = b'SESSION KEY LOL'
+-
+-    def setUp(self):
+-        # mock out crypto
+-        patcher = patch('steam.core.crypto.generate_session_key')
+-        self.addCleanup(patcher.stop)
+-        self.gen_skey = patcher.start()
+-        self.gen_skey.return_value = (self.test_channel_key, b'PUBKEY 
ENCRYPTED SESSION KEY')
+-
+-        patcher = patch('steam.core.crypto.symmetric_encrypt')
+-        self.addCleanup(patcher.stop)
+-        self.s_enc = patcher.start()
+-        self.s_enc.side_effect = lambda m, k: m
+-        patcher = patch('steam.core.crypto.symmetric_encrypt_HMAC')
+-        self.addCleanup(patcher.stop)
+-        self.s_enc_hmac = patcher.start()
+-        self.s_enc_hmac.side_effect = lambda m, k, mac: m
+-
+-        patcher = patch('steam.core.crypto.symmetric_decrypt')
+-        self.addCleanup(patcher.stop)
+-        self.s_dec = patcher.start()
+-        self.s_dec.side_effect = lambda c, k: c
+-        patcher = patch('steam.core.crypto.symmetric_decrypt_HMAC')
+-        self.addCleanup(patcher.stop)
+-        self.s_dec_hmac = patcher.start()
+-        self.s_dec_hmac.side_effect = lambda c, k, mac: c
+-
+-        # TODO: Tests for WebsocketConnection
+-
+-        # mock out TCPConnection
+-        patcher = patch('steam.core.cm.TCPConnection', autospec=True)
+-        self.addCleanup(patcher.stop)
+-        self.conn = patcher.start().return_value
+-
+-        self.conn_in = gevent.queue.Queue()
+-        self.conn.__iter__.return_value = self.conn_in
+-
+-        # mock out CMServerList
+-        patcher = patch('steam.core.cm.CMServerList', autospec=True)
+-        self.addCleanup(patcher.stop)
+-        self.server_list = patcher.start().return_value
+-        self.server_list.__iter__.return_value = [(127001, 20000+i) for i in 
range(10)]
+-        self.server_list.bootstrap_from_webapi.return_value = False
+-        self.server_list.bootstrap_from_dns.return_value = False
+-
+-    @patch.object(CMClient, 'emit')
+-    @patch.object(CMClient, '_recv_messages')
+-    def test_connect(self, mock_recv, mock_emit):
+-        # setup
+-        self.conn.connect.return_value = True
+-        self.server_list.__len__.return_value = 10
+-
+-        # run
+-        cm = CMClient()
+-
+-        with gevent.Timeout(2, False):
+-            cm.connect(retry=1)
+-
+-        gevent.idle()
+-
+-        # verify
+-        self.conn.connect.assert_called_once_with((127001, 20000))
+-        mock_emit.assert_called_once_with('connected')
+-        mock_recv.assert_called_once_with()
+-
+-    @patch.object(CMClient, 'emit')
+-    @patch.object(CMClient, '_recv_messages')
+-    def test_connect_auto_discovery_failing(self, mock_recv, mock_emit):
+-        # setup
+-        self.conn.connect.return_value = True
+-        self.server_list.__len__.return_value = 0
+-
+-        # run
+-        cm = CMClient()
+-
+-        with gevent.Timeout(3, False):
+-            cm.connect(retry=1)
+-
+-        gevent.idle()
+-
+-        # verify
+-        self.server_list.bootstrap_from_webapi.assert_called_once_with()
+-        self.server_list.bootstrap_from_dns.assert_called_once_with()
+-        self.conn.connect.assert_not_called()
+-
+-    @patch.object(CMClient, 'emit')
+-    @patch.object(CMClient, '_recv_messages')
+-    def test_connect_auto_discovery_success(self, mock_recv, mock_emit):
+-        # setup
+-        self.conn.connect.return_value = True
+-        self.server_list.__len__.return_value = 0
+-
+-        def fake_servers(*args, **kwargs):
+-            self.server_list.__len__.return_value = 10
+-            return True
+-
+-        self.server_list.bootstrap_from_webapi.side_effect = fake_servers
+-
+-        # run
+-        cm = CMClient()
+-
+-        with gevent.Timeout(3, False):
+-            cm.connect(retry=1)
+-
+-        gevent.idle()
+-
+-        # verify
+-        self.server_list.bootstrap_from_webapi.assert_called_once_with()
+-        self.server_list.bootstrap_from_dns.assert_not_called()
+-        self.conn.connect.assert_called_once_with((127001, 20000))
+-        mock_emit.assert_called_once_with('connected')
+-        mock_recv.assert_called_once_with()
+-
+-    def test_channel_encrypt_sequence(self):
+-        # setup
+-        self.conn.connect.return_value = True
+-
+-        # run ------------
+-        cm = CMClient()
+-        cm.connected = True
+-        gevent.spawn(cm._recv_messages)
+-
+-        # recieve ChannelEncryptRequest
+-        
self.conn_in.put(b'\x17\x05\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x00\x00\x01\x00\x00\x00')
+-        gevent.idle(); gevent.idle(); gevent.idle(); gevent.idle()
+-
+-        
self.conn.put_message.assert_called_once_with(b'\x18\x05\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x00\x00\x80\x00\x00\x00PUBKEY
 ENCRYPTED SESSION 
KEY\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00h-\xc4@\x00\x00\x00\x00')
+-
+-        # recieve ChannelEncryptResult (OK)
+-        
self.conn_in.put(b'\x19\x05\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00\x00\x00')
+-
+-        cm.wait_event('channel_secured', timeout=2, raises=True)
+-- 
+2.50.0
+

diff --git a/dev-python/steam/steam-1.6.1.ebuild 
b/dev-python/steam/steam-2.0.0.ebuild
similarity index 86%
rename from dev-python/steam/steam-1.6.1.ebuild
rename to dev-python/steam/steam-2.0.0.ebuild
index d5e124beed..e18f80fe95 100644
--- a/dev-python/steam/steam-1.6.1.ebuild
+++ b/dev-python/steam/steam-2.0.0.ebuild
@@ -14,9 +14,14 @@ HOMEPAGE="
        https://pypi.org/project/steam/
 "
 SRC_URI="
-       
https://github.com/solsticegamestudios/steam/archive/refs/tags/v${PV}.tar.gz
+       
https://github.com/solsticegamestudios/steam/archive/refs/tags/v${PV}-alpha1.tar.gz
                -> ${P}.gh.tar.gz
 "
+S="${WORKDIR}/${P}-alpha1"
+
+PATCHES=(
+       "${FILESDIR}/${P}-path-pycryptodome-and-gevent.patch"
+)
 
 LICENSE="GPL-3"
 SLOT="0"
@@ -34,6 +39,11 @@ RDEPEND="
        dev-python/wsproto[${PYTHON_USEDEP}]
 "
 
+BDEPEND="
+       dev-python/vcrpy[${PYTHON_USEDEP}]
+       dev-python/mock[${PYTHON_USEDEP}]
+"
+
 distutils_enable_tests pytest
 
 pkg_postinst() {

Reply via email to