(host)
| 19592 | launchBtn.classList.toggle('cursor-wait', !!busy); |
| 19593 | if (busy) { |
| 19594 | launchBtn.classList.remove('bg-orange-600', 'hover:bg-orange-700'); |
| 19595 | launchBtn.classList.add('bg-orange-500'); |
| 19596 | } else { |
| 19597 | launchBtn.classList.remove('bg-orange-500'); |
| 19598 | launchBtn.classList.add('bg-orange-600', 'hover:bg-orange-700'); |
| 19599 | } |
| 19600 | launchBtn.textContent = label || (busy ? 'Launching...' : 'Execute Attack'); |
| 19601 | }; |
| 19602 | |
| 19603 | if (!ip || !port || !action) { |
| 19604 | addConsoleMessage('Please select IP, Port, and Action for manual attack', 'error'); |
| 19605 | setManualAttackStatus('Please select a target IP, port, and action before launching.', 'error'); |
| 19606 | appendManualAttackLog('Manual attack aborted - missing selections.', 'error'); |
| 19607 | return; |
| 19608 | } |
| 19609 | |
| 19610 | if (!isActionAllowedOnPort(action, port)) { |
| 19611 | const matrix = getManualAttackMatrix(); |
| 19612 | const allowedPorts = (matrix[action]?.ports || []).join(', '); |
| 19613 | const errorMessage = `${action.toUpperCase()} brute force is only available on port(s): ${allowedPorts || 'restricted'}.`; |
| 19614 | addConsoleMessage(errorMessage, 'error'); |
| 19615 | setManualAttackStatus(errorMessage, 'error'); |
| 19616 | appendManualAttackLog('Manual attack blocked due to incompatible port selection.', 'error'); |
| 19617 | return; |
| 19618 | } |
| 19619 | |
| 19620 | const attackLabel = `${action.toUpperCase()} on ${ip}:${port}`; |
nothing calls this directly
no test coverage detected