evo-cli 0.34.1__tar.gz → 0.34.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {evo_cli-0.34.1 → evo_cli-0.34.3}/PKG-INFO +1 -1
  2. evo_cli-0.34.3/evo_cli/VERSION +1 -0
  3. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/openvpn.py +22 -0
  4. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli.egg-info/PKG-INFO +1 -1
  5. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_openvpn.py +31 -0
  6. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_route.py +1 -1
  7. evo_cli-0.34.1/evo_cli/VERSION +0 -1
  8. {evo_cli-0.34.1 → evo_cli-0.34.3}/Containerfile +0 -0
  9. {evo_cli-0.34.1 → evo_cli-0.34.3}/HISTORY.md +0 -0
  10. {evo_cli-0.34.1 → evo_cli-0.34.3}/LICENSE +0 -0
  11. {evo_cli-0.34.1 → evo_cli-0.34.3}/MANIFEST.in +0 -0
  12. {evo_cli-0.34.1 → evo_cli-0.34.3}/README.md +0 -0
  13. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/__init__.py +0 -0
  14. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/__main__.py +0 -0
  15. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/base.py +0 -0
  16. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/cli.py +0 -0
  17. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/__init__.py +0 -0
  18. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/agent_toy.py +0 -0
  19. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/claude_code.py +0 -0
  20. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/cloudflare.py +0 -0
  21. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/cred.py +0 -0
  22. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/download.py +0 -0
  23. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/fix_claude.py +0 -0
  24. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/gdrive.py +0 -0
  25. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/gh.py +0 -0
  26. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/__init__.py +0 -0
  27. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_dag.py +0 -0
  28. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_git.py +0 -0
  29. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_hub.py +0 -0
  30. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_mirror.py +0 -0
  31. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_model.py +0 -0
  32. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_mutate.py +0 -0
  33. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_paths.py +0 -0
  34. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_render.py +0 -0
  35. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/_server.py +0 -0
  36. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/check.py +0 -0
  37. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/clone.py +0 -0
  38. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/edit.py +0 -0
  39. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/pull.py +0 -0
  40. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/serve.py +0 -0
  41. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/show.py +0 -0
  42. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/views.py +0 -0
  43. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/index-Cs7hXRPJ.css +0 -0
  44. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/index-CuNOlaH7.js +0 -0
  45. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  46. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  47. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  48. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  49. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  50. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  51. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  52. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  53. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  54. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  55. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  56. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  57. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/harness/web/index.html +0 -0
  58. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/hwid.py +0 -0
  59. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/hwid_reset.py +0 -0
  60. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/image.py +0 -0
  61. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/localproxy.py +0 -0
  62. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/mcp.py +0 -0
  63. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/miniconda.py +0 -0
  64. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/netcheck.py +0 -0
  65. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/ngrok.py +0 -0
  66. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/opencode.py +0 -0
  67. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/openvpn.py +0 -0
  68. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/plantuml.py +0 -0
  69. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/__init__.py +0 -0
  70. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/_dns.py +0 -0
  71. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/_dpi.py +0 -0
  72. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/_hosts.py +0 -0
  73. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/_page.py +0 -0
  74. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/_probe.py +0 -0
  75. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/_spoofdpi.py +0 -0
  76. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/check.py +0 -0
  77. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/fix.py +0 -0
  78. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/probe.py +0 -0
  79. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/route/status.py +0 -0
  80. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/serp.py +0 -0
  81. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/site2s.py +0 -0
  82. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/ssh.py +0 -0
  83. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/storage.py +0 -0
  84. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/sysmon.py +0 -0
  85. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/tts.py +0 -0
  86. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/update.py +0 -0
  87. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/commands/wifi.py +0 -0
  88. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/console.py +0 -0
  89. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/__init__.py +0 -0
  90. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/doctor.py +0 -0
  91. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/google_oauth.py +0 -0
  92. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/migrate.py +0 -0
  93. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/oauth_flow.py +0 -0
  94. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/registry.py +0 -0
  95. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/store.py +0 -0
  96. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/credentials/sync.py +0 -0
  97. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/imaging/__init__.py +0 -0
  98. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/imaging/align.py +0 -0
  99. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/imaging/core.py +0 -0
  100. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/imaging/creds.py +0 -0
  101. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/imaging/errors.py +0 -0
  102. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/imaging/gemini.py +0 -0
  103. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/imaging/ncnn.py +0 -0
  104. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/mcp_registry.py +0 -0
  105. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/serp/__init__.py +0 -0
  106. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/serp/client.py +0 -0
  107. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/serp/creds.py +0 -0
  108. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/serp/errors.py +0 -0
  109. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/serp/install.py +0 -0
  110. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/serp/render.py +0 -0
  111. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/__init__.py +0 -0
  112. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/chunking.py +0 -0
  113. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/core.py +0 -0
  114. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/creds.py +0 -0
  115. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/errors.py +0 -0
  116. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/gemini.py +0 -0
  117. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/http.py +0 -0
  118. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/openai.py +0 -0
  119. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/player.py +0 -0
  120. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli/tts/vbee.py +0 -0
  121. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli.egg-info/SOURCES.txt +0 -0
  122. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli.egg-info/dependency_links.txt +0 -0
  123. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli.egg-info/entry_points.txt +0 -0
  124. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli.egg-info/requires.txt +0 -0
  125. {evo_cli-0.34.1 → evo_cli-0.34.3}/evo_cli.egg-info/top_level.txt +0 -0
  126. {evo_cli-0.34.1 → evo_cli-0.34.3}/pyproject.toml +0 -0
  127. {evo_cli-0.34.1 → evo_cli-0.34.3}/setup.cfg +0 -0
  128. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/__init__.py +0 -0
  129. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/fake_evo_agents.py +0 -0
  130. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/fixtures/hub/contract-0.2.0.json +0 -0
  131. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/fixtures/hub/mirror-demo.yaml +0 -0
  132. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_agent_toy.py +0 -0
  133. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_claude_code.py +0 -0
  134. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_cli.py +0 -0
  135. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_console.py +0 -0
  136. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_cred.py +0 -0
  137. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_download.py +0 -0
  138. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_fix_claude.py +0 -0
  139. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_gdrive.py +0 -0
  140. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_gh.py +0 -0
  141. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_harness.py +0 -0
  142. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_harness_clone.py +0 -0
  143. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_harness_dag.py +0 -0
  144. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_harness_hub.py +0 -0
  145. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_harness_show.py +0 -0
  146. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_image.py +0 -0
  147. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_mcp.py +0 -0
  148. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_ngrok.py +0 -0
  149. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_opencode.py +0 -0
  150. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_plantuml.py +0 -0
  151. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_serp.py +0 -0
  152. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_storage.py +0 -0
  153. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_sysmon.py +0 -0
  154. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_tts.py +0 -0
  155. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_update.py +0 -0
  156. {evo_cli-0.34.1 → evo_cli-0.34.3}/tests/test_wifi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.34.1
