Skip to content
This repository was archived by the owner on Nov 10, 2020. It is now read-only.

Added 4DP support. Default to include unitdp=4 querystring in all reques... #61

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 10 additions & 11 deletions source/XeroAPI.Net.nuspec
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>XeroAPI.Net</id>
<version>0.0.0.0</version>
<title>.Net wrapper library for Xero API</title>
<authors>XeroAPI</authors>
<owners />
<projectUrl>https://github.com/XeroAPI/XeroAPI.Net</projectUrl>
<iconUrl>https://secure.gravatar.com/avatar/7fff030fb8040a5157c3fd463858167f.png?s=128</iconUrl>
<id>XeroAPI.Net-4DP</id>
<version>1.0.6</version>
<title>.Net wrapper library for Xero API with 4DP support</title>
<authors>Unleashed Software</authors>
<projectUrl>https://github.com/unleashedsoftware/XeroAPI.Net</projectUrl>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>.Net wrapper library for Xero API. This library allows you to perform GET/PUT/POST methods against the Xero API without needing to know the internals of xml serialisation, oauth signatures or character encodings. See http://developer.xero.com for more information.</description>
<summary>.Net wrapper library for Xero API</summary>
<description>This library is same as XeroAPI.Net (https://www.nuget.org/packages/XeroAPI.Net) with 4DP support by default.</description>
<summary>.Net wrapper library for Xero API with 4DP support</summary>
<releaseNotes>Replicating fix for bug in Content-Length from https://github.com/XeroAPI/XeroAPI.Net/commit/3946a195397870b81cb5ce55ad9b20dd9c679658</releaseNotes>
</metadata>
<files>
<file src="XeroApi\bin\Release\XeroApi.dll" target="lib\XeroApi.dll" />
<file src="XeroApi\bin\Release\XeroApi.pdb" target="lib\XeroApi.pdb" />
<file src="XeroApi\bin\Release\XeroApi.dll" target="lib\net45\XeroApi.dll" />
<file src="XeroApi\bin\Release\XeroApi.pdb" target="lib\net45\XeroApi.pdb" />
</files>
</package>
6 changes: 3 additions & 3 deletions source/XeroApi.Tests/OAuth/Consumer/ConsumerRequestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public void to_consumer_response_with_current_date_string_should_pass_validation
[Test]
public void it_can_parse_unset_IfModifiedSince_date()
{
ConsumerRequest consumerRequest = new ConsumerRequest(null, null, null, null);
ConsumerRequest consumerRequest = new ConsumerRequest(null, null, null);
NameValueCollection headers = new NameValueCollection();
OAuthContext oauthContext = new OAuthContext {Headers = headers};

Expand Down Expand Up @@ -126,7 +126,7 @@ public void it_can_read_IfModifiedSince_date_from_oauth_context_property()

private static ConsumerRequest NewConsumerRequest()
{
return new ConsumerRequest(null, null, null, null);
return new ConsumerRequest(null, null, null);
}

private static ConsumerRequest NewConsumerRequest(OAuthContext oAuthContext)
Expand All @@ -142,7 +142,7 @@ private static ConsumerRequest NewConsumerRequest(OAuthContext oAuthContext)
ConsumerRequestRunner = consumerRequestRunner
};

return new ConsumerRequest(oAuthSession, oAuthContext, consumerContext, new NullCertificateFactory());
return new ConsumerRequest(oAuthSession, oAuthContext, consumerContext);
}
}
}
3 changes: 3 additions & 0 deletions source/XeroApi.Tests/XeroApi.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,7 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
</Project>
3 changes: 3 additions & 0 deletions source/XeroApi.VBTests/XeroApi.VBTests.vbproj
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,9 @@
<Name>XeroApi</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
Expand Down
18 changes: 15 additions & 3 deletions source/XeroApi/Integration/IntegrationProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,17 @@ namespace XeroApi.Integration
public class IntegrationProxy : IIntegrationProxy
{
private readonly IOAuthSession _oauthSession;
private bool _is4DP;


/// <summary>
/// Initializes a new instance of the <see cref="IntegrationProxy"/> class.
/// </summary>
/// <param name="oauthSession">The oauth session.</param>
public IntegrationProxy (IOAuthSession oauthSession)
public IntegrationProxy (IOAuthSession oauthSession, bool is4DP)
{
_oauthSession = oauthSession;
_is4DP = is4DP;
}


Expand Down Expand Up @@ -84,7 +86,7 @@ public string UpdateOrCreateElements(string endpointName, string body)
ModelTypeHelper.Pluralize(endpointName),
null,
null,
new NameValueCollection { { "summarizeErrors", "false" } },
GetAdditionalQueryParams(),
null);

if (consumerResponse.IsGoodResponse || consumerResponse.IsClientError)
Expand All @@ -105,7 +107,7 @@ public string CreateElements(string endpointName, string body)
ModelTypeHelper.Pluralize(endpointName),
null,
null,
new NameValueCollection { { "summarizeErrors", "false" } },
GetAdditionalQueryParams(),
null);

