CONNECTBOT改造2-增加密码保存功能
CONNECTBOT的主机信息是通过数据库(SQLlite)来保存的,数据库存放在“/data/data/org.connectbot/databases/hosts”文件中。
数据库的处理在\src\main\java\org\connectbot\util\HostDatabase.java,在HostListActivity类的onCreate函数新建数据库操作类:
this.hostdb = new HostDatabase(this);
当开始console连接时,如果host不在数据库中,则新增一条host记录到数据库:
HostBean host = TransportFactory.findHost(hostdb, uri);
if (host == null) {
host = TransportFactory.getTransport(uri.getScheme()).createHost(uri);
host.setColor(HostDatabase.COLOR_GRAY);
host.setPubkeyId(HostDatabase.PUBKEYID_ANY);
hostdb.saveHost(host);
}
我们在hosts文件中新建一个表,表名叫pass,里面两个字段:nickname、passwd,用来记录连接名和密码的对应关系:
在HostDatabase.java的onCreate函数添加:
db.execSQL("CREATE TABLE pass (_id INTEGER PRIMARY KEY,nickname TEXT,passwd TEXT)");
下面是保存密码,,密码验证在\src\main\java\org\connectbot\transport\SSH.java文件的authenticate函数中:
} else if (connection.isAuthMethodAvailable(host.getUsername(), AUTH_PASSWORD)) {
bridge.outputLine(manager.res.getString(R.string.terminal_auth_pass));
String password = bridge.getPromptHelper().requestStringPrompt(null,
manager.res.getString(R.string.prompt_password));
if (password != null
&& connection.authenticateWithPassword(host.getUsername(), password)) {
finishConnection();
} else {
bridge.outputLine(manager.res.getString(R.string.terminal_auth_pass_fail));
}
}
如果验证通过,则完成连接finishConnection(),我们可以在这里保存密码:
在SSH.java中添加密码保存函数savePass,首先判断表是否存在,如不存在则创建一个密码表,然后保存密码记录:
public void savePass(SQLiteDatabase db,String name,String passwd)
{
//判断表是否存在
if(tabIsExist(db,"pass")==false)
{
//不存在则新建
db.execSQL("CREATE TABLE pass (_id INTEGER PRIMARY KEY,nickname TEXT,passwd TEXT)");
}
//判断Nickname是否存在
Cursor c = db.query("pass", null,"nickname = ?", new String[] { String.valueOf(name) },null, null, null);
int recnum=c.getCount();
c.close();
if(recnum>0) {
//存在则更新密码
ContentValues values = new ContentValues();
values.put("passwd", passwd);
if (passwd != "") {
db.update("pass", values, "nickname = ?", new String[]{String.valueOf(name)});
}
}
else{
//不存在则插入一个
ContentValues values = new ContentValues();
values.put("nickname", name);
values.put("passwd", passwd);
db.insert("pass", null,values);
}
}
//判断表是否存在
public boolean tabIsExist(SQLiteDatabase db,String tabName){
boolean result = false;
if(tabName == null){
return false;
}
Cursor cursor = null;
try {
String sql = "select count(*) as c from sqlite_master where type ='table' and name ='"+tabName.trim()+"' ";
cursor = db.rawQuery(sql, null);
if(cursor.moveToNext()){
int count = cursor.getInt(0);
if(count>0){
result = true;
}
}
cursor.close();
} catch (Exception e) {
//cursor.close();
}
return result;
}
然后在finishConnection();前加上调用:
try {
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("/data/data/org.connectbot/databases/hosts", null);
savePass(db,host.getNickname(),password);
}catch (Exception e) {
}
finishConnection();
最后要添加自动填写密码功能:
首先加一个计数,自动填写只有第一次生效(防止服务器密码改变时自动填写重复出错,无法手工输入登录),定义全局变量:
private int trynum=0;
修改输入密码部分:
String password = bridge.getPromptHelper().requestStringPrompt(null,
manager.res.getString(R.string.prompt_password));
改成如下代码:
String password;
if(trynum>0) {
password = bridge.getPromptHelper().requestStringPrompt(null,
manager.res.getString(R.string.prompt_password));
}
else
{
try {
SQLiteDatabase db = SQLiteDatabase.openDatabase("/data/data/org.ywb_ipop/databases/hosts", null,0);
password=getPass(db,host.getNickname());
if(password=="")
password = bridge.getPromptHelper().requestStringPrompt(null,
manager.res.getString(R.string.prompt_password));
}catch (Exception e) {
password = bridge.getPromptHelper().requestStringPrompt(null,
manager.res.getString(R.string.prompt_password));
trynum=1;
}
trynum=1;
}
获取密码函数如下:
public String getPass(SQLiteDatabase db,String name)
{
String temps;
//判断表是否存在
if(tabIsExist(db,"pass")==false)
{
return "";
}
//判断Nickname是否存在
Cursor c = db.query("pass", null,"nickname = ?", new String[] { String.valueOf(name) },null, null, null);
int recnum=c.getCount();
if(recnum>0) {
//存在
c.moveToFirst();
temps=c.getString(2);
c.close();
return temps;
}
else{
return "";
}
}
发表评论