diff --git a/lib/pkpass/models/pass_web_service.dart b/lib/pkpass/models/pass_web_service.dart index c9f2ba0..11a48a3 100644 --- a/lib/pkpass/models/pass_web_service.dart +++ b/lib/pkpass/models/pass_web_service.dart @@ -1,3 +1,5 @@ +import 'package:punycode_converter/punycode_converter.dart'; + /// Metadata required for Pass Web Service /// /// https://developer.apple.com/library/archive/documentation/PassKit/Reference/PassKit_WebService/WebService.html#//apple_ref/doc/uid/TP40011988 @@ -29,7 +31,8 @@ class PassWebService { if (uri == null || uri.scheme != 'https') return null; return PassWebService( authenticationToken: authenticationToken, - webServiceURL: uri, + // URLs due to IDNA2008 + webServiceURL: uri.punyEncoded, ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 7d558a9..e2589cc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,6 +17,7 @@ dependencies: crypto: ^3.0.3 http: ^1.0.0 intl: ">=0.17.0 <1.0.0" + punycode_converter: ^0.2.1 topics: - wallet diff --git a/test/pkpass_test.dart b/test/pkpass_test.dart index 9c3c3d5..0b7f490 100644 --- a/test/pkpass_test.dart +++ b/test/pkpass_test.dart @@ -126,4 +126,28 @@ void main() { expect(scaled, 'logo@4x.png'); }); }); + + test('Check Punyc encoding of Domain in Webservice', () { + // per default Uri.parse does not punycode! + final url = "https://my-äöü-domain.com/endpoint/1234/"; + final token = "0000000000000000"; + final webService = + PassWebService.maybe(webServiceURL: url, authenticationToken: token); + + expect( + webService!.webServiceURL, + Uri.parse("https://xn--my--domain-s5a0tyc.com/endpoint/1234"), + ); + }); + test('Double Check Domain not needed Puny encoding in Webservice', () { + final url = "https://my-domain.com/endpoint/1234/"; + final token = "0000000000000000"; + final webService = + PassWebService.maybe(webServiceURL: url, authenticationToken: token); + + expect( + webService!.webServiceURL, + Uri.parse("https://my-domain.com/endpoint/1234"), + ); + }); }