H-uru / Plasma

Cyan Worlds's Plasma game engine
http://h-uru.github.io/Plasma/
GNU General Public License v3.0
205 stars 80 forks source link

Prefer to grab the server's SDL descriptors. #1450

Closed Hoikas closed 1 year ago

Hoikas commented 1 year ago

The impetus for this change is the SDL on MOULa is now progressing, sometimes faster than we can update it due to limited reviewer manpower and the lack of proper reviews taking place on the OU side. This results in SDL DESC PROBLEM for people using our clients. Further, it is known that the MOULa game server does not inspect SDL blobs before propagating them to other players, so it is fairly trivial to make clients error out on MOULa with cryptic messages by taking specially crafted SDLs on that shard. Therefore, we now prefer to use the server's SDL, even in /LocalData.

This removes the singlular /SkipPreload command line argument in favor of two arguments: /LocalPython and /LocalSDL. /LocalData now implies the former but not the latter. The reason for this change is that the SDL is a contract between the server and the client about how exactly an SDL blob is formatted. If SDL blobs don't have the same format between the client and server, this can have fairly bad implications, ranging from remote players being disconnected with an error, the player with the wrong SDL getting an error, or the server crashing.

Hoikas commented 1 year ago

Of course, this can lead to the client using SDL that's incompatible with its local scripts and age data, but that's much less likely to cause remote breakage than SDL mismatches.

Yeah, there's really not a good way to fix all of the problems. I'd just like to fix the worst offenders where we can.

To clarify, because I don't fully understand all of the patching logic... does this apply only if the server provides the .sdl files via the auth server/secure preloader, or also if they're provided via the file server? Does this change anything about which of the two sources is preferred?

There should be no change about which of the sources is preferred. The patcher will check the file server first. If the SecurePreloader manifest is missing (or we are not connected to the file server), then we will fall back to the auth server. Ideally, we don't want to use the auth server because files must be redownloaded each time from it because the auth manifests don't include file hashes, preventing any sort of integrity checking.