L2PasswordChangerInstance

Модификации и дополнения, редактирование файлов ядра.
DarkCat
Просветитель
Аватара пользователя
Сообщения: 2101
Зарегистрирован: 12 дек 2009, 23:20
Откуда: Киев
Контактная информация:

21 авг 2017, 12:05

Код: Выделить всё

/* 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.gameserver.model.actor.instance;

import Base64;
import CtrlIntention;
import ActionFailed;
import LeaveWorld;
import MyTargetSelected;
import NpcHtmlMessage;
import ValidateLocation;
import L2NpcTemplate;
import L2DatabaseFactory;

import java.security.MessageDigest;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.StringTokenizer;
import javolution.text.TextBuilder;

/**
 * L2 InStadia Account Manager
 */
public class L2PasswordChangerInstance extends L2FolkInstance
{
   public L2PasswordChangerInstance(int objectId, L2NpcTemplate template)
   {
      super(objectId, template);
   }

   public void onBypassFeedback(L2PcInstance player, String command)
   {
      if (command.startsWith("change_password"))
      {
         StringTokenizer st = new StringTokenizer(command);
         st.nextToken();
         String currPass = null;
         String newPass = null;
         String repeatNewPass = null;
         try
         {
            if (st.hasMoreTokens())
            {
               currPass = st.nextToken();
               newPass = st.nextToken();
               repeatNewPass = st.nextToken();
            }
            else
            {
               player.sendMessage("Please fill in all the blanks before requesting for a password change.");
               return;
            }
            changePassword(currPass, newPass, repeatNewPass, player);
         }
         catch (StringIndexOutOfBoundsException e){}
      }
   }
   
   public void onAction(L2PcInstance player)
   {
      if (!canTarget(player))
      {
         return;
      }
      if (this != player.getTarget())
      {
         player.setTarget(this);
         player.sendPacket(new MyTargetSelected(getObjectId(), 0));
         player.sendPacket(new ValidateLocation(this));
      }
      else if (!canInteract(player))
      {
         player.getAI().setIntention(CtrlIntention.AI_INTENTION_INTERACT, this);
      }
      else
      {
         showHtmlWindow(player);
      }
      player.sendPacket(new ActionFailed());
   }
   
   private void showHtmlWindow(L2PcInstance activeChar)
   {
      NpcHtmlMessage nhm = new NpcHtmlMessage(5);
      TextBuilder replyMSG = new TextBuilder("");

      replyMSG.append("<html><title></title>");
      replyMSG.append("<body><center>");
      replyMSG.append("To change your password:<br1> First fill in your current password and then your new!</font><br>");
      replyMSG.append("Current Password: <edit var=\"cur\" width=100 height=15><br>");
      replyMSG.append("New Password: <edit var=\"new\" width=100 height=15><br>");
      replyMSG.append("Repeat New Password: <edit var=\"repeatnew\" width=100 height=15><br><br>");
      replyMSG.append("<button value=\"Change Password\" action=\"bypass -h npc_" + getObjectId() + "_change_password $cur $new $repeatnew\" width=204 height=20 back=\"sek.cbui75\" fore=\"sek.cbui75\">");
      replyMSG.append("</center></body></html>");

      nhm.setHtml(replyMSG.toString());
      activeChar.sendPacket(nhm);
      activeChar.sendPacket(new ActionFailed());
   }

   public static boolean changePassword(String currPass, String newPass, String repeatNewPass, L2PcInstance activeChar)
   {
      if (newPass.length() < 5)
      {
         activeChar.sendMessage("The new password is too short!");
         return false;
      }
      
      if (newPass.length() > 20)
      {
         activeChar.sendMessage("The new password is too long!");
         return false;
      }
      
      if (!newPass.equals(repeatNewPass))
      {
         activeChar.sendMessage("Repeated password doesn't match the new password.");
         return false;
      }

      Connection con = null;
      String password = null;
      
      try
      {
         MessageDigest md = MessageDigest.getInstance("SHA");
         byte[] raw = currPass.getBytes("UTF-8");
         raw = md.digest(raw);
         String currPassEncoded = Base64.encodeBytes(raw);

         con = L2DatabaseFactory.getInstance().getConnection();
         PreparedStatement statement = con.prepareStatement("SELECT password FROM accounts WHERE login=?");
         statement.setString(1, activeChar.getAccountName());
         ResultSet rset = statement.executeQuery();
         
         while (rset.next())
         {
            password = rset.getString("password");
         }
         
         rset.close();
         statement.close();
         byte[] password2 = null;
         
         if (currPassEncoded.equals(password))
         {
            password2 = newPass.getBytes("UTF-8");
            password2 = md.digest(password2);

            PreparedStatement statement2 = con.prepareStatement("UPDATE accounts SET password=? WHERE login=?");
            statement2.setString(1, Base64.encodeBytes(password2));
            statement2.setString(2, activeChar.getAccountName());
            statement2.executeUpdate();
            statement2.close();

            activeChar.sendMessage("Congratulations! Your password has been changed succesfully. You will now be disconnected for security reasons. Please login again!");
            
            try
            {
               Thread.sleep(3000L);
            }
            catch (Exception e){}
            
            activeChar.deleteMe();
            activeChar.sendPacket(new LeaveWorld());
         }
         else
         {
            activeChar.sendMessage("The current password you've inserted is incorrect! Please try again!");
            return password2 != null;
         }
      }
      catch (Exception e)
      {
         _log.warning("could not update the password of account: " + activeChar.getAccountName());
      }
      finally
      {
         try
         {
            if (con != null)
               con.close();
         }
         catch (SQLException e)
         {
            _log.warning("Failed to close database connection!");
         }
      }
      return true;
   }
}

Вернуться в «Ядро сервера (Java)»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя