/*************************************************************************** * * * Copyright (C) 2005, 2006 by Kevin Gilbert * * kev.gilbert@cdu.edu.au * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "commonwidget.h" #include "compoundwidget.h" #include "htmlwidget.h" #include "knmap.h" #include "loggingoptions.h" #include "nmapoutputbuffer.h" #include "outputwidget.h" #include "pandsoptions.h" #include "profiledialog.h" #include "scanmonitor.h" #include "scanmonitorevent.h" #include "scanwidget.h" #include "simpleoptions.h" #include "tabwidgetdata.h" #include "tabwidgetptrlist.h" #include "timingwidget.h" // constructor // =========== ScanWidget::ScanWidget( const TQString& scanName, const bool useTargetHost, TQWidget* parent, const char* name ) : TQFrame( parent, name ), m_dirty (false ), m_hideOptions( true ), m_ignoreTabChanges( false ), m_nmapProcess( NULL ), m_pipeStderr( NULL ), m_pipeStdout( NULL ), m_scanMonitor( NULL ), m_scanName( scanName ), m_state( dormant ), m_useTargetHost( useTargetHost ) { setFrameStyle( TQFrame::WinPanel | TQFrame::Sunken ); createLayout( ); m_clearOutputButton->setEnabled( false ); m_stopButton->setEnabled( false ); m_startButton->setDefault( true ); srand( time( NULL )); TQTimer::singleShot( 0, this, SLOT( slotFinaliseInitialisation( ))); } // destructor // ========== ScanWidget::~ScanWidget( ) { if( m_nmapProcess != NULL ) { m_nmapProcess->kill( SIGKILL ); delete m_nmapProcess; } if( m_pipeStderr != NULL ) { m_pipeStderr->remove( ); delete m_pipeStderr; } if( m_pipeStdout != NULL ) { m_pipeStdout->remove( ); delete m_pipeStdout; } if( m_scanMonitor != NULL ) { m_scanMonitor->terminate( ); while( m_scanMonitor->running( )) ; delete m_scanMonitor; } } // buildNmapOptionsList // ==================== TQStringList ScanWidget::buildNmapOptionsList( ) { TQStringList nmapOptions; nmapOptions << TDEStandardDirs::findExe ( "nmap" ); if( m_commonWidget->resovleAlwaysState( )) nmapOptions << "-R"; if( m_commonWidget->resovleNeverState( )) nmapOptions << "-n"; if( m_timingWidget->hostTimeoutState( )) { nmapOptions << "--host_timeout"; nmapOptions << TQString::number( m_timingWidget->hostTimeoutValue( )); } if( m_timingWidget->initialRTTTimeoutState( )) { nmapOptions << "--initial_rtt_timeout"; nmapOptions << TQString::number( m_timingWidget->initialRTTTimeoutValue( )); } if( m_timingWidget->maxHostGroupState( )) { nmapOptions << "--max_hostgroup"; nmapOptions << TQString::number( m_timingWidget->maxHostGroupValue( )); } if( m_timingWidget->minHostGroupState( )) { nmapOptions << "--min_hostgroup"; nmapOptions << TQString::number( m_timingWidget->minHostGroupValue( )); } if( m_timingWidget->maxParallelismState( )) { nmapOptions << "--max_parallelism"; nmapOptions << TQString::number( m_timingWidget->maxParallelismValue( )); } if( m_timingWidget->minParallelismState( )) { nmapOptions << "--min_parallelism"; nmapOptions << TQString::number( m_timingWidget->minParallelismValue( )); } if( m_timingWidget->maxRTTTimeoutState( )) { nmapOptions << "--max_rtt_timeout"; nmapOptions << TQString::number( m_timingWidget->maxRTTTimeoutValue( )); } if( m_timingWidget->minRTTTimeoutState( )) { nmapOptions << "--min_rtt_timeout"; nmapOptions << TQString::number( m_timingWidget->minRTTTimeoutValue( )); } if( m_timingWidget->maxScanDelayState( )) { nmapOptions << "--max_scan_delay"; nmapOptions << TQString::number( m_timingWidget->maxScanDelayValue( )); } if( m_timingWidget->scanDelayState( )) { nmapOptions << "--scan_delay"; nmapOptions << TQString::number( m_timingWidget->scanDelayValue( )); } if( !m_timingWidget->simpleTiming( ).isEmpty( )) { nmapOptions << "-T"; nmapOptions << m_timingWidget->simpleTiming( ); } if( m_pAndSWidget->ackState( )) nmapOptions << "-PA" + m_pAndSWidget->ackValue( ); if( m_pAndSWidget->arpState( )) nmapOptions << "-PR"; if( m_pAndSWidget->dontPingState( )) nmapOptions << "-P0"; if( m_pAndSWidget->echoState( )) nmapOptions << "-PE"; if( m_pAndSWidget->netmaskState( )) nmapOptions << "-PM"; if( m_pAndSWidget->synState( )) nmapOptions << "-PS" + m_pAndSWidget->synValue( ); if( m_pAndSWidget->timestampState( )) nmapOptions << "-PP"; if( m_commonWidget->portRangesState( )) { nmapOptions << "-p"; nmapOptions << m_commonWidget->portRanges( )->join( "," ); } if( m_compoundWidget->dataDirState( )) { nmapOptions << "--datadir"; nmapOptions << m_compoundWidget->dataDirValue( ); } if( m_compoundWidget->debugLevelState( )) for( byte i = 0; i < m_compoundWidget->debugLevelValue( ); i++ ) nmapOptions << "-d"; if( m_compoundWidget->dataLengthState( )) { nmapOptions << "--data_length"; nmapOptions << TQString::number( m_compoundWidget->dataLengthValue( )); } if( m_compoundWidget->decoyState( )) { nmapOptions << "-D"; nmapOptions << m_compoundWidget->decoyValue( ); } if( m_compoundWidget->excludeState( )) { nmapOptions << "--exclude"; nmapOptions << m_compoundWidget->excludeValue( ); } if( m_compoundWidget->excludeFileState( )) { nmapOptions << "--excludefile"; nmapOptions << m_compoundWidget->excludeFileValue( ); } if( m_compoundWidget->fragmentLevelState( )) for( byte i = 0; i < m_compoundWidget->fragmentLevelValue( ); i++ ) nmapOptions << "-f"; if( m_compoundWidget->interfaceState( )) { nmapOptions << "-e"; nmapOptions << m_compoundWidget->interfaceValue( ); } if( m_compoundWidget->maxSocketsState( )) { nmapOptions << "-M"; nmapOptions << TQString::number( m_compoundWidget->maxSocketsValue( )); } if( m_compoundWidget->randomIPState( )) { nmapOptions << "-iR"; nmapOptions << TQString::number( m_compoundWidget->randomIPValue( )); } if( m_compoundWidget->sourcePortState( )) { nmapOptions << "--source_port"; nmapOptions << TQString::number( m_compoundWidget->sourcePortValue( )); } if( m_compoundWidget->sourceIPState( )) { nmapOptions << "-S"; nmapOptions << m_compoundWidget->sourceIPValue( ); } if( m_compoundWidget->spoofMacState( )) { nmapOptions << "--spoof_mac"; nmapOptions << m_compoundWidget->spoofMacValue( ); } if( m_compoundWidget->targetFileState( )) { nmapOptions << "-iL"; nmapOptions << m_compoundWidget->targetFileValue( ); } if( m_compoundWidget->ttlState( )) { nmapOptions << "--ttl"; nmapOptions << TQString::number( m_compoundWidget->ttlValue( )); } if( m_simpleWidget->ipV6State( )) nmapOptions << "-6"; if( m_simpleWidget->allPortsState( )) nmapOptions << "--allports"; if( m_loggingWidget->appendOutputState( )) nmapOptions << "--append_output"; if( m_loggingWidget->baseFileNameState( )) { nmapOptions << "-oA"; nmapOptions << m_loggingWidget->baseFileNameValue( ); } if( m_simpleWidget->fastScanState( )) nmapOptions << "-F"; if( m_loggingWidget->grepableLogState( )) { nmapOptions << "-oG"; nmapOptions << m_loggingWidget->grepableLogValue( ); } if( m_simpleWidget->noRandomPortsState( )) nmapOptions << "-r"; if( m_loggingWidget->normalLogState( )) { nmapOptions << "-oN"; nmapOptions << m_loggingWidget->normalLogValue( ); } if( m_loggingWidget->noStylesheetState( )) nmapOptions << "--no_stylesheet"; if( m_simpleWidget->osDetectionState( )) nmapOptions << "-O"; if( m_simpleWidget->osScanLimitState( )) nmapOptions << "--osscan_limit"; if( m_simpleWidget->packetTraceState( )) nmapOptions << "--packet_trace"; if( m_simpleWidget->privilegedState( )) nmapOptions << "--privileged"; if( m_simpleWidget->randomizeHostsState( )) nmapOptions << "--randomize_hosts"; if( m_loggingWidget->resumeState( )) { nmapOptions << "--resume"; nmapOptions << m_loggingWidget->resumeValue( ); } if( m_loggingWidget->scriptKiddieState( )) { nmapOptions << "-oS"; nmapOptions << m_loggingWidget->scriptKiddieValue( ); } if( m_pAndSWidget->scanAckState( )) nmapOptions << "-sA"; if( m_pAndSWidget->scanFINState( )) nmapOptions << "-sF"; if( m_pAndSWidget->scanFTPBounceState( )) { nmapOptions << "-b"; nmapOptions << m_pAndSWidget->scanFTPRelayHost( ); } if( m_pAndSWidget->scanIdleState( )) { nmapOptions << "-sI"; nmapOptions << m_pAndSWidget->zombieDetails( ); } if( m_pAndSWidget->scanListState( )) nmapOptions << "-sL"; if( m_pAndSWidget->scanNullState( )) nmapOptions << "-sN"; if( m_pAndSWidget->scanPingState( )) nmapOptions << "-sP"; if( m_pAndSWidget->scanProtocolState( )) nmapOptions << "-sO"; if( m_pAndSWidget->scanRPCState( )) nmapOptions << "-sR"; if( m_pAndSWidget->scanTCPConnectState( )) nmapOptions << "-sT"; if( m_pAndSWidget->scanSYNState( )) nmapOptions << "-sS"; if( m_pAndSWidget->scanUDPState( )) nmapOptions << "-sU"; if( m_pAndSWidget->scanVersionState( )) nmapOptions << "-sV"; if( m_pAndSWidget->scanWindowState( )) nmapOptions << "-sW"; if( m_pAndSWidget->scanXmasState( )) nmapOptions << "-sX"; if( m_simpleWidget->sendEthState( )) nmapOptions << "--send_eth"; if( m_simpleWidget->sendIPState( )) nmapOptions << "--send_ip"; if( m_loggingWidget->stylesheetState( )) { nmapOptions << "--stylesheet"; nmapOptions << m_loggingWidget->stylesheetValue( ); } if( m_simpleWidget->verboseState( )) nmapOptions << "-v"; if( m_loggingWidget->xmlLogState( )) { nmapOptions << "-oX"; nmapOptions << m_loggingWidget->xmlLogValue( ); } nmapOptions << m_commonWidget->host( ); return nmapOptions; } // closePipe // ========= void ScanWidget::closePipe( TQFile*& pipe, int& pipeFD ) { if( pipe == NULL ) return; ::close( pipeFD ); pipe->remove( ); delete pipe; pipe = NULL; } // createLayout // ============ void ScanWidget::createLayout( ) { m_commonWidget = new CommonWidget( this, "common widget" ); m_compoundWidget = new CompoundWidget( this, "compound widget" ); m_loggingWidget = new LoggingOptions( this, "logging widget" ); m_pAndSWidget = new PAndSOptions( this, "p and s widget" ); m_simpleWidget = new SimpleOptions( this, "simple widget" ); m_timingWidget = new TimingWidget( this, "timing widget" ); m_tabWidget = new KTabWidget( this, "tab widget" ); m_tabWidget->setTabReorderingEnabled( true ); byte row = 0; TQVBoxLayout* layout = new TQVBoxLayout( this ); layout->addWidget( m_tabWidget, row++ ); TQHBoxLayout* buttonLayout = new TQHBoxLayout( ); m_clearOutputButton = new TQPushButton( i18n( "Clear output" ), this, "clear output button" ); m_hideOptionsButton = new TQPushButton( i18n( "Hide options" ), this, "hide options button" ); m_startButton = new TQPushButton( i18n( "Start nmap" ), this, "start button" ); m_stopButton = new TQPushButton( i18n( "Stop nmap" ), this, "stop button" ); byte col = 0; buttonLayout->insertStretch( col++, 10 ); buttonLayout->insertWidget( col++, m_startButton, 5 ); buttonLayout->insertStretch( col++, 3 ); buttonLayout->insertWidget( col++, m_stopButton, 5 ); buttonLayout->insertStretch( col++, 3 ); buttonLayout->insertWidget( col++, m_hideOptionsButton, 5 ); buttonLayout->insertStretch( col++, 3 ); buttonLayout->insertWidget( col++, m_clearOutputButton, 5 ); buttonLayout->insertStretch( col++, 10 ); layout->addLayout( buttonLayout, row ); m_outputWidget = new OutputWidget( this, "output widget" ); layout->addWidget( m_outputWidget, row++ ); } // createPipe // ========== bool ScanWidget::createPipe( const TQString type, const TQString& tempDir, TQFile*& pipe, int& pipeFD ) { while( true ) { pipe = new TQFile( TQString( "%1knmap_%2_%3" ).arg( tempDir ).arg( type ).arg( rand( ))); if( !pipe->exists( )) break; delete pipe; } if( mkfifo( pipe->name( ).local8Bit(), 0600 )) { TQString text = TQString( i18n( "Couldn't create the named pipe \"%1\" for nmap output: %2\n" )).arg( pipe->name( )).arg( strerror( errno )); m_outputWidget->addOutput( OutputWidget::Stderr, text.local8Bit(), text.local8Bit().length( )); delete pipe; pipe = NULL; return false; } pipeFD = ::open( pipe->name( ).local8Bit(), O_RDONLY | O_NONBLOCK ); if( pipeFD != -1 ) return true; TQString text = TQString( i18n( "Couldn't open the named pipe \"%1\" for nmap output: %2\n" )).arg( pipe->name( )) .arg( strerror( errno )); m_outputWidget->addOutput( OutputWidget::Stderr, text.local8Bit(), text.local8Bit().length( )); delete pipe; pipe = NULL; return false; } // createPipes // =========== bool ScanWidget::createPipes( ) { Q_ASSERT( m_pipeStderr == NULL ); Q_ASSERT( m_pipeStdout == NULL ); TDEStandardDirs standardDirs; TQStringList tempDir = standardDirs.resourceDirs( "tmp" ); if( tempDir.isEmpty( )) { TQString text = TQString( i18n( "Couldn't create the named pipe for nmap output: no temp file dir\n" )); m_outputWidget->addOutput( OutputWidget::Stderr, text.local8Bit(), text.local8Bit().length( )); return false; } if( !createPipe( "stderr", tempDir[ 0 ], m_pipeStderr, m_pipeStderrFD )) return false; return createPipe( "stderr", tempDir[ 0 ], m_pipeStdout, m_pipeStdoutFD ); } // customEvent // =========== void ScanWidget::customEvent( TQCustomEvent* event ) { smePtr scanMonitorEvent = (ScanMonitorEvent*) event; nobPtr buffer; switch( event->type( )) { case ScanMonitor::StderrType: buffer = scanMonitorEvent->buffer( ); m_outputWidget->addOutput( OutputWidget::Stderr, buffer->buffer( ), buffer->length( )); buffer->setFree( ); break; case ScanMonitor::StdoutType: buffer = scanMonitorEvent->buffer( ); m_outputWidget->addOutput( OutputWidget::Stdout, buffer->buffer( ), buffer->length( )); buffer->setFree( ); break; default: kdDebug( ) << "internal error in ScanWidget::customEvent - unknown event type " << event->type( ) << " - ignoring it" << endl; } } // fileSave // ======== void ScanWidget::fileSave( ) { if( m_outputWidget->fileSave( )) emit( outputAvailable( false, true )); } // fileSaveAs // ========== void ScanWidget::fileSaveAs( ) { if( m_outputWidget->fileSaveAs( )) emit( outputAvailable( false, true )); } // getOptions // ========== bool ScanWidget::getOptions( ) { m_piping = false; if( !m_commonWidget->getOptions( )) return false; if( !m_compoundWidget->getOptions( m_piping )) return false; if( !m_loggingWidget->getOptions( )) return false; if( !m_pAndSWidget->getOptions( m_piping )) return false; if( !m_simpleWidget->getOptions( m_piping )) return false; if( !m_timingWidget->getOptions( )) return false; if( m_commonWidget->host( ).isEmpty( ) && !m_compoundWidget->targetFileState( )) { KMessageBox::error( this, i18n( "Target host(s) not specified by \"Target host(s)\" or \"Target hosts file\" options" ), i18n( "Target host(s) error" )); return false; } return true; } // profileAskAndSave // ================= void ScanWidget::profileAskAndSave( ) { if( !m_dirty ) return; if( KMessageBox::Yes != KMessageBox::questionYesNo( this, i18n( "Profile has been updated - save it now?" ), i18n( "Profile data updated" ))) return; profileSave( ); } // profileCopy // =========== void ScanWidget::profileCopy( ) { ProfileDialog dlg( ProfileDialog::Copy, m_profileName, this, "profile dlg" ); dlg.exec( ); } // profileDelete // ============= void ScanWidget::profileDelete( ) { ProfileDialog dlg( ProfileDialog::Delete, m_profileName, this, "profile dlg" ); dlg.exec( ); } // profileLoad // =========== void ScanWidget::profileLoad( ) { profileAskAndSave( ); ProfileDialog dlg( ProfileDialog::Load, m_profileName, this, "profile dlg" ); if( dlg.exec( ) != TQDialog::Accepted ) return; m_profileName = dlg.profileName( ); saveProfileName( ); profileRead( ); setInitialValues( ); } // profileRead // =========== void ScanWidget::profileRead( ) { TDEConfig* config = kapp->config( ); kapp->config( )->setGroup( m_profileName ); m_commonWidget->readProfile( config ); m_compoundWidget->readProfile( config ); m_loggingWidget->readProfile( config ); m_pAndSWidget->readProfile( config ); m_outputWidget->readProfile( config ); m_simpleWidget->readProfile( config ); m_timingWidget->readProfile( config ); m_commonIndex = config->readNumEntry( "commonWidget", 0 ); m_compoundIndex = config->readNumEntry( "compoundWidget", 2 ); m_currentTab = config->readNumEntry( "currentTab", 0 ); m_loggingIndex = config->readNumEntry( "loggingWidget", 3 ); m_pAndSIndex = config->readNumEntry( "pAndSWidget", 4 ); m_simpleIndex = config->readNumEntry( "simpleWidget", 1 ); m_timingIndex = config->readNumEntry( "timingWidget", 5 ); m_useTargetHost = config->readBoolEntry( "useTargetHost", false ); } // profileRename // ============= void ScanWidget::profileRename( ) { ProfileDialog dlg( ProfileDialog::Rename, m_profileName, this, "profile dlg" ); dlg.exec( ); } // profileSave // =========== void ScanWidget::profileSave( ) { if( !getOptions( )) if( KMessageBox::Yes != KMessageBox::questionYesNo( this, i18n( "Do you still want to save the profile? (It may be in an inconsistent state." ), i18n( "Save inconsistent profile" ))) return; TDEConfig* config = kapp->config( ); config->setGroup( m_profileName ); m_commonWidget->saveProfile( config ); m_compoundWidget->saveProfile( config ); m_loggingWidget->saveProfile( config ); m_outputWidget->saveProfile( config ); m_pAndSWidget->saveProfile( config ); m_simpleWidget->saveProfile( config ); m_timingWidget->saveProfile( config ); config->writeEntry( "commonWidget", m_tabWidget->indexOf( m_commonWidget )); config->writeEntry( "compoundWidget", m_tabWidget->indexOf( m_compoundWidget )); config->writeEntry( "currentTab", m_tabWidget->currentPageIndex( )); config->writeEntry( "loggingWidget", m_tabWidget->indexOf( m_loggingWidget )); config->writeEntry( "pAndSWidget", m_tabWidget->indexOf( m_pAndSWidget )); config->writeEntry( "simpleWidget", m_tabWidget->indexOf( m_simpleWidget )); config->writeEntry( "timingWidget", m_tabWidget->indexOf( m_timingWidget )); config->writeEntry( "useTargetHost", m_useTargetHost ); slotOptionsDirty( false ); } // profileSaveAs // ============= void ScanWidget::profileSaveAs( ) { ProfileDialog dlg( ProfileDialog::SaveAs, m_profileName, this, "profile dlg" ); if( dlg.exec( ) != TQDialog::Accepted ) return; m_profileName = dlg.profileName( ); saveProfileName( ); profileSave( ); } // readSettings // ============ void ScanWidget::readSettings( ) { TDEConfig* config = kapp->config( ); config->setGroup( m_scanName ); m_profileName = config->readEntry( "profileName", DEFAULT_PROFILE ); profileRead( ); } // renameScan // ========== void ScanWidget::renameScan( const TQString& newScanName ) { kapp->config( )->deleteGroup( m_scanName ); m_scanName = newScanName; } // saveProfileName // =============== void ScanWidget::saveProfileName( ) { TDEConfig* config = kapp->config( ); config->setGroup( m_scanName ); config->writeEntry( "profileName", m_profileName ); } // saveSettings // ============ void ScanWidget::saveSettings( ) { saveProfileName( ); profileSave( ); } // setInitialValues // ================ void ScanWidget::setInitialValues( ) { m_commonWidget->setInitialValues( ); m_compoundWidget->setInitialValues( ); m_loggingWidget->setInitialValues( ); m_pAndSWidget->setInitialValues( ); m_simpleWidget->setInitialValues( ); m_timingWidget->setInitialValues( ); TabWidgetPtrList list; list.append( new TabWidgetData( m_commonIndex, i18n( "Common options" ), m_commonWidget )); list.append( new TabWidgetData( m_compoundIndex, i18n( "Compound options" ), m_compoundWidget )); list.append( new TabWidgetData( m_loggingIndex, i18n( "Logging options" ), m_loggingWidget )); list.append( new TabWidgetData( m_pAndSIndex, i18n( "Ping and Scan options" ), m_pAndSWidget )); list.append( new TabWidgetData( m_simpleIndex, i18n( "Simple options" ), m_simpleWidget )); list.append( new TabWidgetData( m_timingIndex, i18n( "Timing options" ), m_timingWidget )); list.sort( ); while( m_tabWidget->count( )) m_tabWidget->removePage( m_tabWidget->page( 0 )); for( TabWidgetData* widgetData = list.first( ); widgetData != NULL; widgetData = list.next( )) m_tabWidget->insertTab( widgetData->widget( ), widgetData->title( ), widgetData->index( )); m_tabWidget->setCurrentPage( m_currentTab ); } // setProfileName // ============== void ScanWidget::setProfileName( const TQString& profileName ) { m_profileName = profileName; saveProfileName( ); profileRead( ); } // slotClearOutput // =============== void ScanWidget::slotClearOutput( ) { m_clearOutputButton->setEnabled( false ); m_outputWidget->clearOutput( ); emit( outputAvailable( false, false )); } // slotDisplayDocBook // ================== void ScanWidget::slotDisplayDocBook( const TQString& anchor ) { TDEProcess* process = new TDEProcess; *process << "khelpcenter"; *process << "help:/knmap//index.html#" + anchor; process->start( TDEProcess::DontCare ); } // slotDisplayUnknown // ================== void ScanWidget::slotDisplayUnknown( ) { KMessageBox::sorry( this, i18n( "There is no help available for the item you have selected!\nTOUGH!!!\nDon't bother me with you pathetic whinges. Go get a life." ), i18n( "Help unavailable" )); } // slotFinaliseInitialisation // ========================== void ScanWidget::slotFinaliseInitialisation( ) { setInitialValues( ); m_commonWidget->finaliseInitialisation( ); m_compoundWidget->finaliseInitialisation( ); m_pAndSWidget->finaliseInitialisation( ); m_simpleWidget->finaliseInitialisation( ); m_timingWidget->finaliseInitialisation( ); connect( m_outputWidget, SIGNAL( statusBarText( const TQString& )), SIGNAL( statusBarText( const TQString& ))); connect( m_clearOutputButton, SIGNAL( clicked( )), SLOT( slotClearOutput( ))); connect( m_commonWidget, SIGNAL( disableFastScan( )), m_simpleWidget, SLOT( slotDisableFastScan( ))); connect( m_commonWidget, SIGNAL( targetChanged( const TQString& )), SLOT( slotTargetChanged( const TQString& ))); connect( m_hideOptionsButton, SIGNAL( clicked( )), SLOT( slotHideOptions( ))); connect( m_simpleWidget, SIGNAL( disablePortRanges( )), m_commonWidget, SLOT( slotDisablePortRanges( ))); connect( m_startButton, SIGNAL( clicked( )), SLOT( slotStartClicked( ))); connect( m_stopButton, SIGNAL( clicked( )), SLOT( slotStopClicked( ))); connect( m_tabWidget, SIGNAL( currentChanged( TQWidget* )), SLOT( slotTabChanged( TQWidget* ))); connect( m_commonWidget, SIGNAL( optionsDirty( )), SLOT( slotOptionsDirty( ))); connect( m_compoundWidget, SIGNAL( optionsDirty( )), SLOT( slotOptionsDirty( ))); connect( m_loggingWidget, SIGNAL( optionsDirty( )), SLOT( slotOptionsDirty( ))); connect( m_pAndSWidget, SIGNAL( optionsDirty( )), SLOT( slotOptionsDirty( ))); connect( m_simpleWidget, SIGNAL( optionsDirty( )), SLOT( slotOptionsDirty( ))); connect( m_tabWidget, SIGNAL( movedTab( int, int )), SLOT( slotOptionsDirty( ))); connect( m_timingWidget, SIGNAL( optionsDirty( )), SLOT( slotOptionsDirty( ))); connect( m_commonWidget, SIGNAL( displayHelp( const TQString& )), SIGNAL( displayHelp( const TQString& ))); connect( m_compoundWidget, SIGNAL( displayHelp( const TQString& )), SIGNAL( displayHelp( const TQString& ))); connect( m_loggingWidget, SIGNAL( displayHelp( const TQString& )), SIGNAL( displayHelp( const TQString& ))); connect( m_pAndSWidget, SIGNAL( displayHelp( const TQString& )), SIGNAL( displayHelp( const TQString& ))); connect( m_simpleWidget, SIGNAL( displayHelp( const TQString& )), SIGNAL( displayHelp( const TQString& ))); connect( m_timingWidget, SIGNAL( displayHelp( const TQString& )), SIGNAL( displayHelp( const TQString& ))); connect( m_commonWidget, SIGNAL( displayDocBook( const TQString& )), SLOT( slotDisplayDocBook( const TQString&))); connect( m_compoundWidget, SIGNAL( displayDocBook( const TQString& )), SLOT( slotDisplayDocBook( const TQString&))); connect( m_loggingWidget, SIGNAL( displayDocBook( const TQString& )), SLOT( slotDisplayDocBook( const TQString&))); connect( m_pAndSWidget, SIGNAL( displayDocBook( const TQString& )), SLOT( slotDisplayDocBook( const TQString&))); connect( m_simpleWidget, SIGNAL( displayDocBook( const TQString& )), SLOT( slotDisplayDocBook( const TQString&))); connect( m_timingWidget, SIGNAL( displayDocBook( const TQString& )), SLOT( slotDisplayDocBook( const TQString&))); connect( m_commonWidget, SIGNAL( displayUnknown( )), SLOT( slotDisplayUnknown( ))); connect( m_compoundWidget, SIGNAL( displayUnknown( )), SLOT( slotDisplayUnknown( ))); connect( m_loggingWidget, SIGNAL( displayUnknown( )), SLOT( slotDisplayUnknown( ))); connect( m_pAndSWidget, SIGNAL( displayUnknown( )), SLOT( slotDisplayUnknown( ))); connect( m_simpleWidget, SIGNAL( displayUnknown( )), SLOT( slotDisplayUnknown( ))); connect( m_timingWidget, SIGNAL( displayUnknown( )), SLOT( slotDisplayUnknown( ))); if( m_useTargetHost ) renameScan( m_commonWidget->getHostName( )); } // slotHideOptions // =============== void ScanWidget::slotHideOptions( ) { if( m_hideOptions ) { m_tabWidget->hide( ); m_hideOptionsButton->setText( i18n( "Show options" )); } else { m_tabWidget->show( ); m_hideOptionsButton->setText( i18n( "Hide options" )); } m_hideOptions = !m_hideOptions; } // slotOptionsDirty // ================ void ScanWidget::slotOptionsDirty( const bool dirty ) { m_dirty = dirty; emit( optionsDirty( )); } // slotProcessExited // ================= void ScanWidget::slotProcessExited( ) { delete m_nmapProcess; m_nmapProcess = NULL; if( m_piping ) { closePipe( m_pipeStderr, m_pipeStderrFD ); closePipe( m_pipeStdout, m_pipeStdoutFD ); if( m_scanMonitor != NULL ) while( m_scanMonitor->running( )) sleep( 1 ); } m_stopButton->setEnabled( false ); m_startButton->setEnabled( true ); emit( scanStopped( this )); } // slotReceivedStderr // ================== void ScanWidget::slotReceivedStderr( TDEProcess* /* process */, char* buffer, int buflen ) { m_clearOutputButton->setEnabled( true ); m_outputWidget->addOutput( OutputWidget::Stderr, buffer, buflen ); emit( outputAvailable( true, true )); } // slotReceivedStdout // ================== void ScanWidget::slotReceivedStdout( TDEProcess* /* process */, char* buffer, int buflen ) { m_clearOutputButton->setEnabled( true ); m_outputWidget->addOutput( OutputWidget::Stdout, buffer, buflen ); emit( outputAvailable( true, true )); } // slotStartClicked // ================ void ScanWidget::slotStartClicked( ) { if( !getOptions( )) return; m_stopButton->setEnabled( true ); m_startButton->setEnabled( false ); if( m_piping && !createPipes( )) return; TQStringList nmapOptions = buildNmapOptionsList( ); m_nmapProcess = new TDEProcess; if( !m_piping ) *m_nmapProcess << nmapOptions; else { nmapOptions << ">"; nmapOptions << m_pipeStdout->name( ); nmapOptions << "2>"; nmapOptions << m_pipeStderr->name( ); *m_nmapProcess << "tdesu"; *m_nmapProcess << "-n"; *m_nmapProcess << nmapOptions.join( " " ); } TQValueList args = m_nmapProcess->args( ); TQString cmd; TQValueList::iterator it; for( it = args.begin( ); it != args.end( ); ++it ) cmd += *it + " "; cmd.stripWhiteSpace( ); m_clearOutputButton->setEnabled( true ); m_outputWidget->addOutput( OutputWidget::Stdin, cmd.local8Bit(), cmd.local8Bit().length( )); emit( outputAvailable( true, true )); connect( m_nmapProcess, SIGNAL( processExited( TDEProcess* )), SLOT( slotProcessExited( ))); if( !m_piping ) { connect( m_nmapProcess, SIGNAL( receivedStderr( TDEProcess*, char*, int )), SLOT( slotReceivedStderr( TDEProcess*, char*, int ))); connect( m_nmapProcess, SIGNAL( receivedStdout( TDEProcess*, char*, int )), SLOT( slotReceivedStdout( TDEProcess*, char*, int ))); } m_nmapProcess->start( TDEProcess::NotifyOnExit, TDEProcess::AllOutput ); m_state = running; emit( scanStarted( )); if( !m_piping ) return; if( m_scanMonitor == NULL ) m_scanMonitor = new ScanMonitor( this ); m_scanMonitor->setPipeFDs( m_pipeStderrFD, m_pipeStdoutFD ); m_scanMonitor->start( ); } // slotStopClicked // =============== void ScanWidget::slotStopClicked( ) { m_stopButton->setEnabled( false ); m_nmapProcess->kill( ); } // slotTabChanged // ============== void ScanWidget::slotTabChanged( TQWidget* /* toWidget */) { if( !m_ignoreTabChanges ) slotOptionsDirty( ); } // slotTabChanged // ============== void ScanWidget::slotTargetChanged( const TQString& target ) { if( m_useTargetHost ) emit( scanRename( target )); } // updateStatusBarText // =================== void ScanWidget::updateStatusBarText( ) { m_outputWidget->slotUpdateStatusBarText( ); } // useTargetHost // ============== void ScanWidget::useTargetHost( const bool b ) { m_useTargetHost = b; if( m_useTargetHost ) emit( scanRename( m_commonWidget->getHostName( ))); } // wrapText // ======== void ScanWidget::wrapText( const bool wrap ) { m_outputWidget->setWordWrap( wrap ? TQTextEdit::WidgetWidth : TQTextEdit::NoWrap ); } #include "scanwidget.moc"