⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 logindialog.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

	/**
     * 填充服务器
     * 
     * @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 + -