robustrep 0.1.1__tar.gz → 0.1.2__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 (68) hide show
  1. {robustrep-0.1.1 → robustrep-0.1.2}/CHANGELOG.md +14 -0
  2. {robustrep-0.1.1/robustrep.egg-info → robustrep-0.1.2}/PKG-INFO +2 -2
  3. {robustrep-0.1.1 → robustrep-0.1.2}/constraints.txt +1 -1
  4. {robustrep-0.1.1 → robustrep-0.1.2}/pyproject.toml +5 -2
  5. {robustrep-0.1.1 → robustrep-0.1.2/robustrep.egg-info}/PKG-INFO +2 -2
  6. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep.egg-info/requires.txt +1 -1
  7. {robustrep-0.1.1 → robustrep-0.1.2}/tests/e2e/test_live.py +8 -8
  8. {robustrep-0.1.1 → robustrep-0.1.2}/LICENSE +0 -0
  9. {robustrep-0.1.1 → robustrep-0.1.2}/MANIFEST.in +0 -0
  10. {robustrep-0.1.1 → robustrep-0.1.2}/README.md +0 -0
  11. {robustrep-0.1.1 → robustrep-0.1.2}/SECURITY.md +0 -0
  12. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/__init__.py +0 -0
  13. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/aggregate.py +0 -0
  14. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/cli.py +0 -0
  15. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/config.py +0 -0
  16. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/evidence.py +0 -0
  17. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/explain.py +0 -0
  18. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/normalize.py +0 -0
  19. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/pipeline.py +0 -0
  20. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/__init__.py +0 -0
  21. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/adversarial.py +0 -0
  22. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/export.py +0 -0
  23. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/figures.py +0 -0
  24. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/provenance_keys.py +0 -0
  25. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/publish.py +0 -0
  26. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/render.py +0 -0
  27. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/report/sensitivity.py +0 -0
  28. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/schema.py +0 -0
  29. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/__init__.py +0 -0
  30. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/base_erc8004.py +0 -0
  31. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/blockscout_util.py +0 -0
  32. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/evidence_batch.py +0 -0
  33. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/evidence_fetch.py +0 -0
  34. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/http_util.py +0 -0
  35. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/rater_profile.py +0 -0
  36. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sources/rpc.py +0 -0
  37. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/store.py +0 -0
  38. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep/sybil.py +0 -0
  39. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep.egg-info/SOURCES.txt +0 -0
  40. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep.egg-info/dependency_links.txt +0 -0
  41. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep.egg-info/entry_points.txt +0 -0
  42. {robustrep-0.1.1 → robustrep-0.1.2}/robustrep.egg-info/top_level.txt +0 -0
  43. {robustrep-0.1.1 → robustrep-0.1.2}/setup.cfg +0 -0
  44. {robustrep-0.1.1 → robustrep-0.1.2}/tests/adversarial/test_attacks.py +0 -0
  45. {robustrep-0.1.1 → robustrep-0.1.2}/tests/conftest.py +0 -0
  46. {robustrep-0.1.1 → robustrep-0.1.2}/tests/e2e/fixtures/base_logs_2000.json +0 -0
  47. {robustrep-0.1.1 → robustrep-0.1.2}/tests/e2e/test_replay.py +0 -0
  48. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_aggregate.py +0 -0
  49. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_base_erc8004.py +0 -0
  50. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_blockscout_util.py +0 -0
  51. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_cli.py +0 -0
  52. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_conn_guard.py +0 -0
  53. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_evidence.py +0 -0
  54. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_evidence_batch.py +0 -0
  55. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_evidence_fetch.py +0 -0
  56. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_explain.py +0 -0
  57. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_http_util.py +0 -0
  58. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_live_guard.py +0 -0
  59. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_normalize.py +0 -0
  60. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_pipeline.py +0 -0
  61. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_rater_profile.py +0 -0
  62. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_report.py +0 -0
  63. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_report_publish.py +0 -0
  64. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_rpc.py +0 -0
  65. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_schema.py +0 -0
  66. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_store.py +0 -0
  67. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_sybil.py +0 -0
  68. {robustrep-0.1.1 → robustrep-0.1.2}/tests/unit/test_version.py +0 -0
@@ -4,6 +4,19 @@ All notable changes to robustrep are recorded here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); the project is pre-1.0,
5
5
  so a `0.x` bump may change published numbers without changing the API.
6
6
 
7
+ ## [0.1.2] — 2026-10-03
8
+
9
+ A dependency security release. No API, CLI or scoring changes.
10
+
11
+ ### Security — Fixed
12
+
13
+ - **urllib3 floor raised to 2.8.** urllib3 2.6–2.7 can enter an infinite loop
14
+ on a chunked deflate stream (PYSEC-2026-4176) and buffer an unbounded
15
+ chunk-size line into memory (PYSEC-2026-4177). Both are reachable from
16
+ `fetch`, which reads responses from attacker-chosen evidence hosts, so a
17
+ hostile URI could hang or exhaust the fetcher. 2.8 also fixes HTTPS-proxy TLS
18
+ settings being ignored (PYSEC-2026-4175). The CI pin moves to 2.8.0 as well.
19
+
7
20
  ## [0.1.1] — 2026-09-15
