mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-07-13 15:34:42 +00:00
Login Safety (#1299)
* differentiated between login test idling and post-message-received idling; added a messaging buffer that gets emptied during the transition to normal login behavior * isolated behavior
This commit is contained in:
parent
f49804257a
commit
f88323805a
1 changed files with 35 additions and 27 deletions
|
|
@ -101,6 +101,8 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
|
||||||
|
|
||||||
private val bcryptRounds = 12
|
private val bcryptRounds = 12
|
||||||
|
|
||||||
|
private var buffer: Seq[Any] = Seq() //for typed actors, this becomes an akka.actor.typed.scaladsl.StashBuffer (size 10?)
|
||||||
|
|
||||||
override def preStart(): Unit = {
|
override def preStart(): Unit = {
|
||||||
super.preStart()
|
super.preStart()
|
||||||
ServiceManager.serviceManager ! Lookup("accountIntermediary")
|
ServiceManager.serviceManager ! Lookup("accountIntermediary")
|
||||||
|
|
@ -122,7 +124,12 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
|
||||||
sockets = listings.head
|
sockets = listings.head
|
||||||
}
|
}
|
||||||
|
|
||||||
private def idlingBehavior: Receive = persistentSetupMixinBehavior.orElse {
|
private def idlingBufferBehavior: Receive = persistentSetupMixinBehavior.orElse {
|
||||||
|
case packet =>
|
||||||
|
buffer = buffer :+ packet
|
||||||
|
}
|
||||||
|
|
||||||
|
private def idlingIgnoreBehavior: Receive = persistentSetupMixinBehavior.orElse {
|
||||||
case _ => ()
|
case _ => ()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -132,7 +139,7 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
|
||||||
hostName = address.HostName
|
hostName = address.HostName
|
||||||
canonicalHostName = address.CanonicalHostName
|
canonicalHostName = address.CanonicalHostName
|
||||||
port = address.Port
|
port = address.Port
|
||||||
context.become(idlingBehavior)
|
context.become(idlingBufferBehavior)
|
||||||
runLoginTest()
|
runLoginTest()
|
||||||
|
|
||||||
case _ => ()
|
case _ => ()
|
||||||
|
|
@ -146,35 +153,33 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
|
||||||
failWithError(s"Invalid packet class received: $default")
|
failWithError(s"Invalid packet class received: $default")
|
||||||
}
|
}
|
||||||
|
|
||||||
private def displayingServerListBehavior: Receive = persistentSetupMixinBehavior.orElse {
|
private def nextPortTransferBehavior: Receive = {
|
||||||
case packet: PlanetSideGamePacket =>
|
|
||||||
handleGamePktDuringWorldSelect(packet)
|
|
||||||
|
|
||||||
case LoginActor.UpdateServerList =>
|
|
||||||
updateServerList()
|
|
||||||
|
|
||||||
case SocketPane.NextPort(_, _, portNum) =>
|
case SocketPane.NextPort(_, _, portNum) =>
|
||||||
val address = gameTestServerAddress.getAddress.getHostAddress
|
val address = gameTestServerAddress.getAddress.getHostAddress
|
||||||
log.info(s"Connecting to ${address.toLowerCase}: $portNum ...")
|
log.info(s"Connecting to ${address.toLowerCase}: $portNum ...")
|
||||||
val response = ConnectToWorldMessage(serverName, address, portNum)
|
val response = ConnectToWorldMessage(serverName, address, portNum)
|
||||||
context.become(idlingBehavior)
|
context.become(idlingIgnoreBehavior)
|
||||||
middlewareActor ! MiddlewareActor.Send(response)
|
middlewareActor ! MiddlewareActor.Send(response)
|
||||||
middlewareActor ! MiddlewareActor.Close()
|
middlewareActor ! MiddlewareActor.Close()
|
||||||
|
|
||||||
case default =>
|
|
||||||
failWithError(s"Invalid packet class received: $default")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private def waitingForServerTransferBehavior: Receive = persistentSetupMixinBehavior.orElse {
|
private def displayingServerListBehavior: Receive = persistentSetupMixinBehavior
|
||||||
case SocketPane.NextPort(_, _, portNum) =>
|
.orElse(nextPortTransferBehavior)
|
||||||
val address = gameTestServerAddress.getAddress.getHostAddress
|
.orElse {
|
||||||
log.info(s"Connecting to ${address.toLowerCase}: $portNum ...")
|
case packet: PlanetSideGamePacket =>
|
||||||
val response = ConnectToWorldMessage(serverName, address, portNum)
|
handleGamePktDuringWorldSelect(packet)
|
||||||
context.become(idlingBehavior)
|
|
||||||
middlewareActor ! MiddlewareActor.Send(response)
|
|
||||||
middlewareActor ! MiddlewareActor.Close()
|
|
||||||
|
|
||||||
case _ => ()
|
case LoginActor.UpdateServerList =>
|
||||||
|
updateServerList()
|
||||||
|
|
||||||
|
case default =>
|
||||||
|
failWithError(s"Invalid packet class received: $default")
|
||||||
|
}
|
||||||
|
|
||||||
|
private def waitingForServerTransferBehavior: Receive = persistentSetupMixinBehavior
|
||||||
|
.orElse(nextPortTransferBehavior)
|
||||||
|
.orElse {
|
||||||
|
case _ => ()
|
||||||
}
|
}
|
||||||
|
|
||||||
private def handleGamePktDuringLogin(pkt: PlanetSideGamePacket): Unit = {
|
private def handleGamePktDuringLogin(pkt: PlanetSideGamePacket): Unit = {
|
||||||
|
|
@ -182,17 +187,17 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
|
||||||
case LoginMessage(majorVersion, minorVersion, buildDate, username, _, Some(token), revision) =>
|
case LoginMessage(majorVersion, minorVersion, buildDate, username, _, Some(token), revision) =>
|
||||||
val clientVersion = s"Client Version: $majorVersion.$minorVersion.$revision, $buildDate"
|
val clientVersion = s"Client Version: $majorVersion.$minorVersion.$revision, $buildDate"
|
||||||
log.debug(s"New login UN:$username Token:$token. $clientVersion")
|
log.debug(s"New login UN:$username Token:$token. $clientVersion")
|
||||||
context.become(idlingBehavior)
|
context.become(idlingIgnoreBehavior)
|
||||||
accountLoginWithToken(token)
|
accountLoginWithToken(token)
|
||||||
|
|
||||||
case LoginMessage(majorVersion, minorVersion, buildDate, username, password, None, revision) =>
|
case LoginMessage(majorVersion, minorVersion, buildDate, username, password, None, revision) =>
|
||||||
val clientVersion = s"Client Version: $majorVersion.$minorVersion.$revision, $buildDate"
|
val clientVersion = s"Client Version: $majorVersion.$minorVersion.$revision, $buildDate"
|
||||||
log.debug(s"New login UN:$username. $clientVersion")
|
log.debug(s"New login UN:$username. $clientVersion")
|
||||||
context.become(idlingBehavior)
|
context.become(idlingIgnoreBehavior)
|
||||||
accountLogin(username, password.getOrElse(""))
|
accountLogin(username, password.getOrElse(""))
|
||||||
|
|
||||||
case _ =>
|
case _ =>
|
||||||
log.warning(s"Unhandled GamePacket $pkt")
|
log.warning(s"Unhandled GamePacket during login $pkt")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,7 +210,7 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
|
||||||
sockets ! SocketPane.GetNextPort("world", context.self)
|
sockets ! SocketPane.GetNextPort("world", context.self)
|
||||||
|
|
||||||
case _ =>
|
case _ =>
|
||||||
log.warning(s"Unhandled GamePacket $pkt")
|
log.warning(s"Unhandled GamePacket during world select $pkt")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -224,8 +229,11 @@ class LoginActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], conne
|
||||||
result.onComplete {
|
result.onComplete {
|
||||||
case Success(Some(_)) =>
|
case Success(Some(_)) =>
|
||||||
context.become(accountLoginBehavior) // account found
|
context.become(accountLoginBehavior) // account found
|
||||||
|
buffer.foreach { self ! _ }
|
||||||
|
buffer = Seq()
|
||||||
case Success(None) =>
|
case Success(None) =>
|
||||||
middlewareActor ! MiddlewareActor.Send(DisconnectMessage("Character database not found; stopping ..."))
|
log.error("account database not found")
|
||||||
|
middlewareActor ! MiddlewareActor.Send(DisconnectMessage("Account database not found; stopping ..."))
|
||||||
middlewareActor ! MiddlewareActor.Close()
|
middlewareActor ! MiddlewareActor.Close()
|
||||||
case Failure(e) =>
|
case Failure(e) =>
|
||||||
log.error(e.getMessage)
|
log.error(e.getMessage)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue