BOOL rdg_process_in_channel_authorization(rdpRdg* rdg, HttpResponse* response) { wStream* s; int status; if (response->StatusCode != HTTP_STATUS_OK) { rdg->state = RDG_CLIENT_STATE_CLOSED; return FALSE; } WLog_DBG(TAG, "In Channel authorization complete"); rdg->state = RDG_CLIENT_STATE_IN_CHANNEL_AUTHORIZED; s = rdg_build_http_request(rdg, "RDG_IN_DATA"); if (!s) return FALSE; status = tls_write_all(rdg->tlsIn, Stream_Buffer(s), Stream_Length(s)); Stream_Free(s, TRUE); if (status <= 0) return FALSE; return TRUE; }
BOOL rdg_process_out_channel_response(rdpRdg* rdg, HttpResponse* response) { int status; wStream* s; char* token64 = NULL; int ntlmTokenLength = 0; BYTE* ntlmTokenData = NULL; rdpNtlm* ntlm = rdg->ntlm; if (response->StatusCode != HTTP_STATUS_DENIED) { WLog_DBG(TAG, "RDG not supported"); rdg->state = RDG_CLIENT_STATE_NOT_FOUND; return FALSE; } WLog_DBG(TAG, "Out Channel authorization required"); if (ListDictionary_Contains(response->Authenticates, "NTLM")) { token64 = ListDictionary_GetItemValue(response->Authenticates, "NTLM"); if (!token64) { return FALSE; } crypto_base64_decode(token64, strlen(token64), &ntlmTokenData, &ntlmTokenLength); } if (ntlmTokenData && ntlmTokenLength) { ntlm->inputBuffer[0].pvBuffer = ntlmTokenData; ntlm->inputBuffer[0].cbBuffer = ntlmTokenLength; } ntlm_authenticate(ntlm); s = rdg_build_http_request(rdg, "RDG_OUT_DATA"); if (!s) return FALSE; status = tls_write_all(rdg->tlsOut, Stream_Buffer(s), Stream_Length(s)); Stream_Free(s, TRUE); ntlm_free(rdg->ntlm); rdg->ntlm = NULL; if (status < 0) { return FALSE; } rdg->state = RDG_CLIENT_STATE_OUT_CHANNEL_AUTHORIZE; return TRUE; }
static BOOL rdg_send_http_request(rdpRdg* rdg, rdpTls* tls, const char* method, const char* transferEncoding) { wStream* s = NULL; int status; s = rdg_build_http_request(rdg, method, transferEncoding); if (!s) return FALSE; status = tls_write_all(tls, Stream_Buffer(s), Stream_Length(s)); Stream_Free(s, TRUE); return (status >= 0); }
BOOL rdg_send_in_channel_request(rdpRdg*rdg) { int status; wStream* s = NULL; rdg->ntlm = ntlm_new(); if (!rdg->ntlm) return FALSE; status = rdg_ncacn_http_ntlm_init(rdg, rdg->tlsIn); if (!status) return FALSE; status = ntlm_authenticate(rdg->ntlm); if (!status) return FALSE; s = rdg_build_http_request(rdg, "RDG_IN_DATA"); if (!s) return FALSE; status = tls_write_all(rdg->tlsIn, Stream_Buffer(s), Stream_Length(s)); Stream_Free(s, TRUE); if (status < 0) return FALSE; rdg->state = RDG_CLIENT_STATE_IN_CHANNEL_REQUEST; return TRUE; }