Commit Graph

662 Commits

Author SHA1 Message Date
Justin Bollinger b623a0eb6d chore(deps): bump HashcatRosetta to v0.2.0, add click runtime dep
Resolves Dependabot alert #1 — vulnerable pytest tmpdir handling
(< 9.0.3) in HashcatRosetta/requirements.txt. Upstream v0.2.0
drops pytest from runtime requirements and now depends on click
for its CLI/formatting module, so add click>=8.0.0 to hate_crack
runtime deps to keep display_rule_opcodes_summary functional.
2026-05-05 19:41:21 -04:00
Justin Bollinger a881c36537 Merge branch 'dev' into main v2.10.0 2026-05-05 18:51:14 -04:00
Justin Bollinger 3cb40be393 Merge branch 'bugfix/hashview-download' into dev 2026-05-05 18:51:09 -04:00
Justin Bollinger 66e1f3935e test(hashview-download): strengthen assertions, add NTLMv2 rsplit coverage
- Strengthen left-file assertions to verify hash-only lines and exclude passwords
- Add test_download_left_rsplit_ntlmv2 to verify rsplit(":", 1) correctly handles
  multi-colon hashes like NTLMv2 potfile format

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-05 18:36:47 -04:00
Justin Bollinger b7c81a3f36 fix(hashview-download): append found hashes to left file, fix rsplit for NTLMv2 2026-05-05 17:47:52 -04:00
Justin Bollinger 811606e796 feat(wordlist-optimize): accept directories as input, inline tab-completion display, add Wordlist/Rule Tools to main menu
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-05 15:42:56 -04:00
Justin Bollinger 31c476a7a2 fix(wordlist-optimize): use rli.bin (hash-set) instead of rli2.bin (sorted merge-join)
wordlist_optimize worker called wordlist_subtract_single (rli2.bin), which
requires both files to be lexicographically sorted. splitlen.bin preserves
insertion order, so rli2.bin silently missed duplicates. Switch to
wordlist_subtract (rli.bin), which loads the remove-list into a hash set and
is order-independent. Also add "(comma-separated)" to the input paths prompt.
Update worker tests to patch wordlist_subtract instead of wordlist_subtract_single.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 21:26:47 -04:00
Justin Bollinger 81015787ed fix(wordlist-optimize): remove allow_multiple crash, redundant import, add worker tests
- Remove `allow_multiple=True` from wordlist_optimize handler to avoid
  AttributeError when the return value is a list rather than a str
- Remove redundant `import tempfile` inside wordlist_optimize worker body
  (tempfile is already imported at module level on line 29)
- Add TestWordlistOptimizeWorker with 6 tests covering: fast-path
  (empty outdir), merge-path (subtract+append), new-length copy,
  splitlen failure, subtract failure, and missing-input skip

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 21:20:53 -04:00
Justin Bollinger efd525a4a7 feat(wordlist-tools): add Optimize Wordlists submenu option (8)
Adds wordlist_optimize worker to main.py that consolidates multiple
wordlists into per-length deduplicated files using splitlen.bin and
rli2.bin. Wires handler in attacks.py and registers it as option 8 in
the Wordlist Tools submenu. Adds 16 tests covering happy path, empty
input, missing files, empty outdir, failure path, and submenu dispatch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 21:13:10 -04:00
Justin Bollinger 1282f12e2a fix(menu): plain numbered menu by default with aligned key columns
- Switch default from simple-term-menu (arrow-key) to plain numbered
  input so all keys including 10+ can be selected by typing a number;
  arrow-key mode is now opt-in via HATE_CRACK_ARROW_MENU=1
- Right-align key numbers within brackets so single- and multi-digit
  items line up: [ 1] through [99]
