Fix pairing and streaming from Gen 7 servers

This commit is contained in:
Cameron Gutman 2016-04-01 01:30:37 -04:00
parent c6c4e5102c
commit 86532497ef

View File

@ -166,6 +166,16 @@ static int load_cert(const char* keyDirectory) {
}
static int load_server_status(PSERVER_DATA server) {
uuid_t uuid;
char uuid_str[37];
int ret;
char url[4096];
int i;
i = 0;
do {
char *pairedText = NULL;
char *currentGameText = NULL;
char *versionText = NULL;
@ -173,14 +183,17 @@ static int load_server_status(PSERVER_DATA server) {
char *heightText = NULL;
char *serverCodecModeSupportText = NULL;
uuid_t uuid;
char uuid_str[37];
ret = GS_INVALID;
int ret = GS_INVALID;
char url[4096];
uuid_generate_random(uuid);
uuid_unparse(uuid, uuid_str);
sprintf(url, "https://%s:47984/serverinfo?uniqueid=%s&uuid=%s", server->address, unique_id, uuid_str);
// Modern GFE versions don't allow serverinfo to be fetched over HTTPS if the client
// is not already paired. Since we can't pair without knowing the server version, we
// make another request over HTTP if the HTTPS request fails. We can't just use HTTP
// for everything because it doesn't accurately tell us if we're paired.
sprintf(url, "%s://%s:%d/serverinfo?uniqueid=%s&uuid=%s",
i == 0 ? "https" : "http", server->address, i == 0 ? 47984 : 47989, unique_id, uuid_str);
PHTTP_DATA data = http_create_data();
if (data == NULL) {
@ -217,6 +230,10 @@ static int load_server_status(PSERVER_DATA server) {
if (xml_search(data->memory, data->size, "GfeVersion", &server->gfeVersion) != GS_OK)
goto cleanup;
// These fields are present on all version of GFE that this client supports
if (!strlen(currentGameText) || !strlen(pairedText) || !strlen(versionText) || !strlen(stateText))
goto cleanup;
server->paired = pairedText != NULL && strcmp(pairedText, "1") == 0;
server->currentGame = currentGameText == NULL ? 0 : atoi(currentGameText);
server->supports4K = heightText != NULL && serverCodecModeSupportText != NULL && atoi(heightText) >= 2160;
@ -248,6 +265,9 @@ static int load_server_status(PSERVER_DATA server) {
if (serverCodecModeSupportText != NULL)
free(serverCodecModeSupportText);
i++;
} while (ret != GS_OK && i < 2);
return ret;
}
@ -561,7 +581,7 @@ int gs_start_app(PSERVER_DATA server, STREAM_CONFIGURATION *config, int appId, b
srand(time(NULL));
char url[4096];
u_int32_t rikeyid = 1;
u_int32_t rikeyid = 0;
char rikey_hex[33];
bytes_to_hex(config->remoteInputAesKey, rikey_hex, 16);
@ -583,10 +603,10 @@ int gs_start_app(PSERVER_DATA server, STREAM_CONFIGURATION *config, int appId, b
else
goto cleanup;
if ((ret = xml_search(data->memory, data->size, "cancel", &result)) != GS_OK)
if ((ret = xml_search(data->memory, data->size, "gamesession", &result)) != GS_OK)
goto cleanup;
if (atoi(result) == 0) {
if (!strcmp(result, "0")) {
ret = GS_FAILED;
goto cleanup;
}