1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2025-06-09 00:46:19 +00:00

Merge pull request #4 from Zaliro/master

Added support for DEX and "Array" parameters
This commit is contained in:
Jan Korf 2018-08-01 14:50:05 +02:00 committed by GitHub
commit 7a4cabffb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 135 additions and 29 deletions

View File

@ -1,27 +1,88 @@
using System;
using System.Security;
namespace CryptoExchange.Net.Authentication
{
public class ApiCredentials
public class ApiCredentials: IDisposable
{
/// <summary>
/// The api key
/// The api key to authenticate requests
/// </summary>
public string Key { get; }
public SecureString Key { get; }
/// <summary>
/// The api secret
/// The api secret to authenticate requests
/// </summary>
public string Secret { get; }
public SecureString Secret { get; }
public ApiCredentials() { }
/// <summary>
/// The private key to authenticate requests
/// </summary>
public SecureString PrivateKey { get; }
public ApiCredentials(string key, string secret)
/// <summary>
/// Create Api credentials providing a private key for authenication
/// </summary>
/// <param name="privateKey">The private key used for signing</param>
public ApiCredentials(SecureString privateKey)
{
if(string.IsNullOrEmpty(key) || string.IsNullOrEmpty(secret))
throw new ArgumentException("Apikey or apisecret not provided");
PrivateKey = Key;
}
/// <summary>
/// Create Api credentials providing a private key for authenication
/// </summary>
/// <param name="privateKey">The private key used for signing</param>
public ApiCredentials(string privateKey)
{
if(string.IsNullOrEmpty(privateKey))
throw new ArgumentException("Private key can't be null/empty");
var securePrivateKey = new SecureString();
foreach (var c in privateKey)
securePrivateKey.AppendChar(c);
securePrivateKey.MakeReadOnly();
PrivateKey = securePrivateKey;
}
/// <summary>
/// Create Api credentials providing a api key and secret for authenciation
/// </summary>
/// <param name="key">The api key used for identification</param>
/// <param name="secret">The api secret used for signing</param>
public ApiCredentials(SecureString key, SecureString secret)
{
Key = key;
Secret = secret;
}
/// <summary>
/// Create Api credentials providing a private key for authenication
/// </summary>
/// <param name="privateKey">The private key used for signing</param>
public ApiCredentials(string key, string secret)
{
if (string.IsNullOrEmpty(key) || string.IsNullOrEmpty(secret))
throw new ArgumentException("Key and secret can't be null/empty");
var secureApiKey = new SecureString();
foreach (var c in key)
secureApiKey.AppendChar(c);
secureApiKey.MakeReadOnly();
Key = secureApiKey;
var secureApiSecret = new SecureString();
foreach (var c in secret)
secureApiSecret.AppendChar(c);
secureApiSecret.MakeReadOnly();
Secret = secureApiSecret;
}
public void Dispose()
{
Key?.Dispose();
Secret?.Dispose();
PrivateKey?.Dispose();
}
}
}

View File

@ -104,11 +104,16 @@ namespace CryptoExchange.Net
}
string paramString = null;
if (parameters != null) {
if (parameters != null)
{
paramString = "with parameters";
foreach (var param in parameters)
paramString += $"{param.Key}={param.Value}, ";
paramString += $" {param.Key}={(param.Value.GetType().IsArray ? $"[{string.Join(", ", ((object[])param.Value).Select(p => p.ToString()))}]": param.Value )},";
paramString = paramString.Trim(',');
}
log.Write(LogVerbosity.Debug, $"Sending {(signed ? "signed" : "")} request to {request.Uri} {(paramString ?? "")}");
var result = await ExecuteRequest(request).ConfigureAwait(false);
return result.Error != null ? new CallResult<T>(null, result.Error) : Deserialize<T>(result.Data);
@ -123,7 +128,14 @@ namespace CryptoExchange.Net
if (!uriString.EndsWith("?"))
uriString += "?";
uriString += $"{string.Join("&", parameters.Select(s => $"{s.Key}={s.Value}"))}";
var arraysParameters = parameters.Where(p => p.Value.GetType().IsArray).ToList();
foreach(var arrayEntry in arraysParameters)
{
uriString += $"{string.Join("&", ((object[])arrayEntry.Value).Select(v => $"{arrayEntry.Key}[]={v}"))}&";
}
uriString += $"{string.Join("&", parameters.Where(p => !p.Value.GetType().IsArray).Select(s => $"{s.Key}={s.Value}"))}";
uriString = uriString.TrimEnd('&');
}
if (authProvider != null)
@ -237,6 +249,10 @@ namespace CryptoExchange.Net
private void CheckObject(Type type, JObject obj)
{
if (type.GetCustomAttribute<JsonConverterAttribute>(true) != null)
// If type has a custom JsonConverter we assume this will handle property mapping
return;
bool isDif = false;
var properties = new List<string>();
var props = type.GetProperties();
@ -320,6 +336,7 @@ namespace CryptoExchange.Net
public virtual void Dispose()
{
authProvider?.Credentials?.Dispose();
log.Write(LogVerbosity.Debug, "Disposing exchange client");
}
}

View File

@ -1,4 +1,7 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Security;
namespace CryptoExchange.Net
{
@ -25,5 +28,30 @@ namespace CryptoExchange.Net
if (value != null)
parameters.Add(key, value);
}
public static string GetString(this SecureString source)
{
string result = null;
int length = source.Length;
IntPtr pointer = IntPtr.Zero;
char[] chars = new char[length];
try
{
pointer = Marshal.SecureStringToBSTR(source);
Marshal.Copy(pointer, chars, 0, length);
result = string.Join("", chars);
}
finally
{
if (pointer != IntPtr.Zero)
{
Marshal.ZeroFreeBSTR(pointer);
}
}
return result;
}
}
}