- Use [key] format consistently in both plain and arrow-key modes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 18:38:03 -04:00
Justin Bollinger 17ca2e57b3 refactor(menu): close numbering gap, renumber attacks 13-24 → 10-21
Menu options jumped from 9 to 13 because items 10-12 were removed
historically but remaining items kept their old numbers. Renumbers
the contiguous attack block to 10-21, closing the gap.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 18:37:57 -04:00
Justin Bollinger 998e680017 fix(attacks): support range syntax in rule selection (e.g. 138-141)
Rule numbers entered as N-M now expand to all integers in that range
before lookup, matching user expectation that 138-141 selects rules
138 through 141 sequentially. Also catches ValueError alongside
IndexError when a token cannot be converted to int.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 18:37:10 -04:00
Justin Bollinger 59ebf9db7f Merge feature/pcfg-integration: PCFG and PRINCE-LING attacks 2026-05-04 09:18:59 -04:00
Justin Bollinger 4b7ebb53b8 test(pcfg): add UI menu option tests for #23 and #24 2026-05-04 09:11:52 -04:00
Justin Bollinger 1d38a6b939 feat(pcfg): register PCFG attacks in hate_crack.py menu (dual-registration) 2026-05-04 09:10:46 -04:00
Justin Bollinger 085e419604 feat(pcfg): add pcfg_attack and prince_ling_attack handlers in attacks.py 2026-05-04 09:09:39 -04:00
Justin Bollinger a512ff1fdc feat(pcfg): wire menu entries #23 (PCFG) and #24 (PRINCE-LING) in main.py 2026-05-04 09:08:17 -04:00
Justin Bollinger aff0db8540 feat(pcfg): add pcfg and prince_ling dispatchers in main.py 2026-05-04 09:07:07 -04:00
Justin Bollinger 864e67a416 fix(pcfg): catch OSError on cache replace; tighten exception-restore test 2026-05-04 09:06:31 -04:00
Justin Bollinger b2075286c7 feat(pcfg): add hcatPrinceLing attack (mode B — cached wordlist via prince_ling, delegates to hcatPrince)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 09:04:15 -04:00
Justin Bollinger 54d1cfd0ca test(pcfg): tighten hcatPCFG test — patch globals, assert stdin pipe, drop unused 2026-05-04 09:01:57 -04:00
Justin Bollinger ef8af059c5 fix(pcfg): revert generate_session_id signature change, patch in test instead 2026-05-04 08:56:32 -04:00
Justin Bollinger 1963f80e3e feat(pcfg): add hcatPCFG attack (mode A — pcfg_guesser piped to hashcat)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-04 08:53:12 -04:00
Justin Bollinger fd9732ca57 feat(pcfg): verify pcfg_cracker presence at startup (non-fatal) 2026-05-04 08:48:56 -04:00
Justin Bollinger d673332ccd feat(pcfg): load pcfg config keys with sensible defaults 2026-05-04 08:47:04 -04:00
Justin Bollinger e1ac5eee7d feat(pcfg): add pcfgRuleset, pcfgMaxCandidates, pcfgPrinceLingMaxCandidates config keys 2026-05-04 08:45:09 -04:00
Justin Bollinger 7a768c81b6 feat(pcfg): vendor pcfg_cracker as submodule 2026-05-04 08:43:05 -04:00
Justin Bollinger 1021e84f62 Merge branch 'tui-default-dep' into dev 2026-05-03 14:37:13 -04:00
Justin Bollinger 7d7860d28f build(deps): make simple-term-menu a default dependency
Move simple-term-menu from the [tui] optional extra into the main
dependencies list so arrow-key menu navigation works out of the box.
Users can still opt into the plain numbered menu with
HATE_CRACK_PLAIN_MENU=1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 14:37:08 -04:00
Justin Bollinger 3aa7138c9c fix(docker): fix E2E torrent test and transmission-remote compatibility
- Add transmission-cli package (provides transmission-remote binary)
- Fix SETUPTOOLS_SCM_PRETEND_VERSION placement before RUN make install
- Fix PATH to use /root/.local/bin and include venv bin
- Switch TransmissionSession.add() from watch-dir polling to transmission-remote -a
- Remove --no-auth flag (unrecognized in transmission-remote 4.1.0)
- Add test_docker_torrent_downloads_wordlists E2E test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 22:56:13 -04:00
Justin Bollinger 144941d0ed docs(readme): correct version history to v2.9.3
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 20:41:45 -04:00
Justin Bollinger 951bc6f945 docs(readme): consolidate torrent changes under v2.10.0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 20:38:51 -04:00
Justin Bollinger 9d2031016b fix(api): store torrent files in /tmp/hate_crack/ not /tmp/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 20:28:22 -04:00
Justin Bollinger b198e0327b fix(api): increase watch-dir polling timeout from 10s to 30s
Transmission's watch dir scanner runs every ~10s, so a 10s deadline
could expire before the first scan completes. 30s gives 2-3 scan
cycles of headroom.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 20:27:33 -04:00
Justin Bollinger eedf83447c docs(readme): add v2.9.3 version history entry
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 20:08:55 -04:00
Justin Bollinger 09d4acd8ca feat(api): route torrent files through daemon watch dir, not wordlist dir
- Suppress transmission-daemon stdout/stderr (background process)
- Create a watch/ subdir in the session temp config dir; start daemon
  with --watch-dir instead of --no-watch-dir
