主页 > 其他 > CONNECTBOT改造2-增加密码保存功能

CONNECTBOT改造2-增加密码保存功能

2015年4月22日 CONNECTBOT改造2-增加密码保存功能无评论 阅读: 10,032 次

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 "";
}

}

发表评论

新用户的评论需审核后才会显示;

电子邮件地址不会被公开;
必填项已用*标注