EnriqCG / rcon-srcds

A zero-dependency Typescript library for the Source/Minecraft RCON Protocol
https://www.npmjs.com/package/rcon-srcds
MIT License
61 stars 20 forks source link

Authentication sometimes fails #9

Open Taraman17 opened 4 years ago

Taraman17 commented 4 years ago

I have a problem, that sometimes (meanwhile close to 50%) the authentication fails. No answer is sent from the module.

Logging whats happening, I found that sometimes the 2 Authentication packets are sent by the server (or at least received by rcon-srcds) as 1:

writing packet
packet written.
received packet:
<Buffer 0a 00 00 00 99 09 00 00 00 00 00 00 00 00 0a 00 00 00 99 09 00 00 02 00 00 00 00 00>
decoded packet:
{
  size: 10,
  id: 2457,
  type: 0,
  body: '\u0000\u0000\n\u0000\u0000\u0000\u0019\t\u0000\u0000\u0002\u0000\u0000\u0000'
}

a correct set of packets looks like this:

writing packet
packet written.
received packet:
<Buffer 0a 00 00 00 99 09 00 00 00 00 00 00 00 00>
decoded packet:
{ size: 10, id: 2457, type: 0, body: '' }
received packet
<Buffer 0a 00 00 00 99 09 00 00 02 00 00 00 00 00>
decoded packet:
{ size: 10, id: 2457, type: 2, body: '' }
Auth response is success
mandelmonkey commented 4 years ago

I some times get no response as well, did you find a fix for this?

Taraman17 commented 4 years ago

I can't see why the server is behaving this way. I didn't really look into this, I was hoping, @EnriqCG would have a look.

EnriqCG commented 4 years ago

So I have no idea why this is happening and I still don't know if this is a library issue or an issue with the CS:GO gameserver itself. I've noticed the issue started happening somewhere around May 2020.

The following code is a temporary solution I'm not proud of, but it's what we've been running at Generation Esports for a couple months without the auth issue happening again.


if (type === protocol.SERVERDATA_AUTH && decodedPacket.type !== protocol.SERVERDATA_AUTH_RESPONSE) {
    /**
     * Since May 2020 reports have arisen about CSGO servers sending 0x00 but not confirming auth
     * with 0x02. This is a temporary solution that solves the problem.
     */
    if (decodedPacket.body !== '') {
        if (decodedPacket.body === '\u0000\u0000\n\u0000\u0000\u0000<\n\u0000\u0000\u0002\u0000\u0000\u0000') {
            resolve(true)
        } else {
            reject(Error('Unable to authenticate'))
        }
        this.connection.removeListener('data', onData)
    }
    return
}

As I see more people having the issue now I am going to take the time to audit the library and come up with a better solution than the one above.

Taraman17 commented 4 years ago

Thx Enrique

mandelmonkey commented 4 years ago

thanks!

On Sat, Nov 7, 2020 at 12:25 AM Markus Adrario notifications@github.com wrote:

Thx Enrique

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/EnriqCG/rcon-srcds/issues/9#issuecomment-723357902, or unsubscribe https://github.com/notifications/unsubscribe-auth/ABSECN4JMZ5OTAEFA5FY4VDSOSHV7ANCNFSM4THKGYOA .

mandelmonkey commented 4 years ago

@EnriqCG may I ask where you place this quick fix? and does it just make the problem go away for now or do I still need to handle something?

(sorry im new to rcon and udp)

on another note ive started to run a linux server instead of windows and the issue hasnt happened yet

EnriqCG commented 4 years ago

You should replace this if statement with the above mentioned snippet. That should handle the authentication error and there is no extra requirement.

I can confirm the issue happens on Linux too. I rarely run a CS:GO server in Windows anymore and I see this issue a lot. So it is not an OS-dependent thing.

Taraman17 commented 4 years ago
if (type === protocol.SERVERDATA_AUTH && decodedPacket.type !== protocol.SERVERDATA_AUTH_RESPONSE) {

Protocol.SERVER... has to be with a capital P.

EDIT: At least in the current version. In the Typescript version from the pull-request it's correct as is.

mandelmonkey commented 4 years ago

do you guys know if there is an rcon command I can call to get the players score in cs:go?

Taraman17 commented 4 years ago

do you guys know if there is an rcon command I can call to get the players score in cs:go?

A little off-topic, but no, not that I know. Candidates would be "status" or "users", but both don't show scores.

For this you would need server Queries: https://developer.valvesoftware.com/wiki/Server_queries#A2S_PLAYER

Alternatively you could parse logs to track scores. I'm developing a server API (for linux servers) using nodejs, which does this (not for scores yet, but I plan to implement that too): https://github.com/Taraman17/nodejs-csgo-api

t-davies commented 4 years ago

FYI, just ran into this problem and the posted fix is slightly incorrect - or at least it appears to be with the latest versions of CSGO at least. This is what we ended up running with.

if (type === Protocol.SERVERDATA_AUTH && decodedPacket.type !== Protocol.SERVERDATA_AUTH_RESPONSE) {
    /**
     * Since May 2020 reports have arisen about CSGO servers sending 0x00 but not confirming auth
     * with 0x02. This is a temporary solution that solves the problem.
     */
    if (decodedPacket.body !== '') {
        if (decodedPacket.body === '\u0000\u0000\n\u0000\u0000\u0000\u0019\t\u0000\u0000\u0002\u0000\u0000\u0000') {
            resolve('success')
        } else {
            reject(Error('Unable to authenticate'))
        }
        this.connection.removeListener('data', onData)
    }
    return
}
Taraman17 commented 3 years ago

Is this still on the roadmap with 2.x?

erfanasbari commented 3 years ago

This issue is happening with CoD4x servers too. When I call authenticate() right after 2 or 3 seconds for second time it doesn't resolve or reject the promise.

I'm using npm and I don't know how to fix it with the code above; can somebody tell me? Thanks <3