- Replace transmission-remote -a with shutil.copy2 into the watch dir,
  then poll until the daemon picks it up
- Save .torrent metadata files to tempfile.gettempdir() instead of the
  wordlist directory; update cleanup to match
- Update TransmissionSession.add tests to cover the new watch-dir flow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 20:06:45 -04:00
Justin Bollinger 9b60a8b0fb fix(update): force version rebuild after upgrade to stop update loop
After make install, run uv sync --reinstall-package hate_crack so
setuptools-scm regenerates the version from the new git tag. Without
this, the installed version stays at the old value and the update
checker loops indefinitely.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v2.9.2
2026-04-25 19:46:58 -04:00
Justin Bollinger 2204514239 fix(api): use --port instead of --rpc-port for transmission-daemon
transmission-daemon 4.x uses --port for the RPC port, not --rpc-port.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v2.9.1
2026-04-25 19:41:46 -04:00
Justin Bollinger dc9d52d758 refactor(update): replace custom dep install with make install
_run_upgrade now runs `git pull && git fetch --tags && make install`
instead of the bespoke _install_system_deps function. make install is
idempotent, handles all platforms, installs system deps (transmission-
daemon, p7zip), rebuilds the Python package, and updates the CLI shim.

Remove the now-unnecessary uv binary pre-check (make install locates
it) and its stale test.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 19:40:43 -04:00
Justin Bollinger a0af055f33 feat(update): install system deps (transmission-daemon/p7zip) on upgrade
Add _install_system_deps() called by _run_upgrade() after a successful
git pull. Installs transmission-daemon (Linux) or transmission-cli brew
formula (macOS) so users who upgrade don't need to re-run make install
manually. Also corrects _run_upgrade to exit 1 on failure.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v2.9.0
2026-04-25 19:14:53 -04:00
Justin Bollinger e51881133b Merge branch 'feat/auto-detect-usernames' v2.8.0 2026-04-25 19:09:26 -04:00
Justin Bollinger 233d915ce8 fix(api): add missing return in info_file after exhausted loop
Prevent implicit None return when no data row matches the expected
transmission-remote --info-files format. Also clarify README macOS
install note.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 17:31:31 -04:00
Justin Bollinger 913dbd6efa fix(api): correct brew formula in check_transmission_daemon message
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 16:14:31 -04:00
Justin Bollinger f599a385cc fix(docs): use correct brew formula transmission-cli, clarify both deps
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 16:12:53 -04:00
Justin Bollinger fa6e44cafb chore: replace transmission-cli with transmission-daemon in CI/install
Delete wordlists/kill_transmission.sh (replaced by Python extraction).
Update Makefile, Dockerfile.test, lima config, README, TESTING.md, and
test_dependencies.py to reference transmission-daemon/transmission-remote
instead of transmission-cli.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 00:46:51 -04:00
Justin Bollinger 0ec573c85f fix(api): resolve save_dir once and report total failure in weakpass menu
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 00:43:24 -04:00
Justin Bollinger 43da0769d3 fix(main): wire --download-all-torrents to fetch_torrent_metadata
Pass fetch_torrent_metadata (HTTP-only) to download_all_weakpass_torrents
so the batch collects all .torrent files first, then runs exactly one
TransmissionSession rather than N single-torrent sessions.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 00:37:25 -04:00
Justin Bollinger e7bbd4bc80 refactor(api): wire entry points through TransmissionSession
Split download_torrent_file into fetch_torrent_metadata (HTTP-only) and
a backwards-compat shim. Update weakpass_wordlist_menu,
download_all_weakpass_torrents, and download_weakpass_torrent to collect
.torrent files first, then run a single TransmissionSession batch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 00:36:05 -04:00
Justin Bollinger cd0ba16579 fix(api): correct TransmissionSession edge cases from code review
- add() now diffs before/after list() for fallback ID detection
- remove unreachable return in info_file
- simplify wait_for_all break logic
- always call on_complete even when info_file returns empty string

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 00:31:56 -04:00
Justin Bollinger a60b17e882 feat(api): add TransmissionSession daemon infrastructure
Replace check_transmission_cli with check_transmission_daemon, add
_pick_free_port, TransmissionSession context manager, and
run_torrent_session. A single transmission-daemon process handles all
selected torrents in parallel and tears down via transmission-remote
--exit on completion or interrupt.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-25 00:24:39 -04:00