fix: use live macchanger OUI path
This commit is contained in:
@@ -0,0 +1,143 @@
|
|||||||
|
# Task 1 Report: Cached OUI Identity Resolution
|
||||||
|
|
||||||
|
## Status
|
||||||
|
|
||||||
|
Implemented and verified cached local OUI identity resolution while preserving the existing `oui_vendor()` behavior and unrelated unstaged HTML report changes.
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [x] Added failing resolver tests before production changes.
|
||||||
|
- [x] Verified the tests failed because `OUI_DATA_PATHS` and `oui_identity()` were absent.
|
||||||
|
- [x] Added Nmap and macchanger data paths.
|
||||||
|
- [x] Added a lazy process-level identity cache.
|
||||||
|
- [x] Added local database parsing for plain and separated OUI prefixes.
|
||||||
|
- [x] Preserved Nmap precedence over macchanger and built-in fallback.
|
||||||
|
- [x] Added local/randomized and unknown identities.
|
||||||
|
- [x] Returned JSON-safe dictionaries with `manufacturer`, `model`, `oui`, and `source`.
|
||||||
|
- [x] Kept `model` as `None` for every source.
|
||||||
|
- [x] Preserved `oui_vendor()` behavior.
|
||||||
|
- [x] Ran focused and regression tests.
|
||||||
|
- [x] Self-reviewed the diff and checked whitespace.
|
||||||
|
|
||||||
|
## TDD Evidence
|
||||||
|
|
||||||
|
Initial command:
|
||||||
|
|
||||||
|
```text
|
||||||
|
python3 -m unittest tests.test_recon.OuiVendorTest -v
|
||||||
|
```
|
||||||
|
|
||||||
|
Initial result before implementation:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Ran 8 tests in 0.005s
|
||||||
|
|
||||||
|
FAILED (errors=3)
|
||||||
|
```
|
||||||
|
|
||||||
|
All three new identity tests errored at `mock.patch.object(server, 'OUI_DATA_PATHS', ...)` with:
|
||||||
|
|
||||||
|
```text
|
||||||
|
AttributeError: <module 'server' ...> does not have the attribute 'OUI_DATA_PATHS'
|
||||||
|
```
|
||||||
|
|
||||||
|
After the minimal implementation, the focused resolver test result was:
|
||||||
|
|
||||||
|
```text
|
||||||
|
python3 -m unittest tests.test_recon.OuiVendorTest -v
|
||||||
|
|
||||||
|
Ran 9 tests in 0.005s
|
||||||
|
|
||||||
|
OK
|
||||||
|
```
|
||||||
|
|
||||||
|
## Final Verification
|
||||||
|
|
||||||
|
Command:
|
||||||
|
|
||||||
|
```text
|
||||||
|
python3 -m unittest tests.test_recon.DecodersTest -v
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
```text
|
||||||
|
test_decode_encryption_cases (tests.test_recon.DecodersTest.test_decode_encryption_cases) ... ok
|
||||||
|
test_decode_ssid_bytes_and_str (tests.test_recon.DecodersTest.test_decode_ssid_bytes_and_str) ... ok
|
||||||
|
test_decode_ssid_cli_escapes (tests.test_recon.DecodersTest.test_decode_ssid_cli_escapes) ... ok
|
||||||
|
test_fmt_mac_colon_form (tests.test_recon.DecodersTest.test_fmt_mac_colon_form) ... ok
|
||||||
|
test_fmt_mac_noop (tests.test_recon.DecodersTest.test_fmt_mac_noop) ... ok
|
||||||
|
test_norm_mac_12hex (tests.test_recon.DecodersTest.test_norm_mac_12hex) ... ok
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Ran 6 tests in 0.005s
|
||||||
|
|
||||||
|
OK
|
||||||
|
```
|
||||||
|
|
||||||
|
Command:
|
||||||
|
|
||||||
|
```text
|
||||||
|
python3 -m unittest tests.test_recon -v
|
||||||
|
```
|
||||||
|
|
||||||
|
Output summary:
|
||||||
|
|
||||||
|
```text
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Ran 119 tests in 0.681s
|
||||||
|
|
||||||
|
OK
|
||||||
|
```
|
||||||
|
|
||||||
|
All 119 individual tests printed `... ok`; there were no failures, errors, or warnings.
|
||||||
|
|
||||||
|
Command:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git diff --check
|
||||||
|
```
|
||||||
|
|
||||||
|
Output: no output; exit status 0.
|
||||||
|
|
||||||
|
## Self-Review
|
||||||
|
|
||||||
|
- Local/randomized detection occurs before cache loading, avoiding unnecessary file access.
|
||||||
|
- Cache precedence follows path order and never overwrites an earlier prefix.
|
||||||
|
- Missing files are skipped without masking parsing or programming errors.
|
||||||
|
- Unknown and invalid MACs return JSON-safe values.
|
||||||
|
- `AA` was not used as the unknown global test prefix because its locally administered bit is set; `AC` correctly represents a globally administered unknown prefix.
|
||||||
|
- Existing unstaged HTML signal-ordering changes in `server.py` and `tests/test_recon.py` are intentionally excluded from the Task 1 commit.
|
||||||
|
|
||||||
|
## Concerns
|
||||||
|
|
||||||
|
None. Database source labels rely on the specified two-entry `OUI_DATA_PATHS` ordering.
|
||||||
|
|
||||||
|
## Live Path Correction
|
||||||
|
|
||||||
|
The committed Task 1 diff used `/usr/share/macchanger/OUI.list`, but the design
|
||||||
|
specification and live macchanger package use
|
||||||
|
`/usr/share/macchanger/wireless.list`. Updated `OUI_DATA_PATHS` to the required
|
||||||
|
live path. Resolver tests patch `OUI_DATA_PATHS`, so no test changes were needed.
|
||||||
|
|
||||||
|
Verification after the correction:
|
||||||
|
|
||||||
|
```text
|
||||||
|
python3 -m unittest tests.test_recon.OuiVendorTest -v
|
||||||
|
|
||||||
|
Ran 9 tests in 0.005s
|
||||||
|
|
||||||
|
OK
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
python3 -m unittest tests.test_recon -v
|
||||||
|
|
||||||
|
Ran 119 tests in 0.498s
|
||||||
|
|
||||||
|
OK
|
||||||
|
```
|
||||||
|
|
||||||
|
The unrelated unstaged HTML signal-ordering changes in `server.py` and
|
||||||
|
`tests/test_recon.py`, plus untracked loot and certificate files, remain
|
||||||
|
excluded from this correction.
|
||||||
@@ -1160,7 +1160,7 @@ OUI_VENDORS = {
|
|||||||
|
|
||||||
OUI_DATA_PATHS = [
|
OUI_DATA_PATHS = [
|
||||||
'/usr/share/nmap/nmap-mac-prefixes',
|
'/usr/share/nmap/nmap-mac-prefixes',
|
||||||
'/usr/share/macchanger/OUI.list',
|
'/usr/share/macchanger/wireless.list',
|
||||||
]
|
]
|
||||||
_oui_identity_cache = None
|
_oui_identity_cache = None
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user