Example #1
0
 private Task <PrivateApiResponse> SetBidirectionalStreamAndDoRequest(
     SignedPrivateApiRequest request, Stream bidirectionalStream)
 {
     SetRequestStream(bidirectionalStream);
     SetResponseStream(bidirectionalStream);
     return(base.DoApiRequest(request));
 }
Example #2
0
        public override async Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request)
        {
            var socket = CreateSocketFromCurrentEndPoint();
            await socket.ConnectAsync(currentEndpoint.Address, currentEndpoint.Port);

            using (var networkStream = new NetworkStream(socket, true))
                return(await SetBidirectionalStreamAndDoRequest(request, networkStream));
        }
Example #3
0
        private async Task <PrivateApiResponse> ConnectAndDoRequest(IPEndPoint useEndPoint,
                                                                    SignedPrivateApiRequest request)
        {
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            {
                NoDelay     = true,
                LingerState = new LingerOption(true, SockerLingerTimeoutInSeconds)
            };
            await socket.ConnectAsync(useEndPoint.Address, useEndPoint.Port);

            using (var networkStream = new NetworkStream(socket, true))
                return(await SetBidirectionalStreamAndDoRequest(request, networkStream));
        }
 private static void AssertSignatureIsValide(PrivateApiRequest request,
                                             SignedPrivateApiRequest signedRequest)
 {
     using (var rsa = RSA.Create())
     {
         rsa.ImportParameters(TestData.Credentials.PrivateRsaParameters);
         string signableString     = request.FormatIntoSignableString(TestData.RequestNonce);
         var    signableStringData = Encoding.UTF8.GetBytes(signableString);
         bool   isValidSignature   = rsa.VerifyData(signableStringData, signedRequest.Signature,
                                                    HashAlgorithmName.SHA512, RSASignaturePadding.Pkcs1);
         Assert.That(isValidSignature, Is.True);
     }
 }
Example #5
0
        public override async Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request)
        {
            // Only one usage of each socket address (protocol/network address/port) is normally permitted
            // 31.172.83.53:18017 on Fairlay Wallet.Service/SocialBot.Service/Exchange.Service
            await preventMultipleCallsToSameAddress.WaitAsync();

            try
            {
                return(await ConnectAndDoRequest(endPoints[0], request));
            }
            catch
            {
                try
                {
                    // Try next one in list and if it works move first broken server to end of the list
                    var result = await ConnectAndDoRequest(endPoints[1], request);

                    var firstNotWorking = endPoints[0];
                    endPoints.Remove(endPoints[0]);
                    endPoints.Add(firstNotWorking);
                    return(result);
                }
                catch
                {
                    // If that didn't help go to the current end of the list (usually the next as we have 3)
                    // and do the same, move the currently broken first to the end and use the last next time.
                    // If this fails too we are outa here and will crash with the exception thrown here.
                    var result = await ConnectAndDoRequest(endPoints.Last(), request);

                    var lastWorking = endPoints.Last();
                    endPoints.Remove(lastWorking);
                    endPoints.Insert(0, lastWorking);
                    return(result);
                }
            }
            finally
            {
                preventMultipleCallsToSameAddress.Release();
            }
        }
        public virtual async Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request)
        {
            await requestWriter.WriteRequest(request);

            return(await responseReader.ReadResponse());
        }
 public override Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request)
 {
     WriteFakeApiResponseToInMemoryResponseStream();
     return(base.DoApiRequest(request));
 }
Example #8
0
 public Task <PrivateApiResponse> DoApiRequest(SignedPrivateApiRequest request)
 => null;                     //ncrunch: no coverage
Example #9
0
 /// <summary>
 /// https://github.com/Fairlay/FairlayDotNetClient/wiki/Private-API#fairlay-private-api-documentation-v0
 /// </summary>
 public static string FormatIntoApiRequestMessage(this SignedPrivateApiRequest request)
 => $"{Convert.ToBase64String(request.Signature)}|{request.Nonce}|{request.UserId}|" +
 $"{request.Header}|{request.Body}{EndOfDataToken}";