3
+ Version: 0.34.3
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -0,0 +1 @@
1
+ 0.34.3
@@ -23,6 +23,8 @@ from urllib.parse import parse_qs, urlparse
23
23
  from evo_cli.credentials.store import CredentialError, compile_flat, read_flat, set_value
24
24
 
25
25
  APP = Path("/Applications/OpenVPN Connect/OpenVPN Connect.app/Contents/MacOS/OpenVPN Connect")
26
+ # OpenVPN 2.6's default --data-ciphers.
27
+ DATA_CIPHERS = ("AES-256-GCM", "AES-128-GCM", "CHACHA20-POLY1305")
26
28
  INLINE = {"ca", "cert", "key", "tls-auth", "tls-crypt", "tls-crypt-v2", "extra-certs"}
27
29
  # Only self-contained client profiles: never execute scripts/plugins or follow includes as root.
28
30
  OPTIONS = {
@@ -184,6 +186,24 @@ def uses_credentials(text):
184
186
  return any(words[0].removeprefix("--") == "auth-user-pass" for _, words in _directives(text))
185
187
 
186
188
 
189
+ def data_ciphers(text):
190
+ """The --data-ciphers to pass for a profile that names only --cipher, else None.
191
+
192
+ OpenVPN 2.5 and Connect offer that cipher too; 2.6 no longer does, so a server that accepts nothing else
193
+ (Access Server profiles carry "cipher AES-256-CBC") ends with "no shared cipher". The defaults stay first.
194
+ """
195
+ cipher = None
196
+ for _, words in _directives(text):
197
+ option = words[0].removeprefix("--")
198
+ if option == "data-ciphers":
199
+ return None
200
+ if option == "cipher" and len(words) == 2:
201
+ cipher = words[1]
202
+ if not cipher or cipher.upper() in DATA_CIPHERS:
203
+ return None
204
+ return ":".join([*DATA_CIPHERS, cipher])
205
+
206
+
187
207
  def takes_default_route(text):
188
208
  """Whether a profile may take the default route. Only split-tunnel profiles can run beside another VPN.
189
209
 
@@ -635,6 +655,8 @@ def worker(name, timeout):
635
655
  # With no password to ask for, a server can add a sign-in step only through the browser (Access
636
656
  # Server SAML); announce it, or such a server refuses the client.
637
657
  command += ["--setenv", "IV_SSO", "openurl,webauth"]
658
+ if ciphers := data_ciphers(profile["config"]):
659
+ command += ["--data-ciphers", ciphers]
638
660
  pinned = [] if takes_default_route(profile["config"]) else remotes
639
661
  if profile.get("otp_url"):
640
662
  pinned = [*pinned, urlparse(profile["otp_url"]).hostname]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.34.1
3
+ Version: 0.34.3
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -367,6 +367,37 @@ def test_worker_pins_the_otp_host_even_for_a_full_tunnel(store, monkeypatch):
367
367
  assert pinned == [["otp.example"]]
368
368
 
369
369
 
370
+ @pytest.mark.parametrize(
371
+ "extra,expected",
372
+ [
373
+ ("", None),
374
+ ("cipher AES-256-CBC\n", "AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305:AES-256-CBC"),
375
+ ("cipher AES-256-GCM\n", None),
376
+ ("cipher AES-256-CBC\ndata-ciphers AES-256-GCM\n", None),
377
+ ],
378
+ )
379
+ def test_a_profile_cipher_is_offered_after_the_defaults(extra, expected):
380
+ assert vpn.data_ciphers(CONFIG + extra) == expected
381
+
382
+
383
+ def test_worker_passes_the_profile_cipher(store, monkeypatch):
384
+ vpn.save_profile("m1", {"config": CERT_ONLY + "cipher AES-256-CBC\n"})
385
+ monkeypatch.setattr(sys, "stdin", io.StringIO("\n"))
386
+ monkeypatch.setattr(vpn.os, "geteuid", lambda: 0)
387
+ monkeypatch.setattr(vpn.shutil, "which", lambda _: "/fake/openvpn")
388
+ monkeypatch.setattr(vpn, "pin_remotes", lambda command, hosts: command)
389
+ started = []
390
+
391
+ def popen(command, **_):
392
+ started.append(command)
393
+ raise OSError("stop before running anything")
394
+
395
+ monkeypatch.setattr(vpn.subprocess, "Popen", popen)
396
+ vpn.worker("m1", 10)
397
+ command = started[0]
398
+ assert command[command.index("--data-ciphers") + 1].endswith(":AES-256-CBC")
399
+
400
+
370
401
  @pytest.mark.parametrize(
371
402
  "message,expected",
372
403
  [
@@ -429,7 +429,7 @@ def _fake_macos_bypass(monkeypatch, tmp_path, proxy_fails=()):
429
429
  monkeypatch.setattr(_dpi, "is_admin", lambda: False)
430
430
  monkeypatch.setattr(_probe, "diagnose", lambda host, timeout: {"host": host, "verdict": _probe.SNI_BLOCKED})
431
431
  monkeypatch.setattr(_spoofdpi, "ensure", ensure)
432
- monkeypatch.setattr(_spoofdpi, "browser_overrides", lambda: [])
432
+ monkeypatch.setattr(_spoofdpi, "browser_overrides", list)
433
433
  monkeypatch.setattr(
434
434
  _probe, "proxy_probe", lambda host, proxy, timeout=6.0: _probe_row(host, tls=host not in proxy_fails)
435
435
  )
@@ -1 +0,0 @@
1
- 0.34.1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes