Article View: cn.bbs.comp.lang.java
Article #13004��Ұ��ҿ������java����
From: �����
Date: Sat, 10 Jul 2004 11:13
Date: Sat, 10 Jul 2004 11:13
249 lines
7462 bytes
7462 bytes
/*
* $Header: /cvsroot/l2j/L2_Gameserver/java/net/sf/l2j/loginserver/Logins.java,v 1.7 2004/07/05 23:02:00 l2chef Exp $
*
* $Author: l2chef $
* $Date: 2004/07/05 23:02:00 $
* $Revision: 1.7 $
* $Log: Logins.java,v $
* Revision 1.7 2004/07/05 23:02:00 l2chef
* access levels are stored for logins
*
* Revision 1.6 2004/07/04 11:34:39 l2chef
* passwords are no longer stored in plaintext. instead the Hash is stored encoded. that should drastically increase security
*
* Revision 1.5 2004/06/30 21:51:34 l2chef
* using jdk logger instead of println
*
* Revision 1.4 2004/06/27 22:16:51 l2chef
* fixed storing of accout file
*
* Revision 1.3 2004/06/27 20:57:14 l2chef
* autoAccount creation can be set in config file
*
* Revision 1.2 2004/06/27 08:51:43 jeichhorn
* Added copyright notice
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package net.sf.l2j.loginserver;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.logging.Logger;
import net.sf.l2j.Base64;
/**
* This class ...
*
* @version $Revision: 1.7 $ $Date: 2004/07/05 23:02:00 $
*/
public class Logins
{
private static final String SHA = "SHA";
private static final String UTF_8 = "UTF-8";
private static Logger _log = Logger.getLogger(Logins.class.getName());
private HashMap _logPass;
private HashMap _accessLevels;
private boolean _autoCreate;
public Logins(boolean autoCreate)
{
_logPass = new HashMap();
_accessLevels = new HashMap();
_autoCreate = autoCreate;
_log.config("Automatically creating new accounts: " + _autoCreate);
File loginFile = new File("data/logins.txt");
if (loginFile.exists())
{
readFromDisk(loginFile);
}
}
public int getAccessLevel(String user)
{
return ((Integer)_accessLevels.get(user)).intValue();
}
public boolean loginValid(String user, String password)
{
boolean ok = false;
try
{
MessageDigest md = MessageDigest.getInstance(SHA);
byte[] raw = password.getBytes("UTF-8");
byte[] hash = md.digest(raw);
byte[] expected = (byte[]) _logPass.get(user);
if (expected == null)
{
if (_autoCreate)
{
_logPass.put(user, hash);
_accessLevels.put(user, new Integer(0));
_log.info("created new account for "+ user);
saveToDisk();
return true;
}
else
{
_log.warning("account missing for user "+user);
return false;
}
}
ok = true;
for (int i=0;i<expected.length;i++)
{
if (hash[i] != expected[i])
{
ok = false;
break;
}
}
}
catch (Exception e)
{
// digest algo not found ??
// out of bounds should not be possible
_log.warning("could not check password:"+e);
ok = false;
}
return ok;
}
/**
* @param loginFile
*/
private void readFromDisk(File loginFile)
{
LineNumberReader lnr = null;
_logPass.clear();
try
{
int i=0;
String line = null;
lnr = new LineNumberReader(new FileReader(loginFile));
while ( (line = lnr.readLine()) != null)
{
StringTokenizer st = new StringTokenizer(line,"\t\n\r");
if (st.hasMoreTokens())
{
String name = st.nextToken();
String password = st.nextToken();
_logPass.put(name, Base64.decode(password));
// this is just for compatibility to 0.2
if (st.hasMoreTokens())
{
String access = st.nextToken();
Integer level = new Integer(access);
_accessLevels.put(name, level);
}
else
{
_accessLevels.put(name, new Integer(0));
}
i++;
}
}
_log.config("found " + i + " logins on disk");
}
catch (FileNotFoundException e)
{
// cannot happen
}
catch (IOException e1)
{
e1.printStackTrace();
}
finally
{
try
{
lnr.close();
}
catch (Exception e2)
{
}
}
}
public void saveToDisk()
{
File loginFile = new File("data/logins.txt");
FileWriter save = null;
try
{
save = new FileWriter(loginFile);
for (Iterator iter = _logPass.keySet().iterator(); iter.hasNext();)
{
String name = (String) iter.next();
byte[] pass = (byte[]) _logPass.get(name);
save.write(name);
save.write("\t");
save.write(Base64.encodeBytes(pass));
save.write("\t");
save.write("" + _accessLevels.get(name));
save.write("\r\n");
}
}
catch (IOException e)
{
_log.warning("could not store accouts file."+e);
e.printStackTrace();
}
finally
{
try
{
save.close();
}
catch (Exception e1)
{
}
}
}
}
����õ�����������ܵķ�ʽ����
--
[1;36m��������������������������������������������������������������
[1;36m�� [31m��(��/��)���ֻ������������̵�ɣ����������㣡 [1;36m��
[1;36m�� [1;33m���� ������ http://ebshop.vip.cn [1;33m���� [1;36m��
[1;36m�� [1;33m���[32m������š� http://yfdoor.vip.cn [1;33m��� [1;36m��
[1;36m��[1;33m�� [1;34m�� F T P�� ftp://yfdoor.jingye.net [1;33m���� [1;36m��
[1;36m��������������������������������������������������������������
[1;37m�� ��Դ:�������ʵBBS http://bbs.tju.edu.cn [FROM: 202.113.13.188][m
Technical Details
Message-ID:
<4DB71G$B4T@bbs.tju.edu.cn>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.glorb.com!news.moat.net!ctu-peer!news.nctu.edu.tw!netnews.csie.nctu.edu.tw!maily.cic.tsinghua.edu.cn!news2.happynet.org!TJUBBSShow Full Headers
Complete Article Headers
X-Google-Thread: f6cb0,b4b4530ceb709daa,start X-Google-Attributes: gidf6cb0,public X-Google-Language: ENGLISH,GB Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!news.glorb.com!news.moat.net!ctu-peer!news.nctu.edu.tw!netnews.csie.nctu.edu.tw!maily.cic.tsinghua.edu.cn!news2.happynet.org!TJUBBS From: angeldong.bbs@bbs.tju.edu.cn.no.spam (�����) Newsgroups: cn.bbs.comp.lang.java Subject: ��Ұ��ҿ������java���� Date: 10 Jul 2004 11:13:04 GMT Organization: �����ʵBBSվ Message-ID: <4DB71G$B4T@bbs.tju.edu.cn> Mime-Version: 1.0 Content-Type: text/plain; charset="gb2312" Content-Transfer-Encoding: 8bit X-Filename: Java/M.1089457984.A