Comments

Friday, January 25, 2013

Android Knockd Client

Posted by at Friday, January 25, 2013 Read our previous post

sheldonknockpenny

Big thanks to Alexis for the source Code.
I have the source code changed a bit
Knockd Android Client Apk
Knockd Android Client Source
DBAdapter.java
package com.alexis.portknocking;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBAdapter {
 private Context ctx;
 private DBOpenHelper helper;
 private SQLiteDatabase db;
 
 public static final String KEY_ID = "_id";
 public static final String KEY_HOST = "host";
 public static final String KEY_PORT = "port";
 public static final String KEY_STARTSTOP = "startstop";
 
 public static final int START_MODE = 0;
 public static final int STOP_MODE = 1;
 
 private static class DBOpenHelper extends SQLiteOpenHelper {
  public DBOpenHelper(Context context) {
   super(context, "hostlist.db", null, 3);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL("CREATE TABLE hosts (_id INTEGER PRIMARY KEY, " +
     "host STRING, " +
     "port INTEGER, " +
     "startstop INTEGER DEFAULT 0," +
     "position INTEGER DEFAULT 0);");
   
   /* Triggers for computing position after DELETE/UPDATE-ing an host. */
   db.execSQL("CREATE TRIGGER host_delete_recalcpos AFTER DELETE ON " +
     "hosts FOR EACH ROW BEGIN UPDATE hosts " +
     "SET position=position-1 WHERE position>old.position; " +
     "END;");
   
   db.execSQL("CREATE TRIGGER host_update_recalcpos BEFORE UPDATE OF position " +
     "ON hosts FOR EACH ROW BEGIN UPDATE hosts " +
     "SET position=old.position WHERE position=new.position; " +
     "END;"); // I love involutive bijections!
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   //db.execSQL("DROP TABLE IF EXISTS hosts");
   //onCreate(db);
  }
 }
 
 public DBAdapter(Context ctx) {
  this.ctx = ctx;
 }
 
 public void open() {
  helper = new DBOpenHelper(this.ctx);
  db = helper.getWritableDatabase();
 }
 
 public void close() {
  db.close();
 }
 
 public int[] getHosts(long startstop) {
  Cursor c = db.query("hosts", 
    new String[]{"_id"}, "startstop="+startstop, null, null, null, "position");
  
  int[] data = new int[c.getCount()];
  c.moveToFirst();
  
  for (int i = 0; i < c.getCount(); i++) {
   data[i] = c.getInt(0);
   c.moveToNext();
  }
  
  c.close();
  
  return data;
 }
 
 public String getHost(int id) {
  Cursor c = db.query("hosts", 
    new String[]{"host"}, "_id ="+id, null, null, null, null);
  String host;
  
  c.moveToFirst();
  host = c.getString(0);
  c.close();
  
  return host;
 }
 
 public int getPort(int id) {
  // TODO: WARNING SQL INJECTION!
  Cursor c = db.query("hosts",
    new String[]{"port"}, "_id = "+id, null, null, null, null);
  c.moveToFirst();
  int result = c.getInt(0);
  c.close();
  
  return result;
 }
 
 public Cursor getRawHosts(int startstop) {
  return db.query("hosts", null, "startstop="+startstop, null, null, null, "position");
 }
 
 public Cursor getRawHost(long id) {
  Cursor c = db.query("hosts", null, "_id = "+String.valueOf(id), null, null, null, null);
  if (c != null)
   c.moveToFirst();
  return c;
 }
 
 public void createHost(String host, Long port, int startstop) {
  db.execSQL("INSERT INTO hosts (host,port,position,startstop) VALUES (?,?,(SELECT " +
    "IFNULL(MAX(position)+1,0) " +
    "FROM hosts WHERE startstop=?),?)", new Object[]{host, port, startstop, startstop});
 }
 
 public void updateHost(long id, String host, Long port) {
  ContentValues args = new ContentValues();
  args.put(KEY_HOST, host);
  args.put(KEY_PORT, port);
  
  db.update("hosts", args, KEY_ID+"="+id, null);
 }
 
 public void deleteHost(long id) {
  db.delete("hosts", KEY_ID+"="+id, null);
 }
 
 public void upHost(long id) {
  db.execSQL("UPDATE hosts SET position = position-1 WHERE _id=?", new Object[]{id});
 }
 
 public void downHost(long id) {
  db.execSQL("UPDATE hosts SET position = position+1 WHERE _id=?", new Object[]{id});
 }
}


HostEdit.java


package com.alexis.portknocking;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

// TODO: Use pause/resume/saved states for automatic DB saving

public class HostEdit extends Activity {
 private Long rowid;
    private DBAdapter dbadapter;
    private EditText wHost;
    private EditText wPort;
    private Button wCancelButton;
    
 private int activity_mode = DBAdapter.START_MODE;
 
