mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
Organize packets in to their own packages
Also remove legacy CryptoStateManager
This commit is contained in:
parent
e41d0ac9c4
commit
ff4ea792ce
|
|
@ -1,8 +1,9 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet
|
||||||
|
|
||||||
|
import net.psforever.packet.control.SlottedMetaPacket
|
||||||
import scodec.bits.BitVector
|
import scodec.bits.BitVector
|
||||||
import scodec.{Err, DecodeResult, Attempt, Codec}
|
import scodec.{Attempt, Codec, DecodeResult, Err}
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
|
||||||
object ControlPacketOpcode extends Enumeration {
|
object ControlPacketOpcode extends Enumeration {
|
||||||
|
|
@ -54,12 +55,12 @@ object ControlPacketOpcode extends Enumeration {
|
||||||
import net.psforever
|
import net.psforever
|
||||||
|
|
||||||
opcode match {
|
opcode match {
|
||||||
case HandleGamePacket => psforever.packet.HandleGamePacket.decode
|
case HandleGamePacket => control.HandleGamePacket.decode
|
||||||
case ServerStart => psforever.packet.ServerStart.decode
|
case ServerStart => control.ServerStart.decode
|
||||||
case ClientStart => psforever.packet.ClientStart.decode
|
case ClientStart => control.ClientStart.decode
|
||||||
case MultiPacket => psforever.packet.MultiPacket.decode
|
case MultiPacket => control.MultiPacket.decode
|
||||||
case SlottedMetaPacket0 => psforever.packet.SlottedMetaPacket.decode
|
case SlottedMetaPacket0 => SlottedMetaPacket.decode
|
||||||
case ConnectionClose => psforever.packet.ConnectionClose.decode
|
case ConnectionClose => control.ConnectionClose.decode
|
||||||
case default => (a : BitVector) => Attempt.failure(Err(s"Could not find a marshaller for control packet ${opcode}"))
|
case default => (a : BitVector) => Attempt.failure(Err(s"Could not find a marshaller for control packet ${opcode}"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
package net.psforever.packet
|
package net.psforever.packet
|
||||||
|
|
||||||
import scodec.bits.BitVector
|
import scodec.bits.BitVector
|
||||||
import scodec.{Err, DecodeResult, Attempt}
|
import scodec.{Attempt, DecodeResult, Err}
|
||||||
|
|
||||||
// this isnt actually used as an opcode (i.e not serialized)
|
// this isnt actually used as an opcode (i.e not serialized)
|
||||||
object CryptoPacketOpcode extends Enumeration {
|
object CryptoPacketOpcode extends Enumeration {
|
||||||
|
|
@ -14,10 +14,10 @@ object CryptoPacketOpcode extends Enumeration {
|
||||||
import net.psforever
|
import net.psforever
|
||||||
|
|
||||||
opcode match {
|
opcode match {
|
||||||
case ClientChallengeXchg => psforever.packet.ClientChallengeXchg.decode
|
case ClientChallengeXchg => crypto.ClientChallengeXchg.decode
|
||||||
case ServerChallengeXchg => psforever.packet.ServerChallengeXchg.decode
|
case ServerChallengeXchg => crypto.ServerChallengeXchg.decode
|
||||||
case ServerFinished => psforever.packet.ServerFinished.decode
|
case ServerFinished => crypto.ServerFinished.decode
|
||||||
case ClientFinished => psforever.packet.ClientFinished.decode
|
case ClientFinished => crypto.ClientFinished.decode
|
||||||
case default => (a : BitVector) => Attempt.failure(Err(s"Could not find a marshaller for crypto packet ${opcode}")
|
case default => (a : BitVector) => Attempt.failure(Err(s"Could not find a marshaller for crypto packet ${opcode}")
|
||||||
.pushContext("get_marshaller"))
|
.pushContext("get_marshaller"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet
|
||||||
|
|
||||||
import scodec.{Err, DecodeResult, Attempt, Codec}
|
import scodec.{Attempt, Codec, DecodeResult, Err}
|
||||||
import scodec.bits.BitVector
|
import scodec.bits.BitVector
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
|
||||||
|
|
@ -35,9 +35,9 @@ object GamePacketOpcode extends Enumeration {
|
||||||
import net.psforever
|
import net.psforever
|
||||||
|
|
||||||
opcode match {
|
opcode match {
|
||||||
case LoginMessage => psforever.packet.LoginMessage.decode
|
case LoginMessage => game.LoginMessage.decode
|
||||||
case LoginRespMessage => psforever.packet.LoginRespMessage.decode
|
case LoginRespMessage => game.LoginRespMessage.decode
|
||||||
case VNLWorldStatusMessage => psforever.packet.VNLWorldStatusMessage.decode
|
case VNLWorldStatusMessage => game.VNLWorldStatusMessage.decode
|
||||||
case default => (a : BitVector) => Attempt.failure(Err(s"Could not find a marshaller for game packet ${opcode}"))
|
case default => (a : BitVector) => Attempt.failure(Err(s"Could not find a marshaller for game packet ${opcode}"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.control
|
||||||
|
|
||||||
|
import net.psforever.packet.{ControlPacketOpcode, Marshallable, PlanetSideControlPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
import scodec.codecs._
|
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
import scodec.codecs._
|
||||||
|
|
||||||
final case class ClientStart(clientNonce : Long)
|
final case class ClientStart(clientNonce : Long)
|
||||||
extends PlanetSideControlPacket {
|
extends PlanetSideControlPacket {
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.control
|
||||||
|
|
||||||
|
import net.psforever.packet._
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
|
||||||
final case class ConnectionClose()
|
final case class ConnectionClose()
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.control
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
import net.psforever.packet.{ControlPacketOpcode, Marshallable, PlanetSideControlPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.ByteVector
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
|
||||||
final case class HandleGamePacket(packet : ByteVector)
|
final case class HandleGamePacket(packet : ByteVector)
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.control
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
import net.psforever.packet.{ControlPacketOpcode, Marshallable, PlanetSideControlPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.ByteVector
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import scodec.bits._
|
|
||||||
|
|
||||||
final case class MultiPacket(packets : Vector[ByteVector])
|
final case class MultiPacket(packets : Vector[ByteVector])
|
||||||
extends PlanetSideControlPacket {
|
extends PlanetSideControlPacket {
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.control
|
||||||
|
|
||||||
|
import net.psforever.packet.{ControlPacketOpcode, Marshallable, PlanetSideControlPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
import scodec.codecs._
|
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
import scodec.codecs._
|
||||||
|
|
||||||
final case class ServerStart(clientNonce : Long, serverNonce : Long)
|
final case class ServerStart(clientNonce : Long, serverNonce : Long)
|
||||||
extends PlanetSideControlPacket {
|
extends PlanetSideControlPacket {
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.control
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
import net.psforever.packet.{ControlPacketOpcode, Marshallable, PlanetSideControlPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.ByteVector
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
|
||||||
final case class SlottedMetaPacket(/*slot : Int,*/ packet : ByteVector)
|
final case class SlottedMetaPacket(/*slot : Int,*/ packet : ByteVector)
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.crypto
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
|
||||||
|
|
||||||
|
import net.psforever.packet.{CryptoPacketOpcode, Marshallable, PlanetSideCryptoPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.{ByteVector, _}
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import scodec.bits._
|
|
||||||
|
|
||||||
final case class ClientChallengeXchg(time : Long, challenge : ByteVector, p : ByteVector, g : ByteVector)
|
final case class ClientChallengeXchg(time : Long, challenge : ByteVector, p : ByteVector, g : ByteVector)
|
||||||
extends PlanetSideCryptoPacket {
|
extends PlanetSideCryptoPacket {
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.crypto
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
import net.psforever.packet.{CryptoPacketOpcode, Marshallable, PlanetSideCryptoPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.{ByteVector, _}
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import scodec.bits._
|
|
||||||
|
|
||||||
final case class ClientFinished(pubKey : ByteVector, challengeResult: ByteVector)
|
final case class ClientFinished(pubKey : ByteVector, challengeResult: ByteVector)
|
||||||
extends PlanetSideCryptoPacket {
|
extends PlanetSideCryptoPacket {
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.crypto
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
import net.psforever.packet.{CryptoPacketOpcode, Marshallable, PlanetSideCryptoPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.{ByteVector, _}
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import scodec.bits._
|
|
||||||
|
|
||||||
final case class ServerChallengeXchg(time : Long, challenge : ByteVector, pubKey : ByteVector)
|
final case class ServerChallengeXchg(time : Long, challenge : ByteVector, pubKey : ByteVector)
|
||||||
extends PlanetSideCryptoPacket {
|
extends PlanetSideCryptoPacket {
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.crypto
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
import net.psforever.packet.{CryptoPacketOpcode, Marshallable, PlanetSideCryptoPacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.{ByteVector, _}
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import scodec.bits._
|
|
||||||
|
|
||||||
final case class ServerFinished(challengeResult : ByteVector)
|
final case class ServerFinished(challengeResult : ByteVector)
|
||||||
extends PlanetSideCryptoPacket {
|
extends PlanetSideCryptoPacket {
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.game
|
||||||
|
|
||||||
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.game
|
||||||
|
|
||||||
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import scodec.bits._
|
|
||||||
import shapeless._
|
import shapeless._
|
||||||
|
|
||||||
final case class LoginMessage(majorVersion : Long,
|
final case class LoginMessage(majorVersion : Long,
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.game
|
||||||
|
|
||||||
import scodec.bits.ByteVector
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
|
import scodec.bits.ByteVector
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
import scodec.bits._
|
|
||||||
|
|
||||||
final case class LoginRespMessage(token : String, // printable ascii for 16
|
final case class LoginRespMessage(token : String, // printable ascii for 16
|
||||||
unknown : ByteVector, // hex"00000000 18FABE0C 00000000 00000000"
|
unknown : ByteVector, // hex"00000000 18FABE0C 00000000 00000000"
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
package net.psforever.packet
|
package net.psforever.packet.game
|
||||||
|
|
||||||
import java.net.{InetAddress, InetSocketAddress}
|
import java.net.{InetAddress, InetSocketAddress}
|
||||||
|
|
||||||
|
import net.psforever.packet.{GamePacketOpcode, Marshallable, PacketHelpers, PlanetSideGamePacket}
|
||||||
import scodec._
|
import scodec._
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
import scodec.codecs._
|
import scodec.codecs._
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
import org.specs2.mutable._
|
import org.specs2.mutable._
|
||||||
import net.psforever.packet._
|
import net.psforever.packet._
|
||||||
|
import net.psforever.packet.control.{ClientStart, ServerStart}
|
||||||
|
import net.psforever.packet.crypto.{ClientChallengeXchg, ClientFinished, ServerChallengeXchg, ServerFinished}
|
||||||
import scodec.Codec
|
import scodec.Codec
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import java.net.{InetAddress, InetSocketAddress}
|
||||||
|
|
||||||
import org.specs2.mutable._
|
import org.specs2.mutable._
|
||||||
import net.psforever.packet._
|
import net.psforever.packet._
|
||||||
|
import net.psforever.packet.game._
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
|
||||||
class GamePacketTest extends Specification {
|
class GamePacketTest extends Specification {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
// Copyright (c) 2016 PSForever.net to present
|
||||||
import org.specs2.mutable._
|
import org.specs2.mutable._
|
||||||
import net.psforever.packet._
|
import net.psforever.packet._
|
||||||
|
import net.psforever.packet.control.{ClientStart, ServerStart}
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
|
||||||
class PacketCodingTest extends Specification {
|
class PacketCodingTest extends Specification {
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,9 @@ import scodec.{Attempt, Codec, Err}
|
||||||
import scodec.codecs.{bytes, uint16L, uint8L}
|
import scodec.codecs.{bytes, uint16L, uint8L}
|
||||||
import java.security.SecureRandom
|
import java.security.SecureRandom
|
||||||
|
|
||||||
|
import net.psforever.packet.control.{ClientStart, ServerStart}
|
||||||
|
import net.psforever.packet.crypto._
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Actor that stores crypto state for a connection and filters away any packet metadata.
|
* Actor that stores crypto state for a connection and filters away any packet metadata.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,8 @@ import java.net.{InetAddress, InetSocketAddress}
|
||||||
|
|
||||||
import akka.actor.{Actor, ActorLogging, ActorRef, Identify, MDCContextAware}
|
import akka.actor.{Actor, ActorLogging, ActorRef, Identify, MDCContextAware}
|
||||||
import net.psforever.packet._
|
import net.psforever.packet._
|
||||||
|
import net.psforever.packet.control.{ConnectionClose, SlottedMetaPacket}
|
||||||
|
import net.psforever.packet.game._
|
||||||
import scodec.Attempt.{Failure, Successful}
|
import scodec.Attempt.{Failure, Successful}
|
||||||
import scodec.bits._
|
import scodec.bits._
|
||||||
|
|
||||||
|
|
@ -61,7 +63,7 @@ class LoginSessionActor extends Actor with MDCContextAware {
|
||||||
}
|
}
|
||||||
|
|
||||||
def handleGamePkt(pkt : PlanetSideGamePacket) = {
|
def handleGamePkt(pkt : PlanetSideGamePacket) = {
|
||||||
|
log.debug(s"Unhandled GamePacket ${pkt}")
|
||||||
}
|
}
|
||||||
|
|
||||||
def failWithError(error : String) = {
|
def failWithError(error : String) = {
|
||||||
|
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
// Copyright (c) 2016 PSForever.net to present
|
|
||||||
package net.psforever.crypto
|
|
||||||
|
|
||||||
import akka.actor.{Actor, ActorLogging, FSM}
|
|
||||||
import akka.util.ByteString
|
|
||||||
import scodec.Codec
|
|
||||||
import scodec.bits.ByteVector
|
|
||||||
|
|
||||||
sealed trait CryptoState
|
|
||||||
final case class ClientStart() extends CryptoState
|
|
||||||
final case class ServerStart() extends CryptoState
|
|
||||||
final case class ClientChallengeXchg() extends CryptoState
|
|
||||||
final case class ServerChallengeXchg() extends CryptoState
|
|
||||||
final case class ClientFinished() extends CryptoState
|
|
||||||
final case class ServerFinished() extends CryptoState
|
|
||||||
|
|
||||||
sealed trait CryptoData
|
|
||||||
final case class Uninitialized() extends CryptoData
|
|
||||||
|
|
||||||
class CryptoStateManager extends Actor with ActorLogging with FSM[CryptoState, CryptoData] {
|
|
||||||
startWith(ClientStart(), Uninitialized())
|
|
||||||
|
|
||||||
when(ClientStart()) {
|
|
||||||
/*case Event(RawPacket(msg), _) => {
|
|
||||||
val decoded = Codec.decode[net.psforever.net.ClientStart](msg.bits)
|
|
||||||
try {
|
|
||||||
val packet = decoded.require.value
|
|
||||||
println("Got cNonce: " + packet.clientNonce)
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
case e : Exception =>
|
|
||||||
println("Invalid packet: " + e.getMessage)
|
|
||||||
}
|
|
||||||
|
|
||||||
stay
|
|
||||||
}*/
|
|
||||||
case _ => stay
|
|
||||||
}
|
|
||||||
|
|
||||||
initialize()
|
|
||||||
}
|
|
||||||
Loading…
Reference in a new issue