if (consumerResponse.IsGoodResponse || consumerResponse.IsClientError)
Expand Down Expand Up @@ -333,5 +335,15 @@ public static Uri ConstructChildResourceUri(Uri baseUrl, string endpointName, st
return uriBuilder.Uri;
}


private NameValueCollection GetAdditionalQueryParams()
{
var additionalQueryParams = new NameValueCollection { { "summarizeErrors", "false" } };
if (_is4DP)
{
additionalQueryParams.Add("unitdp", "4");
}
return additionalQueryParams;
}
}
}
32 changes: 17 additions & 15 deletions source/XeroApi/Model/Contact.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,55 +6,57 @@ public class Contact : EndpointModelBase
{
[ItemId]
public Guid ContactID { get; set; }

[ItemNumber]
public string ContactNumber { get; set; }

[ItemUpdatedDate]
public DateTime? UpdatedDateUTC { get; set; }

public string ContactStatus { get; set; }

public string Name { get; set; }

public string FirstName { get; set; }

public string LastName { get; set; }

public string EmailAddress { get; set; }

public string SkypeUserName { get; set; }

public ContactPersons ContactPersons { get; set; }

public string BankAccountDetails { get; set; }

public string TaxNumber { get; set; }

public string AccountsReceivableTaxType { get; set; }

public string AccountsPayableTaxType { get; set; }

public Addresses Addresses { get; set; }

public Phones Phones { get; set; }

public ContactGroups ContactGroups { get; set; }

[ReadOnly]
public bool IsSupplier { get; set; }

[ReadOnly]
public bool IsCustomer { get; set; }
public string DefaultCurrency { get; set; }

public string DefaultCurrency { get; set; }

public Balances Balances { get; set; }

public BatchPayments BatchPayments { get; set; }

public PaymentTerms PaymentTerms { get; set; }

public string AccountNumber { get; set; }

public override string ToString()
{
return string.Format("Contact:{0}", Name);
Expand All @@ -64,5 +66,5 @@ public override string ToString()
public class Contacts : ModelList<Contact>
{
}

}
36 changes: 11 additions & 25 deletions source/XeroApi/OAuth/Consumer/ConsumerRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,13 @@ public class ConsumerRequest : IConsumerRequest
{
private readonly IOAuthConsumerContext _consumerContext;
private readonly IOAuthContext _context;
private readonly ICertificateFactory _clientSslCertificateFactory;
private readonly IOAuthSession _oauthSession;

public ConsumerRequest(IOAuthSession oauthSession, IOAuthContext context, IOAuthConsumerContext consumerContext,
ICertificateFactory clientSslCertificateFactory)
public ConsumerRequest(IOAuthSession oauthSession, IOAuthContext context, IOAuthConsumerContext consumerContext)
{
_oauthSession = oauthSession;
_context = context;
_consumerContext = consumerContext;
_clientSslCertificateFactory = clientSslCertificateFactory;
}

public IOAuthContext Context
Expand All @@ -65,8 +62,8 @@ public virtual HttpWebRequest ToWebRequest()
{
RequestDescription description = GetRequestDescription();

var request = (HttpWebRequest) WebRequest.Create(description.Url);
request.Timeout = (int) TimeSpan.FromMinutes(3).TotalMilliseconds;
var request = (HttpWebRequest)WebRequest.Create(description.Url);
request.Timeout = (int)TimeSpan.FromMinutes(3).TotalMilliseconds;
request.Method = description.Method;
request.UserAgent = _consumerContext.UserAgent;

Expand Down Expand Up @@ -116,18 +113,6 @@ public virtual HttpWebRequest ToWebRequest()
request.Headers[key] = description.Headers[key];
}
}

// Attach a client ssl certificate to the HttpWebRequest
if (_clientSslCertificateFactory != null)
{
X509Certificate2 certificate = _clientSslCertificateFactory.CreateCertificate();

if (certificate != null)
{
request.ClientCertificates.Add(certificate);
}
}

return request;
}

Expand All @@ -138,13 +123,14 @@ public RequestDescription GetRequestDescription()
_consumerContext.SignContext(_context);
}


Uri uri = _context.GenerateUri();

var description = new RequestDescription
{
Url = uri,
Method = _context.RequestMethod
};
{
Url = uri,
Method = _context.RequestMethod
};

if ((_context.FormEncodedParameters != null) && (_context.FormEncodedParameters.Count > 0))
{
Expand Down Expand Up @@ -175,7 +161,7 @@ public HttpWebResponse ToWebResponse()
try
{
HttpWebRequest request = ToWebRequest();
return (HttpWebResponse) request.GetResponse();
return (HttpWebResponse)request.GetResponse();
}
catch (WebException webEx)
{
Expand Down Expand Up @@ -240,7 +226,7 @@ private void EnsureRequestHasNotBeenSignedYet()
AssertValidIfModifiedSinceDate(context.IfModifiedSince.Value);
return context.IfModifiedSince.Value;
}

string ifModifiedSinceString = context.Headers["If-Modified-Since"];

if (string.IsNullOrEmpty(ifModifiedSinceString))
Expand All @@ -253,7 +239,7 @@ private void EnsureRequestHasNotBeenSignedYet()
AssertValidIfModifiedSinceDate(ifModifiedSinceDate);
return ifModifiedSinceDate;
}