    @Override
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hostedit);
        this.setTitle("Add a host");
        
        dbadapter = new DBAdapter(this);
        dbadapter.open();
        
        wHost = (EditText)findViewById(R.id.EditText01);
        wPort = (EditText)findViewById(R.id.EditText02);
        
        wCancelButton = (Button)findViewById(R.id.Button02);
        wCancelButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
          setResult(RESULT_CANCELED);
          finish();
         }
        });
        
        Button savebutton = (Button)findViewById(R.id.Button01);
        savebutton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
          commit();
          
          setResult(RESULT_OK);
          finish();
         }
        });
        
        Bundle extras = getIntent().getExtras();
        if (extras != null) {
         activity_mode = extras.getInt(DBAdapter.KEY_STARTSTOP);
         if (extras.containsKey(DBAdapter.KEY_ID)) {
             rowid = extras.getLong(DBAdapter.KEY_ID);
          populateFields();
         }
        }
    }
    
 private void populateFields() {
  if (rowid != null) {   
   Cursor host = dbadapter.getRawHost(rowid);
   startManagingCursor(host);
   
   wPort.setText(String.valueOf(host.getInt(host.getColumnIndexOrThrow(DBAdapter.KEY_PORT))));
   wHost.setText(host.getString(host.getColumnIndexOrThrow(DBAdapter.KEY_HOST)));
  }
 }
 
 private void commit() {
  if (rowid == null) {
   dbadapter.createHost(wHost.getText().toString(), Long.valueOf(wPort.getText().toString()), activity_mode);
  } else {
   dbadapter.updateHost(rowid, wHost.getText().toString(), Long.valueOf(wPort.getText().toString()));
  }
 }
}





HostList.java


package com.alexis.portknocking;

import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.AdapterView.AdapterContextMenuInfo;

public class HostList extends ListActivity { 
 private static final int ACTIVITY_ADD = 0;
 private static final int ACTIVITY_EDIT = 0;
 
 private int activity_mode = DBAdapter.START_MODE;
 
 private DBAdapter dbadapter;
 
    @Override
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setTitle("Port knocking settings");
        
     Bundle extras = getIntent().getExtras();
     if (extras != null) {
      activity_mode = extras.getInt(DBAdapter.KEY_STARTSTOP);
     }
     
     registerForContextMenu(this.getListView());
        
        dbadapter = new DBAdapter(this.getApplicationContext());
     dbadapter.open();
     
     updateList();
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuItem menuit = menu.add(0, Menu.FIRST, 0, "Add");
        menuit.setIcon(android.R.drawable.ic_menu_add);

        return true;
    }
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
     super.onCreateContextMenu(menu, v, menuInfo);
     menu.add(0, Menu.FIRST+1, 0, "Edit");
     menu.add(1, Menu.FIRST+2, 0, "Up");
     menu.add(2, Menu.FIRST+3, 0, "Down");
     menu.add(3, Menu.FIRST+4, 0, "Delete");
    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {
     super.onContextItemSelected(item);
     AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
     switch(item.getItemId()) {
     case Menu.FIRST+1:
      onListItemClick(this.getListView(), null, info.position, info.id);
      return true;
     case Menu.FIRST+2:
      dbadapter.upHost(info.id);
         updateList();
      return true;
     case Menu.FIRST+3:
      dbadapter.downHost(info.id);
         updateList();
      return true;
     case Menu.FIRST+4:
      dbadapter.deleteHost(info.id);
      updateList();
      return true;
     }
  return false;
    }
    
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
        case Menu.FIRST:
            Intent i = new Intent(this, HostEdit.class);
            i.putExtra(DBAdapter.KEY_STARTSTOP, activity_mode);
            startActivityForResult(i, ACTIVITY_ADD);
            return true;
        }
        
        return super.onMenuItemSelected(featureId, item);
    }
    
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent i = new Intent(this, HostEdit.class);
        i.putExtra(DBAdapter.KEY_ID, id);
        startActivityForResult(i, ACTIVITY_EDIT);
    }
    
    public void updateList() {
     Cursor hostsCursor = dbadapter.getRawHosts(activity_mode);
     startManagingCursor(hostsCursor);
     
     String[] from = new String[]{"host", "port"};
     int[] to = new int[]{R.id.TextView01, R.id.TextView02};
     
     SimpleCursorAdapter hosts = new SimpleCursorAdapter(this, R.layout.hostitem, hostsCursor, from, to);
     setListAdapter(hosts);
    }
}

Knock.java





package com.alexis.portknocking;

import java.io.IOException;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Knock {
 public static boolean doKnock(String host, int port) {
  Socket s;
  try {
   s = new Socket(host, port);
   if (s.isConnected())
    s.close();
  } catch (UnknownHostException e) {
   e.printStackTrace();
   return false;
  } catch (ConnectException e) {
   // We dismiss "connection refused" as knockd operates at link-layer
  } catch (IOException e) {
   e.printStackTrace();
   return false;
  }
  
  return true;
 }
}


PortKnocking.java


package com.alexis.portknocking;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button; 
import android.widget.ImageView;
import android.widget.TextView;

public class PortKnocking extends Activity {
    private static final int ACTIVITY_SETTINGS=0;
 private DBAdapter dbadapter;
 private Handler mHandler = new Handler();
 private ProgressDialog d;
 private boolean success = true;
 
 private void launchKnocking(View view, int startstop) {
  d = ProgressDialog.show(view.getContext(), "Knock Knock Knock ...", "Please wait ...", true);
  
  final int startstop_final = startstop; // TODO: Learn how to use threads.
  
  new Thread(new Runnable() {
   public void run() {
    int[] hosts = dbadapter.getHosts(startstop_final);
    
    for (int i = 0; i < hosts.length; i++) {
     int id = hosts[i];
     final String host = dbadapter.getHost(id);
     final int port = dbadapter.getPort(id);
     mHandler.post(new Runnable() {
      public void run() {
       d.setMessage(String.format("Pinging %s:%d ...", host, port));
       Log.i("PortKnocker", String.format("Pinging %s:%d ...", host, port));
      };
     });
     
     success = true;
     if (!Knock.doKnock(host, port))
      success = false;     
    }
    
    mHandler.post(new Runnable() {
     public void run() {
      d.dismiss();
      
      endKnocking();
     }
    });
   }
  }).start();  
  final TextView text = (TextView) findViewById(R.id.texttimer);
  text.setText("");
  new CountDownTimer(30000, 1000) {

       @Override
   public void onTick(long millisUntilFinished) {
           text.setText("Your Door is Now Open for : " + millisUntilFinished / 1000 + "Seconds");
           ImageView img = (ImageView) findViewById(R.id.imageView1);
           img.setImageResource(R.drawable.opendoor);
           TextView text = (TextView) findViewById(R.id.texttimer);
           text.setTextColor(Color.parseColor("#7CFC00"));
       }

       @Override
   public void onFinish() {
           text.setText("Your Door are Closed Now !!!");
           ImageView img = (ImageView) findViewById(R.id.imageView1);
           img.setImageResource(R.drawable.armitagelogo);
           TextView text = (TextView) findViewById(R.id.texttimer);
           text.setTextColor(Color.parseColor("#FF0000"));
       }
    }.start();
 }
 
 
 public void endKnocking() {
  //AlertDialog.Builder alert = new AlertDialog.Builder(this);
  //alert.setTitle("Port knocking");

  if (success) {
   //alert.setMessage("Knocking complete !");
  } else {
   //alert.setMessage("An error occured during knocking !");
  }
  
  //alert.show();
 }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
     dbadapter = new DBAdapter(this.getApplicationContext());
     dbadapter.open();
     
     Button startButton;
     Button stopButton;
        
        startButton = (Button)findViewById(R.id.Button01);
        startButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
          launchKnocking(view, DBAdapter.START_MODE);
         }
        });
        
        stopButton = (Button)findViewById(R.id.Button02);
        stopButton.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {
          launchKnocking(view, DBAdapter.STOP_MODE);
         }
        });
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuItem menuit = menu.add(0, Menu.FIRST, 0, "Settings");
        menuit.setIcon(android.R.drawable.ic_menu_preferences);
        return true;
    }
    
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
        case Menu.FIRST:
            Intent i = new Intent(this, Settings.class);
            startActivityForResult(i, ACTIVITY_SETTINGS);
            return true;
        }
       
        return super.onMenuItemSelected(featureId, item);
    }
}


Settings.java


package com.alexis.portknocking;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class Settings extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        TabHost thost = getTabHost();
        thost.setup();
        
        TabHost.TabSpec startspec = thost.newTabSpec("start");
        Intent startintent = new Intent(this, HostList.class);
        startintent.putExtra(DBAdapter.KEY_STARTSTOP, DBAdapter.START_MODE);
        startspec.setContent(startintent);
        startspec.setIndicator("HOST", getResources().getDrawable(R.drawable.start));
        thost.addTab(startspec);
        
        //TabHost.TabSpec stopspec = thost.newTabSpec("stop");
        //Intent stopintent = new Intent(this, HostList.class);
        //stopintent.putExtra(DBAdapter.KEY_STARTSTOP, DBAdapter.STOP_MODE);
        //stopspec.setContent(stopintent);
        //stopspec.setIndicator("Stop", getResources().getDrawable(R.drawable.stop));
        //thost.addTab(stopspec);
    }
}

1 comment:

  1. Quantum Binary Signals

    Professional trading signals delivered to your cell phone daily.

    Start following our trades NOW and gain up to 270% a day.

    ReplyDelete

[#] iNFO [#]

All the information provided on this site is for educational purposes only.
 
The site and it's author is in no way responsible for any misuse of the information.
©2012 Security is just an Illusion is powered by Blogger - Template designed by Stramaxon - Best SEO Template