/* * This file is part of the OdinMS Maple Story Server Copyright (C) 2008 ~ 2010 * Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan * Christian Meyer <vimes@odinms.de> * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License version 3 as published by * the Free Software Foundation. You may not use, modify or distribute this * program under any other version of the GNU Affero General Public License. * * 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 Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package javastory.server.handling; import javastory.channel.ChannelClient; import javastory.client.GameClient; import javastory.cryptography.AesTransform; import javastory.cryptography.CustomEncryption; import javastory.io.GamePacket; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; import org.apache.mina.filter.codec.ProtocolEncoder; import org.apache.mina.filter.codec.ProtocolEncoderOutput; public class PacketEncoder implements ProtocolEncoder { @Override public void encode(final IoSession session, final Object message, final ProtocolEncoderOutput out) throws Exception { final ChannelClient client = (ChannelClient) session.getAttribute(GameClient.CLIENT_KEY); if (client != null) { final byte[] packet = ((GamePacket) message).getBytes(); final byte[] packetCopy = new byte[packet.length]; System.arraycopy(packet, 0, packetCopy, 0, packet.length); final byte[] raw = new byte[packetCopy.length + 4]; final AesTransform serverCrypto = client.getServerCrypto(); synchronized (serverCrypto) { final byte[] header = serverCrypto.constructHeader(packetCopy.length); System.arraycopy(header, 0, raw, 0, 4); CustomEncryption.encrypt(packetCopy); serverCrypto.transform(packetCopy); } System.arraycopy(packetCopy, 0, raw, 4, packetCopy.length); out.write(IoBuffer.wrap(raw)); } else { out.write(IoBuffer.wrap(((GamePacket) message).getBytes())); } } @Override public void dispose(final IoSession session) throws Exception { // nothing to do } }