nyxora 2.6.0__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.
- nyxora-2.6.0/.github/workflows/ci.yml +61 -0
- nyxora-2.6.0/.github/workflows/publish.yml +49 -0
- nyxora-2.6.0/.gitignore +61 -0
- nyxora-2.6.0/CHANGELOG.md +217 -0
- nyxora-2.6.0/CODE_OF_CONDUCT.md +12 -0
- nyxora-2.6.0/CONTRIBUTING.md +43 -0
- nyxora-2.6.0/LICENSE +21 -0
- nyxora-2.6.0/PKG-INFO +234 -0
- nyxora-2.6.0/README.md +185 -0
- nyxora-2.6.0/SECURITY.md +52 -0
- nyxora-2.6.0/assets/nyxora_icon.png +0 -0
- nyxora-2.6.0/docs/.gitkeep +0 -0
- nyxora-2.6.0/docs/ARCHITECTURE.md +183 -0
- nyxora-2.6.0/docs/CLI_UX_SPEC.md +113 -0
- nyxora-2.6.0/docs/RECOVERY.md +144 -0
- nyxora-2.6.0/docs/SECURITY.md +51 -0
- nyxora-2.6.0/docs/help_output_report.md +302 -0
- nyxora-2.6.0/nyxora_windows.spec +96 -0
- nyxora-2.6.0/pyproject.toml +92 -0
- nyxora-2.6.0/scripts_build/build_windows.py +73 -0
- nyxora-2.6.0/src/nyxora/__init__.py +9 -0
- nyxora-2.6.0/src/nyxora/cli/__init__.py +1 -0
- nyxora-2.6.0/src/nyxora/cli/commands/__init__.py +1 -0
- nyxora-2.6.0/src/nyxora/cli/commands/backup.py +275 -0
- nyxora-2.6.0/src/nyxora/cli/commands/generate.py +207 -0
- nyxora-2.6.0/src/nyxora/cli/commands/import_.py +199 -0
- nyxora-2.6.0/src/nyxora/cli/commands/locker.py +213 -0
- nyxora-2.6.0/src/nyxora/cli/commands/recovery.py +145 -0
- nyxora-2.6.0/src/nyxora/cli/commands/scripting.py +278 -0
- nyxora-2.6.0/src/nyxora/cli/commands/secret.py +339 -0
- nyxora-2.6.0/src/nyxora/cli/commands/security.py +271 -0
- nyxora-2.6.0/src/nyxora/cli/commands/tui_cmd.py +83 -0
- nyxora-2.6.0/src/nyxora/cli/commands/update.py +230 -0
- nyxora-2.6.0/src/nyxora/cli/commands/vault.py +454 -0
- nyxora-2.6.0/src/nyxora/cli/helpers.py +187 -0
- nyxora-2.6.0/src/nyxora/cli/main.py +145 -0
- nyxora-2.6.0/src/nyxora/cli/ui.py +437 -0
- nyxora-2.6.0/src/nyxora/core/__init__.py +1 -0
- nyxora-2.6.0/src/nyxora/core/crypto_engine.py +410 -0
- nyxora-2.6.0/src/nyxora/core/intel_engine.py +552 -0
- nyxora-2.6.0/src/nyxora/core/memory_guard.py +221 -0
- nyxora-2.6.0/src/nyxora/core/recovery_core.py +329 -0
- nyxora-2.6.0/src/nyxora/core/session_core.py +203 -0
- nyxora-2.6.0/src/nyxora/core/update_engine.py +244 -0
- nyxora-2.6.0/src/nyxora/core/vault_store.py +976 -0
- nyxora-2.6.0/src/nyxora/data/__init__.py +0 -0
- nyxora-2.6.0/src/nyxora/data/eff_large_wordlist.txt +7776 -0
- nyxora-2.6.0/src/nyxora/sdk.py +300 -0
- nyxora-2.6.0/src/nyxora/tui/__init__.py +2 -0
- nyxora-2.6.0/src/nyxora/tui/app.py +58 -0
- nyxora-2.6.0/src/nyxora/tui/screens/__init__.py +0 -0
- nyxora-2.6.0/src/nyxora/tui/screens/audit_screen.py +79 -0
- nyxora-2.6.0/src/nyxora/tui/screens/search_overlay.py +62 -0
- nyxora-2.6.0/src/nyxora/tui/screens/vault_browser.py +241 -0
- nyxora-2.6.0/src/nyxora/tui/theme.tcss +249 -0
- nyxora-2.6.0/src/nyxora/utils/__init__.py +1 -0
- nyxora-2.6.0/src/nyxora/utils/config.py +210 -0
- nyxora-2.6.0/src/nyxora/utils/exceptions.py +127 -0
- nyxora-2.6.0/tests/__init__.py +0 -0
- nyxora-2.6.0/tests/cli/__init__.py +0 -0
- nyxora-2.6.0/tests/cli/test_backup_commands.py +0 -0
- nyxora-2.6.0/tests/cli/test_generate_commands.py +0 -0
- nyxora-2.6.0/tests/cli/test_locker_commands.py +0 -0
- nyxora-2.6.0/tests/cli/test_recovery_commands.py +0 -0
- nyxora-2.6.0/tests/cli/test_secret_commands.py +0 -0
- nyxora-2.6.0/tests/cli/test_security_commands.py +0 -0
- nyxora-2.6.0/tests/cli/test_vault_commands.py +0 -0
- nyxora-2.6.0/tests/conftest.py +27 -0
- nyxora-2.6.0/tests/integration/__init__.py +0 -0
- nyxora-2.6.0/tests/integration/test_brute_force_lockout.py +72 -0
- nyxora-2.6.0/tests/integration/test_full_workflow.py +100 -0
- nyxora-2.6.0/tests/integration/test_tamper_detection.py +95 -0
- nyxora-2.6.0/tests/integration/test_v2_features.py +111 -0
- nyxora-2.6.0/tests/unit/__init__.py +0 -0
- nyxora-2.6.0/tests/unit/test_cli_commands.py +130 -0
- nyxora-2.6.0/tests/unit/test_cli_help.py +23 -0
- nyxora-2.6.0/tests/unit/test_config.py +55 -0
- nyxora-2.6.0/tests/unit/test_crypto_engine.py +104 -0
- nyxora-2.6.0/tests/unit/test_direct_coverage.py +284 -0
- nyxora-2.6.0/tests/unit/test_intel_engine.py +155 -0
- nyxora-2.6.0/tests/unit/test_interactive_mocks.py +171 -0
- nyxora-2.6.0/tests/unit/test_main_and_vault.py +48 -0
- nyxora-2.6.0/tests/unit/test_massive_coverage.py +117 -0
- nyxora-2.6.0/tests/unit/test_memory_guard.py +30 -0
- nyxora-2.6.0/tests/unit/test_recovery_core.py +69 -0
- nyxora-2.6.0/tests/unit/test_sdk.py +141 -0
- nyxora-2.6.0/tests/unit/test_session_core.py +123 -0
- nyxora-2.6.0/tests/unit/test_tui.py +90 -0
- nyxora-2.6.0/tests/unit/test_ui_components.py +49 -0
- nyxora-2.6.0/tests/unit/test_update_engine.py +127 -0
- nyxora-2.6.0/tests/unit/test_vault_store.py +254 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, develop]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
fail-fast: false
|
|
14
|
+
matrix:
|
|
15
|
+
os: [ubuntu-latest, windows-latest]
|
|
16
|
+
python-version: ["3.12", "3.13", "3.14"]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v4
|
|
20
|
+
|
|
21
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
22
|
+
uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: ${{ matrix.python-version }}
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: |
|
|
28
|
+
python -m pip install --upgrade pip
|
|
29
|
+
pip install -e ".[dev]"
|
|
30
|
+
|
|
31
|
+
- name: Run ruff lint
|
|
32
|
+
run: ruff check src/ tests/
|
|
33
|
+
|
|
34
|
+
- name: Run mypy type check
|
|
35
|
+
run: mypy src/nyxora
|
|
36
|
+
|
|
37
|
+
- name: Run tests
|
|
38
|
+
run: pytest tests/ -x -q --timeout=60
|
|
39
|
+
|
|
40
|
+
build_windows:
|
|
41
|
+
runs-on: windows-latest
|
|
42
|
+
needs: test
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v4
|
|
45
|
+
|
|
46
|
+
- name: Set up Python 3.12
|
|
47
|
+
uses: actions/setup-python@v5
|
|
48
|
+
with:
|
|
49
|
+
python-version: "3.12"
|
|
50
|
+
|
|
51
|
+
- name: Install build deps
|
|
52
|
+
run: |
|
|
53
|
+
python -m pip install --upgrade pip
|
|
54
|
+
pip install -e ".[dev,build]"
|
|
55
|
+
|
|
56
|
+
- name: Verify spec parses
|
|
57
|
+
run: |
|
|
58
|
+
python -c "
|
|
59
|
+
import PyInstaller.__main__
|
|
60
|
+
print('PyInstaller available')
|
|
61
|
+
"
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
|
|
13
|
+
- name: Set up Python
|
|
14
|
+
uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: "3.12"
|
|
17
|
+
|
|
18
|
+
- name: Install build tools
|
|
19
|
+
run: |
|
|
20
|
+
python -m pip install --upgrade pip
|
|
21
|
+
pip install build
|
|
22
|
+
|
|
23
|
+
- name: Build distributions
|
|
24
|
+
run: python -m build
|
|
25
|
+
|
|
26
|
+
- name: Upload distributions as artifact
|
|
27
|
+
uses: actions/upload-artifact@v4
|
|
28
|
+
with:
|
|
29
|
+
name: dist
|
|
30
|
+
path: dist/
|
|
31
|
+
|
|
32
|
+
publish:
|
|
33
|
+
needs: build
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
environment:
|
|
36
|
+
name: pypi
|
|
37
|
+
url: https://pypi.org/project/nyxora/
|
|
38
|
+
permissions:
|
|
39
|
+
id-token: write # Required for OIDC trusted publishing
|
|
40
|
+
|
|
41
|
+
steps:
|
|
42
|
+
- name: Download distributions
|
|
43
|
+
uses: actions/download-artifact@v4
|
|
44
|
+
with:
|
|
45
|
+
name: dist
|
|
46
|
+
path: dist/
|
|
47
|
+
|
|
48
|
+
- name: Publish to PyPI
|
|
49
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
nyxora-2.6.0/.gitignore
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*$py.class
|
|
4
|
+
*.so
|
|
5
|
+
.Python
|
|
6
|
+
build/
|
|
7
|
+
develop-eggs/
|
|
8
|
+
dist/
|
|
9
|
+
downloads/
|
|
10
|
+
eggs/
|
|
11
|
+
.eggs/
|
|
12
|
+
lib/
|
|
13
|
+
lib64/
|
|
14
|
+
parts/
|
|
15
|
+
sdist/
|
|
16
|
+
var/
|
|
17
|
+
wheels/
|
|
18
|
+
*.egg-info/
|
|
19
|
+
.installed.cfg
|
|
20
|
+
*.egg
|
|
21
|
+
|
|
22
|
+
# Testing
|
|
23
|
+
.pytest_cache/
|
|
24
|
+
.coverage
|
|
25
|
+
htmlcov/
|
|
26
|
+
.tox/
|
|
27
|
+
|
|
28
|
+
# Vault files
|
|
29
|
+
*.vault
|
|
30
|
+
*.nyx
|
|
31
|
+
.nyxora/
|
|
32
|
+
nyxora_session/
|
|
33
|
+
*.capsule
|
|
34
|
+
*.key
|
|
35
|
+
*.pem
|
|
36
|
+
|
|
37
|
+
# Environment
|
|
38
|
+
.env
|
|
39
|
+
.env.*
|
|
40
|
+
|
|
41
|
+
# IDE
|
|
42
|
+
.vscode/
|
|
43
|
+
.idea/
|
|
44
|
+
*.swp
|
|
45
|
+
*.swo
|
|
46
|
+
|
|
47
|
+
# OS
|
|
48
|
+
.DS_Store
|
|
49
|
+
Thumbs.db
|
|
50
|
+
|
|
51
|
+
# MyPy
|
|
52
|
+
.mypy_cache/
|
|
53
|
+
|
|
54
|
+
# Ruff
|
|
55
|
+
.ruff_cache/
|
|
56
|
+
|
|
57
|
+
# Temporary & Debug
|
|
58
|
+
*.txt
|
|
59
|
+
!src/nyxora/data/*.txt
|
|
60
|
+
*.bak
|
|
61
|
+
.claude/
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to Nyxora are documented here.
|
|
4
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## [2.6.0] - 2026-05-03
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- **Auto-updater** (`nyx update check/install/rollback/channel`) — GitHub
|
|
12
|
+
Releases API integration with SHA-256 integrity verification, rollback
|
|
13
|
+
support, and non-blocking startup version notification after unlock
|
|
14
|
+
- **Named vault profiles** (`nyx vault profiles/use/add-profile/remove-profile`)
|
|
15
|
+
— multiple vaults managed from one installation; active profile auto-resolves
|
|
16
|
+
vault path across all commands
|
|
17
|
+
- **JSON output mode** (`nyx --json`) — any command emits machine-readable JSON;
|
|
18
|
+
supported on secret get/list/search, vault status, generate password/passphrase
|
|
19
|
+
- **TOTP per entry** — store a TOTP secret alongside credentials;
|
|
20
|
+
`nyx secret totp [entry]` shows live 6-digit code with countdown bar;
|
|
21
|
+
`--watch` flag auto-refreshes every 30 seconds
|
|
22
|
+
- **Vault health score** (`nyx security health`) — 0–100 composite grade
|
|
23
|
+
across strength, breach-free, no-reuse, age, and TOTP coverage
|
|
24
|
+
- **Rotation reminders** (`nyx security due [--days N]`) — lists entries
|
|
25
|
+
whose password hasn't changed in N days, sorted oldest-first
|
|
26
|
+
- **nyx vault import** — extended with `--totp-secret` on update command
|
|
27
|
+
- **Scripting layer** — `nyx script pipe`, `nyx script run`, `nyx script fzf`
|
|
28
|
+
for credential injection into subprocesses without shell history exposure
|
|
29
|
+
- **Python SDK** (`from nyxora import VaultClient`) — high-level programmatic
|
|
30
|
+
vault access with context manager, session-based and password-based modes
|
|
31
|
+
- **Textual TUI** (`nyx tui`) — Obsidian Tactical interactive vault browser;
|
|
32
|
+
entry list with j/k navigation, live search overlay, detail panel with
|
|
33
|
+
TOTP countdown, audit dashboard, amber #C89A30 tactical theme
|
|
34
|
+
- **Shell completions v2** — entry titles complete live from vault on Tab
|
|
35
|
+
for `nyx secret get`, `nyx secret update`, `nyx secret delete`
|
|
36
|
+
- **PyInstaller build** — Windows standalone `nyx.exe` with gem icon;
|
|
37
|
+
`python scripts_build/build_windows.py` produces a single-file executable
|
|
38
|
+
|
|
39
|
+
### Security
|
|
40
|
+
- Schema version bumped to "2"; silent migration adds `totp_secret_enc` column
|
|
41
|
+
to existing v2.0.0 vaults on first open — HMAC stays consistent
|
|
42
|
+
|
|
43
|
+
### Breaking Changes
|
|
44
|
+
- None — fully backward-compatible with v2.0.0 vault files
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## [2.0.0] - 2026-05-03
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
- `nyx vault import` — batch import from CSV, Bitwarden JSON, 1Password CSV,
|
|
52
|
+
and Nyxora JSON export formats with auto-detection and dry-run preview
|
|
53
|
+
- In-session entry cache on VaultStore — eliminates O(N) decryptions on
|
|
54
|
+
repeated list/search operations; invalidated on every mutation
|
|
55
|
+
- `VaultStore.get_metadata_value()` — public API for metadata queries,
|
|
56
|
+
replacing internal `_conn` access in the recovery status command
|
|
57
|
+
- `nyx generate password --min-strength` — regenerates up to 10 times until
|
|
58
|
+
the requested entropy threshold (weak/fair/strong/excellent) is met
|
|
59
|
+
- `nyx generate passphrase --count/-n` — generate multiple passphrases in
|
|
60
|
+
one call, matching the `password` command's existing `--count` flag
|
|
61
|
+
- `nyx secret update --tags` — replace tags on an existing entry
|
|
62
|
+
- `nyx secret add --custom` — attach arbitrary key=value custom fields
|
|
63
|
+
- Full EFF Large Wordlist (7,776 words) replaces the 204-word sample —
|
|
64
|
+
5-word passphrase entropy: 37.7 bits → 64.6 bits
|
|
65
|
+
- 9 new terminal UI components: `entropy_bar`, `strength_badge`,
|
|
66
|
+
`checklist_panel`, `danger_panel`, `session_dashboard`,
|
|
67
|
+
`audit_summary_panel`, `clipboard_countdown`, `update_diff_panel`,
|
|
68
|
+
`recovery_status_panel`
|
|
69
|
+
- Visual entropy bar and strength badge on all generation commands
|
|
70
|
+
- `nyx vault status` now shows a rich session dashboard (entries, session
|
|
71
|
+
token prefix, inactivity timeout, failed attempt count, cipher suite)
|
|
72
|
+
- `nyx vault health-check` renders a pass/fail integrity checklist
|
|
73
|
+
- `nyx security audit` appends a colour-coded summary panel
|
|
74
|
+
- `nyx backup export --plaintext` requires a two-step danger confirmation
|
|
75
|
+
(confirm prompt + type the word CONFIRM)
|
|
76
|
+
- `nyx secret get --copy` auto-clears clipboard after 30 seconds
|
|
77
|
+
- `nyx recovery status` now shows real TOTP/capsule/share detection
|
|
78
|
+
- Real integration tests replacing empty stubs: full vault lifecycle,
|
|
79
|
+
brute-force lockout ladder, 3-layer tamper detection, entry cache,
|
|
80
|
+
metadata API, and CSV import round-trip (135 tests total)
|
|
81
|
+
|
|
82
|
+
### Security
|
|
83
|
+
- Recovery capsule inner and outer encryption now use HKDF-derived
|
|
84
|
+
independent keys (`nyxora:capsule:inner` / `nyxora:capsule:outer`) —
|
|
85
|
+
previously both layers shared `capsule_key` directly
|
|
86
|
+
- Locker `.nyx` files now embed a 16-byte random salt in the header;
|
|
87
|
+
identical filenames always produce a different encryption key
|
|
88
|
+
- `nyx secret update --password` flag removed — password no longer exposed
|
|
89
|
+
in shell history or `ps aux`; interactive prompt required instead
|
|
90
|
+
- Plaintext backup export now requires double confirmation with exact word
|
|
91
|
+
match to prevent accidental credential exposure
|
|
92
|
+
|
|
93
|
+
### Performance
|
|
94
|
+
- `wipe_memory()` passes 2 and 3 now use `ctypes.memset` — orders of
|
|
95
|
+
magnitude faster for large buffers
|
|
96
|
+
- `gc.collect()` removed from `wipe_memory()` — eliminates ResourceWarning
|
|
97
|
+
cascade and unnecessary GC pressure on every key wipe
|
|
98
|
+
- GF(256) multiplicative inverse is now an O(1) precomputed lookup table
|
|
99
|
+
(was O(256) brute-force per call)
|
|
100
|
+
- `security audit` HIBP checks now run concurrently via
|
|
101
|
+
`ThreadPoolExecutor(max_workers=5)` — ~10× faster for large vaults
|
|
102
|
+
|
|
103
|
+
### Fixed
|
|
104
|
+
- `nyx vault change-password`: atomic three-step file swap with rollback —
|
|
105
|
+
power loss can no longer permanently destroy the vault (Phase 1)
|
|
106
|
+
- HMAC comparisons in `_verify_entry_hmac` and `_verify_vault_hmac` now
|
|
107
|
+
use `hmac.compare_digest()` — eliminates timing oracle (Phase 1)
|
|
108
|
+
- `SessionManager` brute-force ladder now active at CLI level —
|
|
109
|
+
`record_failed_attempt()` and `record_successful_unlock()` wired in (Phase 1)
|
|
110
|
+
- `SessionManager._running` initialised in `__init__` — no more
|
|
111
|
+
`AttributeError` when `lock()` called before `unlock()` (Phase 1)
|
|
112
|
+
- `delete_entry` now verifies entry HMAC before soft-deletion, consistent
|
|
113
|
+
with `get_entry` and `update_entry` (Phase 1)
|
|
114
|
+
- `unlock --create` branch now writes the `.salt` file — vault can be
|
|
115
|
+
re-opened after creation via `--create` flag (Phase 2)
|
|
116
|
+
- Empty tag list `[]` in `migrate_from_store` no longer treated as `None` —
|
|
117
|
+
HMAC mismatch after migration fixed (Phase 2)
|
|
118
|
+
- `locker_key` always wiped in `finally` block during encrypt — key no
|
|
119
|
+
longer leaked in memory on exception (Phase 2)
|
|
120
|
+
- `_derive_argon2id` removes pointless `tmp` wipe of a bytearray copy;
|
|
121
|
+
`del raw` minimises lifetime of the immutable `bytes` object (Phase 2)
|
|
122
|
+
- Dead code removed: unreachable `return` after `raise` in HIBP check;
|
|
123
|
+
unused `sha1` variable in `check_breach_offline` (Phase 4)
|
|
124
|
+
- `Config.validate()` called on every `load()` — invalid configs no longer
|
|
125
|
+
silently propagate (Phase 4)
|
|
126
|
+
- `nyx recovery status` no longer returns placeholder text (Phase 2 UI)
|
|
127
|
+
- Panic exit code changed to 4 — no conflict with brute-force lockout
|
|
128
|
+
exit code 3 (Phase 2 UI)
|
|
129
|
+
|
|
130
|
+
### Breaking Changes
|
|
131
|
+
- `.nyx` locker files created with v1.x are **not compatible** with v2.0.0.
|
|
132
|
+
The file header format changed to include a 16-byte per-file salt.
|
|
133
|
+
Re-encrypt files using `nyx locker decrypt` (v1.x) then
|
|
134
|
+
`nyx locker encrypt` (v2.0.0).
|
|
135
|
+
- Recovery capsules created with v1.x are **not compatible** with v2.0.0.
|
|
136
|
+
The HKDF key derivation for inner/outer layers changed.
|
|
137
|
+
Recreate capsules using `nyx recovery create-capsule`.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## [1.2.0] - 2026-05-03
|
|
142
|
+
|
|
143
|
+
### Performance
|
|
144
|
+
- `wipe_memory()` passes 2+3 use `ctypes.memset` (single C-level write)
|
|
145
|
+
- `gc.collect()` removed from `wipe_memory()` — fixes ResourceWarning flood
|
|
146
|
+
- GF(256) inverse now O(1) precomputed lookup table
|
|
147
|
+
- HIBP audit requests now concurrent via `ThreadPoolExecutor(max_workers=5)`
|
|
148
|
+
|
|
149
|
+
### Security
|
|
150
|
+
- Recovery capsule: HKDF-separated inner/outer keys
|
|
151
|
+
- Locker: per-file 16-byte salt embedded in `.nyx` header
|
|
152
|
+
- Full EFF large wordlist (7,776 words) — fixes ~27-bit entropy overstatement
|
|
153
|
+
|
|
154
|
+
### Fixed
|
|
155
|
+
- Dead code removed from `intel_engine.py` (unreachable return, unused sha1)
|
|
156
|
+
- `strength_color()` removed from `generate.py` (replaced by `strength_badge`)
|
|
157
|
+
- `TYPE_CHECKING` no-op removed from `crypto_engine.py`
|
|
158
|
+
- `click` removed as explicit dep (transitive via `typer[all]`)
|
|
159
|
+
- `Config.validate()` now called on `load()`
|
|
160
|
+
- Inactivity monitor mock exhaustion warning resolved in test suite
|
|
161
|
+
|
|
162
|
+
### CI
|
|
163
|
+
- Matrix expanded: ubuntu + windows × Python 3.12, 3.13, 3.14 (6 jobs)
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## [1.1.0] - 2026-05-02
|
|
168
|
+
|
|
169
|
+
### Added
|
|
170
|
+
- 9 new UI components: entropy bar, strength badge, checklist panel,
|
|
171
|
+
danger panel, session dashboard, audit summary panel, clipboard countdown,
|
|
172
|
+
update diff panel, recovery status panel
|
|
173
|
+
- Real integration tests: full vault lifecycle, brute-force lockout, tamper
|
|
174
|
+
detection (7 tests replacing empty stubs)
|
|
175
|
+
- `nyx vault status` → rich session dashboard
|
|
176
|
+
- `nyx vault health-check` → integrity checklist panel
|
|
177
|
+
- `nyx security audit` → summary panel appended
|
|
178
|
+
- `nyx backup export --plaintext` → two-step danger confirmation
|
|
179
|
+
- `nyx secret get --copy` → 30-second clipboard auto-clear
|
|
180
|
+
- `nyx recovery status` → real TOTP/capsule/share detection
|
|
181
|
+
|
|
182
|
+
### Fixed
|
|
183
|
+
- `unlock --create` writes salt file (vault was uncloseable after creation)
|
|
184
|
+
- Empty tag list migration HMAC mismatch resolved
|
|
185
|
+
- `locker_key` wiped in `finally` on encrypt exception
|
|
186
|
+
- `_derive_argon2id` removes misleading `tmp` wipe
|
|
187
|
+
- `nyx secret update --password` flag removed (shell history exposure)
|
|
188
|
+
|
|
189
|
+
### Security
|
|
190
|
+
- Panic exit code 4 (was 3, conflicting with brute-force lockout)
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## [1.0.1] - 2026-05-01
|
|
195
|
+
|
|
196
|
+
### Security
|
|
197
|
+
- `nyx vault change-password`: atomic file swap prevents vault destruction
|
|
198
|
+
- HMAC comparisons use `hmac.compare_digest()` — timing-safe
|
|
199
|
+
- `SessionManager` brute-force ladder wired into CLI unlock path
|
|
200
|
+
- `SessionManager._running` initialised in `__init__`
|
|
201
|
+
- `delete_entry` verifies HMAC before soft-deletion
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## [1.0.0] - 2026-03-03
|
|
206
|
+
|
|
207
|
+
### Added
|
|
208
|
+
- Initial production release
|
|
209
|
+
- Offline zero-knowledge architecture with Argon2id + XChaCha20-Poly1305
|
|
210
|
+
- 7 command groups: vault, secret, generate, security, backup, recovery, locker
|
|
211
|
+
- 3-layer HMAC integrity (per-entry, vault-wide, schema fingerprint)
|
|
212
|
+
- Shamir secret sharing, TOTP, encrypted recovery capsules
|
|
213
|
+
- HIBP k-anonymity breach detection
|
|
214
|
+
- Neon cyberpunk Rich terminal UI
|
|
215
|
+
- Hardened SQLite (WAL, EXCLUSIVE locking, secure_delete)
|
|
216
|
+
- Windows VirtualLock / Linux mlock memory protection
|
|
217
|
+
- 3-pass secure memory wipe (urandom → 0xFF → 0x00)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Contributor Covenant Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone.
|
|
5
|
+
|
|
6
|
+
## Enforcement
|
|
7
|
+
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
|
|
8
|
+
|
|
9
|
+
For all issues, contact **ScorpioCodeX** at `scorpiocodex0@gmail.com`.
|
|
10
|
+
|
|
11
|
+
For all issues related to Nyxora v2.0.0 and above, contact
|
|
12
|
+
**ScorpioCodeX** at `scorpiocodex0@gmail.com`.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Contributing to Nyxora
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in Nyxora.
|
|
4
|
+
|
|
5
|
+
Nyxora is a solo-led project (ScorpioCodeX). External contributions are
|
|
6
|
+
welcome but subject to strict security and style review.
|
|
7
|
+
|
|
8
|
+
## Repository Structure
|
|
9
|
+
|
|
10
|
+
src/nyxora/
|
|
11
|
+
├── cli/commands/ # Typer command modules (one per group)
|
|
12
|
+
├── cli/ui.py # All Rich terminal output — no print() elsewhere
|
|
13
|
+
├── core/ # Cryptographic business logic
|
|
14
|
+
├── data/ # Static data files (EFF wordlist)
|
|
15
|
+
└── utils/ # Config, exceptions
|
|
16
|
+
|
|
17
|
+
tests/
|
|
18
|
+
├── unit/ # Mocked unit tests
|
|
19
|
+
└── integration/ # Real on-disk vault tests (no mocks)
|
|
20
|
+
|
|
21
|
+
## Code Guidelines
|
|
22
|
+
|
|
23
|
+
- Follow the 6-layer dependency model — no layer imports from above itself
|
|
24
|
+
- All sensitive `bytearray` values must be wiped with `wipe_memory()` in a
|
|
25
|
+
`finally` block before the function returns
|
|
26
|
+
- All terminal output must go through `nyxora.cli.ui` — no raw `print()`
|
|
27
|
+
- Never write unencrypted key material to disk or logs
|
|
28
|
+
- New UI output must use existing components from `ui.py` or add a new
|
|
29
|
+
reusable function there — no inline Rich markup in command files
|
|
30
|
+
- New commands must have at least one integration test in `tests/integration/`
|
|
31
|
+
- Maintain the neon cyberpunk aesthetic in all Rich panels and messages
|
|
32
|
+
|
|
33
|
+
## Running Tests
|
|
34
|
+
|
|
35
|
+
pip install -e ".[dev]"
|
|
36
|
+
pytest tests/ -v --timeout=60
|
|
37
|
+
|
|
38
|
+
Coverage must remain above 80% (currently ~94%).
|
|
39
|
+
|
|
40
|
+
## Submitting Changes
|
|
41
|
+
|
|
42
|
+
Open an Issue before any large PR.
|
|
43
|
+
Contact: scorpiocodex0@gmail.com
|
nyxora-2.6.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ScorpioCodeX
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|