🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: cn.bbs.comp.lang.java
Article #13004

��Ұ��ҿ������java����

#13004
From: �����
Date: Sat, 10 Jul 2004 11:13
249 lines
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)
			{
			}
		}
	}
}

����õ�����������ܵķ�ʽ����

--
��������������������������������������������������������������
��       ��(��/��)���ֻ������������̵꡻�ɣ����������㣡  ��
��    ���� ������ http://ebshop.vip.cn          ����    ��
��  ���������š�  http://yfdoor.vip.cn             ���   ��
����    �� F T P��  ftp://yfdoor.jingye.net     ����      ��
��������������������������������������������������������������
�� ��Դ:�������ʵBBS http://bbs.tju.edu.cn [FROM: 202.113.13.188]
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!TJUBBS

Show 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