Skip to content

Commit a5d93c1

Browse files
authored
fix(deps): use the latest dulwich (#353)
* fix(deps): use the latest dulwich Related to this iterative/dvc#10395 * vendor in some test helpers from dulwich
1 parent 0ed6d87 commit a5d93c1

File tree

4 files changed

+127
-2
lines changed

4 files changed

+127
-2
lines changed

pyproject.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ requires-python = ">=3.9"
2222
dynamic = ["version"]
2323
dependencies = [
2424
"gitpython>3",
25-
"dulwich>=0.21.6",
25+
"dulwich>=0.22.1",
2626
"pygit2>=1.14.0",
2727
"pygtrie>=2.3.2",
2828
"fsspec[tqdm]>=2024.2.0",

tests/test_dulwich.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@
88
import asyncssh
99
import paramiko
1010
import pytest
11-
from dulwich.contrib.test_paramiko_vendor import CLIENT_KEY, PASSWORD, USER, Server
1211
from pytest_mock import MockerFixture
1312
from pytest_test_utils.waiters import wait_until
1413

1514
from scmrepo.git.backend.dulwich.asyncssh_vendor import AsyncSSHVendor
1615

16+
from .vendor.test_paramiko_vendor import (
17+
CLIENT_KEY,
18+
PASSWORD,
19+
USER,
20+
Server,
21+
)
22+
1723
# pylint: disable=redefined-outer-name
1824

1925

tests/vendor/__init__.py

Whitespace-only changes.

tests/vendor/test_paramiko_vendor.py

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# test_paramiko_vendor.py
2+
#
3+
# Dulwich is dual-licensed under the Apache License, Version 2.0 and the GNU
4+
# General Public License as public by the Free Software Foundation; version 2.0
5+
# or (at your option) any later version. You can redistribute it and/or
6+
# modify it under the terms of either of these two licenses.
7+
#
8+
# Unless required by applicable law or agreed to in writing, software
9+
# distributed under the License is distributed on an "AS IS" BASIS,
10+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
# See the License for the specific language governing permissions and
12+
# limitations under the License.
13+
#
14+
# You should have received a copy of the licenses; if not, see
15+
# <http://www.gnu.org/licenses/> for a copy of the GNU General Public License
16+
# and <http://www.apache.org/licenses/LICENSE-2.0> for a copy of the Apache
17+
# License, Version 2.0.
18+
#
19+
20+
"""Tests for paramiko_vendor."""
21+
22+
from io import StringIO
23+
24+
try:
25+
import paramiko
26+
except ImportError:
27+
has_paramiko = False
28+
else:
29+
has_paramiko = True
30+
31+
class Server(paramiko.ServerInterface):
32+
"""http://docs.paramiko.org/en/2.4/api/server.html."""
33+
34+
def __init__(self, commands, *args, **kwargs) -> None:
35+
super().__init__(*args, **kwargs)
36+
self.commands = commands
37+
38+
def check_channel_exec_request(self, channel, command):
39+
self.commands.append(command)
40+
return True
41+
42+
def check_auth_password(self, username, password):
43+
if username == USER and password == PASSWORD:
44+
return paramiko.AUTH_SUCCESSFUL
45+
return paramiko.AUTH_FAILED
46+
47+
def check_auth_publickey(self, username, key):
48+
pubkey = paramiko.RSAKey.from_private_key(StringIO(CLIENT_KEY))
49+
if username == USER and key == pubkey:
50+
return paramiko.AUTH_SUCCESSFUL
51+
return paramiko.AUTH_FAILED
52+
53+
def check_channel_request(self, kind, chanid):
54+
if kind == "session":
55+
return paramiko.OPEN_SUCCEEDED
56+
return paramiko.OPEN_FAILED_ADMINISTRATIVELY_PROHIBITED
57+
58+
def get_allowed_auths(self, username):
59+
return "password,publickey"
60+
61+
62+
USER = "testuser"
63+
PASSWORD = "test"
64+
SERVER_KEY = """\
65+
-----BEGIN RSA PRIVATE KEY-----
66+
MIIEpAIBAAKCAQEAy/L1sSYAzxsMprtNXW4u/1jGXXkQmQ2xtmKVlR+RlIL3a1BH
67+
bzTpPlZyjltAAwzIP8XRh0iJFKz5y3zSQChhX47ZGN0NvQsVct8R+YwsUonwfAJ+
68+
JN0KBKKvC8fPHlzqBr3gX+ZxqsFH934tQ6wdQPH5eQWtdM8L826lMsH1737uyTGk
69+
+mCSDjL3c6EzY83g7qhkJU2R4qbi6ne01FaWADzG8sOzXnHT+xpxtk8TTT8yCVUY
70+
MmBNsSoA/ka3iWz70ghB+6Xb0WpFJZXWq1oYovviPAfZGZSrxBZMxsWMye70SdLl
71+
TqsBEt0+miIcm9s0fvjWvQuhaHX6mZs5VO4r5QIDAQABAoIBAGYqeYWaYgFdrYLA
72+
hUrubUCg+g3NHdFuGL4iuIgRXl4lFUh+2KoOuWDu8Uf60iA1AQNhV0sLvQ/Mbv3O
73+
s4xMLisuZfaclctDiCUZNenqnDFkxEF7BjH1QJV94W5nU4wEQ3/JEmM4D2zYkfKb
74+
FJW33JeyH6TOgUvohDYYEU1R+J9V8qA243p+ui1uVtNI6Pb0TXJnG5y9Ny4vkSWH
75+
Fi0QoMPR1r9xJ4SEearGzA/crb4SmmDTKhGSoMsT3d5ATieLmwcS66xWz8w4oFGJ
76+
yzDq24s4Fp9ccNjMf/xR8XRiekJv835gjEqwF9IXyvgOaq6XJ1iCqGPFDKa25nui
77+
JnEstOkCgYEA/ZXk7aIanvdeJlTqpX578sJfCnrXLydzE8emk1b7+5mrzGxQ4/pM
78+
PBQs2f8glT3t0O0mRX9NoRqnwrid88/b+cY4NCOICFZeasX336/gYQxyVeRLJS6Z
79+
hnGEQqry8qS7PdKAyeHMNmZFrUh4EiHiObymEfQS+mkRUObn0cGBTw8CgYEAzeQU
80+
D2baec1DawjppKaRynAvWjp+9ry1lZx9unryKVRwjRjkEpw+b3/+hdaF1IvsVSce
81+
cNj+6W2guZ2tyHuPhZ64/4SJVyE2hKDSKD4xTb2nVjsMeN0bLD2UWXC9mwbx8nWa
82+
2tmtUZ7a/okQb2cSdosJinRewLNqXIsBXamT1csCgYEA0cXb2RCOQQ6U3dTFPx4A
83+
3vMXuA2iUKmrsqMoEx6T2LBow/Sefdkik1iFOdipVYwjXP+w9zC2QR1Rxez/DR/X
84+
8ymceNUjxPHdrSoTQQG29dFcC92MpDeGXQcuyA+uZjcLhbrLOzYEvsOfxBb87NMG
85+
14hNQPDNekTMREafYo9WrtUCgYAREK54+FVzcwf7fymedA/xb4r9N4v+d3W1iNsC
86+
8d3Qfyc1CrMct8aVB07ZWQaOr2pPRIbJY7L9NhD0UZVt4I/sy1MaGqonhqE2LP4+
87+
R6legDG2e/50ph7yc8gwAaA1kUXMiuLi8Nfkw/3yyvmJwklNegi4aRzRbA2Mzhi2
88+
4q9WMQKBgQCb0JNyxHG4pvLWCF/j0Sm1FfvrpnqSv5678n1j4GX7Ka/TubOK1Y4K
89+
U+Oib7dKa/zQMWehVFNTayrsq6bKVZ6q7zG+IHiRLw4wjeAxREFH6WUjDrn9vl2l
90+
D48DKbBuBwuVOJWyq3qbfgJXojscgNQklrsPdXVhDwOF0dYxP89HnA==
91+
-----END RSA PRIVATE KEY-----"""
92+
CLIENT_KEY = """\
93+
-----BEGIN RSA PRIVATE KEY-----
94+
MIIEpAIBAAKCAQEAxvREKSElPOm/0z/nPO+j5rk2tjdgGcGc7We1QZ6TRXYLu7nN
95+
GeEFIL4p8N1i6dmB+Eydt7xqCU79MWD6Yy4prFe1+/K1wCDUxIbFMxqQcX5zjJzd
96+
i8j8PbcaUlVhP/OkjtkSxrXaGDO1BzfdV4iEBtTV/2l3zmLKJlt3jnOHLczP24CB
97+
DTQKp3rKshbRefzot9Y+wnaK692RsYgsyo9YEP0GyWKG9topCHk13r46J6vGLeuj
98+
ryUKqmbLJkzbJbIcEqwTDo5iHaCVqaMr5Hrb8BdMucSseqZQJsXSd+9tdRcIblUQ
99+
38kZjmFMm4SFbruJcpZCNM2wNSZPIRX+3eiwNwIDAQABAoIBAHSacOBSJsr+jIi5
100+
KUOTh9IPtzswVUiDKwARCjB9Sf8p4lKR4N1L/n9kNJyQhApeikgGT2GCMftmqgoo
101+
tlculQoHFgemBlOmak0MV8NNzF5YKEy/GzF0CDH7gJfEpoyetVFrdA+2QS5yD6U9
102+
XqKQxiBi2VEqdScmyyeT8AwzNYTnPeH/DOEcnbdRjqiy/CD79F49CQ1lX1Fuqm0K
103+
I7BivBH1xo/rVnUP4F+IzocDqoga+Pjdj0LTXIgJlHQDSbhsQqWujWQDDuKb+MAw
104+
sNK4Zf8ErV3j1PyA7f/M5LLq6zgstkW4qikDHo4SpZX8kFOO8tjqb7kujj7XqeaB
105+
CxqrOTECgYEA73uWkrohcmDJ4KqbuL3tbExSCOUiaIV+sT1eGPNi7GCmXD4eW5Z4
106+
75v2IHymW83lORSu/DrQ6sKr1nkuRpqr2iBzRmQpl/H+wahIhBXlnJ25uUjDsuPO
107+
1Pq2LcmyD+jTxVnmbSe/q7O09gZQw3I6H4+BMHmpbf8tC97lqimzpJ0CgYEA1K0W
108+
ZL70Xtn9quyHvbtae/BW07NZnxvUg4UaVIAL9Zu34JyplJzyzbIjrmlDbv6aRogH
109+
/KtuG9tfbf55K/jjqNORiuRtzt1hUN1ye4dyW7tHx2/7lXdlqtyK40rQl8P0kqf8
110+
zaS6BqjnobgSdSpg32rWoL/pcBHPdJCJEgQ8zeMCgYEA0/PK8TOhNIzrP1dgGSKn
111+
hkkJ9etuB5nW5mEM7gJDFDf6JPupfJ/xiwe6z0fjKK9S57EhqgUYMB55XYnE5iIw
112+
ZQ6BV9SAZ4V7VsRs4dJLdNC3tn/rDGHJBgCaym2PlbsX6rvFT+h1IC8dwv0V79Ui
113+
Ehq9WTzkMoE8yhvNokvkPZUCgYEAgBAFxv5xGdh79ftdtXLmhnDvZ6S8l6Fjcxqo
114+
Ay/jg66Tp43OU226iv/0mmZKM8Dd1xC8dnon4GBVc19jSYYiWBulrRPlx0Xo/o+K
115+
CzZBN1lrXH1i6dqufpc0jq8TMf/N+q1q/c1uMupsKCY1/xVYpc+ok71b7J7c49zQ
116+
nOeuUW8CgYA9Infooy65FTgbzca0c9kbCUBmcAPQ2ItH3JcPKWPQTDuV62HcT00o
117+
fZdIV47Nez1W5Clk191RMy8TXuqI54kocciUWpThc6j44hz49oUueb8U4bLcEHzA
118+
WxtWBWHwxfSmqgTXilEA3ALJp0kNolLnEttnhENwJpZHlqtes0ZA4w==
119+
-----END RSA PRIVATE KEY-----"""

0 commit comments

Comments
 (0)