📄 logindialog.java
字号:
});
// 密码框的输入事件
text.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.character == SWT.CR) {
doOk();
}
}
});
// 密码框的改变事件
text.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
changed = true;
}
});
}
private byte[] getTrianglePasswordKey(String pass) {
byte[] b = Util.doMD5(Util.doMD5(pass.getBytes()));
return getTrianglePasswordKey(b);
}
private byte[] getTrianglePasswordKey(byte[] passwordKey) {
return Util.doMD5(new String(Base64.encode(passwordKey)).getBytes());
}
/**
* 用户按了登陆按钮时调用这个方法
*/
private void doOk() {
ok = true;
// 保存当前输入
saveInput();
// 得到登陆历史信息文件对象,如果不存在,创建一个
File loginHistory = new File(LumaQQ.LOGIN_HISTORY);
if(!ConfigHelper.checkLoginHistoryFile(loginHistory)) return;
// 检查是否当前登陆是新的记录
Login login = ConfigHelper.findLogin(logins, combo.getText());
if(login == null) {
// 如果没有,把新的登陆信息加入
login = new LoginImpl();
logins.getLoginList().add(login);
// 排序所有的登陆信息,按照QQ号从小到大排
Collections.sort(logins.getLoginList(), new QQNumberComparator());
}
// 设置登陆信息
setLoginValue(login);
// 修改最后一次登陆的qq号信息
logins.setLastLogin(combo.getText());
// 写入文件
try {
logins.marshal(loginHistory);
} catch (IOException e) {
log.error("登陆历史信息写入失败,本次登陆将不记载");
}
dialog.close();
}
/**
* 把当前信息存入Login对象中
* @param login Login对象
*/
private void setLoginValue(Login login) {
/*
* 目前我采用了一个临时的办法,对于没有选择记住密码的人,把它的md5key做了base64之后
* 再做一次md5,再来一次base64,这样的话应该就安全了,即时它把字符串用base64解密
* 也没用了,但是对于我比较密码还是有用,就是在修改个人信息的时候那个密码,就是
* 那个地方还要比较一下密码。
* 不过,对付暴力破解并没有用,QQ是做了几十万次的MD5来保存密码,我不想做那么多
* 次,Java做不来那么多次,写JNI又懒的动手,就这样吧
*/
login.setQq(combo.getText());
login.setRememberPassword(String.valueOf(rememberPassword));
login.setLoginHidden(String.valueOf(loginHidden));
if(rememberPassword)
login.setPassword(new String(Base64.encode(md5pwd)));
else
login.setPassword(new String(Base64.encode(getTrianglePasswordKey(md5pwd))));
}
/**
* 初始化控件的值
*/
private void initValue() {
// 检查配置文件,如果不存在则创建一个
File loginHistory = new File(LumaQQ.LOGIN_HISTORY);
if(!ConfigHelper.checkLoginHistoryFile(loginHistory)) return;
// 读入登陆信息文件
logins = ConfigHelper.loadLoginHistory(loginHistory);
if(logins == null)
return;
// 得到上一次登陆的人的历史信息
Login login = ConfigHelper.findLogin(logins, logins.getLastLogin());
// 把所有的QQ号都加到combo里面
addAllQQ();
// 检查login,不应该为null,如果为null了,那文件有问题,采用第一项login
if(login == null) {
log.warn("登陆历史信息文件有错误");
List list = logins.getLoginList();
if(list == null || list.size() == 0) return;
login = (Login)list.get(0);
}
// 设置初始值
setInitValue(login);
}
/**
* 把所有的QQ号都加到combo里面
*/
private void addAllQQ() {
List list = logins.getLoginList();
Iterator iter = list.iterator();
while(iter.hasNext()) {
Login l = (Login)iter.next();
combo.add(l.getQq());
}
}
/**
* 设置初始值
* @param login Login对象
*/
private void setInitValue(Login login) {
combo.setText(login.getQq());
chkRemember.setSelection(login.getRememberPassword().equalsIgnoreCase("true"));
chkHidden.setSelection(login.getLoginHidden().equalsIgnoreCase("true"));
if(chkRemember.getSelection()) {
text.setText("xxxxxxxx");
md5pwd = Base64.decode(login.getPassword().toCharArray());
} else {
text.setText("");
md5pwd = new byte[16];
}
changed = false;
}
/**
* 保存输入结果
*/
private void saveInput() {
rememberPassword = chkRemember.getSelection();
loginHidden = chkHidden.getSelection();
qqNum = Util.getInt(combo.getText(), 10001);
if(changed)
md5pwd = Util.doMD5(Util.doMD5(text.getText().getBytes()));
else if(md5pwd == null)
md5pwd = Util.doMD5(Util.doMD5("".getBytes()));
}
/**
* 打开对话框
*/
public boolean open() {
// create dialog
Shell parent = getParent();
Display display = parent.getDisplay();
dialog = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL | SWT.MIN);
// init child controls
initLayout(dialog);
// 初始化控件的值
initValue();
// init event listeners
initListeners(dialog);
// set title and image
dialog.setImage(icons.getImage(IconHolder.icoQQ));
dialog.setText(LumaQQ.getString("login.title"));
// set dialog to center of screen
dialog.pack();
Rectangle dialogRect = dialog.getBounds();
Rectangle displayRect = display.getBounds();
dialog.setLocation((displayRect.width-dialogRect.width)/2, (displayRect.height-dialogRect.height)/2);
// 设置密码框获得焦点
text.setFocus();
combo.setSelection(new Point(0, 0));
// event loop
dialog.open();
while(!dialog.isDisposed())
if(!display.readAndDispatch())
display.sleep();
return ok;
}
/**
* @return Returns the loginHidden.
*/
public boolean isLoginHidden() {
return loginHidden;
}
/**
* @return Returns the md5pwd.
*/
public byte[] getMd5Password() {
return md5pwd;
}
/**
* @return Returns the qqNum.
*/
public int getQQ() {
return qqNum;
}
/**
* 设置logo
*
* @param lblLogo
*/
private void setLogo(Label lblLogo) {
Calendar c = Calendar.getInstance();
if(c.get(Calendar.MONTH) == Calendar.MARCH)
lblLogo.setImage(IconHolder.getInstance().getImage(IconHolder.bmpSmth));
else if(c.get(Calendar.HOUR_OF_DAY) >= 22)
lblLogo.setImage(IconHolder.getInstance().getImage(IconHolder.bmpLogin2));
else
lblLogo.setImage(IconHolder.getInstance().getImage(IconHolder.bmpLogin));
}
/**
* @return Returns the rememberPassword.
*/
public boolean isRememberPassword() {
return rememberPassword;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -