2323import android .content .SharedPreferences ;
2424import android .net .Uri ;
2525import android .os .Bundle ;
26+ import android .preference .PreferenceManager ;
2627import android .view .Menu ;
2728import android .view .MenuInflater ;
2829import android .view .MenuItem ;
3132import android .widget .AdapterView ;
3233import android .widget .AdapterView .OnItemLongClickListener ;
3334import android .widget .ArrayAdapter ;
35+ import android .widget .EditText ;
3436import android .widget .ListView ;
3537import android .widget .ProgressBar ;
38+ import android .widget .TextView ;
3639import android .widget .Toast ;
3740import android .widget .ToggleButton ;
3841
5457import java .util .ArrayList ;
5558
5659public class PortScanner extends Plugin {
60+ private TextView mTextDoc = null ;
61+ private EditText mTextParameters = null ;
5762 private ToggleButton mScanToggleButton = null ;
5863 private ProgressBar mScanProgress = null ;
5964 private boolean mRunning = false ;
6065 private ArrayList <String > mPortList = null ;
6166 private ArrayAdapter <String > mListAdapter = null ;
6267 private Receiver mScanReceiver = null ;
6368 private String mCustomPorts = null ;
69+ private Menu mMenu = null ;
70+ private static final String CUSTOM_PARAMETERS = "PortScanner.Prefs.CustomParameters" ;
71+ private static final String CUSTOM_PARAMETERS_TEXT = "PortScanner.Prefs.CustomParameters.Text" ;
72+ private SharedPreferences mPreferences = null ;
6473
6574 public PortScanner () {
6675 super (R .string .port_scanner , R .string .port_scanner_desc ,
@@ -72,11 +81,46 @@ public PortScanner() {
7281 mScanReceiver = new Receiver ();
7382 }
7483
84+ /**
85+ * Sets visible the custom parameters text field, and loads the saved parameters
86+ */
87+ private void displayParametersField (){
88+ mTextDoc .setVisibility (View .VISIBLE );
89+ mTextParameters .setVisibility (View .VISIBLE );
90+ mTextParameters .setText (mPreferences .getString (CUSTOM_PARAMETERS_TEXT , "" ));
91+
92+ saveCustomParameters (true );
93+ }
94+
95+ /**
96+ * Hides the custom parameters text field, saving the typed parameters
97+ */
98+ private void hideParametersField (){
99+ saveCustomParameters (false );
100+
101+ mTextDoc .setVisibility (View .GONE );
102+ mTextParameters .setVisibility (View .GONE );
103+ }
104+
105+ /**
106+ * Saves customs parameters entered by the user
107+ *
108+ * @param displayed Sets if the custom parameters text field must be displayed or not
109+ */
110+ private void saveCustomParameters (boolean displayed ){
111+ SharedPreferences .Editor edit = mPreferences .edit ();
112+ edit .putBoolean (CUSTOM_PARAMETERS , displayed );
113+ edit .putString (CUSTOM_PARAMETERS_TEXT , mTextParameters .getText ().toString ());
114+ edit .commit ();
115+ }
116+
75117 private void setStoppedState () {
76118 if (mProcess !=null ) {
77119 mProcess .kill ();
78120 mProcess = null ;
79121 }
122+ saveCustomParameters (mTextParameters .isShown ());
123+
80124 mScanProgress .setVisibility (View .INVISIBLE );
81125 mRunning = false ;
82126 mScanToggleButton .setChecked (false );
@@ -90,13 +134,21 @@ private void setStartedState() {
90134 createPortList ();
91135
92136 try {
93- mProcess = System .getTools ().nmap
94- .synScan (System .getCurrentTarget (), mScanReceiver , mCustomPorts );
137+ if (mTextParameters .isShown ()) {
138+ mListAdapter .clear ();
139+ mListAdapter .notifyDataSetChanged ();
140+ mProcess = System .getTools ().nmap
141+ .customScan (System .getCurrentTarget (), mScanReceiver , mTextParameters .getText ().toString ());
142+ }
143+ else {
144+ mProcess = System .getTools ().nmap
145+ .synScan (System .getCurrentTarget (), mScanReceiver , mCustomPorts );
146+ }
95147
96148 mRunning = true ;
97149 } catch (ChildManager .ChildNotStartedException e ) {
98150 System .errorLogging (e );
99- Toast .makeText (PortScanner .this , getString (R .string .child_not_started ), Toast .LENGTH_LONG ).show ();
151+ Toast .makeText (PortScanner .this , getString (R .string .child_not_started ) + " \n " + e . getLocalizedMessage () , Toast .LENGTH_LONG ).show ();
100152 }
101153 }
102154
@@ -129,9 +181,15 @@ public void onCreate(Bundle savedInstanceState) {
129181 setTheme (R .style .AppTheme );
130182 super .onCreate (savedInstanceState );
131183
184+ mPreferences = System .getSettings ();
185+ mTextDoc = (TextView ) findViewById (R .id .scanDoc );
186+ mTextParameters = (EditText ) findViewById (R .id .scanParameters );
132187 mScanToggleButton = (ToggleButton ) findViewById (R .id .scanToggleButton );
133188 mScanProgress = (ProgressBar ) findViewById (R .id .scanActivity );
134189
190+ if (mPreferences .getBoolean (CUSTOM_PARAMETERS , false ))
191+ displayParametersField ();
192+
135193 mScanToggleButton .setOnClickListener (new OnClickListener () {
136194 @ Override
137195 public void onClick (View v ) {
@@ -220,12 +278,24 @@ public void onCancel() {
220278 public boolean onCreateOptionsMenu (Menu menu ) {
221279 MenuInflater inflater = getMenuInflater ();
222280 inflater .inflate (R .menu .port_scanner , menu );
281+ mMenu = menu ;
282+ mMenu .findItem (R .id .scanner_custom_parameters ).
283+ setChecked (mPreferences .getBoolean (CUSTOM_PARAMETERS , false ));
284+
223285 return super .onCreateOptionsMenu (menu );
224286 }
225287
226288 @ Override
227289 public boolean onOptionsItemSelected (MenuItem item ) {
228290 switch (item .getItemId ()) {
291+ case R .id .scanner_custom_parameters :
292+ if (item .isChecked ())
293+ hideParametersField ();
294+ else
295+ displayParametersField ();
296+
297+ item .setChecked (!item .isChecked ());
298+ return true ;
229299 case R .id .select_ports :
230300
231301 new InputDialog (getString (R .string .select_ports ),
@@ -271,6 +341,9 @@ public void onInputEntered(String input) {
271341 PortScanner .this ).show ();
272342 }
273343
344+ hideParametersField ();
345+ mMenu .findItem (R .id .scanner_custom_parameters ).setChecked (false );
346+
274347 Logger .debug ("mCustomPorts = " + mCustomPorts );
275348 } else
276349 new ErrorDialog (getString (R .string .error ),
0 commit comments