示例#1
0
        private async Task <JToken> HttpPostJsonAsync(string payload, Uri uri)
        {
            //var content = new StringContent(payload, Encoding.UTF8, _contentType);
            var content = !DnfClient.UseCompression ? (HttpContent) new StringContent(payload, Encoding.UTF8, _contentType) : GetGZipContent(payload);

            var responseMessage = await HttpClient.PostAsync(DnfClient.Proxy(uri), content)
                                  .ConfigureAwait(false);

            ParseApiUsage(responseMessage);


            if (responseMessage.StatusCode == HttpStatusCode.NoContent)
            {
                return(string.Empty);
            }

            var response = await responseMessage.Content.ReadAsStreamAsync()
                           .ConfigureAwait(false);

            using var reader = new StreamReader(response);
            if (responseMessage.IsSuccessStatusCode)
            {
                return(DeserializeJson(reader));
            }

            throw new BaseHttpClientException(await reader.ReadToEndAsync()
                                              .ConfigureAwait(false), responseMessage.StatusCode);
        }
        protected static async Task DeleteTestingRecords(DnfClient client)
        {
            (await client.Composite.DeleteAsync(
                 await client.QueryAsync(@"
SELECT Id FROM Case WHERE Subject LIKE 'UnitTest%'").Pull()
                 .Select(r => r["Id"]?.ToString()).ToListAsync()
                 .ConfigureAwait(false))
             .ConfigureAwait(false)).Assert();
            (await client.Composite.DeleteAsync(
                 await client.QueryAsync(@"
SELECT Id FROM Account WHERE Name LIKE 'UnitTest%'").Pull()
                 .Select(r => r["Id"]?.ToString()).ToListAsync()
                 .ConfigureAwait(false))
             .ConfigureAwait(false)).Assert();
            (await client.Composite.DeleteAsync(
                 await client.QueryAsync(@"
SELECT Id FROM Contact WHERE Name LIKE 'UnitTest%'").Pull()
                 .Select(r => r["Id"]?.ToString()).ToListAsync()
                 .ConfigureAwait(false))
             .ConfigureAwait(false)).Assert();
            (await client.Composite.DeleteAsync(
                 await client.QueryAsync(@"
SELECT Id FROM Product2 WHERE ProductCode LIKE 'UnitTest%'").Pull()
                 .Select(r => r["Id"]?.ToString()).ToListAsync()
                 .ConfigureAwait(false))
             .ConfigureAwait(false)).Assert();
        }
示例#3
0
        public async Task LoginFailTest()
        {
            await Assert.ThrowsAsync <ForceAuthException>(async() =>
            {
                using var client = await DnfClient.LoginAsync(new Uri("https://www.salesforce.com"), ClientId, ClientSecret, UserName, Password, WriteLine)
                                   .ConfigureAwait(false);
            });

            await Assert.ThrowsAsync <ForceAuthException>(async() =>
            {
                using var client = await DnfClient.LoginAsync(LoginUri, "ClientId", ClientSecret, UserName, Password, WriteLine)
                                   .ConfigureAwait(false);
            });

            await Assert.ThrowsAsync <ForceAuthException>(async() =>
            {
                using var client = await DnfClient.LoginAsync(LoginUri, ClientId, "ClientSecret", UserName, Password, WriteLine)
                                   .ConfigureAwait(false);
            });

            await Assert.ThrowsAsync <ForceAuthException>(async() =>
            {
                using var client = await DnfClient.LoginAsync(LoginUri, ClientId, ClientSecret, "UserName", Password, WriteLine)
                                   .ConfigureAwait(false);
            });

            await Assert.ThrowsAsync <ForceAuthException>(async() =>
            {
                using var client = await DnfClient.LoginAsync(LoginUri, ClientId, ClientSecret, UserName, "Password", WriteLine)
                                   .ConfigureAwait(false);
            });
        }
        protected Task <DnfClient> LoginTask()
        {
            var client = DnfClient.LoginAsync(
                LoginUri, ClientId, ClientSecret, UserName, Password, WriteLine);

            return(client);
        }
示例#5
0
        public async Task <string> GenerateAsync(DnfClient client, Func <JProperty, bool> filter)
        {
            var objects = await RetrieveSObjectsAsync(client)
                          .ConfigureAwait(false);

            GenerationEnvironment.Append(@"using DotNetForce;
using DotNetForce.Schema;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ").Append(SchemaNamespace).Append(@"
{");
            GenerateSchema(objects);

            foreach (var prop in objects.Properties().Where(p => filter?.Invoke(p) != false))
            {
                // await WriteJsonAsync(prop.Name, prop.Value).ConfigureAwait(false);
                GenerateObject(prop.Name, prop.Value);
            }
            GenerationEnvironment.Append(@"
}");
            return(GenerationEnvironment.ToString());
        }
示例#6
0
        public static async Task <JObject> RetrieveSObjectsAsync(DnfClient client)
        {
            var describeGlobalResult = await client.GetObjectsAsync()
                                       .ConfigureAwait(false);

            var request = new CompositeRequest();

            if (describeGlobalResult?.SObjects != null)
            {
                foreach (var sObject in describeGlobalResult.SObjects)
                {
                    var objectName = sObject["name"]?.ToString() ?? string.Empty;
                    if ((bool?)sObject["deprecatedAndHidden"] == true)
                    {
                        continue;
                    }
                    request.Describe(objectName, objectName);
                }
            }

            var describeResult = await client.Composite.PostAsync(request)
                                 .ConfigureAwait(false);

            var objects = JObject.FromObject(describeResult.Results());

            return(objects);
        }
示例#7
0
        private static async Task RunTransformAsync()
        {
            var output       = new StringBuilder();
            var loginUrl     = "";
            var clientId     = "";
            var clientSecret = "";
            var userName     = "";
            var password     = "";

            var schemaNamespace = "";
            var schemaName      = "";

            if (loginUrl == "")
            {
                loginUrl = "https://test.salesforce.com";
            }
            if (schemaNamespace == "")
            {
                schemaNamespace = "DotNetForce.Schemas";
            }
            if (schemaName == "")
            {
                schemaName = "Uat";
            }
            try
            {
                loginUrl        = Prompt("Login URL?", loginUrl) ?? throw new ArgumentNullException(nameof(loginUrl));
                clientId        = Prompt("Client Id?", clientId) ?? throw new ArgumentNullException(nameof(clientId));
                clientSecret    = Prompt("Client Secret?", clientSecret) ?? throw new ArgumentNullException(nameof(clientSecret));
                userName        = Prompt("User Name?", userName) ?? throw new ArgumentNullException(nameof(userName));
                password        = Prompt("Password?", password) ?? throw new ArgumentNullException(nameof(password));
                schemaNamespace = Prompt("Namespace?", schemaNamespace) ?? throw new ArgumentNullException(nameof(schemaNamespace));
                schemaName      = Prompt("File Name?", schemaName) ?? throw new ArgumentNullException(nameof(schemaName));
                var loginUri = new Uri($"{loginUrl}/services/oauth2/token");
                var client   = await DnfClient.LoginAsync(loginUri, clientId, clientSecret, userName, password, Console.WriteLine)
                               .ConfigureAwait(false);

                var generator = new SchemaGenerator(output, schemaNamespace, schemaName);
                await generator.GenerateAsync(client)
                .ConfigureAwait(false);
            }
            finally
            {
                var filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) !, $"{schemaName}.cs");
                await File.WriteAllTextAsync(filePath, output.ToString())
                .ConfigureAwait(false);
            }
        }
示例#8
0
        public async Task <Stream> HttpGetBlobAsync(string resourceName)
        {
            var uri = Common.FormatUrl(resourceName, InstanceUrl, ApiVersion);

            var request = new HttpRequestMessage
            {
                RequestUri = DnfClient.Proxy(uri),
                Method     = HttpMethod.Get
            };

            var responseMessage = await HttpClient.SendAsync(request)
                                  .ConfigureAwait(false);

            var response = await responseMessage.Content.ReadAsStreamAsync()
                           .ConfigureAwait(false);

            return(responseMessage.IsSuccessStatusCode ? response : new MemoryStream());
        }
示例#9
0
        public async Task <T?> HttpBinaryDataPostAsync <T>(string resourceName, object?inputObject, byte[] fileContents, string headerName, string fileName) where T : class
        {
            // BRAD: I think we should probably, in time, refactor multipart and binary support to the BaseHttpClient.
            // For now though, I just left this in here.

            var uri = Common.FormatUrl(resourceName, InstanceUrl, ApiVersion);

            var json = JsonConvert.SerializeObject(inputObject,
                                                   Formatting.None,
                                                   new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });

            var content = new MultipartFormDataContent();

            var stringContent = new StringContent(json, Encoding.UTF8, "application/json");

            stringContent.Headers.Add("Content-Disposition", "form-data; name=\"json\"");
            content.Add(stringContent);

            var byteArrayContent = new ByteArrayContent(fileContents);

            byteArrayContent.Headers.Add("Content-Type", "application/octet-stream");
            byteArrayContent.Headers.Add("Content-Disposition", $"form-data; name=\"{headerName}\"; filename=\"{fileName}\"");
            content.Add(byteArrayContent, headerName, fileName);

            var responseMessage = await HttpClient.PostAsync(DnfClient.Proxy(uri), content)
                                  .ConfigureAwait(false);

            var response = await responseMessage.Content.ReadAsStringAsync()
                           .ConfigureAwait(false);

            if (responseMessage.IsSuccessStatusCode)
            {
                return(JsonConvert.DeserializeObject <T>(response));
            }

            throw ParseForceException(response);
        }
示例#10
0
        public async Task TokenRefreshAsync(string clientId, string?refreshToken, string clientSecret, string tokenRequestEndpointUrl)
        {
            var url = Common.FormatRefreshTokenUrl(
                tokenRequestEndpointUrl,
                clientId,
                refreshToken,
                clientSecret);

            var request = new HttpRequestMessage
            {
                Method     = HttpMethod.Post,
                RequestUri = DnfClient.Proxy(new Uri(url))
            };

            request.Headers.UserAgent.ParseAdd(string.Concat(UserAgent, "/", ApiVersion));

            var responseMessage = await _httpClient.SendAsync(request)
                                  .ConfigureAwait(false);

            var response = await responseMessage.Content.ReadAsStringAsync()
                           .ConfigureAwait(false);

            if (responseMessage.IsSuccessStatusCode)
            {
                var authToken = JsonConvert.DeserializeObject <AuthToken>(response);

                AccessToken  = authToken?.AccessToken ?? string.Empty;
                RefreshToken = refreshToken;
                InstanceUrl  = authToken?.InstanceUrl ?? string.Empty;
                Id           = authToken?.Id ?? string.Empty;
            }
            else
            {
                var errorResponse = JsonConvert.DeserializeObject <AuthErrorResponse>(response);
                throw new ForceException(errorResponse?.Error ?? string.Empty, errorResponse?.ErrorDescription ?? string.Empty);
            }
        }
示例#11
0
        private async Task <JToken> HttpGetJsonAsync(Uri uri)
        {
            var responseMessage = await HttpClient.GetAsync(DnfClient.Proxy(uri))
                                  .ConfigureAwait(false);

            ParseApiUsage(responseMessage);

            if (responseMessage.StatusCode == HttpStatusCode.NoContent)
            {
                return(string.Empty);
            }

            var response = await responseMessage.Content.ReadAsStreamAsync()
                           .ConfigureAwait(false);

            using var reader = new StreamReader(response);
            if (responseMessage.IsSuccessStatusCode)
            {
                return(DeserializeJson(reader));
            }

            throw new BaseHttpClientException(await reader.ReadToEndAsync()
                                              .ConfigureAwait(false), responseMessage.StatusCode);
        }
示例#12
0
        public async Task UsernamePasswordAsync(string clientId, string clientSecret, string username, string password, string tokenRequestEndpointUrl)
        {
            if (string.IsNullOrEmpty(clientId))
            {
                throw new ArgumentNullException(nameof(clientId));
            }
            if (string.IsNullOrEmpty(clientSecret))
            {
                throw new ArgumentNullException(nameof(clientSecret));
            }
            if (string.IsNullOrEmpty(username))
            {
                throw new ArgumentNullException(nameof(username));
            }
            if (string.IsNullOrEmpty(password))
            {
                throw new ArgumentNullException(nameof(password));
            }
            if (string.IsNullOrEmpty(tokenRequestEndpointUrl))
            {
                throw new ArgumentNullException(nameof(tokenRequestEndpointUrl));
            }
            if (!Uri.IsWellFormedUriString(tokenRequestEndpointUrl, UriKind.Absolute))
            {
                throw new FormatException("tokenRequestEndpointUrl");
            }

            var content = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair <string, string>("grant_type", "password"),
                new KeyValuePair <string, string>("client_id", clientId),
                new KeyValuePair <string, string>("client_secret", clientSecret),
                new KeyValuePair <string, string>("username", username),
                new KeyValuePair <string, string>("password", password)
            });

            var request = new HttpRequestMessage
            {
                Method     = HttpMethod.Post,
                RequestUri = DnfClient.Proxy(new Uri(tokenRequestEndpointUrl)),
                Content    = content
            };

            request.Headers.UserAgent.ParseAdd(string.Concat(UserAgent, "/", ApiVersion));

            var responseMessage = await _httpClient.SendAsync(request)
                                  .ConfigureAwait(false);

            var response = await responseMessage.Content.ReadAsStringAsync()
                           .ConfigureAwait(false);

            if (responseMessage.IsSuccessStatusCode)
            {
                try {
                    var authToken = JsonConvert.DeserializeObject <AuthToken>(response);

                    AccessToken = authToken?.AccessToken ?? string.Empty;
                    InstanceUrl = authToken?.InstanceUrl ?? string.Empty;
                    Id          = authToken?.Id ?? string.Empty;
                }
                catch (Exception ex) {
                    throw new ForceAuthException(ex.Message, response, responseMessage.StatusCode);
                }
            }
            else
            {
                var errorResponse = JsonConvert.DeserializeObject <AuthErrorResponse>(response);
                throw new ForceAuthException(errorResponse?.Error ?? string.Empty, errorResponse?.ErrorDescription ?? string.Empty, responseMessage.StatusCode);
            }
        }
示例#13
0
        public async Task WebServerAsync(string?clientId, string?clientSecret, string?redirectUri, string?code, string?tokenRequestEndpointUrl)
        {
            if (string.IsNullOrEmpty(clientId))
            {
                throw new ArgumentNullException(nameof(clientId));
            }
            // if (string.IsNullOrEmpty(clientSecret)) throw new ArgumentNullException("clientSecret");
            if (string.IsNullOrEmpty(redirectUri))
            {
                throw new ArgumentNullException(nameof(redirectUri));
            }
            if (!Uri.IsWellFormedUriString(redirectUri, UriKind.Absolute))
            {
                throw new FormatException("redirectUri");
            }
            if (string.IsNullOrEmpty(code))
            {
                throw new ArgumentNullException(nameof(code));
            }
            if (string.IsNullOrEmpty(tokenRequestEndpointUrl))
            {
                throw new ArgumentNullException(nameof(tokenRequestEndpointUrl));
            }
            if (!Uri.IsWellFormedUriString(tokenRequestEndpointUrl, UriKind.Absolute))
            {
                throw new FormatException("tokenRequestEndpointUrl");
            }

            var content = string.IsNullOrEmpty(clientSecret)
                ? new FormUrlEncodedContent(new[]
            {
                new KeyValuePair <string, string>("grant_type", "authorization_code"),
                new KeyValuePair <string, string>("client_id", clientId),
                new KeyValuePair <string, string>("redirect_uri", redirectUri),
                new KeyValuePair <string, string>("code", code)
            })
                : new FormUrlEncodedContent(new[]
            {
                new KeyValuePair <string, string>("grant_type", "authorization_code"),
                new KeyValuePair <string, string>("client_id", clientId),
                new KeyValuePair <string, string>("client_secret", clientSecret),
                new KeyValuePair <string, string>("redirect_uri", redirectUri),
                new KeyValuePair <string, string>("code", code)
            });

            var request = new HttpRequestMessage
            {
                Method     = HttpMethod.Post,
                RequestUri = DnfClient.Proxy(new Uri(tokenRequestEndpointUrl)),
                Content    = content
            };

            request.Headers.UserAgent.ParseAdd(string.Concat(UserAgent, "/", ApiVersion));

            var responseMessage = await _httpClient.SendAsync(request)
                                  .ConfigureAwait(false);

            var response = await responseMessage.Content.ReadAsStringAsync()
                           .ConfigureAwait(false);

            if (responseMessage.IsSuccessStatusCode)
            {
                var authToken = JsonConvert.DeserializeObject <AuthToken>(response);

                AccessToken  = authToken?.AccessToken;
                InstanceUrl  = authToken?.InstanceUrl;
                Id           = authToken?.Id;
                RefreshToken = authToken?.RefreshToken;
            }
            else
            {
                try
                {
                    var errorResponse = JsonConvert.DeserializeObject <AuthErrorResponse>(response);
                    throw new ForceAuthException(errorResponse?.Error ?? string.Empty, errorResponse?.ErrorDescription ?? string.Empty);
                }
                catch (Exception ex)
                {
                    throw new ForceAuthException(Error.UnknownException, ex.Message);
                }
            }
        }
示例#14
0
 public Task <string> GenerateAsync(DnfClient client)
 {
     return(GenerateAsync(client, _ => true));
 }