return null;
}

Expand Down
2 changes: 1 addition & 1 deletion source/XeroApi/OAuth/Consumer/ConsumerResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public class ConsumerResponse : IConsumerResponse
if (webResponse.Headers["Content-Type"] != string.Empty)
ContentType = webResponse.Headers["Content-Type"];

if (webResponse.Headers["Content-Length"] != string.Empty)
if (!string.IsNullOrEmpty(webResponse.Headers["Content-Length"]))
ContentLength = int.Parse(webResponse.Headers["Content-Length"]);

TimeTaken = timeTaken;
Expand Down
11 changes: 1 addition & 10 deletions source/XeroApi/OAuth/Consumer/DefaultConsumerRequestFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,17 @@ public DefaultConsumerRequestFactory()
{
}

public DefaultConsumerRequestFactory(ICertificateFactory clientSslCertificateFactory)
{
CertificateFactory = clientSslCertificateFactory;
}

public static IConsumerRequestFactory Instance
{
get { return _defaultInstance ?? (_defaultInstance = new DefaultConsumerRequestFactory()); }
set { _defaultInstance = value; }
}

public ICertificateFactory CertificateFactory
{
get;
set;
}

public IConsumerRequest CreateConsumerRequest(IOAuthSession session, IOAuthContext context, IOAuthConsumerContext consumerContext)
{
return new ConsumerRequest(session, context, consumerContext, CertificateFactory);
return new ConsumerRequest(session, context, consumerContext);
}
}
}
Binary file modified source/XeroApi/OAuth/Framework/DateTimeUtility.cs
Binary file not shown.
Binary file modified source/XeroApi/OAuth/Framework/NonceGenerator.cs
Binary file not shown.
6 changes: 3 additions & 3 deletions source/XeroApi/OAuth/XeroApiEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ namespace XeroApi.OAuth
public class XeroApiEndpoints
{
public static Uri PublicRequestTokenUri = new Uri("https://api.xero.com/oauth/RequestToken");
public static Uri PartnerRequestTokenUri = new Uri("https://api-partner.network.xero.com/oauth/RequestToken");
public static Uri PartnerRequestTokenUri = new Uri("https://api.xero.com/oauth/RequestToken");

public static Uri UserAuthorizeUri = new Uri("https://api.xero.com/oauth/Authorize");

public static Uri PublicAccessTokenUri = new Uri("https://api.xero.com/oauth/AccessToken");
public static Uri PartnerAccessTokenUri = new Uri("https://api-partner.network.xero.com/oauth/AccessToken");
public static Uri PartnerAccessTokenUri = new Uri("https://api.xero.com/oauth/AccessToken");

public static Uri PublicBaseEndpointUri = new Uri("https://api.xero.com/api.xro/2.0/");
public static Uri PartnerBaseEndpointUri = new Uri("https://api-partner.network.xero.com/api.xro/2.0/");
public static Uri PartnerBaseEndpointUri = new Uri("https://api.xero.com/api.xro/2.0/");
}

}
8 changes: 4 additions & 4 deletions source/XeroApi/OAuth/XeroApiPartnerSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,17 @@ namespace XeroApi.OAuth
public class XeroApiPartnerSession : OAuthSession
{
[Obsolete("Use the constructor with ITokenRepository")]
public XeroApiPartnerSession(string userAgent, string consumerKey, X509Certificate2 signingCertificate, X509Certificate2 sslCertificate)
public XeroApiPartnerSession(string userAgent, string consumerKey, X509Certificate2 signingCertificate)
: base(CreateConsumerContext(userAgent, consumerKey, signingCertificate))
{
ConsumerRequestFactory = new DefaultConsumerRequestFactory(new SimpleCertificateFactory(sslCertificate));
ConsumerRequestFactory = new DefaultConsumerRequestFactory();
}


public XeroApiPartnerSession(string userAgent, string consumerKey, X509Certificate2 signingCertificate, X509Certificate2 sslCertificate, ITokenRepository tokenRepository)
public XeroApiPartnerSession(string userAgent, string consumerKey, X509Certificate2 signingCertificate, ITokenRepository tokenRepository)
: base(CreateConsumerContext(userAgent, consumerKey, signingCertificate), tokenRepository)
{
ConsumerRequestFactory = new DefaultConsumerRequestFactory(new SimpleCertificateFactory(sslCertificate));
ConsumerRequestFactory = new DefaultConsumerRequestFactory();
}


Expand Down
Loading