axross 0.4.1__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 (257) hide show
  1. axross-0.4.1/CONTRIBUTING.md +98 -0
  2. axross-0.4.1/INSTALL.md +227 -0
  3. axross-0.4.1/LICENSE +200 -0
  4. axross-0.4.1/MANIFEST.in +7 -0
  5. axross-0.4.1/NOTICE +30 -0
  6. axross-0.4.1/OAUTH_SETUP.md +105 -0
  7. axross-0.4.1/PKG-INFO +265 -0
  8. axross-0.4.1/README.md +225 -0
  9. axross-0.4.1/README_PYPI.md +143 -0
  10. axross-0.4.1/README_de.md +216 -0
  11. axross-0.4.1/README_es.md +219 -0
  12. axross-0.4.1/SECURITY.md +70 -0
  13. axross-0.4.1/THIRD_PARTY_LICENSES.md +69 -0
  14. axross-0.4.1/axross/__init__.py +18 -0
  15. axross-0.4.1/axross/__main__.py +7 -0
  16. axross-0.4.1/axross/_version.py +5 -0
  17. axross-0.4.1/axross/cli.py +9 -0
  18. axross-0.4.1/axross.egg-info/PKG-INFO +265 -0
  19. axross-0.4.1/axross.egg-info/SOURCES.txt +255 -0
  20. axross-0.4.1/axross.egg-info/dependency_links.txt +1 -0
  21. axross-0.4.1/axross.egg-info/entry_points.txt +2 -0
  22. axross-0.4.1/axross.egg-info/requires.txt +115 -0
  23. axross-0.4.1/axross.egg-info/top_level.txt +6 -0
  24. axross-0.4.1/core/__init__.py +0 -0
  25. axross-0.4.1/core/adb_client.py +883 -0
  26. axross-0.4.1/core/append_helpers.py +62 -0
  27. axross-0.4.1/core/archive.py +578 -0
  28. axross-0.4.1/core/atomic_io.py +146 -0
  29. axross-0.4.1/core/atomic_recovery.py +150 -0
  30. axross-0.4.1/core/azure_client.py +1134 -0
  31. axross-0.4.1/core/backend.py +167 -0
  32. axross-0.4.1/core/backend_registry.py +873 -0
  33. axross-0.4.1/core/bookmarks.py +187 -0
  34. axross-0.4.1/core/capability_contracts.py +84 -0
  35. axross-0.4.1/core/cas.py +401 -0
  36. axross-0.4.1/core/client_identity.py +81 -0
  37. axross-0.4.1/core/connect_worker.py +269 -0
  38. axross-0.4.1/core/connection_manager.py +493 -0
  39. axross-0.4.1/core/credentials.py +283 -0
  40. axross-0.4.1/core/db_fs_base.py +431 -0
  41. axross-0.4.1/core/destructive_preview.py +143 -0
  42. axross-0.4.1/core/dfsn_client.py +185 -0
  43. axross-0.4.1/core/diagnostics.py +139 -0
  44. axross-0.4.1/core/dropbox_client.py +683 -0
  45. axross-0.4.1/core/elevated_io.py +309 -0
  46. axross-0.4.1/core/encrypted_overlay.py +420 -0
  47. axross-0.4.1/core/exchange_client.py +1060 -0
  48. axross-0.4.1/core/ftp_client.py +785 -0
  49. axross-0.4.1/core/fuse_mount.py +911 -0
  50. axross-0.4.1/core/gdrive_client.py +740 -0
  51. axross-0.4.1/core/git_fs_client.py +890 -0
  52. axross-0.4.1/core/git_fs_writer_helper.py +53 -0
  53. axross-0.4.1/core/gopher_client.py +676 -0
  54. axross-0.4.1/core/imap_client.py +1316 -0
  55. axross-0.4.1/core/iscsi_client.py +886 -0
  56. axross-0.4.1/core/ldap_fs_client.py +439 -0
  57. axross-0.4.1/core/local_fs.py +195 -0
  58. axross-0.4.1/core/mcp_http.py +953 -0
  59. axross-0.4.1/core/mcp_server.py +3308 -0
  60. axross-0.4.1/core/metadata_index.py +431 -0
  61. axross-0.4.1/core/mongo_fs_client.py +246 -0
  62. axross-0.4.1/core/mtp_client.py +499 -0
  63. axross-0.4.1/core/net_helpers.py +1226 -0
  64. axross-0.4.1/core/nfs_client.py +328 -0
  65. axross-0.4.1/core/nntp_client.py +526 -0
  66. axross-0.4.1/core/nntp_lib.py +455 -0
  67. axross-0.4.1/core/onedrive_client.py +933 -0
  68. axross-0.4.1/core/operation_journal.py +212 -0
  69. axross-0.4.1/core/path_policy.py +72 -0
  70. axross-0.4.1/core/pjl_client.py +637 -0
  71. axross-0.4.1/core/pop3_client.py +502 -0
  72. axross-0.4.1/core/postgres_fs_client.py +258 -0
  73. axross-0.4.1/core/previews.py +426 -0
  74. axross-0.4.1/core/profiles.py +652 -0
  75. axross-0.4.1/core/proxy.py +563 -0
  76. axross-0.4.1/core/ram_fs.py +554 -0
  77. axross-0.4.1/core/ramfs_settings.py +109 -0
  78. axross-0.4.1/core/recovery.py +77 -0
  79. axross-0.4.1/core/redaction.py +132 -0
  80. axross-0.4.1/core/redis_fs_client.py +244 -0
  81. axross-0.4.1/core/remote_name.py +174 -0
  82. axross-0.4.1/core/rsh_client.py +459 -0
  83. axross-0.4.1/core/rsync_client.py +1153 -0
  84. axross-0.4.1/core/s3_client.py +661 -0
  85. axross-0.4.1/core/scp_client.py +838 -0
  86. axross-0.4.1/core/scripting.py +1662 -0
  87. axross-0.4.1/core/secure_storage.py +105 -0
  88. axross-0.4.1/core/security_mode.py +90 -0
  89. axross-0.4.1/core/server_ops.py +92 -0
  90. axross-0.4.1/core/slp_client.py +364 -0
  91. axross-0.4.1/core/slp_lib.py +343 -0
  92. axross-0.4.1/core/smb_client.py +507 -0
  93. axross-0.4.1/core/snapshot_browser.py +179 -0
  94. axross-0.4.1/core/snmp_helpers.py +302 -0
  95. axross-0.4.1/core/sqlite_fs_client.py +273 -0
  96. axross-0.4.1/core/ssh_client.py +828 -0
  97. axross-0.4.1/core/ssh_config.py +190 -0
  98. axross-0.4.1/core/structured_log.py +31 -0
  99. axross-0.4.1/core/svn_fs_client.py +374 -0
  100. axross-0.4.1/core/telnet_cisco.py +450 -0
  101. axross-0.4.1/core/telnet_client.py +1468 -0
  102. axross-0.4.1/core/tftp_client.py +576 -0
  103. axross-0.4.1/core/tmpfs_detect.py +183 -0
  104. axross-0.4.1/core/transfer_manager.py +482 -0
  105. axross-0.4.1/core/transfer_worker.py +587 -0
  106. axross-0.4.1/core/trash.py +387 -0
  107. axross-0.4.1/core/ui_helpers.py +343 -0
  108. axross-0.4.1/core/version_stubs.py +24 -0
  109. axross-0.4.1/core/watch.py +281 -0
  110. axross-0.4.1/core/webdav_client.py +767 -0
  111. axross-0.4.1/core/winrm_client.py +598 -0
  112. axross-0.4.1/core/wmi_client.py +549 -0
  113. axross-0.4.1/core/xlink.py +309 -0
  114. axross-0.4.1/dev-requirements.txt +31 -0
  115. axross-0.4.1/docs/DEVELOPMENT.md +203 -0
  116. axross-0.4.1/docs/HANDBUCH.md +784 -0
  117. axross-0.4.1/docs/MCP.md +397 -0
  118. axross-0.4.1/docs/MCP_de.md +404 -0
  119. axross-0.4.1/docs/MCP_es.md +394 -0
  120. axross-0.4.1/docs/OPSEC.md +69 -0
  121. axross-0.4.1/docs/PACKAGING.md +385 -0
  122. axross-0.4.1/docs/PROXY_SUPPORT.md +173 -0
  123. axross-0.4.1/docs/RED_TEAM_NOTES.md +801 -0
  124. axross-0.4.1/docs/SCRIPTING.md +207 -0
  125. axross-0.4.1/docs/SCRIPTING_REFERENCE.md +1140 -0
  126. axross-0.4.1/docs/SCRIPTING_de.md +143 -0
  127. axross-0.4.1/docs/SCRIPTING_es.md +140 -0
  128. axross-0.4.1/docs/SUPPLY_CHAIN_AUDIT.md +262 -0
  129. axross-0.4.1/docs/TEST_COVERAGE_MATRIX.md +333 -0
  130. axross-0.4.1/docs/USAGE.md +347 -0
  131. axross-0.4.1/docs/USAGE_de.md +283 -0
  132. axross-0.4.1/docs/USAGE_es.md +293 -0
  133. axross-0.4.1/docs/WINDOWS_TESTING.md +127 -0
  134. axross-0.4.1/main.py +338 -0
  135. axross-0.4.1/models/__init__.py +0 -0
  136. axross-0.4.1/models/exec_result.py +44 -0
  137. axross-0.4.1/models/file_item.py +69 -0
  138. axross-0.4.1/models/file_table_model.py +158 -0
  139. axross-0.4.1/models/file_version.py +32 -0
  140. axross-0.4.1/models/interactive_shell.py +284 -0
  141. axross-0.4.1/models/transfer_model.py +144 -0
  142. axross-0.4.1/models/trash_entry.py +23 -0
  143. axross-0.4.1/models/xlink.py +40 -0
  144. axross-0.4.1/pyproject.toml +185 -0
  145. axross-0.4.1/resources/__init__.py +1 -0
  146. axross-0.4.1/resources/logo/__init__.py +1 -0
  147. axross-0.4.1/resources/logo/axross-glyph.svg +23 -0
  148. axross-0.4.1/resources/logo/axross-logo-128.png +0 -0
  149. axross-0.4.1/resources/logo/axross-logo-16.png +0 -0
  150. axross-0.4.1/resources/logo/axross-logo-256.png +0 -0
  151. axross-0.4.1/resources/logo/axross-logo-32.png +0 -0
  152. axross-0.4.1/resources/logo/axross-logo-48.png +0 -0
  153. axross-0.4.1/resources/logo/axross-logo-512.png +0 -0
  154. axross-0.4.1/resources/logo/axross-logo-64.png +0 -0
  155. axross-0.4.1/resources/logo/axross-logo.svg +35 -0
  156. axross-0.4.1/resources/logo/axross-minimal.svg +17 -0
  157. axross-0.4.1/resources/logo/axross-monogram.svg +28 -0
  158. axross-0.4.1/resources/logo/axross-outline.svg +27 -0
  159. axross-0.4.1/resources/logo/axross-wordmark.svg +20 -0
  160. axross-0.4.1/resources/logo/concepts/01-ascii-skull.svg +21 -0
  161. axross-0.4.1/resources/logo/concepts/02-constellation.svg +35 -0
  162. axross-0.4.1/resources/logo/concepts/03-routing-table.svg +29 -0
  163. axross-0.4.1/resources/logo/concepts/04-origami-fox.svg +27 -0
  164. axross-0.4.1/resources/logo/concepts/05-quantum-tunnel.svg +25 -0
  165. axross-0.4.1/resources/logo/concepts/06-bridge.svg +27 -0
  166. axross-0.4.1/resources/logo/concepts/07-cuneiform.svg +46 -0
  167. axross-0.4.1/resources/logo/concepts/08-lockpick.svg +29 -0
  168. axross-0.4.1/resources/logo/concepts/09-mobius.svg +33 -0
  169. axross-0.4.1/resources/logo/concepts/10-glitched-x.svg +28 -0
  170. axross-0.4.1/resources/logo/concepts/11-compass.svg +32 -0
  171. axross-0.4.1/resources/logo/concepts/12-celtic-knot.svg +21 -0
  172. axross-0.4.1/resources/logo/concepts/13-punch-card.svg +55 -0
  173. axross-0.4.1/resources/logo/concepts/14-subway.svg +33 -0
  174. axross-0.4.1/resources/logo/concepts/15-prism.svg +38 -0
  175. axross-0.4.1/resources/logo/concepts/16-iceberg.svg +30 -0
  176. axross-0.4.1/resources/logo/concepts/17-sigil.svg +34 -0
  177. axross-0.4.1/resources/logo/concepts/18-antenna.svg +36 -0
  178. axross-0.4.1/resources/logo/concepts/19-tape-reel.svg +32 -0
  179. axross-0.4.1/resources/logo/concepts/20-neon.svg +42 -0
  180. axross-0.4.1/resources/logo/concepts/__init__.py +1 -0
  181. axross-0.4.1/resources/scripts/README.md +129 -0
  182. axross-0.4.1/resources/scripts/__init__.py +1 -0
  183. axross-0.4.1/resources/scripts/atomic_replace.py +34 -0
  184. axross-0.4.1/resources/scripts/backend_capabilities.py +70 -0
  185. axross-0.4.1/resources/scripts/bookmark_audit.py +61 -0
  186. axross-0.4.1/resources/scripts/bookmarks_export.py +60 -0
  187. axross-0.4.1/resources/scripts/bulk_rename.py +47 -0
  188. axross-0.4.1/resources/scripts/cas_dedupe.py +43 -0
  189. axross-0.4.1/resources/scripts/cisco_collect.py +58 -0
  190. axross-0.4.1/resources/scripts/connection_probe.py +60 -0
  191. axross-0.4.1/resources/scripts/dedupe.py +50 -0
  192. axross-0.4.1/resources/scripts/du.py +35 -0
  193. axross-0.4.1/resources/scripts/encrypted_archive.py +115 -0
  194. axross-0.4.1/resources/scripts/encrypted_stream.py +49 -0
  195. axross-0.4.1/resources/scripts/find_secrets.py +81 -0
  196. axross-0.4.1/resources/scripts/fingerprint_diff.py +52 -0
  197. axross-0.4.1/resources/scripts/git_changelog.py +32 -0
  198. axross-0.4.1/resources/scripts/gopher_archive.py +53 -0
  199. axross-0.4.1/resources/scripts/hash_audit.py +42 -0
  200. axross-0.4.1/resources/scripts/imap_archive.py +34 -0
  201. axross-0.4.1/resources/scripts/lab_smoke.py +42 -0
  202. axross-0.4.1/resources/scripts/mirror.py +65 -0
  203. axross-0.4.1/resources/scripts/nntp_subjects.py +31 -0
  204. axross-0.4.1/resources/scripts/port_scan.py +47 -0
  205. axross-0.4.1/resources/scripts/profile_audit.py +62 -0
  206. axross-0.4.1/resources/scripts/ramfs_decrypt.py +27 -0
  207. axross-0.4.1/resources/scripts/ramfs_pipeline.py +60 -0
  208. axross-0.4.1/resources/scripts/redact.py +51 -0
  209. axross-0.4.1/resources/scripts/s3_inventory.py +62 -0
  210. axross-0.4.1/resources/scripts/slp_inventory.py +30 -0
  211. axross-0.4.1/resources/scripts/snapshot_walk.py +38 -0
  212. axross-0.4.1/resources/scripts/sqlite_export.py +52 -0
  213. axross-0.4.1/resources/scripts/tftp_audit.py +31 -0
  214. axross-0.4.1/resources/scripts/webdav_quota.py +27 -0
  215. axross-0.4.1/resources/wordlists/__init__.py +1 -0
  216. axross-0.4.1/resources/wordlists/tftp_common.txt +213 -0
  217. axross-0.4.1/setup.cfg +4 -0
  218. axross-0.4.1/setup.py +5 -0
  219. axross-0.4.1/tests/test_backend_regressions.py +2497 -0
  220. axross-0.4.1/tests/test_e2e.py +645 -0
  221. axross-0.4.1/tests/test_hardening_regressions.py +18920 -0
  222. axross-0.4.1/tests/test_network.py +788 -0
  223. axross-0.4.1/tests/test_new_features.py +386 -0
  224. axross-0.4.1/tests/test_packaging.py +602 -0
  225. axross-0.4.1/tests/test_pane_layout_regressions.py +41 -0
  226. axross-0.4.1/tests/test_protocols.py +9184 -0
  227. axross-0.4.1/tests/test_pypi_packaging.py +123 -0
  228. axross-0.4.1/tests/test_regressions.py +960 -0
  229. axross-0.4.1/tests/test_windows_integration.py +198 -0
  230. axross-0.4.1/ui/__init__.py +0 -0
  231. axross-0.4.1/ui/batch_rename_dialog.py +222 -0
  232. axross-0.4.1/ui/bookmark_edit_dialog.py +161 -0
  233. axross-0.4.1/ui/bookmark_sidebar.py +212 -0
  234. axross-0.4.1/ui/cas_dialog.py +252 -0
  235. axross-0.4.1/ui/checksum_dialog.py +65 -0
  236. axross-0.4.1/ui/column_prefs.py +125 -0
  237. axross-0.4.1/ui/connection_dialog.py +1320 -0
  238. axross-0.4.1/ui/create_xlink_dialog.py +129 -0
  239. axross-0.4.1/ui/dock_titlebar.py +105 -0
  240. axross-0.4.1/ui/elevated_viewer.py +113 -0
  241. axross-0.4.1/ui/file_pane.py +2721 -0
  242. axross-0.4.1/ui/hex_editor.py +700 -0
  243. axross-0.4.1/ui/icon_provider.py +533 -0
  244. axross-0.4.1/ui/image_viewer.py +258 -0
  245. axross-0.4.1/ui/layout_presets.py +129 -0
  246. axross-0.4.1/ui/layout_utils.py +79 -0
  247. axross-0.4.1/ui/log_dock.py +195 -0
  248. axross-0.4.1/ui/main_window.py +3237 -0
  249. axross-0.4.1/ui/metadata_search_dialog.py +265 -0
  250. axross-0.4.1/ui/permissions_dialog.py +159 -0
  251. axross-0.4.1/ui/repl_widget.py +837 -0
  252. axross-0.4.1/ui/snapshot_browser_dialog.py +276 -0
  253. axross-0.4.1/ui/terminal_pane.py +287 -0
  254. axross-0.4.1/ui/terminal_widget.py +840 -0
  255. axross-0.4.1/ui/text_editor.py +252 -0
  256. axross-0.4.1/ui/transfer_dock.py +164 -0
  257. axross-0.4.1/ui/trash_browser.py +239 -0
@@ -0,0 +1,98 @@
1
+ # Contributing to Axross
2
+
3
+ Thanks for considering a contribution. Axross is an Apache-2.0 licensed
4
+ multi-protocol file manager; the ground rules below keep the project
5
+ sustainable and predictable for everyone.
6
+
7
+ ## Licensing of contributions
8
+
9
+ By submitting a pull request, you agree that your contribution is provided
10
+ under the terms of the Apache License 2.0 (see [LICENSE](LICENSE)) and that
11
+ you have the right to submit it. Per Apache-2.0 §5, every contribution is
12
+ automatically licensed under the same terms as the project — no separate CLA
13
+ is required for normal contributions.
14
+
15
+ If your contribution includes code you did not author (vendored snippets,
16
+ translated code, etc.), flag it in the PR description with the original
17
+ source and its license so we can verify compatibility with Apache-2.0 before
18
+ merge.
19
+
20
+ ## What's in scope
21
+
22
+ - Fixes for any backend listed in the protocol table.
23
+ - New backends that follow the `FileBackend` protocol in `core/backend.py`.
24
+ - UI / UX improvements (keyboard shortcuts, dialog ergonomics, accessibility).
25
+ - MCP tool additions that compose cleanly with the existing surface.
26
+ - Hardening tests (`tests/test_hardening_regressions.py`) that cover a real
27
+ attack class; generic "it doesn't crash" tests are lower priority.
28
+ - Translation updates for README and user-facing messages.
29
+
30
+ ## What's out of scope
31
+
32
+ - Features that require bundling additional heavy SDKs by default. Put them
33
+ behind a new optional extra in `pyproject.toml` and keep the base install
34
+ slim.
35
+ - Changes that degrade the safe-extraction guards in `core/archive.py`,
36
+ the MCP root-traversal guard, or the profile-field keyring routing
37
+ without explicit justification.
38
+ - Telemetry / phone-home / auto-update code of any kind.
39
+
40
+ ## Development setup
41
+
42
+ ```bash
43
+ python3 -m venv .venv
44
+ source .venv/bin/activate
45
+ pip install -e ".[all]"
46
+ pip install -r dev-requirements.txt
47
+ ```
48
+
49
+ For the protocol lab:
50
+
51
+ ```bash
52
+ cd tests/docker && docker compose up -d --build
53
+ ```
54
+
55
+ See [INSTALL.md](INSTALL.md) for the canonical install flow.
56
+
57
+ ## Running tests
58
+
59
+ Host suite (no Docker required):
60
+
61
+ ```bash
62
+ QT_QPA_PLATFORM=offscreen .venv/bin/pytest -q \
63
+ tests/test_hardening_regressions.py tests/test_regressions.py \
64
+ tests/test_new_features.py tests/test_backend_regressions.py \
65
+ tests/test_pane_layout_regressions.py tests/test_e2e.py
66
+ ```
67
+
68
+ Protocol lab (needs `docker compose up -d --build` first):
69
+
70
+ ```bash
71
+ .venv/bin/pytest tests/test_protocols.py tests/test_network.py
72
+ ```
73
+
74
+ PRs must pass the host suite. Lab tests are best-effort because not every
75
+ reviewer has the lab stood up — your PR description should state which
76
+ lab sections you ran locally.
77
+
78
+ ## Code style
79
+
80
+ - Python: `ruff` is the only style gate. `ruff check .` must pass.
81
+ - Line length 100 (configured in `pyproject.toml`).
82
+ - Keep dependencies minimal. New runtime deps need a justification; new
83
+ optional extras are preferred over base-install additions.
84
+ - Tests: mirror the module layout, one test file per module where
85
+ reasonable. Use `QT_QPA_PLATFORM=offscreen` for any UI test.
86
+
87
+ ## Commits and PRs
88
+
89
+ - One commit per logical feature. Rebase before opening the PR.
90
+ - Subject line: imperative, under 72 chars. Body wraps at 72.
91
+ - Reference the issue number in the body if applicable (`closes #123`).
92
+ - PR description states: what changed, why, how it was tested, and any
93
+ follow-up items you deliberately deferred.
94
+
95
+ ## Security issues
96
+
97
+ Do not open a public issue for anything with exploit potential — email
98
+ [SECURITY.md](SECURITY.md) has the disclosure contact and timeline.
@@ -0,0 +1,227 @@
1
+ # Installation
2
+
3
+ This is the single canonical install reference. The top-level READMEs
4
+ (EN/DE/ES) link here instead of duplicating these steps in each language.
5
+
6
+ ## Prerequisites
7
+
8
+ - **Python** ≥ 3.10
9
+ - **Linux**: `apt install python3-venv` or the equivalent on your distro so
10
+ `python3 -m venv` is available.
11
+ - **Linux GUI / containers**: PyQt6 ships Qt itself, but minimal images still
12
+ need the system loader libraries used by Qt plugins. On Debian/Ubuntu slim
13
+ images install:
14
+
15
+ ```bash
16
+ apt-get update
17
+ apt-get install -y --no-install-recommends \
18
+ libglib2.0-0 libgl1 libegl1 libfontconfig1 libxkbcommon0 libdbus-1-3
19
+ ```
20
+
21
+ Headless modes such as `axross --help`, `axross --script`, and
22
+ `axross --mcp-server` do not need those GUI libraries.
23
+ - Optional system tools (only needed for protocols that call out via
24
+ `subprocess`):
25
+ - `rsync` binary — Rsync backend.
26
+ - `mount.nfs`, `umount` (root/sudo) — NFS backend.
27
+ - `iscsiadm`, `mount`, `blkid` (root/sudo + `open-iscsi`) — iSCSI backend.
28
+ - `pkexec` + polkit rules — "Open as root…" action
29
+ (`core.elevated_io`).
30
+
31
+ ## PyPI install
32
+
33
+ Once a release is published:
34
+
35
+ ```bash
36
+ python3 -m venv .venv
37
+ source .venv/bin/activate
38
+ pip install "axross[all]"
39
+ axross # launches the GUI
40
+ ```
41
+
42
+ Use `pip install axross` for the smallest base install and add
43
+ protocol extras as needed.
44
+
45
+ ## Source install
46
+
47
+ ```bash
48
+ git clone <repo-url>
49
+ cd axross
50
+ python3 -m venv .venv
51
+ source .venv/bin/activate
52
+ pip install -e .
53
+ axross # launches the GUI
54
+ ```
55
+
56
+ Base install pulls only what the always-available protocols need:
57
+
58
+ | Package | Version | Purpose |
59
+ |-----------------|----------|------------------------------------------------|
60
+ | PyQt6 | ≥ 6.6 | GUI framework |
61
+ | paramiko | ≥ 3.4 | SSH / SFTP / SCP |
62
+ | PySocks | ≥ 1.7 | SOCKS4 / SOCKS5 proxy |
63
+ | keyring | ≥ 25.0 | OS secret store for passwords |
64
+
65
+ FTP, Telnet, IMAP use only the Python standard library — no extra deps.
66
+
67
+ ## Optional protocol extras
68
+
69
+ Install just the ones you need. Unavailable backends appear greyed out
70
+ in the Connection Manager with an inline `pip install` hint.
71
+
72
+ ```bash
73
+ pip install "axross[smb]" # SMB / CIFS + DFS-N (smbprotocol)
74
+ pip install "axross[webdav]" # WebDAV (requests + defusedxml — pure-Python)
75
+ pip install "axross[s3]" # S3-compatible (boto3)
76
+ pip install "axross[azure]" # Azure Blob + Azure Files (azure-storage-*)
77
+ pip install "axross[onedrive]" # OneDrive + SharePoint (msal, requests)
78
+ pip install "axross[gdrive]" # Google Drive (google-api-python-client)
79
+ pip install "axross[dropbox]" # Dropbox (dropbox SDK)
80
+ pip install "axross[winrm]" # WinRM / PowerShell-Remoting (pywinrm)
81
+ pip install "axross[wmi]" # WMI / DCOM read-only (impacket)
82
+ pip install "axross[exchange]" # Exchange Web Services (exchangelib)
83
+ pip install "axross[fuse]" # FUSE mount any backend (fusepy, Linux/macOS)
84
+ ```
85
+
86
+ From a source checkout, use the editable equivalent, for example
87
+ `pip install -e ".[smb]"`.
88
+
89
+ ### Install light extras at once
90
+
91
+ ```bash
92
+ pip install "axross[all]"
93
+ ```
94
+
95
+ `[all]` covers SMB, WebDAV, S3, Azure, OneDrive/SharePoint, GDrive,
96
+ Dropbox. It deliberately **excludes** `winrm`, `wmi`, `exchange`, and
97
+ `fuse` because each of those pulls a heavy dep (impacket brings in
98
+ ~50 MB of crypto code; exchangelib pulls lxml; fusepy needs matching
99
+ kernel FUSE support). Add them explicitly when you need them.
100
+
101
+ ### One-shot sanity check
102
+
103
+ ```bash
104
+ .venv/bin/python -c 'import main; print("axross ok")'
105
+ ```
106
+
107
+ ## Cloud services (OAuth)
108
+
109
+ OneDrive, SharePoint, Google Drive, and Dropbox require OAuth app
110
+ registration before first use. Client IDs are not shipped with the
111
+ repo — every user needs their own.
112
+
113
+ See [OAUTH_SETUP.md](OAUTH_SETUP.md) for each provider's step-by-step
114
+ recipe.
115
+
116
+ ## Building a wheel
117
+
118
+ ```bash
119
+ pip install build twine
120
+ python -m build
121
+ python -m twine check dist/*
122
+ # dist/axross-<version>.tar.gz
123
+ # dist/axross-<version>-py3-none-any.whl
124
+ ```
125
+
126
+ Install on another machine:
127
+
128
+ ```bash
129
+ pip install dist/axross-<version>-py3-none-any.whl
130
+ # Or with extras:
131
+ pip install "dist/axross-<version>-py3-none-any.whl[all]"
132
+ ```
133
+
134
+ Smoke-test the built artifact without the source tree:
135
+
136
+ ```bash
137
+ tmpdir="$(mktemp -d)"
138
+ python3 -m venv "$tmpdir/venv"
139
+ "$tmpdir/venv/bin/pip" install --no-deps dist/axross-<version>-py3-none-any.whl
140
+ "$tmpdir/venv/bin/python" -c 'import axross; print(axross.__version__)'
141
+ "$tmpdir/venv/bin/python" -m axross --help
142
+ "$tmpdir/venv/bin/axross" --help
143
+ ```
144
+
145
+ ## Publishing to PyPI
146
+
147
+ Build from a clean, tagged checkout and always validate on TestPyPI first:
148
+
149
+ ```bash
150
+ rm -rf dist
151
+ python -m build
152
+ python -m twine check dist/*
153
+ python -m twine upload --repository testpypi dist/*
154
+ python -m twine upload dist/*
155
+ ```
156
+
157
+ Authentication should use PyPI/TestPyPI API tokens, either from
158
+ `~/.pypirc` or environment variables consumed by `twine`.
159
+
160
+ ## Versioning
161
+
162
+ The package version has one source of truth: `axross/_version.py`.
163
+ `pyproject.toml` reads it via `tool.setuptools.dynamic`, so do not
164
+ duplicate the version in project metadata.
165
+
166
+ Use PEP 440 versions:
167
+
168
+ ```text
169
+ 0.4.1 # patch release
170
+ 0.5.0 # feature release
171
+ 1.0.0 # stable major release
172
+ 0.5.0rc1 # release candidate
173
+ 0.4.1.post1 # post-release metadata/docs fix
174
+ ```
175
+
176
+ Release bump checklist:
177
+
178
+ ```bash
179
+ python - <<'PY'
180
+ from axross._version import __version__
181
+ print(__version__)
182
+ PY
183
+ rm -rf dist
184
+ python -m build
185
+ python -m twine check dist/*
186
+ ```
187
+
188
+ Tag releases as `v<version>`, for example `v0.4.1`.
189
+
190
+ ## Development setup
191
+
192
+ ```bash
193
+ source .venv/bin/activate
194
+ pip install -e ".[all]"
195
+ pip install -r dev-requirements.txt
196
+ ```
197
+
198
+ `dev-requirements.txt` covers pytest, coverage, ruff, build, twine, plus
199
+ `cryptography` and `jsonschema` that some MCP tests exercise directly.
200
+
201
+ Run the host test suite (no Docker required):
202
+
203
+ ```bash
204
+ QT_QPA_PLATFORM=offscreen .venv/bin/pytest -q \
205
+ tests/test_hardening_regressions.py tests/test_regressions.py \
206
+ tests/test_new_features.py tests/test_backend_regressions.py \
207
+ tests/test_pane_layout_regressions.py tests/test_e2e.py
208
+ ```
209
+
210
+ Expected: ~925 pass, 5 skip (three FUSE tests gated on `fusepy`,
211
+ one GDrive-refresh test gated on `google-auth`, one end-to-end test
212
+ that needs the docker lab).
213
+
214
+ For the Docker protocol lab see the **Development / Testing** section
215
+ in [README.md](README.md) — the protocol coverage matrix there spells
216
+ out exactly which backends are cleanly tested and which aren't.
217
+
218
+ ## Uninstall
219
+
220
+ ```bash
221
+ pip uninstall axross
222
+ rm -rf .venv
223
+ rm -rf ~/.config/axross ~/.local/state/axross # settings + logs
224
+ # Keyring entries — the "Forget Password" option in the Connection
225
+ # Manager removes individual entries; wholesale cleanup depends on
226
+ # your OS keyring front-end (Seahorse, kwallet-query, security).
227
+ ```
axross-0.4.1/LICENSE ADDED
@@ -0,0 +1,200 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for describing the origin of the Work and
141
+ reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may accept support,
167
+ warranty, indemnity, or other liability obligations and/or rights
168
+ consistent with this License. However, in accepting such obligations,
169
+ You may act only on Your own behalf and on Your sole responsibility,
170
+ not on behalf of any other Contributor, and only if You agree to
171
+ indemnify, defend, and hold each Contributor harmless for any
172
+ liability incurred by, or claims asserted against, such Contributor
173
+ by reason of your accepting any such warranty or additional liability.
174
+
175
+ END OF TERMS AND CONDITIONS
176
+
177
+ APPENDIX: How to apply the Apache License to your work.
178
+
179
+ To apply the Apache License to your work, attach the following
180
+ boilerplate notice, with the fields enclosed by brackets "[]"
181
+ replaced with your own identifying information. (Don't include
182
+ the brackets!) The text should be enclosed in the appropriate
183
+ comment syntax for the file format. We also recommend that a
184
+ file or class name and description of purpose be included on the
185
+ same "printed page" as the copyright notice for easier
186
+ identification within third-party archives.
187
+
188
+ Copyright 2026 Marco Lux
189
+
190
+ Licensed under the Apache License, Version 2.0 (the "License");
191
+ you may not use this file except in compliance with the License.
192
+ You may obtain a copy of the License at
193
+
194
+ http://www.apache.org/licenses/LICENSE-2.0
195
+
196
+ Unless required by applicable law or agreed to in writing, software
197
+ distributed under the License is distributed on an "AS IS" BASIS,
198
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
199
+ See the License for the specific language governing permissions and
200
+ limitations under the License.
@@ -0,0 +1,7 @@
1
+ include LICENSE NOTICE README.md README_PYPI.md README_de.md README_es.md INSTALL.md
2
+ include dev-requirements.txt
3
+ include OAUTH_SETUP.md SECURITY.md CONTRIBUTING.md THIRD_PARTY_LICENSES.md
4
+ recursive-include docs *.md
5
+ recursive-include resources/logo *.png *.svg
6
+ recursive-include resources/scripts *.md *.py
7
+ recursive-include resources/wordlists *.txt
axross-0.4.1/NOTICE ADDED
@@ -0,0 +1,30 @@
1
+ Axross
2
+ Copyright 2026 Marco Lux
3
+
4
+ This product includes software developed by Marco Lux.
5
+
6
+ Licensed under the Apache License, Version 2.0 (the "License");
7
+ you may not use this file except in compliance with the License.
8
+ You may obtain a copy of the License at
9
+
10
+ http://www.apache.org/licenses/LICENSE-2.0
11
+
12
+ ================================================================================
13
+ THIRD-PARTY COMPONENTS
14
+ ================================================================================
15
+
16
+ Axross is source-distributed under Apache-2.0 and dynamically imports the
17
+ runtime dependencies listed in pyproject.toml and THIRD_PARTY_LICENSES.md.
18
+ These dependencies are NOT bundled in the source tree; users install them via
19
+ `pip install`.
20
+
21
+ IMPORTANT: Pre-built PyInstaller bundles (dist/axross-slim, dist/axross-full,
22
+ the AppImage) produced from this source tree statically include PyQt6, which
23
+ is distributed by Riverbank Computing under the GNU General Public License,
24
+ Version 3 (GPL-3.0) or a separate commercial license. When distributing those
25
+ bundles, the combined binary is therefore redistributed under GPL-3.0 terms.
26
+ The Axross source itself remains available under Apache-2.0, and users who
27
+ wish to produce non-GPL binaries may rebuild against PySide6 (LGPL-3.0)
28
+ instead of PyQt6.
29
+
30
+ Per-dependency license attribution is maintained in THIRD_PARTY_LICENSES.md.
@@ -0,0 +1,105 @@
1
+ # OAuth App Registration Guide
2
+
3
+ Axross supports cloud storage services that require OAuth2 authentication.
4
+ You need to register your own app with each provider to get Client IDs/Secrets.
5
+
6
+ ## Google Drive
7
+
8
+ 1. Go to [Google Cloud Console](https://console.cloud.google.com/)
9
+ 2. Create a new project (or select existing)
10
+ 3. Enable the **Google Drive API**:
11
+ - Navigate to *APIs & Services > Library*
12
+ - Search for "Google Drive API" and click **Enable**
13
+ 4. Create OAuth credentials:
14
+ - Go to *APIs & Services > Credentials*
15
+ - Click **Create Credentials > OAuth client ID**
16
+ - Application type: **Desktop app**
17
+ - Name: `Axross` (or any name)
18
+ - Click **Create**
19
+ 5. Copy the **Client ID** and **Client Secret**
20
+ 6. Configure the OAuth consent screen:
21
+ - Go to *APIs & Services > OAuth consent screen*
22
+ - User type: **External** (or Internal for Workspace)
23
+ - Fill in app name, support email
24
+ - Add scope: `https://www.googleapis.com/auth/drive`
25
+ - Add your email as a test user (while in "Testing" status)
26
+
27
+ Enter the Client ID and Client Secret in the Axross connection dialog.
28
+
29
+ ## Microsoft OneDrive / SharePoint
30
+
31
+ 1. Go to [Azure Portal - App registrations](https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade)
32
+ 2. Click **New registration**
33
+ - Name: `Axross`
34
+ - Supported account types: **Accounts in any organizational directory and personal Microsoft accounts**
35
+ - Redirect URI: **Public client/native (mobile & desktop)** → `http://localhost`
36
+ 3. After creation, note the **Application (client) ID**
37
+ 4. Set the **Tenant ID**:
38
+ - For personal OneDrive: use `common`
39
+ - For organization-only: use your Azure AD tenant ID
40
+ 5. Configure API permissions:
41
+ - Go to *API permissions > Add a permission > Microsoft Graph*
42
+ - Delegated permissions:
43
+ - `Files.ReadWrite.All`
44
+ - `User.Read`
45
+ - For SharePoint also add: `Sites.ReadWrite.All`
46
+ - Click **Grant admin consent** (if you have admin rights)
47
+ 6. Under *Authentication*:
48
+ - Ensure **Allow public client flows** is set to **Yes**
49
+
50
+ Enter the Client ID and Tenant ID in the Axross connection dialog.
51
+ For SharePoint, also enter the Site URL (e.g. `https://company.sharepoint.com/sites/MySite`).
52
+
53
+ ## Dropbox
54
+
55
+ 1. Go to [Dropbox App Console](https://www.dropbox.com/developers/apps)
56
+ 2. Click **Create app**
57
+ - Choose **Scoped access**
58
+ - Choose **Full Dropbox** access type
59
+ - Name: `Axross` (must be unique)
60
+ 3. In the app settings:
61
+ - Note the **App key** and **App secret**
62
+ 4. Under *Permissions* tab, enable:
63
+ - `files.metadata.read`
64
+ - `files.metadata.write`
65
+ - `files.content.read`
66
+ - `files.content.write`
67
+ - `account_info.read`
68
+ 5. Click **Submit** to save permissions
69
+
70
+ Enter the App Key and App Secret in the Axross connection dialog.
71
+
72
+ ## Token Storage
73
+
74
+ OAuth tokens are cached locally at:
75
+ - Google Drive: `~/.config/axross/gdrive_token.json`
76
+ - OneDrive/SharePoint: `~/.config/axross/onedrive_token.json`
77
+ - Dropbox: `~/.config/axross/dropbox_token.json`
78
+
79
+ Tokens are automatically refreshed when they expire. Delete the token file to force re-authentication.
80
+
81
+ ## Security Notes
82
+
83
+ - **Client IDs** (and Dropbox App Keys) live in your profile file at
84
+ `~/.config/axross/profiles.json`. These are not secret on their own —
85
+ Google / Microsoft / Dropbox treat them as public identifiers for the
86
+ registered app. The profiles file is still written with `0o600`
87
+ permissions via `tempfile.mkstemp` followed by `os.replace`, so only
88
+ your user account can read it.
89
+ - **Client Secrets** (Google's `client_secret`, Dropbox's `app_secret`)
90
+ plus Azure SAS tokens and Azure connection strings are **never** stored
91
+ in the profiles file. They go to the OS keyring (GNOME Keyring / KDE
92
+ Wallet / macOS Keychain / Windows Credential Manager) via the
93
+ `SENSITIVE_PROFILE_FIELDS` mechanism in `core/profiles.py`. If no
94
+ desktop keyring is available, axross logs a warning and does NOT
95
+ persist them — you re-enter on next launch rather than risk a plaintext
96
+ leak.
97
+ - **OAuth refresh tokens** are written atomically to
98
+ `~/.config/axross/*_token.json` with `0o600` via
99
+ `core.secure_storage.write_secret_file`. The file is 0o600 from birth
100
+ (`fchmod` on the temp fd before the rename) — no TOCTOU window where
101
+ a world-readable version exists.
102
+ - **What to protect from yourself and others:** the token files under
103
+ `~/.config/axross/` and your OS keyring entries. Losing those → drop
104
+ the file and re-auth. Leaking them → revoke the OAuth app's access in
105
+ the provider's console immediately and regenerate.