📄 logindialog.java
字号:
/**
* 填充服务器
*
* @param udp
*/
private void fillServers(boolean udp) {
comboServer.removeAll();
String[] servers = udp ? LumaQQ.udpServers : LumaQQ.tcpServers;
for(String s : servers)
comboServer.add(s);
}
/**
* 初始化监听器
*/
private void initListeners() {
// 取消按钮鼠标事件
btnCancel.addMouseListener(new MouseAdapter() {
public void mouseUp(MouseEvent e) {
ok = false;
dialog.close();
}
});
// 登陆按钮鼠标事件
btnLogin.addMouseListener(new MouseAdapter() {
public void mouseUp(MouseEvent e) {
doOk();
}
});
// qq号输入框选择事件
combo.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// 查找选择的号码的信息,重新设置控件的value
Login login = LoginUtil.findLogin(logins, combo.getText());
if(login == null) {
log.error("登陆历史信息文件有错误");
return;
}
setInitValue(login);
}
});
// 密码框的输入事件
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(byte[] passwordKey) {
return md5(new String(codec.encode(passwordKey)).getBytes());
}
/**
* 用户按了登录按钮时调用这个方法
*/
@SuppressWarnings("unchecked")
private void doOk() {
String msg = validate();
if(msg != null) {
MessageDialog.openError(dialog, message_box_common_fail_title, msg);
return;
}
ok = true;
// 保存当前输入
saveInput();
// 得到登陆历史信息文件对象,如果不存在,创建一个
File loginHistory = new File(LumaQQ.LOGIN_HISTORY);
if(logins == null)
logins = ModelUtils.createDefaultLogins();
// 检查是否当前登陆是新的记录
Login login = LoginUtil.findLogin(logins, combo.getText());
if(login == null) {
// 如果没有,把新的登陆信息加入
login = LoginFactory.eINSTANCE.createLogin();
// 设置登陆信息
setLoginValue(login);
// 添加login
logins.getLogin().add(login);
/*
* 这里新建了一个临时列表来排序,因为一个很奇怪的bug
* 使用logins.getLogin()得到的列表,排序时会出错误,
* 确实没有道理,也许是EMF的bug
*/
List<Login> temp = new ArrayList<Login>(logins.getLogin());
// 排序所有的登陆信息,按照QQ号从小到大排
Collections.sort(temp, new Comparator<Login>() {
public int compare(Login l1, Login l2) {
try {
int qq1 = Integer.parseInt(l1.getQq());
int qq2 = Integer.parseInt(l2.getQq());
return qq1 - qq2;
} catch (NumberFormatException e) {
return 0;
}
}
});
logins.getLogin().clear();
logins.getLogin().addAll(temp);
} else {
setLoginValue(login);
}
// 修改最后一次登陆的qq号信息
logins.setLastLogin(combo.getText());
// 写入文件
LoginUtil.save(loginHistory, logins);
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(autoLogin || rememberPassword);
login.setLoginHidden(loginHidden);
login.setAutoLogin(autoLogin);
if(rememberPassword)
login.setPassword(new String(codec.encode(md5pwd)));
else
login.setPassword(new String(codec.encode(getTrianglePasswordKey(md5pwd))));
}
/**
* 初始化控件的值
*/
@SuppressWarnings("unchecked")
private void initValue() {
// 检查配置文件,如果不存在则创建一个
File loginHistory = new File(LumaQQ.LOGIN_HISTORY);
// 读入登陆信息文件
logins = LoginUtil.load(loginHistory);
if(logins == null)
logins = ModelUtils.createDefaultLogins();
// 得到上一次登陆的人的历史信息
Login login = LoginUtil.findLogin(logins, logins.getLastLogin());
// 把所有的QQ号都加到combo里面
addAllQQ();
// 检查login,不应该为null,如果为null了,那文件有问题,采用第一项login
if(login == null) {
List<Login> list = logins.getLogin();
if(list == null || list.size() == 0) return;
login = list.get(0);
}
// 设置初始值
setInitValue(login);
}
/**
* 把所有的QQ号都加到combo里面
*/
@SuppressWarnings("unchecked")
private void addAllQQ() {
for(Login login : (List<Login>)logins.getLogin())
combo.add(login.getQq());
}
/**
* 设置初始值
* @param login Login对象
*/
private void setInitValue(Login login) {
combo.setText(login.getQq());
chkRemember.setSelection(login.isAutoLogin() || login.isRememberPassword());
chkHidden.setSelection(login.isLoginHidden());
chkAuto.setSelection(login.isAutoLogin());
chkRemember.setEnabled(!login.isAutoLogin());
if(chkRemember.getSelection()) {
text.setText("xxxxxxxx");
md5pwd = codec.decode(login.getPassword().getBytes());
} else {
text.setText("");
md5pwd = new byte[16];
}
changed = false;
LoginOption lo = logins.getNetwork();
comboProxyType.select(lo.getProxyType().getValue());
selectProxy(lo.getProxyType().getValue());
textProxyServer.setText(lo.getProxyServer());
textProxyPort.setText(String.valueOf(lo.getProxyPort()));
textUsername.setText(lo.getProxyUsername());
textPassword.setText(lo.getProxyPassword());
rdoTcp.setSelection(lo.isUseTcp());
rdoUdp.setSelection(!lo.isUseTcp());
chkAutoSelect.setSelection(lo.isAutoSelect());
if(lo.getProxyPort() == 443)
comboPort.select(1);
else
comboPort.select(0);
comboServer.setText(lo.getServer());
}
/**
* 校验用户输入
*
* @return
* 错误信息,如果没有错误,返回null
*/
private String validate() {
if(Util.getInt(combo.getText(), -1) == -1)
return message_box_wrong_qq;
else
return null;
}
/**
* 保存输入结果
*/
private void saveInput() {
autoLogin = chkAuto.getSelection();
rememberPassword = autoLogin || chkRemember.getSelection();
loginHidden = chkHidden.getSelection();
qqNum = Util.getInt(combo.getText(), -1);
combo.setText(String.valueOf(qqNum));
if(changed)
md5pwd = md5(md5(text.getText().getBytes()));
else if(md5pwd == null)
md5pwd = md5(md5("".getBytes()));
LoginOption lo = logins.getNetwork();
lo.setUseTcp(rdoTcp.getSelection());
lo.setAutoSelect(chkAutoSelect.getSelection());
lo.setServer(comboServer.getText());
lo.setTcpPort(Util.getInt(comboPort.getText(), 80));
switch(comboProxyType.getSelectionIndex()) {
case 0:
lo.setProxyType(ProxyType.NONE_LITERAL);
break;
case 1:
lo.setProxyType(ProxyType.HTTP_LITERAL);
break;
case 2:
lo.setProxyType(ProxyType.SOCKS5_LITERAL);
break;
}
lo.setProxyServer(textProxyServer.getText());
lo.setProxyPort(Util.getInt(textProxyPort.getText(), 8000));
lo.setProxyUsername(textUsername.getText());
lo.setProxyPassword(textPassword.getText());
}
/**
* 打开对话框
*/
public boolean open() {
// create dialog
Shell parent = getParent();
Display display = parent.getDisplay();
dialog = new Shell(parent, getStyle());
// init child controls
initLayout();
// 初始化控件的值
initValue();
if(!ignoreAuto && chkAuto.getSelection()) {
saveInput();
return true;
}
// init event listeners
initListeners();
// set title and image
dialog.setImage(res.getImage(Resources.icoLumaQQ));
dialog.setText(login_title);
// set dialog to center of screen
dialog.pack();
smallRect = dialog.getBounds();
Rectangle displayRect = display.getBounds();
dialog.setLocation((displayRect.width - smallRect.width) / 2, (displayRect.height - smallRect.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(Resources.getInstance().getImage(Resources.bmpSmth));
else if(c.get(Calendar.HOUR_OF_DAY) >= 20)
lblLogo.setImage(Resources.getInstance().getImage(Resources.bmpLogin2));
else
lblLogo.setImage(Resources.getInstance().getImage(Resources.bmpLogin));
}
/**
* @return Returns the rememberPassword.
*/
public boolean isRememberPassword() {
return rememberPassword;
}
/**
* 切换网络设置面板的显示
*/
private void switchNetworkSetting() {
GridData gd = (GridData)networkContainer.getLayoutData();
gd.exclude = !gd.exclude;
networkContainer.getParent().layout();
dialog.layout();
if(gd.exclude)
dialog.setSize(smallRect.width, smallRect.height);
else
dialog.setSize(smallRect.width, smallRect.height + networkContainer.getSize().y);
Rectangle dialogRect = dialog.getBounds();
Rectangle displayRect = dialog.getDisplay().getClientArea();
dialog.setLocation((displayRect.width - dialogRect.width) >> 1, (displayRect.height - dialogRect.height) >> 1);
useNetworkSetting = !gd.exclude;
}
/**
* @return the logins
*/
public Logins getLogins() {
return logins;
}
/**
* @return the useNetworkSetting
*/
public boolean isUseNetworkSetting() {
return useNetworkSetting;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -