Jump to content
  • 0

Base64 In Acis


l2jkain

Question

4 answers to this question

Recommended Posts

  • 0

You can use the Java 8 Base64 Encoder and then the encodeToString method to convert bytearray to Base64 string.

You don't need fancy acis specific classes to do that shit.

Link to comment
Share on other sites

  • 0

You can use the Java 8 Base64 Encoder and then the encodeToString method to convert bytearray to Base64 string.

You don't need fancy acis specific classes to do that shit.

 

 

I'm just adapting the mod to alcis, it was not me that did it, I believe that this mod was made by you, elfocrazy myth

Edited by l2jkain
Link to comment
Share on other sites

  • 0


### Eclipse Workspace Patch 1.0

#P L2JaCis350

Index: java/net/sf/l2j/gameserver/network/clientpackets/RequestWithdrawPledge.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestWithdrawPledge.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestWithdrawPledge.java (working copy)

@@ -36,7 +38,7 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

final L2Clan clan = activeChar.getClan();

if (clan == null)

{

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/TradeRequest.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/TradeRequest.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/TradeRequest.java (working copy)

@@ -53,6 +53,12 @@

return;

}

 

+ if (player.isSubmitingPin() || ((L2PcInstance) target).isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (target.isInOlympiadMode() || player.isInOlympiadMode())

{

player.sendMessage("You or your target can't trade during Olympiad.");

Index: aCis_datapack_350/data/html/passkey/setup.htm

===================================================================

--- aCis_datapack_350/data/html/passkey/setup.htm (revision 0)

+++ aCis_datapack_350/data/html/passkey/setup.htm (working copy)

@@ -0,0 +1,27 @@

+<html>

+<title>Personal Password Manager</title>

+<body>

+<center>

+<img src="L2Font.mini_logo-k" width=250 height=90><br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32><br>

+</center>

+<br>

+Hello, stranger! What i do?! Protect you from hacking.

+I'll help you set a password for the character.

+This way if someone theft your account no one can make any action with the character.

+It is not recommended to enter as password the same as you use in the account.

+The security question is required if you lose or forget your password.

+<center>

+<table>

+<tr><td><font color="732cde">Enter the password: </font></td><td><edit var="pass1" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Repeat password: </font></td><td><edit var="pass2" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Enter a security question: </font></td><td><edit var="question" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Enter the answer: </font></td><td><edit var="answer" width=70 height=10></td></tr><br>

+</table>

+<br>

+<button value="Confirm" action="bypass -h pkset ] $pass1 ] $pass2 ] $question ] $answer" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32>

+</center>

+</body>

+</html>

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreSell.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreSell.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreSell.java (working copy)

@@ -64,6 +64,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (_items == null)

return;

 

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestBypassToServer.java (working copy)

@@ -14,10 +14,19 @@

*/

package net.sf.l2j.gameserver.network.clientpackets;

 

+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 java.util.logging.Level;

 

import net.sf.l2j.Config;

+import net.sf.l2j.Base64;

+import net.sf.l2j.gameserver.cache.HtmCache;

+import net.sf.l2j.L2DatabaseFactory;

+import net.sf.l2j.gameserver.model.actor.L2Character;

import net.sf.l2j.gameserver.communitybbs.CommunityBoard;

import net.sf.l2j.gameserver.datatables.AdminCommandAccessRights;

import net.sf.l2j.gameserver.handler.AdminCommandHandler;

@@ -181,6 +190,220 @@

final int arenaId = Integer.parseInt(_command.substring(12).trim());

activeChar.enterOlympiadObserverMode(arenaId);

}

+ else if (_command.equalsIgnoreCase("pkrecovery"))

+ {

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/recovery.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ html.replace("%question%", getPassKeyQuestion(activeChar));

+ activeChar.sendPacket(html);

+ html = null;

+ }

+ else if (_command.startsWith("pkset"))

+ {

+ StringTokenizer st = new StringTokenizer(_command, "]");

+ if (st.countTokens() != 5)

+ {

+ activeChar.sendMessage("You have not entered all the data!");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/setup.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+ String newCommand = st.nextToken();

+ String pass1 = st.nextToken();

+ pass1 = pass1.substring(1, pass1.length() - 1);

+ String pass2 = st.nextToken();

+ pass2 = pass2.substring(1, pass2.length() - 1);

+ String question = st.nextToken();

+ question = question.substring(1, question.length() - 1);

+ String answer = st.nextToken();

+ answer = answer.substring(1, answer.length());

+ if (pass1 == null || pass2 == null || question == null || answer == null)

+ {

+ activeChar.sendMessage("Input error");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/setup.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+

+ if (!pass1.equals(pass2))

+ {

+ activeChar.sendMessage("You entered different passwords");

+ activeChar.sendMessage("pass1 = " + pass1);

+ activeChar.sendMessage("pass2 = " + pass2);

+ activeChar.sendMessage("Question = " + question);

+ activeChar.sendMessage("answer = " + answer);

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/setup.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+ insertPassKeyInformation(activeChar, pass1, question, answer);

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/login.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ }

+ else if (_command.startsWith("pklogin"))

+ {

+ StringTokenizer st = new StringTokenizer(_command, " ");

+ if (st.countTokens() != 2)

+ {

+ activeChar.sendMessage("You make a mistake when entering the password!");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/login.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+ String newCommand = st.nextToken();

+ String pass = st.nextToken();

+ Connection con = null;

+ String query = "SELECT passkey FROM passkey WHERE obj_Id = ?";

+ String pwdindb = "error";

+ try

+ {

+ con = L2DatabaseFactory.getInstance().getConnection();

+ PreparedStatement ps = con.prepareStatement(query);

+ ps.setInt(1, activeChar.getObjectId());

+ ResultSet rs = ps.executeQuery();

+

+ while (rs.next())

+ pwdindb = rs.getString(1);

+ rs.close();

+ ps.close();

+ ps = null;

+ rs = null;

+ }

+ catch (Exception e)

+ {

+ e.printStackTrace();

+ }

+ finally

+ {

+ try

+ {

+ con.close();

+ }

+ catch (SQLException e)

+ {

+ e.printStackTrace();

+ }

+ con = null;

+ }

+ if (pwdindb.equals(encodePass(pass)))

+ {

+ activeChar.setIsParalyzed(false);

+ activeChar.setIsSubmitingPin(false);

+ activeChar.setIsInvul(false);

+ }

+ else

+ {

+ activeChar.sendMessage("You have not entered the correct password");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/login.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+ }

+ else if (_command.startsWith("pkrec"))

+ {

+ StringTokenizer st = new StringTokenizer(_command, " ");

+ if (st.countTokens() != 4)

+ {

+ activeChar.sendMessage("You make a mistake when entering data!");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/recovery.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ html.replace("%question%", getPassKeyQuestion(activeChar));

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+ String newCommand = st.nextToken();

+ String answer = st.nextToken();

+ String pass1 = st.nextToken();

+ String pass2 = st.nextToken();

+ if (!pass1.equals(pass2))

+ {

+ activeChar.sendMessage("You entered different passwords");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/recovery.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ html.replace("%question%", getPassKeyQuestion(activeChar));

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+ Connection con = null;

+ String query = "SELECT answer FROM passkey WHERE obj_Id = ?";

+ String anwindb = "error";

+ try

+ {

+ con = L2DatabaseFactory.getInstance().getConnection();

+ PreparedStatement ps = con.prepareStatement(query);

+ ps.setInt(1, activeChar.getObjectId());

+ ResultSet rs = ps.executeQuery();

+

+ while (rs.next())

+ anwindb = rs.getString(1);

+

+ rs.close();

+ ps.close();

+ ps = null;

+ rs = null;

+ }

+ catch (Exception e)

+ {

+ e.printStackTrace();

+ }

+ finally

+ {

+ try

+ {

+ con.close();

+ }

+ catch (SQLException e)

+ {

+ e.printStackTrace();

+ }

+ con = null;

+ }

+

+ if (anwindb.equals(answer))

+ {

+ updPassKey(activeChar, pass1);

+ activeChar.sendMessage("You have successfully changed your password.");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/login.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ }

+ else

+ {

+ activeChar.sendMessage("You entered the wrong answer to your question");

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/recovery.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ html.replace("%question%", getPassKeyQuestion(activeChar));

+ activeChar.sendPacket(html);

+ html = null;

+ return;

+ }

+ }

}

catch (Exception e)

{

@@ -188,6 +411,173 @@

}

}

 

+ private void updPassKey(L2PcInstance player, String pass)

+ {

+ Connection con = null;

+ String query = "UPDATE passkey SET passkey = ? WHERE obj_Id = ?";

+ try

+ {

+ con = L2DatabaseFactory.getInstance().getConnection();

+ PreparedStatement st = con.prepareStatement(query);

+ st.setString(1, encodePass(pass));

+ st.setInt(2, player.getObjectId());

+ st.executeUpdate();

+ st.close();

+ st = null;

+ }

+ catch (Exception e)

+ {

+ e.printStackTrace();

+ }

+ finally

+ {

+ try

+ {

+ con.close();

+ }

+ catch (SQLException e)

+ {

+ e.printStackTrace();

+ }

+ con = null;

+ }

+ }

+

+ private String encodePass(String password)

+ {

+ String pass = "error";

+ try

+ {

+ MessageDigest md = MessageDigest.getInstance("SHA");

+ byte[] raw = password.getBytes("UTF-8");

+ byte[] hash = md.digest(raw);

+ pass = Base64.encodeBytes(hash);

+ }

+ catch (Exception e)

+ {

+ e.printStackTrace();

+ }

+ return pass;

+ }

+

+ private void insertPassKeyInformation(L2PcInstance player, String pass, String question, String answer)

+ {

+ Connection con = null;

+ String query = "INSERT INTO passkey (obj_Id, passkey, question, answer) VALUES (?,?,?,?)";

+ try

+ {

+ con = L2DatabaseFactory.getInstance().getConnection();

+ PreparedStatement st = con.prepareStatement(query);

+ st.setInt(1, player.getObjectId());

+ st.setString(2, encodePass(pass));

+ st.setString(3, question);

+ st.setString(4, answer);

+ st.execute();

+ st.close();

+ st = null;

+ }

+ catch (Exception e)

+ {

+ e.printStackTrace();

+ }

+ finally

+ {

+ try

+ {

+ con.close();

+ }

+ catch (SQLException e)

+ {

+ e.printStackTrace();

+ }

+ con = null;

+ }

+ }

+

+ private String getPassKeyQuestion(L2PcInstance player)

+ {

+ Connection con = null;

+ String query = "SELECT question FROM passkey WHERE obj_Id = ?";

+ String question = "error";

+ try

+ {

+ con = L2DatabaseFactory.getInstance().getConnection();

+ PreparedStatement st = con.prepareStatement(query);

+ st.setInt(1, player.getObjectId());

+ ResultSet rs = st.executeQuery();

+

+ while (rs.next())

+ question = rs.getString(1);

+

+ rs.close();

+ st.close();

+ st = null;

+ rs = null;

+ }

+ catch (Exception e)

+ {

+ e.printStackTrace();

+ }

+ finally

+ {

+ try

+ {

+ con.close();

+ }

+ catch (SQLException e)

+ {

+ e.printStackTrace();

+ }

+ con = null;

+ }

+

+ return question;

+ }

+

+ public static boolean getPassKeyEnable(L2PcInstance player)

+ {

+ Connection con = null;

+ String query = "SELECT COUNT(*) FROM passkey WHERE obj_Id = ?";

+ int count = 0;

+

+ try

+ {

+ con = L2DatabaseFactory.getInstance().getConnection();

+ PreparedStatement st = con.prepareStatement(query);

+ st.setInt(1, player.getObjectId());

+ ResultSet rs = st.executeQuery();

+

+ while (rs.next())

+ count = rs.getInt(1);

+

+ rs.close();

+ st.close();

+ st = null;

+ rs = null;

+ }

+ catch (Exception e)

+ {

+ e.printStackTrace();

+ }

+ finally

+ {

+ try

+ {

+ con.close();

+ }

+ catch (SQLException e)

+ {

+ e.printStackTrace();

+ }

+ con = null;

+ }

+

+ if (count == 1)

+ return true;

+ else

+ return false;

+ }

+

private static void playerHelp(L2PcInstance activeChar, String path)

{

if (path.indexOf("..") != -1)

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinAlly.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinAlly.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinAlly.java (working copy)

@@ -38,6 +38,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

final L2Clan clan = activeChar.getClan();

if (clan == null)

{

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestCrystallizeItem.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestCrystallizeItem.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestCrystallizeItem.java (working copy)

@@ -46,6 +46,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (_count <= 0)

{

Util.handleIllegalPlayerAction(activeChar, "[RequestCrystallizeItem] " + activeChar.getName() + "tried to crystallize an object but count was inferior to 0", IllegalPlayerAction.PUNISH_KICK);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreBuy.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreBuy.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPrivateStoreBuy.java (working copy)

@@ -66,6 +66,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (_items == null)

return;

 

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendInvite.java (working copy)

@@ -38,6 +38,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

final L2PcInstance friend = L2World.getInstance().getPlayer(_name);

 

// can't use friend invite for locating invisible characters

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestEnchantItem.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestEnchantItem.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestEnchantItem.java (working copy)

@@ -52,6 +52,12 @@

if (activeChar == null || _objectId == 0)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (!activeChar.isOnline() || getClient().isDetached())

{

activeChar.setActiveEnchantItem(null);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSellItem.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSellItem.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSellItem.java (working copy)

@@ -72,6 +72,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

// Alt game - Karma punishment

if (!Config.KARMA_PLAYER_CAN_SHOP && player.getKarma() > 0)

return;

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/Say2.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/Say2.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/Say2.java (working copy)

@@ -132,6 +132,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (_type < 0 || _type >= CHAT_NAMES.length)

{

_log.warning("Say2: Invalid type: " + _type + " Player : " + activeChar.getName() + " text: " + _text);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SendWarehouseWithdrawList.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SendWarehouseWithdrawList.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SendWarehouseWithdrawList.java (working copy)

@@ -68,6 +68,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (player.isProcessingTransaction())

{

player.sendPacket(SystemMessageId.ALREADY_TRADING);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/UseItem.java (working copy)

@@ -78,6 +78,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (activeChar.isInStoreMode())

{

activeChar.sendPacket(SystemMessageId.ITEMS_UNAVAILABLE_FOR_STORE_MANUFACTURE);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestStartPledgeWar.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestStartPledgeWar.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestStartPledgeWar.java (working copy)

@@ -42,6 +42,12 @@

if (attackerClan == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if ((player.getClanPrivileges() & L2Clan.CP_CL_PLEDGE_WAR) != L2Clan.CP_CL_PLEDGE_WAR)

{

player.sendPacket(SystemMessageId.YOU_ARE_NOT_AUTHORIZED_TO_DO_THAT);

Index: aCis_datapack_350/data/html/passkey/login.htm

===================================================================

--- aCis_datapack_350/data/html/passkey/login.htm (revision 0)

+++ aCis_datapack_350/data/html/passkey/login.htm (working copy)

@@ -0,0 +1,21 @@

+<html>

+<title>Personal Password Manager</title>

+<body>

+<center>

+<img src="L2Font.mini_logo-k" width=250 height=90><br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32><br>

+</center>

+<br>

+Hello, stranger! To continue playing, you have to provide your password.

+<center>

+<table>

+<tr><td><font color="732cde">Enter password: </font></td><td><edit var="pass" width=70 height=10></td></tr><br>

+</table>

+<br>

+<button value="Confirm" action="bypass -h pklogin $pass" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<button value="Forgot password" action="bypass -h pkrecovery" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32>

+</center>

+</body>

+</html>

\ No newline at end of file

Index: aCis_datapack_350/data/html/passkey/recovery.htm

===================================================================

--- aCis_datapack_350/data/html/passkey/recovery.htm (revision 0)

+++ aCis_datapack_350/data/html/passkey/recovery.htm (working copy)

@@ -0,0 +1,26 @@

+<html>

+<title>Personal Password Manager</title>

+<body>

+<center>

+<img src="L2Font.mini_logo-k" width=250 height=90><br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32><br>

+</center>

+<br>

+Hello, stranger! You forgot your password? Okay, I'll help you recover it!<br>

+But you have to type the answer to the question, that you've set during registration.<br>

+

+<center><font color="LEVEL">%question%</font></center>

+<br>

+<center>

+<table>

+<tr><td><font color="732cde">Enter the answer: </font></td><td><edit var="answer" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Enter the new password: </font></td><td><edit var="pass1" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Confirm new password: </font></td><td><edit var="pass2" width=70 height=10></td></tr><br>

+</table>

+<br>

+<button value="Confirm" action="bypass -h pkrec $answer $pass1 $pass2" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32>

+</center>

+</body>

+</html>

\ No newline at end of file

Index: aCis_datapack_350/data/html/passkey/setup.htm

===================================================================

--- aCis_datapack_350/data/html/passkey/setup.htm (revision 0)

+++ aCis_datapack_350/data/html/passkey/setup.htm (working copy)

@@ -0,0 +1,27 @@

+<html>

+<title>Personal Password Manager</title>

+<body>

+<center>

+<img src="L2Font.mini_logo-k" width=250 height=90><br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32><br>

+</center>

+<br>

+Hello, stranger! What i do?! Protect you from hacking.

+I'll help you set a password for the character.

+This way if someone theft your account no one can make any action with the character.

+It is not recommended to enter as password the same as you use in the account.

+The security question is required if you lose or forget your password.

+<center>

+<table>

+<tr><td><font color="732cde">Enter the password: </font></td><td><edit var="pass1" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Repeat password: </font></td><td><edit var="pass2" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Enter a security question: </font></td><td><edit var="question" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Enter the answer: </font></td><td><edit var="answer" width=70 height=10></td></tr><br>

+</table>

+<br>

+<button value="Confirm" action="bypass -h pkset ] $pass1 ] $pass2 ] $question ] $answer" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32>

+</center>

+</body>

+</html>

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDropItem.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDropItem.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDropItem.java (working copy)

@@ -54,6 +54,12 @@

if (activeChar == null || activeChar.isDead())

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

final ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);

if (item == null || _count == 0 || !activeChar.validateItemManipulation(_objectId) || (!Config.ALLOW_DISCARDITEM && !activeChar.isGM()) || !item.isDropable())

{

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestExEnchantSkill.java (working copy)

@@ -56,6 +56,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (activeChar.getClassId().level() < 3 || activeChar.getLevel() < 76)

return;

 

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestShowMiniMap.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestShowMiniMap.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestShowMiniMap.java (working copy)

@@ -31,6 +31,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

activeChar.sendPacket(ShowMiniMap.REGULAR_MAP);

}

}

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/model/actor/L2Character.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/model/actor/L2Character.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/model/actor/L2Character.java (working copy)

@@ -5473,6 +5473,17 @@

return _champion;

}

 

+ public boolean _isSubmitingPin;

+

+ public final void setIsSubmitingPin(boolean value)

+ {

+ _isSubmitingPin = value;

+ }

+ public boolean isSubmitingPin()

+ {

+ return _isSubmitingPin;

+ }

+

/**

* Send system message about damage.<BR>

* <BR>

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/EnterWorld.java (working copy)

@@ -60,6 +60,7 @@

import net.sf.l2j.gameserver.scripting.QuestState;

import net.sf.l2j.gameserver.scripting.ScriptManager;

import net.sf.l2j.gameserver.taskmanager.GameTimeTaskManager;

+import net.sf.l2j.gameserver.cache.HtmCache;

 

public class EnterWorld extends L2GameClientPacket

{

@@ -80,6 +81,26 @@

return;

}

 

+ activeChar.setIsParalyzed(true);

+ activeChar.setIsSubmitingPin(true);

+ activeChar.setIsInvul(true);

+ if (RequestBypassToServer.getPassKeyEnable(activeChar))

+ {

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/login.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ }

+ else

+ {

+ String htmContent = HtmCache.getInstance().getHtm("data/html/passkey/setup.htm");

+ NpcHtmlMessage html = new NpcHtmlMessage(1);

+ html.setHtml(htmContent);

+ activeChar.sendPacket(html);

+ html = null;

+ }

+

if (activeChar.isGM())

{

if (Config.GM_STARTUP_INVULNERABLE && AdminCommandAccessRights.getInstance().hasAccess("admin_invul", activeChar.getAccessLevel()))

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestUnEquipItem.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestUnEquipItem.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestUnEquipItem.java (working copy)

@@ -45,6 +45,12 @@

if (item == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

// Prevent of unequiping a cursed weapon

if (_slot == Item.SLOT_LR_HAND && activeChar.isCursedWeaponEquipped())

return;

@@ -60,7 +66,7 @@

return;

 

ItemInstance[] unequipped = activeChar.getInventory().unEquipItemInBodySlotAndRecord(_slot);

-

+

// show the update in the inventory

InventoryUpdate iu = new InventoryUpdate();

for (ItemInstance itm : unequipped)

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestMagicSkillUse.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestMagicSkillUse.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestMagicSkillUse.java (working copy)

@@ -46,6 +46,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

// Get the level of the used skill

final int level = activeChar.getSkillLevel(_magicId);

if (level <= 0)

Index: aCis_datapack_350/tools/database_installer.bat

===================================================================

--- aCis_datapack_350/tools/database_installer.bat (revision 13)

+++ aCis_datapack_350/tools/database_installer.bat (working copy)

@@ -112,6 +112,7 @@

%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/seven_signs_status.sql

%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/siege_clans.sql

%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/topic.sql

+%mysqlPath% -h %gshost% -u %gsuser% --password=%gspass% -D %gsdb% < ../sql/passskey.sql

 

echo Done.

echo.

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSendFriendMsg.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSendFriendMsg.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSendFriendMsg.java (working copy)

@@ -52,6 +52,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

final L2PcInstance targetPlayer = L2World.getInstance().getPlayer(_reciever);

if (targetPlayer == null || !targetPlayer.getFriendList().contains(activeChar.getObjectId()))

{

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/TradeDone.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/TradeDone.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/TradeDone.java (working copy)

@@ -37,6 +37,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

final TradeList trade = player.getActiveTradeList();

if (trade == null)

return;

Index: aCis_datapack_350/data/html/passkey/recovery.htm

===================================================================

--- aCis_datapack_350/data/html/passkey/recovery.htm (revision 0)

+++ aCis_datapack_350/data/html/passkey/recovery.htm (working copy)

@@ -0,0 +1,26 @@

+<html>

+<title>Personal Password Manager</title>

+<body>

+<center>

+<img src="L2Font.mini_logo-k" width=250 height=90><br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32><br>

+</center>

+<br>

+Hello, stranger! You forgot your password? Okay, I'll help you recover it!<br>

+But you have to type the answer to the question, that you've set during registration.<br>

+

+<center><font color="LEVEL">%question%</font></center>

+<br>

+<center>

+<table>

+<tr><td><font color="732cde">Enter the answer: </font></td><td><edit var="answer" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Enter the new password: </font></td><td><edit var="pass1" width=70 height=10></td></tr><br>

+<tr><td><font color="732cde">Confirm new password: </font></td><td><edit var="pass2" width=70 height=10></td></tr><br>

+</table>

+<br>

+<button value="Confirm" action="bypass -h pkrec $answer $pass1 $pass2" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32>

+</center>

+</body>

+</html>

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListBuy.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListBuy.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListBuy.java (working copy)

@@ -62,6 +62,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (_items == null)

{

player.setPrivateStoreType(PrivateStoreType.NONE);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestFriendDel.java (working copy)

@@ -43,6 +43,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

int id = CharNameTable.getInstance().getIdByName(_name);

 

if (id == -1 || !activeChar.getFriendList().contains(id))

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSetAllyCrest.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSetAllyCrest.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestSetAllyCrest.java (working copy)

@@ -46,6 +46,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (_length < 0)

{

activeChar.sendMessage("File transfer error.");

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPetition.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPetition.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestPetition.java (working copy)

@@ -51,6 +51,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (!GmListTable.getInstance().isGmOnline(false))

{

activeChar.sendPacket(SystemMessageId.NO_GM_PROVIDING_SERVICE_NOW);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestStopPledgeWar.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestStopPledgeWar.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestStopPledgeWar.java (working copy)

@@ -35,11 +35,17 @@

final L2PcInstance player = getClient().getActiveChar();

if (player == null)

return;

-

+

final L2Clan playerClan = player.getClan();

if (playerClan == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

final L2Clan clan = ClanTable.getInstance().getClanByName(_pledgeName);

if (clan == null)

return;

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/util/StringUtil.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/util/StringUtil.java (revision 0)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/util/StringUtil.java (working copy)

@@ -0,0 +1,297 @@

+/*

+ * $Header$

+ *

+ * $Author: fordfrog $ $Date$ $Revision$ $Log$

+ *

+ *

+ * 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.

+ */

+package net.sf.l2j.gameserver.util;

+

+/**

+ * String utilities optimized for the best performance.

+ *

+ * <h1>How to Use It</h1> <h2>concat() or append()</h2> If concatenating strings

+ * in single call, use StringUtil.concat(), otherwise use StringUtil.append()

+ * and its variants. <h2>Minimum Calls</h2> Bad:

+ *

+ * <pre>

+ * final StringBuilder sbString = new StringBuilder();

+ * StringUtil.append(sbString, "text 1", String.valueOf(npcId));

+ * StringUtil.append("text 2");

+ * </pre>

+ *

+ * Good:

+ *

+ * <pre>

+ * final StringBuilder sbString = new StringBuilder();

+ * StringUtil.append(sbString, "text 1", String.valueOf(npcId), "text 2");

+ * </pre>

+ *

+ * Why?<br/>

+ * Because the less calls you do, the less memory re-allocations have to be done

+ * so the whole text fits into the memory and less array copy tasks has to be

+ * performed. So if using less calls, less memory is used and string

+ * concatenation is faster. <h2>Size Hints for Loops</h2> Bad:

+ *

+ * <pre>

+ * final StringBuilder sbString = new StringBuilder();

+ * StringUtil.append(sbString, "header start", someText, "header end");

+ * for (int i = 0; i < 50; i++)

+ * {

+ * StringUtil.append(sbString, "text 1", stringArray, "text 2");

+ * }

+ * </pre>

+ *

+ * Good:

+ *

+ * <pre>

+ * final StringBuilder sbString = StringUtil.startAppend(1300, "header start", someText, "header end");

+ * for (int i = 0; i < 50; i++)

+ * {

+ * StringUtil.append(sbString, "text 1", stringArray, "text 2");

+ * }

+ * </pre>

+ *

+ * Why?<br/>

+ * When using StringUtil.append(), memory is only allocated to fit in the

+ * strings in method argument. So on each loop new memory for the string has to

+ * be allocated and old string has to be copied to the new string. With size

+ * hint, even if the size hint is above the needed memory, memory is saved

+ * because new memory has not to be allocated on each cycle. Also it is much

+ * faster if no string copy tasks has to be performed. So if concatenating

+ * strings in a loop, count approximately the size and set it as the hint for

+ * the string builder size. It's better to make the size hint little bit larger

+ * rather than smaller.<br/>

+ * In case there is no text appended before the cycle, just use <code>new

+ * StringBuilder(1300)</code>. <h2>Concatenation and Constants</h2> Bad:

+ *

+ * <pre>

+ * StringUtil.concat("text 1 ", "text 2", String.valueOf(npcId));

+ * </pre>

+ *

+ * Good:

+ *

+ * <pre>

+ * StringUtil.concat("text 1 " + "text 2", String.valueOf(npcId));

+ * </pre>

+ *

+ * or

+ *

+ * <pre>

+ * StringUtil.concat("text 1 text 2", String.valueOf(npcId));

+ * </pre>

+ *

+ * Why?<br/>

+ * It saves some cycles when determining size of memory that needs to be

+ * allocated because less strings are passed to concat() method. But do not use

+ * + for concatenation of non-constant strings, that degrades performance and

+ * makes extra memory allocations needed. <h2>Concatenation and Constant

+ * Variables</h2> Bad:

+ *

+ * <pre>

+ * String glue = "some glue";

+ * StringUtil.concat("text 1", glue, "text 2", glue, String.valueOf(npcId));

+ * </pre>

+ *

+ * Good:

+ *

+ * <pre>

+ * final String glue = "some glue";

+ * StringUtil.concat("text 1" + glue + "text2" + glue, String.valueOf(npcId));

+ * </pre>

+ *

+ * Why? Because when using <code>final</code> keyword, the <code>glue</code> is

+ * marked as constant string and compiler treats it as a constant string so it

+ * is able to create string "text1some gluetext2some glue" during the

+ * compilation. But this only works in case the value is known at compilation

+ * time, so this cannot be used for cases like

+ * <code>final String objectIdString =

+ * String.valueOf(getObjectId)</code>. <h2>StringBuilder Reuse</h2> Bad:

+ *

+ * <pre>

+ * final StringBuilder sbString1 = new StringBuilder();

+ * StringUtil.append(sbString1, "text 1", String.valueOf(npcId), "text 2");

+ * ... // output of sbString1, it is no more needed

+ * final StringBuilder sbString2 = new StringBuilder();

+ * StringUtil.append(sbString2, "text 3", String.valueOf(npcId), "text 4");

+ * </pre>

+ *

+ * Good:

+ *

+ * <pre>

+ * final StringBuilder sbString = new StringBuilder();

+ * StringUtil.append(sbString, "text 1", String.valueOf(npcId), "text 2");

+ * ... // output of sbString, it is no more needed

+ * sbString.setLength(0);

+ * StringUtil.append(sbString, "text 3", String.valueOf(npcId), "text 4");

+ * </pre>

+ *

+ * Why?</br> In first case, new memory has to be allocated for the second

+ * string. In second case already allocated memory is reused, but only in case

+ * the new string is not longer than the previously allocated string. Anyway,

+ * the second way is better because the string either fits in the memory and

+ * some memory is saved, or it does not fit in the memory, and in that case it

+ * works as in the first case. <h2>Primitives to Strings</h2> To convert

+ * primitives to string, use String.valueOf(). <h2>How much faster is it?</h2>

+ * Here are some results of my tests. Count is number of strings concatenated.

+ * Don't take the numbers as 100% true as the numbers are affected by other

+ * programs running on my computer at the same time. Anyway, from the results it

+ * is obvious that using StringBuilder with predefined size is the fastest (and

+ * also most memory efficient) solution. It is about 5 times faster when

+ * concatenating 7 strings, compared to TextBuilder. Also, with more strings

+ * concatenated, the difference between StringBuilder and TextBuilder gets

+ * larger. In code, there are many cases, where there are concatenated 50+

+ * strings so the time saving is even greater.

+ *

+ * <pre>

+ * Count: 2

+ * TextBuilder: 1893

+ * TextBuilder with size: 1703

+ * String: 1033

+ * StringBuilder: 993

+ * StringBuilder with size: 1024

+ * Count: 3

+ * TextBuilder: 1973

+ * TextBuilder with size: 1872

+ * String: 2583

+ * StringBuilder: 1633

+ * StringBuilder with size: 1156

+ * Count: 4

+ * TextBuilder: 2188

+ * TextBuilder with size: 2229

+ * String: 4207

+ * StringBuilder: 1816

+ * StringBuilder with size: 1444

+ * Count: 5

+ * TextBuilder: 9185

+ * TextBuilder with size: 9464

+ * String: 6937

+ * StringBuilder: 2745

+ * StringBuilder with size: 1882

+ * Count: 6

+ * TextBuilder: 9785

+ * TextBuilder with size: 10082

+ * String: 9471

+ * StringBuilder: 2889

+ * StringBuilder with size: 1857

+ * Count: 7

+ * TextBuilder: 10169

+ * TextBuilder with size: 10528

+ * String: 12746

+ * StringBuilder: 3081

+ * StringBuilder with size: 2139

+ * </pre>

+ *

+ * @author fordfrog

+ */

+public final class StringUtil

+{

+

+ private StringUtil()

+ {

+ }

+

+ /**

+ * Concatenates strings.

+ *

+ * @param strings

+ * strings to be concatenated

+ *

+ * @return concatenated string

+ *

+ * @see StringUtil

+ */

+ public static String concat(final String... strings)

+ {

+ final StringBuilder sbString = new StringBuilder(getLength(strings));

+

+ for (final String string : strings)

+ {

+ sbString.append(string);

+ }

+

+ return sbString.toString();

+ }

+

+ /**

+ * Creates new string builder with size initializated to

+ * <code>sizeHint</code>, unless total length of strings is greater than

+ * <code>sizeHint</code>.

+ *

+ * @param sizeHint

+ * hint for string builder size allocation

+ * @param strings

+ * strings to be appended

+ *

+ * @return created string builder

+ *

+ * @see StringUtil

+ */

+ public static StringBuilder startAppend(final int sizeHint, final String... strings)

+ {

+ final int length = getLength(strings);

+ final StringBuilder sbString = new StringBuilder(sizeHint > length ? sizeHint : length);

+

+ for (final String string : strings)

+ {

+ sbString.append(string);

+ }

+

+ return sbString;

+ }

+

+ /**

+ * Appends strings to existing string builder.

+ *

+ * @param sbString

+ * string builder

+ * @param strings

+ * strings to be appended

+ *

+ * @see StringUtil

+ */

+ public static void append(final StringBuilder sbString, final String... strings)

+ {

+ sbString.ensureCapacity(sbString.length() + getLength(strings));

+

+ for (final String string : strings)

+ {

+ sbString.append(string);

+ }

+ }

+

+ /**

+ * Counts total length of all the strings.

+ *

+ * @param strings

+ * array of strings

+ *

+ * @return total length of all the strings

+ */

+ private static int getLength(final String[] strings)

+ {

+ int length = 0;

+

+ for (final String string : strings)

+ {

+ if (string == null)

+ length += 4;

+ else

+ length += string.length();

+ }

+

+ return length;

+ }

+}

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/Base64.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/Base64.java (revision 0)

+++ aCis_gameserver_350/java/net/sf/l2j/Base64.java (working copy)

@@ -0,0 +1,1382 @@

+/*

+ * 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.

+ */

+package net.sf.l2j;

+

+import java.io.BufferedReader;

+import java.io.IOException;

+import java.io.InputStreamReader;

+import net.sf.l2j.gameserver.util.StringUtil;

+

+/**

+ * Encodes and decodes to and from Base64 notation.

+ *

+ * The source is based on the work of Robert Harder

+ *

+ * <p>

+ * I am placing this code in the Public Domain. Do with it as you will. This

+ * software comes with no guarantees or warranties but with plenty of

+ * well-wishing instead! Please visit <a

+ * href="http://iharder.net/xmlizable">http://iharder.net/base64</a>

+ * periodically to check for updates or to contribute improvements.

+ * </p>

+ *

+ * @author Robert Harder

+ * @author rob@iharder.net

+ * @version 2.0

+ */

+public class Base64

+{

+

+ /* P U B L I C F I E L D S */

+

+ /** No options specified. Value is zero. */

+ public final static int NO_OPTIONS = 0;

+

+ /** Specify encoding. */

+ public final static int ENCODE = 1;

+

+ /** Specify decoding. */

+ public final static int DECODE = 0;

+

+ /** Specify that data should be gzip-compressed. */

+ public final static int GZIP = 2;

+

+ /** Don't break lines when encoding (violates strict Base64 specification) */

+ public final static int DONT_BREAK_LINES = 8;

+

+ /* P R I V A T E F I E L D S */

+

+ /** Maximum line length (76) of Base64 output. */

+ private final static int MAX_LINE_LENGTH = 76;

+

+ /** The equals sign (=) as a byte. */

+ private final static byte EQUALS_SIGN = (byte) '=';

+

+ /** The new line character (\n) as a byte. */

+ private final static byte NEW_LINE = (byte) '\n';

+

+ /** Preferred encoding. */

+ private final static String PREFERRED_ENCODING = "UTF-8";

+

+ /** The 64 valid Base64 values. */

+ private final static byte[] ALPHABET;

+ private final static byte[] _NATIVE_ALPHABET = /* May be something funny like EBCDIC */

+ { (byte) 'A', (byte) 'B', (byte) 'C', (byte) 'D', (byte) 'E', (byte) 'F', (byte) 'G',

+ (byte) 'H', (byte) 'I', (byte) 'J', (byte) 'K', (byte) 'L', (byte) 'M', (byte) 'N',

+ (byte) 'O', (byte) 'P', (byte) 'Q', (byte) 'R', (byte) 'S', (byte) 'T', (byte) 'U',

+ (byte) 'V', (byte) 'W', (byte) 'X', (byte) 'Y', (byte) 'Z', (byte) 'a', (byte) 'b',

+ (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f', (byte) 'g', (byte) 'h', (byte) 'i',

+ (byte) 'j', (byte) 'k', (byte) 'l', (byte) 'm', (byte) 'n', (byte) 'o', (byte) 'p',

+ (byte) 'q', (byte) 'r', (byte) 's', (byte) 't', (byte) 'u', (byte) 'v', (byte) 'w',

+ (byte) 'x', (byte) 'y', (byte) 'z', (byte) '0', (byte) '1', (byte) '2', (byte) '3',

+ (byte) '4', (byte) '5', (byte) '6', (byte) '7', (byte) '8', (byte) '9', (byte) '+',

+ (byte) '/' };

+

+ public static void main(String[] args) throws IOException

+ {

+ BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

+ System.out.print("Enter String to encode: ");

+ System.out.println(Base64.encodeBytes(bf.readLine().getBytes()));

+ }

+

+ /** Determine which ALPHABET to use. */

+ static

+ {

+ byte[] __bytes;

+ try

+ {

+ __bytes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes(PREFERRED_ENCODING);

+ } // end try

+ catch (java.io.UnsupportedEncodingException use)

+ {

+ __bytes = _NATIVE_ALPHABET; // Fall back to native encoding

+ } // end catch

+ ALPHABET = __bytes;

+ } // end static

+

+ /**

+ * Translates a Base64 value to either its 6-bit reconstruction value or a

+ * negative number indicating some other meaning.

+ **/

+ final static byte[] DECODABET = { -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 0 - 8

+ -5, -5, // Whitespace: Tab and Linefeed

+ -9, -9, // Decimal 11 - 12

+ -5, // Whitespace: Carriage Return

+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 14 - 26

+ -9, -9, -9, -9, -9, // Decimal 27 - 31

+ -5, // Whitespace: Space

+ -9, -9, -9, -9, -9, -9, -9, -9, -9, -9, // Decimal 33 - 42

+ 62, // Plus sign at decimal 43

+ -9, -9, -9, // Decimal 44 - 46

+ 63, // Slash at decimal 47

+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // Numbers zero through nine

+ -9, -9, -9, // Decimal 58 - 60

+ -1, // Equals sign at decimal 61

+ -9, -9, -9, // Decimal 62 - 64

+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, // Letters 'A' through 'N'

+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // Letters 'O' through 'Z'

+ -9, -9, -9, -9, -9, -9, // Decimal 91 - 96

+ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, // Letters 'a' through 'm'

+ 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // Letters 'n' through 'z'

+ -9, -9, -9, -9 // Decimal 123 - 126

+ /*

+ * ,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243

+ * -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255

+ */

+ };

+

+ // private final static byte BAD_ENCODING = -9; // Indicates error in encoding

+ private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding

+ private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding

+

+ /** Defeats instantiation. */

+ private Base64()

+ {

+ }

+

+ /* E N C O D I N G M E T H O D S */

+

+ // /**

+ // * Encodes the first three bytes of array <var>threeBytes</var>

+ // * and returns a four-byte array in Base64 notation.

+ // *

+ // * @param threeBytes the array to convert

+ // * @return four byte array in Base64 notation.

+ // * @since 1.3

+ // */

+ // private static byte[] encode3to4( byte[] threeBytes )

+ // {

+ // return encode3to4( threeBytes, 3 );

+ // } // end encodeToBytes

+ // /**

+ // * Encodes up to the first three bytes of array <var>threeBytes</var>

+ // * and returns a four-byte array in Base64 notation.

+ // * The actual number of significant bytes in your array is

+ // * given by <var>numSigBytes</var>.

+ // * The array <var>threeBytes</var> needs only be as big as

+ // * <var>numSigBytes</var>.

+ // *

+ // * @param threeBytes the array to convert

+ // * @param numSigBytes the number of significant bytes in your array

+ // * @return four byte array in Base64 notation.

+ // * @since 1.3

+ // */

+ // private static byte[] encode3to4( byte[] threeBytes, int numSigBytes )

+ // {

+ // byte[] dest = new byte[4];

+ // encode3to4( threeBytes, 0, numSigBytes, dest, 0 );

+ // return dest;

+ // }

+ /**

+ * Encodes up to the first three bytes of array <var>threeBytes</var> and

+ * returns a four-byte array in Base64 notation. The actual number of

+ * significant bytes in your array is given by <var>numSigBytes</var>. The

+ * array <var>threeBytes</var> needs only be as big as

+ * <var>numSigBytes</var>. Code can reuse a byte array by passing a

+ * four-byte array as <var>b4</var>.

+ *

+ * @param b4

+ * A reusable byte array to reduce array instantiation

+ * @param threeBytes

+ * the array to convert

+ * @param numSigBytes

+ * the number of significant bytes in your array

+ * @return four byte array in Base64 notation.

+ * @since 1.5.1

+ */

+ static byte[] encode3to4(byte[] b4, byte[] threeBytes, int numSigBytes)

+ {

+ encode3to4(threeBytes, 0, numSigBytes, b4, 0);

+ return b4;

+ } // end encode3to4

+

+ /**

+ * Encodes up to three bytes of the array <var>source</var> and writes the

+ * resulting four Base64 bytes to <var>destination</var>. The source and

+ * destination arrays can be manipulated anywhere along their length by

+ * specifying <var>srcOffset</var> and <var>destOffset</var>. This method

+ * does not check to make sure your arrays are large enough to accomodate

+ * <var>srcOffset</var> + 3 for the <var>source</var> array or

+ * <var>destOffset</var> + 4 for the <var>destination</var> array. The

+ * actual number of significant bytes in your array is given by

+ * <var>numSigBytes</var>.

+ *

+ * @param source

+ * the array to convert

+ * @param srcOffset

+ * the index where conversion begins

+ * @param numSigBytes

+ * the number of significant bytes in your array

+ * @param destination

+ * the array to hold the conversion

+ * @param destOffset

+ * the index where output will be put

+ * @return the <var>destination</var> array

+ * @since 1.3

+ */

+ static byte[] encode3to4(byte[] source, int srcOffset, int numSigBytes, byte[] destination,

+ int destOffset)

+ {

+ // 1 2 3

+ // 01234567890123456789012345678901 Bit position

+ // --------000000001111111122222222 Array position from threeBytes

+ // --------| || || || | Six bit groups to index ALPHABET

+ // >>18 >>12 >> 6 >> 0 Right shift necessary

+ // 0x3f 0x3f 0x3f Additional AND

+

+ // Create buffer with zero-padding if there are only one or two

+ // significant bytes passed in the array.

+ // We have to shift left 24 in order to flush out the 1's that appear

+ // when Java treats a value as negative that is cast from a byte to an

+ // int.

+ int inBuff = (numSigBytes > 0 ? ((source[srcOffset] << 24) >>> 8) : 0)

+ | (numSigBytes > 1 ? ((source[srcOffset + 1] << 24) >>> 16) : 0)

+ | (numSigBytes > 2 ? ((source[srcOffset + 2] << 24) >>> 24) : 0);

+

+ switch (numSigBytes)

+ {

+ case 3:

+ destination[destOffset] = ALPHABET[(inBuff >>> 18)];

+ destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f];

+ destination[destOffset + 2] = ALPHABET[(inBuff >>> 6) & 0x3f];

+ destination[destOffset + 3] = ALPHABET[(inBuff) & 0x3f];

+ return destination;

+

+ case 2:

+ destination[destOffset] = ALPHABET[(inBuff >>> 18)];

+ destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f];

+ destination[destOffset + 2] = ALPHABET[(inBuff >>> 6) & 0x3f];

+ destination[destOffset + 3] = EQUALS_SIGN;

+ return destination;

+

+ case 1:

+ destination[destOffset] = ALPHABET[(inBuff >>> 18)];

+ destination[destOffset + 1] = ALPHABET[(inBuff >>> 12) & 0x3f];

+ destination[destOffset + 2] = EQUALS_SIGN;

+ destination[destOffset + 3] = EQUALS_SIGN;

+ return destination;

+

+ default:

+ return destination;

+ } // end switch

+ } // end encode3to4

+

+ /**

+ * Serializes an object and returns the Base64-encoded version of that

+ * serialized object. If the object cannot be serialized or there is another

+ * error, the method will return <tt>null</tt>. The object is not

+ * GZip-compressed before being encoded.

+ *

+ * @param serializableObject

+ * The object to encode

+ * @return The Base64-encoded object

+ * @since 1.4

+ */

+ public static String encodeObject(java.io.Serializable serializableObject)

+ {

+ return encodeObject(serializableObject, NO_OPTIONS);

+ } // end encodeObject

+

+ /**

+ * Serializes an object and returns the Base64-encoded version of that

+ * serialized object. If the object cannot be serialized or there is another

+ * error, the method will return <tt>null</tt>.

+ * <p>

+ * Valid options:

+ *

+ * <pre>

+ * GZIP: gzip-compresses object before encoding it.

+ * DONT_BREAK_LINES: don't break lines at 76 characters

+ * <i>Note: Technically, this makes your encoding non-compliant.</i>

+ * </pre>

+ * <p>

+ * Example: <code>encodeObject( myObj, Base64.GZIP )</code> or

+ * <p>

+ * Example:

+ * <code>encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>

+ *

+ * @param serializableObject

+ * The object to encode

+ * @options Specified options

+ * @return The Base64-encoded object

+ * @see Base64#GZIP

+ * @see Base64#DONT_BREAK_LINES

+ * @since 2.0

+ */

+ public static String encodeObject(java.io.Serializable serializableObject, int options)

+ {

+ // Streams

+ java.io.ByteArrayOutputStream baos = null;

+ java.io.OutputStream b64os = null;

+ java.io.ObjectOutputStream oos = null;

+ java.util.zip.GZIPOutputStream gzos = null;

+

+ // Isolate options

+ int gzip = (options & GZIP);

+ int dontBreakLines = (options & DONT_BREAK_LINES);

+

+ try

+ {

+ // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream

+ baos = new java.io.ByteArrayOutputStream();

+ b64os = new Base64.OutputStream(baos, ENCODE | dontBreakLines);

+

+ // GZip?

+ if (gzip == GZIP)

+ {

+ gzos = new java.util.zip.GZIPOutputStream(b64os);

+ oos = new java.io.ObjectOutputStream(gzos);

+ } // end if: gzip

+ else

+ oos = new java.io.ObjectOutputStream(b64os);

+

+ oos.writeObject(serializableObject);

+ } // end try

+ catch (java.io.IOException e)

+ {

+ e.printStackTrace();

+ return null;

+ } // end catch

+ finally

+ {

+ try

+ {

+ oos.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ gzos.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ b64os.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ baos.close();

+ }

+ catch (Exception e)

+ {

+ }

+ } // end finally

+

+ // Return value according to relevant encoding.

+ try

+ {

+ return new String(baos.toByteArray(), PREFERRED_ENCODING);

+ } // end try

+ catch (java.io.UnsupportedEncodingException uue)

+ {

+ return new String(baos.toByteArray());

+ } // end catch

+

+ } // end encode

+

+ /**

+ * Encodes a byte array into Base64 notation. Does not GZip-compress data.

+ *

+ * @param source

+ * The data to convert

+ * @since 1.4

+ */

+ public static String encodeBytes(byte[] source)

+ {

+ return encodeBytes(source, 0, source.length, NO_OPTIONS);

+ } // end encodeBytes

+

+ /**

+ * Encodes a byte array into Base64 notation.

+ * <p>

+ * Valid options:

+ *

+ * <pre>

+ * GZIP: gzip-compresses object before encoding it.

+ * DONT_BREAK_LINES: don't break lines at 76 characters

+ * <i>Note: Technically, this makes your encoding non-compliant.</i>

+ * </pre>

+ * <p>

+ * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or

+ * <p>

+ * Example:

+ * <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>

+ *

+ *

+ * @param source

+ * The data to convert

+ * @param options

+ * Specified options

+ * @see Base64#GZIP

+ * @see Base64#DONT_BREAK_LINES

+ * @since 2.0

+ */

+ public static String encodeBytes(byte[] source, int options)

+ {

+ return encodeBytes(source, 0, source.length, options);

+ } // end encodeBytes

+

+ /**

+ * Encodes a byte array into Base64 notation. Does not GZip-compress data.

+ *

+ * @param source

+ * The data to convert

+ * @param off

+ * Offset in array where conversion should begin

+ * @param len

+ * Length of data to convert

+ * @since 1.4

+ */

+ public static String encodeBytes(byte[] source, int off, int len)

+ {

+ return encodeBytes(source, off, len, NO_OPTIONS);

+ } // end encodeBytes

+

+ /**

+ * Encodes a byte array into Base64 notation.

+ * <p>

+ * Valid options:

+ *

+ * <pre>

+ * GZIP: gzip-compresses object before encoding it.

+ * DONT_BREAK_LINES: don't break lines at 76 characters

+ * <i>Note: Technically, this makes your encoding non-compliant.</i>

+ * </pre>

+ * <p>

+ * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or

+ * <p>

+ * Example:

+ * <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>

+ *

+ *

+ * @param source

+ * The data to convert

+ * @param off

+ * Offset in array where conversion should begin

+ * @param len

+ * Length of data to convert

+ * @param breakLines

+ * Break lines at 80 characters or less.

+ * @param options

+ * Specified options

+ * @see Base64#GZIP

+ * @see Base64#DONT_BREAK_LINES

+ * @since 2.0

+ */

+ public static String encodeBytes(byte[] source, int off, int len, int options)

+ {

+ // Isolate options

+ int dontBreakLines = (options & DONT_BREAK_LINES);

+ int gzip = (options & GZIP);

+

+ // Compress?

+ if (gzip == GZIP)

+ {

+ java.io.ByteArrayOutputStream baos = null;

+ java.util.zip.GZIPOutputStream gzos = null;

+ Base64.OutputStream b64os = null;

+

+ try

+ {

+ // GZip -> Base64 -> ByteArray

+ baos = new java.io.ByteArrayOutputStream();

+ b64os = new Base64.OutputStream(baos, ENCODE | dontBreakLines);

+ gzos = new java.util.zip.GZIPOutputStream(b64os);

+

+ gzos.write(source, off, len);

+ gzos.close();

+ } // end try

+ catch (java.io.IOException e)

+ {

+ e.printStackTrace();

+ return null;

+ } // end catch

+ finally

+ {

+ try

+ {

+ gzos.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ b64os.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ baos.close();

+ }

+ catch (Exception e)

+ {

+ }

+ } // end finally

+

+ // Return value according to relevant encoding.

+ try

+ {

+ return new String(baos.toByteArray(), PREFERRED_ENCODING);

+ } // end try

+ catch (java.io.UnsupportedEncodingException uue)

+ {

+ return new String(baos.toByteArray());

+ } // end catch

+ } // end if: compress

+

+ // Convert option to boolean in way that code likes it.

+ boolean breakLines = dontBreakLines == 0;

+

+ int len43 = len * 4 / 3;

+ byte[] outBuff = new byte[(len43) // Main 4:3

+ + ((len % 3) > 0 ? 4 : 0) // Account for padding

+ + (breakLines ? (len43 / MAX_LINE_LENGTH) : 0)]; // New lines

+ int d = 0;

+ int e = 0;

+ int len2 = len - 2;

+ int lineLength = 0;

+ for (; d < len2; d += 3, e += 4)

+ {

+ encode3to4(source, d + off, 3, outBuff, e);

+

+ lineLength += 4;

+ if (breakLines && lineLength == MAX_LINE_LENGTH)

+ {

+ outBuff[e + 4] = NEW_LINE;

+ e++;

+ lineLength = 0;

+ } // end if: end of line

+ } // en dfor: each piece of array

+

+ if (d < len)

+ {

+ encode3to4(source, d + off, len - d, outBuff, e);

+ e += 4;

+ } // end if: some padding needed

+

+ // Return value according to relevant encoding.

+ try

+ {

+ return new String(outBuff, 0, e, PREFERRED_ENCODING);

+ } // end try

+ catch (java.io.UnsupportedEncodingException uue)

+ {

+ return new String(outBuff, 0, e);

+ } // end catch

+ // end else: don't compress

+

+ } // end encodeBytes

+

+ /* D E C O D I N G M E T H O D S */

+

+ // /**

+ // * Decodes the first four bytes of array <var>fourBytes</var>

+ // * and returns an array up to three bytes long with the

+ // * decoded values.

+ // *

+ // * @param fourBytes the array with Base64 content

+ // * @return array with decoded values

+ // * @since 1.3

+ // */

+ // private static byte[] decode4to3( byte[] fourBytes )

+ // {

+ // byte[] outBuff1 = new byte[3];

+ // int count = decode4to3( fourBytes, 0, outBuff1, 0 );

+ // byte[] outBuff2 = new byte[ count ];

+ //

+ // for( int i = 0; i < count; i++ )

+ // outBuff2 = outBuff1;

+ //

+ // return outBuff2;

+ // }

+ /**

+ * Decodes four bytes from array <var>source</var> and writes the resulting

+ * bytes (up to three of them) to <var>destination</var>. The source and

+ * destination arrays can be manipulated anywhere along their length by

+ * specifying <var>srcOffset</var> and <var>destOffset</var>. This method

+ * does not check to make sure your arrays are large enough to accomodate

+ * <var>srcOffset</var> + 4 for the <var>source</var> array or

+ * <var>destOffset</var> + 3 for the <var>destination</var> array. This

+ * method returns the actual number of bytes that were converted from the

+ * Base64 encoding.

+ *

+ *

+ * @param source

+ * the array to convert

+ * @param srcOffset

+ * the index where conversion begins

+ * @param destination

+ * the array to hold the conversion

+ * @param destOffset

+ * the index where output will be put

+ * @return the number of decoded bytes converted

+ * @since 1.3

+ */

+ static int decode4to3(byte[] source, int srcOffset, byte[] destination, int destOffset)

+ {

+ // Example: Dk==

+ if (source[srcOffset + 2] == EQUALS_SIGN)

+ {

+ // Two ways to do the same thing. Don't know which way I like best.

+ // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6

+ // )

+ // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );

+ int outBuff = ((DECODABET[source[srcOffset]] & 0xFF) << 18)

+ | ((DECODABET[source[srcOffset + 1]] & 0xFF) << 12);

+

+ destination[destOffset] = (byte) (outBuff >>> 16);

+ return 1;

+ }

+

+ // Example: DkL=

+ else if (source[srcOffset + 3] == EQUALS_SIGN)

+ {

+ // Two ways to do the same thing. Don't know which way I like best.

+ // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6

+ // )

+ // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )

+ // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );

+ int outBuff = ((DECODABET[source[srcOffset]] & 0xFF) << 18)

+ | ((DECODABET[source[srcOffset + 1]] & 0xFF) << 12)

+ | ((DECODABET[source[srcOffset + 2]] & 0xFF) << 6);

+

+ destination[destOffset] = (byte) (outBuff >>> 16);

+ destination[destOffset + 1] = (byte) (outBuff >>> 8);

+ return 2;

+ }

+

+ // Example: DkLE

+ else

+ {

+ try

+ {

+ // Two ways to do the same thing. Don't know which way I like

+ // best.

+ // int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 )

+ // >>> 6 )

+ // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )

+ // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )

+ // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );

+ int outBuff = ((DECODABET[source[srcOffset]] & 0xFF) << 18)

+ | ((DECODABET[source[srcOffset + 1]] & 0xFF) << 12)

+ | ((DECODABET[source[srcOffset + 2]] & 0xFF) << 6)

+ | ((DECODABET[source[srcOffset + 3]] & 0xFF));

+

+ destination[destOffset] = (byte) (outBuff >> 16);

+ destination[destOffset + 1] = (byte) (outBuff >> 8);

+ destination[destOffset + 2] = (byte) (outBuff);

+

+ return 3;

+ }

+ catch (Exception e)

+ {

+ System.out.println(StringUtil.concat(String.valueOf(source[srcOffset]), ": ", String.valueOf(DECODABET[source[srcOffset]])));

+ System.out.println(StringUtil.concat(String.valueOf(source[srcOffset + 1]), ": ", String.valueOf(DECODABET[source[srcOffset + 1]])));

+ System.out.println(StringUtil.concat(String.valueOf(source[srcOffset + 2]), ": ", String.valueOf(DECODABET[source[srcOffset + 2]])));

+ System.out.println(StringUtil.concat(String.valueOf(source[srcOffset + 3]), ": ", String.valueOf(DECODABET[source[srcOffset + 3]])));

+ return -1;

+ } // end catch

+ }

+ } // end decodeToBytes

+

+ /**

+ * Very low-level access to decoding ASCII characters in the form of a byte

+ * array. Does not support automatically gunzipping or any other "fancy"

+ * features.

+ *

+ * @param source

+ * The Base64 encoded data

+ * @param off

+ * The offset of where to begin decoding

+ * @param len

+ * The length of characters to decode

+ * @return decoded data

+ * @since 1.3

+ */

+ public static byte[] decode(byte[] source, int off, int len)

+ {

+ int len34 = len * 3 / 4;

+ byte[] outBuff = new byte[len34]; // Upper limit on size of output

+ int outBuffPosn = 0;

+

+ byte[] b4 = new byte[4];

+ int b4Posn = 0;

+ int i = 0;

+ byte sbiCrop = 0;

+ byte sbiDecode = 0;

+ for (i = off; i < off + len; i++)

+ {

+ sbiCrop = (byte) (source & 0x7f); // Only the low seven bits

+ sbiDecode = DECODABET[sbiCrop];

+

+ if (sbiDecode >= WHITE_SPACE_ENC) // White space, Equals sign or

+ // better

+ {

+ if (sbiDecode >= EQUALS_SIGN_ENC)

+ {

+ b4[b4Posn++] = sbiCrop;

+ if (b4Posn > 3)

+ {

+ outBuffPosn += decode4to3(b4, 0, outBuff, outBuffPosn);

+ b4Posn = 0;

+

+ // If that was the equals sign, break out of 'for' loop

+ if (sbiCrop == EQUALS_SIGN)

+ break;

+ } // end if: quartet built

+

+ } // end if: equals sign or better

+

+ } // end if: white space, equals sign or better

+ else

+ {

+ System.err.println(StringUtil.concat("Bad Base64 input character at ", String.valueOf(i), ": ", String.valueOf(source), "(decimal)"));

+ return null;

+ } // end else:

+ } // each input character

+

+ byte[] out = new byte[outBuffPosn];

+ System.arraycopy(outBuff, 0, out, 0, outBuffPosn);

+ return out;

+ } // end decode

+

+ /**

+ * Decodes data from Base64 notation, automatically detecting

+ * gzip-compressed data and decompressing it.

+ *

+ * @param s

+ * the string to decode

+ * @return the decoded data

+ * @since 1.4

+ */

+ public static byte[] decode(String s)

+ {

+ byte[] bytes;

+ try

+ {

+ bytes = s.getBytes(PREFERRED_ENCODING);

+ } // end try

+ catch (java.io.UnsupportedEncodingException uee)

+ {

+ bytes = s.getBytes();

+ } // end catch

+ // </change>

+

+ // Decode

+ bytes = decode(bytes, 0, bytes.length);

+

+ // Check to see if it's gzip-compressed

+ // GZIP Magic Two-Byte Number: 0x8b1f (35615)

+ if (bytes != null && // In case decoding returned null

+ bytes.length >= 2)

+ {

+

+ int head = (bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);

+ if (bytes.length >= 4 && // Don't want to get ArrayIndexOutOfBounds

+ // exception

+ java.util.zip.GZIPInputStream.GZIP_MAGIC == head)

+ {

+ java.io.ByteArrayInputStream bais = null;

+ java.util.zip.GZIPInputStream gzis = null;

+ java.io.ByteArrayOutputStream baos = null;

+ byte[] buffer = new byte[2048];

+ int length = 0;

+

+ try

+ {

+ baos = new java.io.ByteArrayOutputStream();

+ bais = new java.io.ByteArrayInputStream(bytes);

+ gzis = new java.util.zip.GZIPInputStream(bais);

+

+ while ((length = gzis.read(buffer)) >= 0)

+ {

+ baos.write(buffer, 0, length);

+ } // end while: reading input

+

+ // No error? Get new bytes.

+ bytes = baos.toByteArray();

+

+ } // end try

+ catch (java.io.IOException e)

+ {

+ // Just return originally-decoded bytes

+ } // end catch

+ finally

+ {

+ try

+ {

+ baos.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ gzis.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ bais.close();

+ }

+ catch (Exception e)

+ {

+ }

+ } // end finally

+

+ } // end if: gzipped

+ } // end if: bytes.length >= 2

+

+ return bytes;

+ } // end decode

+

+ /**

+ * Attempts to decode Base64 data and deserialize a Java Object within.

+ * Returns <tt>null</tt> if there was an error.

+ *

+ * @param encodedObject

+ * The Base64 data to decode

+ * @return The decoded and deserialized object

+ * @since 1.5

+ */

+ public static Object decodeToObject(String encodedObject)

+ {

+ // Decode and gunzip if necessary

+ byte[] objBytes = decode(encodedObject);

+

+ java.io.ByteArrayInputStream bais = null;

+ java.io.ObjectInputStream ois = null;

+ Object obj = null;

+

+ try

+ {

+ bais = new java.io.ByteArrayInputStream(objBytes);

+ ois = new java.io.ObjectInputStream(bais);

+

+ obj = ois.readObject();

+ } // end try

+ catch (java.io.IOException e)

+ {

+ e.printStackTrace();

+ obj = null;

+ } // end catch

+ catch (java.lang.ClassNotFoundException e)

+ {

+ e.printStackTrace();

+ obj = null;

+ } // end catch

+ finally

+ {

+ try

+ {

+ bais.close();

+ }

+ catch (Exception e)

+ {

+ }

+ try

+ {

+ ois.close();

+ }

+ catch (Exception e)

+ {

+ }

+ } // end finally

+

+ return obj;

+ } // end decodeObject

+

+ /* I N N E R C L A S S I N P U T S T R E A M */

+

+ /**

+ * A {@link Base64#InputStream} will read data from another

+ * {@link java.io.InputStream}, given in the constructor, and encode/decode

+ * to/from Base64 notation on the fly.

+ *

+ * @see Base64

+ * @see java.io.FilterInputStream

+ * @since 1.3

+ */

+ public static class InputStream extends java.io.FilterInputStream

+ {

+ // private int options; // Options specified

+ private boolean encode; // Encoding or decoding

+ private int position; // Current position in the buffer

+ private byte[] buffer; // Small buffer holding converted data

+ private int bufferLength; // Length of buffer (3 or 4)

+ private int numSigBytes; // Number of meaningful bytes in the buffer

+ private int lineLength;

+ private boolean breakLines; // Break lines at less than 80 characters

+

+ /**

+ * Constructs a {@link Base64#InputStream} in DECODE mode.

+ *

+ * @param in

+ * the {@link java.io.InputStream} from which to read data.

+ * @since 1.3

+ */

+ public InputStream(java.io.InputStream pIn)

+ {

+ this(pIn, DECODE);

+ } // end constructor

+

+ /**

+ * Constructs a {@link Base64#InputStream} in either ENCODE or DECODE

+ * mode.

+ * <p>

+ * Valid options:

+ *

+ * <pre>

+ * ENCODE or DECODE: Encode or Decode as data is read.

+ * DONT_BREAK_LINES: don't break lines at 76 characters

+ * (only meaningful when encoding)

+ * <i>Note: Technically, this makes your encoding non-compliant.</i>

+ * </pre>

+ * <p>

+ * Example: <code>new Base64.InputStream( in, Base64.DECODE )</code>

+ *

+ *

+ * @param in

+ * the {@link java.io.InputStream} from which to read data.

+ * @param options

+ * Specified options

+ * @see Base64#ENCODE

+ * @see Base64#DECODE

+ * @see Base64#DONT_BREAK_LINES

+ * @since 2.0

+ */

+ public InputStream(java.io.InputStream pIn, int options)

+ {

+ super(pIn);

+ // this.options = options;

+ breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;

+ encode = (options & ENCODE) == ENCODE;

+ bufferLength = encode ? 4 : 3;

+ buffer = new byte[bufferLength];

+ position = -1;

+ lineLength = 0;

+ } // end constructor

+

+ /**

+ * Reads enough of the input stream to convert to/from Base64 and

+ * returns the next byte.

+ *

+ * @return next byte

+ * @since 1.3

+ */

+ @Override

+ public int read() throws java.io.IOException

+ {

+ // Do we need to get data?

+ if (position < 0)

+ {

+ if (encode)

+ {

+ byte[] b3 = new byte[3];

+ int numBinaryBytes = 0;

+ for (int i = 0; i < 3; i++)

+ {

+ try

+ {

+ int b = in.read();

+

+ // If end of stream, b is -1.

+ if (b >= 0)

+ {

+ b3 = (byte) b;

+ numBinaryBytes++;

+ } // end if: not end of stream

+

+ } // end try: read

+ catch (java.io.IOException e)

+ {

+ // Only a problem if we got no data at all.

+ if (i == 0)

+ throw e;

+

+ } // end catch

+ } // end for: each needed input byte

+

+ if (numBinaryBytes > 0)

+ {

+ encode3to4(b3, 0, numBinaryBytes, buffer, 0);

+ position = 0;

+ numSigBytes = 4;

+ } // end if: got data

+ else

+ {

+ return -1;

+ } // end else

+ } // end if: encoding

+

+ // Else decoding

+ else

+ {

+ byte[] b4 = new byte[4];

+ int i = 0;

+ for (i = 0; i < 4; i++)

+ {

+ // Read four "meaningful" bytes:

+ int b = 0;

+ do

+ {

+ b = in.read();

+ }

+ while (b >= 0 && DECODABET[b & 0x7f] <= WHITE_SPACE_ENC);

+

+ if (b < 0)

+ break; // Reads a -1 if end of stream

+

+ b4 = (byte) b;

+ } // end for: each needed input byte

+

+ if (i == 4)

+ {

+ numSigBytes = decode4to3(b4, 0, buffer, 0);

+ position = 0;

+ } // end if: got four characters

+ else if (i == 0)

+ {

+ return -1;

+ } // end else if: also padded correctly

+ else

+ {

+ // Must have broken out from above.

+ throw new java.io.IOException("Improperly padded Base64 input.");

+ } // end

+

+ } // end else: decode

+ } // end else: get data

+

+ // Got data?

+ if (position >= 0)

+ {

+ // End of relevant data?

+ if ( /* !encode && */position >= numSigBytes)

+ return -1;

+

+ if (encode && breakLines && lineLength >= MAX_LINE_LENGTH)

+ {

+ lineLength = 0;

+ return '\n';

+ } // end if

+ lineLength++; // This isn't important when decoding

+ // but throwing an extra "if" seems

+ // just as wasteful.

+

+ int b = buffer[position++];

+

+ if (position >= bufferLength)

+ position = -1;

+

+ return b & 0xFF; // This is how you "cast" a byte that's

+ // intended to be unsigned.

+ // end else

+ } // end if: position >= 0

+

+ // When JDK1.4 is more accepted, use an assertion here.

+ throw new java.io.IOException("Error in Base64 code reading stream.");

+ // end else

+ } // end read

+

+ /**

+ * Calls {@link #read} repeatedly until the end of stream is reached or

+ * <var>len</var> bytes are read. Returns number of bytes read into

+ * array or -1 if end of stream is encountered.

+ *

+ * @param dest

+ * array to hold values

+ * @param off

+ * offset for array

+ * @param len

+ * max number of bytes to read into array

+ * @return bytes read into array or -1 if end of stream is encountered.

+ * @since 1.3

+ */

+ @Override

+ public int read(byte[] dest, int off, int len) throws java.io.IOException

+ {

+ int i;

+ int b;

+ for (i = 0; i < len; i++)

+ {

+ b = read();

+

+ // if( b < 0 && i == 0 )

+ // return -1;

+

+ if (b >= 0)

+ dest[off + i] = (byte) b;

+ else if (i == 0)

+ return -1;

+ else

+ break; // Out of 'for' loop

+ } // end for: each byte read

+ return i;

+ } // end read

+

+ } // end inner class InputStream

+

+ /* I N N E R C L A S S O U T P U T S T R E A M */

+

+ /**

+ * A {@link Base64#OutputStream} will write data to another

+ * {@link java.io.OutputStream}, given in the constructor, and encode/decode

+ * to/from Base64 notation on the fly.

+ *

+ * @see Base64

+ * @see java.io.FilterOutputStream

+ * @since 1.3

+ */

+ public static class OutputStream extends java.io.FilterOutputStream

+ {

+ // private int options;

+ private boolean encode;

+ private int position;

+ private byte[] buffer;

+ private int bufferLength;

+ private int lineLength;

+ private boolean breakLines;

+ private byte[] b4; // Scratch used in a few places

+ private boolean suspendEncoding;

+

+ /**

+ * Constructs a {@link Base64#OutputStream} in ENCODE mode.

+ *

+ * @param out

+ * the {@link java.io.OutputStream} to which data will be

+ * written.

+ * @since 1.3

+ */

+ public OutputStream(java.io.OutputStream pOut)

+ {

+ this(pOut, ENCODE);

+ } // end constructor

+

+ /**

+ * Constructs a {@link Base64#OutputStream} in either ENCODE or DECODE

+ * mode.

+ * <p>

+ * Valid options:

+ *

+ * <pre>

+ * ENCODE or DECODE: Encode or Decode as data is read.

+ * DONT_BREAK_LINES: don't break lines at 76 characters

+ * (only meaningful when encoding)

+ * <i>Note: Technically, this makes your encoding non-compliant.</i>

+ * </pre>

+ * <p>

+ * Example: <code>new Base64.OutputStream( out, Base64.ENCODE )</code>

+ *

+ * @param out

+ * the {@link java.io.OutputStream} to which data will be

+ * written.

+ * @param options

+ * Specified options.

+ * @see Base64#ENCODE

+ * @see Base64#DECODE

+ * @see Base64#DONT_BREAK_LINES

+ * @since 1.3

+ */

+ public OutputStream(java.io.OutputStream pOut, int options)

+ {

+ super(pOut);

+ // this.options = options;

+ breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;

+ encode = (options & ENCODE) == ENCODE;

+ bufferLength = encode ? 3 : 4;

+ buffer = new byte[bufferLength];

+ position = 0;

+ lineLength = 0;

+ suspendEncoding = false;

+ b4 = new byte[4];

+ } // end constructor

+

+ /**

+ * Writes the byte to the output stream after converting to/from Base64

+ * notation. When encoding, bytes are buffered three at a time before

+ * the output stream actually gets a write() call. When decoding, bytes

+ * are buffered four at a time.

+ *

+ * @param theByte

+ * the byte to write

+ * @since 1.3

+ */

+ @Override

+ public void write(int theByte) throws java.io.IOException

+ {

+ // Encoding suspended?

+ if (suspendEncoding)

+ {

+ super.out.write(theByte);

+ return;

+ } // end if: supsended

+

+ // Encode?

+ if (encode)

+ {

+ buffer[position++] = (byte) theByte;

+ if (position >= bufferLength) // Enough to encode.

+ {

+ out.write(encode3to4(b4, buffer, bufferLength));

+

+ lineLength += 4;

+ if (breakLines && lineLength >= MAX_LINE_LENGTH)

+ {

+ out.write(NEW_LINE);

+ lineLength = 0;

+ } // end if: end of line

+

+ position = 0;

+ } // end if: enough to output

+ } // end if: encoding

+

+ // Else, Decoding

+ else

+ {

+ // Meaningful Base64 character?

+ if (DECODABET[theByte & 0x7f] > WHITE_SPACE_ENC)

+ {

+ buffer[position++] = (byte) theByte;

+ if (position >= bufferLength) // Enough to output.

+ {

+ int len = Base64.decode4to3(buffer, 0, b4, 0);

+ out.write(b4, 0, len);

+ // out.write( Base64.decode4to3( buffer ) );

+ position = 0;

+ } // end if: enough to output

+ } // end if: meaningful base64 character

+ else if (DECODABET[theByte & 0x7f] != WHITE_SPACE_ENC)

+ {

+ throw new java.io.IOException("Invalid character in Base64 data.");

+ } // end else: not white space either

+ } // end else: decoding

+ } // end write

+

+ /**

+ * Calls {@link #write} repeatedly until <var>len</var> bytes are

+ * written.

+ *

+ * @param theBytes

+ * array from which to read bytes

+ * @param off

+ * offset for array

+ * @param len

+ * max number of bytes to read into array

+ * @since 1.3

+ */

+ @Override

+ public void write(byte[] theBytes, int off, int len) throws java.io.IOException

+ {

+ // Encoding suspended?

+ if (suspendEncoding)

+ {

+ super.out.write(theBytes, off, len);

+ return;

+ } // end if: supsended

+

+ for (int i = 0; i < len; i++)

+ {

+ write(theBytes[off + i]);

+ } // end for: each byte written

+

+ } // end write

+

+ /**

+ * Method added by PHIL. [Thanks, PHIL. -Rob] This pads the buffer

+ * without closing the stream.

+ */

+ public void flushBase64() throws java.io.IOException

+ {

+ if (position > 0)

+ {

+ if (encode)

+ {

+ out.write(encode3to4(b4, buffer, position));

+ position = 0;

+ } // end if: encoding

+ else

+ {

+ throw new java.io.IOException("Base64 input not properly padded.");

+ } // end else: decoding

+ } // end if: buffer partially full

+

+ } // end flush

+

+ /**

+ * Flushes and closes (I think, in the superclass) the stream.

+ *

+ * @since 1.3

+ */

+ @Override

+ public void close() throws java.io.IOException

+ {

+ // 1. Ensure that pending characters are written

+ flushBase64();

+

+ // 2. Actually close the stream

+ // Base class both flushes and closes.

+ super.close();

+

+ buffer = null;

+ out = null;

+ } // end close

+

+ /**

+ * Suspends encoding of the stream. May be helpful if you need to embed

+ * a piece of base640-encoded data in a stream.

+ *

+ * @since 1.5.1

+ */

+ public void suspendEncoding() throws java.io.IOException

+ {

+ flushBase64();

+ suspendEncoding = true;

+ } // end suspendEncoding

+

+ /**

+ * Resumes encoding of the stream. May be helpful if you need to embed a

+ * piece of base640-encoded data in a stream.

+ *

+ * @since 1.5.1

+ */

+ public void resumeEncoding()

+ {

+ suspendEncoding = false;

+ } // end resumeEncoding

+

+ } // end inner class OutputStream

+

+} // end class Base64

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestItemList.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestItemList.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestItemList.java (working copy)

@@ -24,6 +24,11 @@

{

}

 

+ protected void isSubmitingPin()

+ {

+ return;

+ }

+

@Override

protected void runImpl()

{

Index: aCis_datapack_350/sql/passskey.sql

===================================================================

--- aCis_datapack_350/sql/passskey.sql (revision 0)

+++ aCis_datapack_350/sql/passskey.sql (working copy)

@@ -0,0 +1,7 @@

+CREATE TABLE IF NOT EXISTS passkey (

+`obj_Id` INT UNSIGNED NOT NULL DEFAULT 0,

+`passkey` VARCHAR(45),

+`question` VARCHAR(55) NOT NULL,

+`answer` VARCHAR(35) NOT NULL,

+PRIMARY KEY (obj_Id)

+);

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDismissAlly.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDismissAlly.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDismissAlly.java (working copy)

@@ -31,6 +31,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (!activeChar.isClanLeader())

{

activeChar.sendPacket(SystemMessageId.FEATURE_ONLY_FOR_ALLIANCE_LEADER);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SendWarehouseDepositList.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SendWarehouseDepositList.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SendWarehouseDepositList.java (working copy)

@@ -67,6 +67,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (player.isProcessingTransaction())

{

player.sendPacket(SystemMessageId.ALREADY_TRADING);

Index: aCis_datapack_350/data/html/passkey/login.htm

===================================================================

--- aCis_datapack_350/data/html/passkey/login.htm (revision 0)

+++ aCis_datapack_350/data/html/passkey/login.htm (working copy)

@@ -0,0 +1,21 @@

+<html>

+<title>Personal Password Manager</title>

+<body>

+<center>

+<img src="L2Font.mini_logo-k" width=250 height=90><br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32><br>

+</center>

+<br>

+Hello, stranger! To continue playing, you have to provide your password.

+<center>

+<table>

+<tr><td><font color="732cde">Enter password: </font></td><td><edit var="pass" width=70 height=10></td></tr><br>

+</table>

+<br>

+<button value="Confirm" action="bypass -h pklogin $pass" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<button value="Forgot password" action="bypass -h pkrecovery" width=75 height=21 back="L2UI_ch3.Btn1_normalOn" fore="L2UI_ch3.Btn1_normal">

+<br>

+<img src="L2UI_CH3.herotower_deco" width=256 height=32>

+</center>

+</body>

+</html>

\ No newline at end of file

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDestroyItem.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDestroyItem.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestDestroyItem.java (working copy)

@@ -48,6 +48,12 @@

if (activeChar == null)

return;

 

+ if (activeChar.isSubmitingPin())

+ {

+ activeChar.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (activeChar.isProcessingTransaction() || activeChar.isInStoreMode())

{

activeChar.sendPacket(SystemMessageId.CANNOT_TRADE_DISCARD_DROP_ITEM_WHILE_IN_SHOPMODE);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListSell.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListSell.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/SetPrivateStoreListSell.java (working copy)

@@ -62,6 +62,12 @@

if (player == null)

return;

 

+ if (player.isSubmitingPin())

+ {

+ player.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (_items == null)

{

player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);

Index: aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java

===================================================================

--- aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java (revision 18)

+++ aCis_gameserver_350/java/net/sf/l2j/gameserver/network/clientpackets/RequestJoinParty.java (working copy)

@@ -58,6 +58,12 @@

return;

}

 

+ if (requestor.isSubmitingPin() || target.isSubmitingPin())

+ {

+ requestor.sendMessage("Digite a senha do personagem.");

+ return;

+ }

+

if (target.equals(requestor) || target.isCursedWeaponEquipped() || requestor.isCursedWeaponEquipped() || target.getAppearance().getInvisible())

{

requestor.sendPacket(SystemMessageId.YOU_HAVE_INVITED_THE_WRONG_TARGET);

 

Link to comment
Share on other sites

  • 0

As said Elfo, we use embedded Java 8 Base64 implementation, and so deleted the class. Simply fix the import and slightly edit method names, see other Base64 uses to "get it".

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Posts

    • I didn't edit anything, It's a scren from Your vid, don't be delusional. I won't refund You. I think 10 years ago I've created account on L2Brasil - You can also go there if You want. Take care
    • don't be stupid if you don't return my money I continue to want sanctions against you.   don't write that you like it, the case is not closed. don't pose as you want when you upload a photo don't edit upload the whole conversation before editing.
    • Made some contacts, for the time being everything is set. Kindly asking for moderators to lock this post.
    • To be fair, I wasn't aware I had an account there. I guess I was banned on that mmo-dev-rus bullshit because I'm well known for not beeing russian-ass-licker-fanboy, those who knows me, knows it too. Thank You. Case closed.  @Celestine     You did. Worked stopped. You got refunded. That's all from me, I have other works to do - I can't spend more time here, repeating myself, so I won't get "reported" yet again with another project. See my point here?  Signing out 
    • VeeloBooster Testosterone Booster (Special Offer) – Buy Now – Official Website Official Website: https://supplementrange.com/veelobooster-reviews/ Facebook: https://www.facebook.com/veelobooster.officialwebsite VeeloBooster Male Enhancement Pills Reviews - For the most part, it’s men who want to have larger penises,” Montague said. Eldorado Trading, Jones, and Vogt admitted in their plea agreements to buying hundreds of thousands of misbranded pills from Lee, which Eldorado Trading resold for a profit of at least $215,000. In their plea agreements, Contenda Health and the Cranfords admitted to purchasing more than 1.4 million misbranded pills from Lee for approximately $2.1 million, which they resold to retail locations across the United States. The anticipated guilty pleas are in relation to three cases filed today in U.S. Continue reading to learn more Crucial Tip 1 Save time and money when you are looking for enlargement method. Now it is urgent to correct DIC to stop bleeding, but Su Hongwen really cant think of the kind of drug that can correct DIC in a short time to achieve The purpose of hemostasis. Its imperative to comprehend that not every erectile disorder problems originate from mental issues There might be a fundamental medical trigger in sufferers with Hd Testo Male Enhancement erection dysfunction For instance.   Official Website: https://supplementrange.com/veelobooster-reviews/ https://supplementrange.com/nexalyn-male-enhancement/ https://supplementrange.com/nexaslim-reviews/ Facebook: https://www.facebook.com/veelobooster.officialwebsite https://www.facebook.com/nexaslimofficialwebsite/ https://www.facebook.com/nexalynofficialwebsite/ Groups Google: https://groups.google.com/u/0/g/veelobooster-male-enhancement/c/kMfeByqzWIU https://groups.google.com/g/nexalyn-reviews/c/612K-C_681Y https://groups.google.com/g/nexalyn-reviews/c/NddGgTyevPw Sites Google: https://sites.google.com/view/veelobooster-official-website/home https://sites.google.com/view/nexalynpillsreviews/home Blogspot: https://nexalyn-reviews.blogspot.com/2024/05/nexalyn-testosterone-booster.html https://nexalyn-reviews.blogspot.com/2024/05/veelobooster-testosterone-booster.html Medium: https://medium.com/@veelobooster.official/veelobooster-testosterone-booster-32935c5b7fd7 https://medium.com/@nexalyn-review/nexalyn-testosterone-booster-52b99cf5540f https://medium.com/@nexalyn-review/nexalyn-testosterone-booster-reviews-nexalyn-male-enhancement-pills-b04e97c5f978 Other Blogs: https://veelobooster-testosterone-booster-2.jimdosite.com/ https://veelobooster-testosterone-boos-1fe422.webflow.io/ https://veelobooster-testosterone-booster-reviews.company.site/ https://www.eventbrite.com/e/veelobooster-testosterone-booster-reviews-veelo-booster-male-enhancement-pills-tickets-903689287987?aff=oddtdtcreator https://edwextrujek.wixsite.com/veelobooster-reviews/post/veelobooster-testosterone-booster-reviews-does-veelo-booster-pills-work-or-not
  • Topics

×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock