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.
- axross-0.4.1/CONTRIBUTING.md +98 -0
- axross-0.4.1/INSTALL.md +227 -0
- axross-0.4.1/LICENSE +200 -0
- axross-0.4.1/MANIFEST.in +7 -0
- axross-0.4.1/NOTICE +30 -0
- axross-0.4.1/OAUTH_SETUP.md +105 -0
- axross-0.4.1/PKG-INFO +265 -0
- axross-0.4.1/README.md +225 -0
- axross-0.4.1/README_PYPI.md +143 -0
- axross-0.4.1/README_de.md +216 -0
- axross-0.4.1/README_es.md +219 -0
- axross-0.4.1/SECURITY.md +70 -0
- axross-0.4.1/THIRD_PARTY_LICENSES.md +69 -0
- axross-0.4.1/axross/__init__.py +18 -0
- axross-0.4.1/axross/__main__.py +7 -0
- axross-0.4.1/axross/_version.py +5 -0
- axross-0.4.1/axross/cli.py +9 -0
- axross-0.4.1/axross.egg-info/PKG-INFO +265 -0
- axross-0.4.1/axross.egg-info/SOURCES.txt +255 -0
- axross-0.4.1/axross.egg-info/dependency_links.txt +1 -0
- axross-0.4.1/axross.egg-info/entry_points.txt +2 -0
- axross-0.4.1/axross.egg-info/requires.txt +115 -0
- axross-0.4.1/axross.egg-info/top_level.txt +6 -0
- axross-0.4.1/core/__init__.py +0 -0
- axross-0.4.1/core/adb_client.py +883 -0
- axross-0.4.1/core/append_helpers.py +62 -0
- axross-0.4.1/core/archive.py +578 -0
- axross-0.4.1/core/atomic_io.py +146 -0
- axross-0.4.1/core/atomic_recovery.py +150 -0
- axross-0.4.1/core/azure_client.py +1134 -0
- axross-0.4.1/core/backend.py +167 -0
- axross-0.4.1/core/backend_registry.py +873 -0
- axross-0.4.1/core/bookmarks.py +187 -0
- axross-0.4.1/core/capability_contracts.py +84 -0
- axross-0.4.1/core/cas.py +401 -0
- axross-0.4.1/core/client_identity.py +81 -0
- axross-0.4.1/core/connect_worker.py +269 -0
- axross-0.4.1/core/connection_manager.py +493 -0
- axross-0.4.1/core/credentials.py +283 -0
- axross-0.4.1/core/db_fs_base.py +431 -0
- axross-0.4.1/core/destructive_preview.py +143 -0
- axross-0.4.1/core/dfsn_client.py +185 -0
- axross-0.4.1/core/diagnostics.py +139 -0
- axross-0.4.1/core/dropbox_client.py +683 -0
- axross-0.4.1/core/elevated_io.py +309 -0
- axross-0.4.1/core/encrypted_overlay.py +420 -0
- axross-0.4.1/core/exchange_client.py +1060 -0
- axross-0.4.1/core/ftp_client.py +785 -0
- axross-0.4.1/core/fuse_mount.py +911 -0
- axross-0.4.1/core/gdrive_client.py +740 -0
- axross-0.4.1/core/git_fs_client.py +890 -0
- axross-0.4.1/core/git_fs_writer_helper.py +53 -0
- axross-0.4.1/core/gopher_client.py +676 -0
- axross-0.4.1/core/imap_client.py +1316 -0
- axross-0.4.1/core/iscsi_client.py +886 -0
- axross-0.4.1/core/ldap_fs_client.py +439 -0
- axross-0.4.1/core/local_fs.py +195 -0
- axross-0.4.1/core/mcp_http.py +953 -0
- axross-0.4.1/core/mcp_server.py +3308 -0
- axross-0.4.1/core/metadata_index.py +431 -0
- axross-0.4.1/core/mongo_fs_client.py +246 -0
- axross-0.4.1/core/mtp_client.py +499 -0
- axross-0.4.1/core/net_helpers.py +1226 -0
- axross-0.4.1/core/nfs_client.py +328 -0
- axross-0.4.1/core/nntp_client.py +526 -0
- axross-0.4.1/core/nntp_lib.py +455 -0
- axross-0.4.1/core/onedrive_client.py +933 -0
- axross-0.4.1/core/operation_journal.py +212 -0
- axross-0.4.1/core/path_policy.py +72 -0
- axross-0.4.1/core/pjl_client.py +637 -0
- axross-0.4.1/core/pop3_client.py +502 -0
- axross-0.4.1/core/postgres_fs_client.py +258 -0
- axross-0.4.1/core/previews.py +426 -0
- axross-0.4.1/core/profiles.py +652 -0
- axross-0.4.1/core/proxy.py +563 -0
- axross-0.4.1/core/ram_fs.py +554 -0
- axross-0.4.1/core/ramfs_settings.py +109 -0
- axross-0.4.1/core/recovery.py +77 -0
- axross-0.4.1/core/redaction.py +132 -0
- axross-0.4.1/core/redis_fs_client.py +244 -0
- axross-0.4.1/core/remote_name.py +174 -0
- axross-0.4.1/core/rsh_client.py +459 -0
- axross-0.4.1/core/rsync_client.py +1153 -0
- axross-0.4.1/core/s3_client.py +661 -0
- axross-0.4.1/core/scp_client.py +838 -0
- axross-0.4.1/core/scripting.py +1662 -0
- axross-0.4.1/core/secure_storage.py +105 -0
- axross-0.4.1/core/security_mode.py +90 -0
- axross-0.4.1/core/server_ops.py +92 -0
- axross-0.4.1/core/slp_client.py +364 -0
- axross-0.4.1/core/slp_lib.py +343 -0
- axross-0.4.1/core/smb_client.py +507 -0
- axross-0.4.1/core/snapshot_browser.py +179 -0
- axross-0.4.1/core/snmp_helpers.py +302 -0
- axross-0.4.1/core/sqlite_fs_client.py +273 -0
- axross-0.4.1/core/ssh_client.py +828 -0
- axross-0.4.1/core/ssh_config.py +190 -0
- axross-0.4.1/core/structured_log.py +31 -0
- axross-0.4.1/core/svn_fs_client.py +374 -0
- axross-0.4.1/core/telnet_cisco.py +450 -0
- axross-0.4.1/core/telnet_client.py +1468 -0
- axross-0.4.1/core/tftp_client.py +576 -0
- axross-0.4.1/core/tmpfs_detect.py +183 -0
- axross-0.4.1/core/transfer_manager.py +482 -0
- axross-0.4.1/core/transfer_worker.py +587 -0
- axross-0.4.1/core/trash.py +387 -0
- axross-0.4.1/core/ui_helpers.py +343 -0
- axross-0.4.1/core/version_stubs.py +24 -0
- axross-0.4.1/core/watch.py +281 -0
- axross-0.4.1/core/webdav_client.py +767 -0
- axross-0.4.1/core/winrm_client.py +598 -0
- axross-0.4.1/core/wmi_client.py +549 -0
- axross-0.4.1/core/xlink.py +309 -0
- axross-0.4.1/dev-requirements.txt +31 -0
- axross-0.4.1/docs/DEVELOPMENT.md +203 -0
- axross-0.4.1/docs/HANDBUCH.md +784 -0
- axross-0.4.1/docs/MCP.md +397 -0
- axross-0.4.1/docs/MCP_de.md +404 -0
- axross-0.4.1/docs/MCP_es.md +394 -0
- axross-0.4.1/docs/OPSEC.md +69 -0
- axross-0.4.1/docs/PACKAGING.md +385 -0
- axross-0.4.1/docs/PROXY_SUPPORT.md +173 -0
- axross-0.4.1/docs/RED_TEAM_NOTES.md +801 -0
- axross-0.4.1/docs/SCRIPTING.md +207 -0
- axross-0.4.1/docs/SCRIPTING_REFERENCE.md +1140 -0
- axross-0.4.1/docs/SCRIPTING_de.md +143 -0
- axross-0.4.1/docs/SCRIPTING_es.md +140 -0
- axross-0.4.1/docs/SUPPLY_CHAIN_AUDIT.md +262 -0
- axross-0.4.1/docs/TEST_COVERAGE_MATRIX.md +333 -0
- axross-0.4.1/docs/USAGE.md +347 -0
- axross-0.4.1/docs/USAGE_de.md +283 -0
- axross-0.4.1/docs/USAGE_es.md +293 -0
- axross-0.4.1/docs/WINDOWS_TESTING.md +127 -0
- axross-0.4.1/main.py +338 -0
- axross-0.4.1/models/__init__.py +0 -0
- axross-0.4.1/models/exec_result.py +44 -0
- axross-0.4.1/models/file_item.py +69 -0
- axross-0.4.1/models/file_table_model.py +158 -0
- axross-0.4.1/models/file_version.py +32 -0
- axross-0.4.1/models/interactive_shell.py +284 -0
- axross-0.4.1/models/transfer_model.py +144 -0
- axross-0.4.1/models/trash_entry.py +23 -0
- axross-0.4.1/models/xlink.py +40 -0
- axross-0.4.1/pyproject.toml +185 -0
- axross-0.4.1/resources/__init__.py +1 -0
- axross-0.4.1/resources/logo/__init__.py +1 -0
- axross-0.4.1/resources/logo/axross-glyph.svg +23 -0
- axross-0.4.1/resources/logo/axross-logo-128.png +0 -0
- axross-0.4.1/resources/logo/axross-logo-16.png +0 -0
- axross-0.4.1/resources/logo/axross-logo-256.png +0 -0
- axross-0.4.1/resources/logo/axross-logo-32.png +0 -0
- axross-0.4.1/resources/logo/axross-logo-48.png +0 -0
- axross-0.4.1/resources/logo/axross-logo-512.png +0 -0
- axross-0.4.1/resources/logo/axross-logo-64.png +0 -0
- axross-0.4.1/resources/logo/axross-logo.svg +35 -0
- axross-0.4.1/resources/logo/axross-minimal.svg +17 -0
- axross-0.4.1/resources/logo/axross-monogram.svg +28 -0
- axross-0.4.1/resources/logo/axross-outline.svg +27 -0
- axross-0.4.1/resources/logo/axross-wordmark.svg +20 -0
- axross-0.4.1/resources/logo/concepts/01-ascii-skull.svg +21 -0
- axross-0.4.1/resources/logo/concepts/02-constellation.svg +35 -0
- axross-0.4.1/resources/logo/concepts/03-routing-table.svg +29 -0
- axross-0.4.1/resources/logo/concepts/04-origami-fox.svg +27 -0
- axross-0.4.1/resources/logo/concepts/05-quantum-tunnel.svg +25 -0
- axross-0.4.1/resources/logo/concepts/06-bridge.svg +27 -0
- axross-0.4.1/resources/logo/concepts/07-cuneiform.svg +46 -0
- axross-0.4.1/resources/logo/concepts/08-lockpick.svg +29 -0
- axross-0.4.1/resources/logo/concepts/09-mobius.svg +33 -0
- axross-0.4.1/resources/logo/concepts/10-glitched-x.svg +28 -0
- axross-0.4.1/resources/logo/concepts/11-compass.svg +32 -0
- axross-0.4.1/resources/logo/concepts/12-celtic-knot.svg +21 -0
- axross-0.4.1/resources/logo/concepts/13-punch-card.svg +55 -0
- axross-0.4.1/resources/logo/concepts/14-subway.svg +33 -0
- axross-0.4.1/resources/logo/concepts/15-prism.svg +38 -0
- axross-0.4.1/resources/logo/concepts/16-iceberg.svg +30 -0
- axross-0.4.1/resources/logo/concepts/17-sigil.svg +34 -0
- axross-0.4.1/resources/logo/concepts/18-antenna.svg +36 -0
- axross-0.4.1/resources/logo/concepts/19-tape-reel.svg +32 -0
- axross-0.4.1/resources/logo/concepts/20-neon.svg +42 -0
- axross-0.4.1/resources/logo/concepts/__init__.py +1 -0
- axross-0.4.1/resources/scripts/README.md +129 -0
- axross-0.4.1/resources/scripts/__init__.py +1 -0
- axross-0.4.1/resources/scripts/atomic_replace.py +34 -0
- axross-0.4.1/resources/scripts/backend_capabilities.py +70 -0
- axross-0.4.1/resources/scripts/bookmark_audit.py +61 -0
- axross-0.4.1/resources/scripts/bookmarks_export.py +60 -0
- axross-0.4.1/resources/scripts/bulk_rename.py +47 -0
- axross-0.4.1/resources/scripts/cas_dedupe.py +43 -0
- axross-0.4.1/resources/scripts/cisco_collect.py +58 -0
- axross-0.4.1/resources/scripts/connection_probe.py +60 -0
- axross-0.4.1/resources/scripts/dedupe.py +50 -0
- axross-0.4.1/resources/scripts/du.py +35 -0
- axross-0.4.1/resources/scripts/encrypted_archive.py +115 -0
- axross-0.4.1/resources/scripts/encrypted_stream.py +49 -0
- axross-0.4.1/resources/scripts/find_secrets.py +81 -0
- axross-0.4.1/resources/scripts/fingerprint_diff.py +52 -0
- axross-0.4.1/resources/scripts/git_changelog.py +32 -0
- axross-0.4.1/resources/scripts/gopher_archive.py +53 -0
- axross-0.4.1/resources/scripts/hash_audit.py +42 -0
- axross-0.4.1/resources/scripts/imap_archive.py +34 -0
- axross-0.4.1/resources/scripts/lab_smoke.py +42 -0
- axross-0.4.1/resources/scripts/mirror.py +65 -0
- axross-0.4.1/resources/scripts/nntp_subjects.py +31 -0
- axross-0.4.1/resources/scripts/port_scan.py +47 -0
- axross-0.4.1/resources/scripts/profile_audit.py +62 -0
- axross-0.4.1/resources/scripts/ramfs_decrypt.py +27 -0
- axross-0.4.1/resources/scripts/ramfs_pipeline.py +60 -0
- axross-0.4.1/resources/scripts/redact.py +51 -0
- axross-0.4.1/resources/scripts/s3_inventory.py +62 -0
- axross-0.4.1/resources/scripts/slp_inventory.py +30 -0
- axross-0.4.1/resources/scripts/snapshot_walk.py +38 -0
- axross-0.4.1/resources/scripts/sqlite_export.py +52 -0
- axross-0.4.1/resources/scripts/tftp_audit.py +31 -0
- axross-0.4.1/resources/scripts/webdav_quota.py +27 -0
- axross-0.4.1/resources/wordlists/__init__.py +1 -0
- axross-0.4.1/resources/wordlists/tftp_common.txt +213 -0
- axross-0.4.1/setup.cfg +4 -0
- axross-0.4.1/setup.py +5 -0
- axross-0.4.1/tests/test_backend_regressions.py +2497 -0
- axross-0.4.1/tests/test_e2e.py +645 -0
- axross-0.4.1/tests/test_hardening_regressions.py +18920 -0
- axross-0.4.1/tests/test_network.py +788 -0
- axross-0.4.1/tests/test_new_features.py +386 -0
- axross-0.4.1/tests/test_packaging.py +602 -0
- axross-0.4.1/tests/test_pane_layout_regressions.py +41 -0
- axross-0.4.1/tests/test_protocols.py +9184 -0
- axross-0.4.1/tests/test_pypi_packaging.py +123 -0
- axross-0.4.1/tests/test_regressions.py +960 -0
- axross-0.4.1/tests/test_windows_integration.py +198 -0
- axross-0.4.1/ui/__init__.py +0 -0
- axross-0.4.1/ui/batch_rename_dialog.py +222 -0
- axross-0.4.1/ui/bookmark_edit_dialog.py +161 -0
- axross-0.4.1/ui/bookmark_sidebar.py +212 -0
- axross-0.4.1/ui/cas_dialog.py +252 -0
- axross-0.4.1/ui/checksum_dialog.py +65 -0
- axross-0.4.1/ui/column_prefs.py +125 -0
- axross-0.4.1/ui/connection_dialog.py +1320 -0
- axross-0.4.1/ui/create_xlink_dialog.py +129 -0
- axross-0.4.1/ui/dock_titlebar.py +105 -0
- axross-0.4.1/ui/elevated_viewer.py +113 -0
- axross-0.4.1/ui/file_pane.py +2721 -0
- axross-0.4.1/ui/hex_editor.py +700 -0
- axross-0.4.1/ui/icon_provider.py +533 -0
- axross-0.4.1/ui/image_viewer.py +258 -0
- axross-0.4.1/ui/layout_presets.py +129 -0
- axross-0.4.1/ui/layout_utils.py +79 -0
- axross-0.4.1/ui/log_dock.py +195 -0
- axross-0.4.1/ui/main_window.py +3237 -0
- axross-0.4.1/ui/metadata_search_dialog.py +265 -0
- axross-0.4.1/ui/permissions_dialog.py +159 -0
- axross-0.4.1/ui/repl_widget.py +837 -0
- axross-0.4.1/ui/snapshot_browser_dialog.py +276 -0
- axross-0.4.1/ui/terminal_pane.py +287 -0
- axross-0.4.1/ui/terminal_widget.py +840 -0
- axross-0.4.1/ui/text_editor.py +252 -0
- axross-0.4.1/ui/transfer_dock.py +164 -0
- 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.
|
axross-0.4.1/INSTALL.md
ADDED
|
@@ -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.
|
axross-0.4.1/MANIFEST.in
ADDED
|
@@ -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.
|