8
21
 
9
22
  A security release: it closes every finding of an external security review of
@@ -114,5 +127,6 @@ no longer rescales a group by its own extremes.
114
127
  Initial release on PyPI: the scoring library, the Base ERC-8004 adapter, and the
115
128
  reproducible report.
116
129
 
130
+ [0.1.2]: https://github.com/iamdongwang/robustrep/compare/v0.1.1...v0.1.2
117
131
  [0.1.1]: https://github.com/iamdongwang/robustrep/compare/v0.1.0...v0.1.1
118
132
  [0.1.0]: https://github.com/iamdongwang/robustrep/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robustrep
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Robust, transport-agnostic reputation scoring for AI agents
5
5
  Author: Dong Wang
6
6
  License: Apache-2.0
@@ -25,7 +25,7 @@ Requires-Dist: numpy>=1.24
25
25
  Requires-Dist: eth-abi>=5.0
26
26
  Requires-Dist: eth-hash[pycryptodome]>=0.5
27
27
  Requires-Dist: requests>=2.31
28
- Requires-Dist: urllib3>=2.6
28
+ Requires-Dist: urllib3>=2.8
29
29
  Requires-Dist: tabulate>=0.9
30
30
  Requires-Dist: matplotlib>=3.7
31
31
  Requires-Dist: typer>=0.12
@@ -98,7 +98,7 @@ typer==0.27.2
98
98
  typing-inspection==0.4.4
99
99
  typing_extensions==4.16.0
100
100
  tzdata==2026.4
101
- urllib3==2.7.0
101
+ urllib3==2.8.0
102
102
  zipp==4.1.0
103
103
  # -- hand-added (not emitted by `pip freeze` on the dev box) -----------------
104
104
  # pip itself: freeze omits it. CI installs this version explicitly before the
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "robustrep"
7
- version = "0.1.1"
7
+ version = "0.1.2"
8
8
  description = "Robust, transport-agnostic reputation scoring for AI agents"
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -31,7 +31,10 @@ dependencies = [
31
31
  # decompression bomb (`max_length` on urllib3's decoders) first exists in
32
32
  # 2.6.0. On 2.0-2.5 the same call decompresses the whole body before
33
33
  # truncating -- measured at a 455 MB peak against 0.8 MB on 2.7.
34
- "urllib3>=2.6",
34
+ # >=2.8: 2.6-2.7 can loop forever on a chunked deflate stream and buffer an
35
+ # unbounded chunk-size line (PYSEC-2026-4176/4177), both reachable from an
36
+ # attacker-chosen evidence host.
37
+ "urllib3>=2.8",
35
38
  "tabulate>=0.9",
36
39
  "matplotlib>=3.7",
37
40
  "typer>=0.12",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: robustrep
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Robust, transport-agnostic reputation scoring for AI agents
5
5
  Author: Dong Wang
6
6
  License: Apache-2.0
@@ -25,7 +25,7 @@ Requires-Dist: numpy>=1.24
25
25
  Requires-Dist: eth-abi>=5.0
26
26
  Requires-Dist: eth-hash[pycryptodome]>=0.5
27
27
  Requires-Dist: requests>=2.31
28
- Requires-Dist: urllib3>=2.6
28
+ Requires-Dist: urllib3>=2.8
29
29
  Requires-Dist: tabulate>=0.9
30
30
  Requires-Dist: matplotlib>=3.7
31
31
  Requires-Dist: typer>=0.12
@@ -3,7 +3,7 @@ numpy>=1.24
3
3
  eth-abi>=5.0
4
4
  eth-hash[pycryptodome]>=0.5
5
5
  requests>=2.31
6
- urllib3>=2.6
6
+ urllib3>=2.8
7
7
  tabulate>=0.9
8
8
  matplotlib>=3.7
9
9
  typer>=0.12
@@ -132,14 +132,14 @@ def rpc_available():
132
132
  def test_live_recent_blocks(tmp_path):
133
133
  cfg = Config()
134
134
  rpc = RpcClient(cfg.rpc_urls, user_agent=cfg.user_agent)
135
- store = Store(tmp_path / "live.db")
136
- with rpc_available():
137
- head = int(rpc.call("eth_blockNumber", []), 16)
138
- base.sync_feedback(store, rpc, chunk=2000, start_block=head - 3999, end_block=head)
139
- assert store.get_sync("last_block") == str(head)
140
- with rpc_available():
141
- base.fill_block_timestamps(store, rpc)
142
- assert store.missing_block_ts() == []
135
+ with Store(tmp_path / "live.db") as store:
136
+ with rpc_available():
137
+ head = int(rpc.call("eth_blockNumber", []), 16)
138
+ base.sync_feedback(store, rpc, chunk=2000, start_block=head - 3999, end_block=head)
139
+ assert store.get_sync("last_block") == str(head)
140
+ with rpc_available():
141
+ base.fill_block_timestamps(store, rpc)
142
+ assert store.missing_block_ts() == []
143
143
 
144
144
 
145
145
  @pytest.mark.live
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