From 6bd3ff3ad9491af7d1a2107ef943063a414ddcf4 Mon Sep 17 00:00:00 2001 From: The one with the braid Date: Fri, 4 Apr 2025 08:14:42 +0000 Subject: [PATCH] fix: support utf-16 encoding --- .gitlab-ci.yml | 4 ++-- CHANGELOG.md | 4 ++++ lib/pkpass/models/barcode.dart | 6 ++++-- lib/pkpass/pass_file.dart | 31 +++++++++++++++---------------- pubspec.yaml | 6 ++---- 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dde3240..e43f027 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,7 +1,7 @@ variables: - FLUTTER_VERSION: 3.24.3 + FLUTTER_VERSION: 3.29.2 -image: registry.gitlab.com/theonewiththebraid/flutter-dockerimages:${FLUTTER_VERSION}-base +image: registry.gitlab.com/polycule_client/flutter-dockerimages:${FLUTTER_VERSION}-base stages: - coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index cb6b0ef..7a86379 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v2.2.0 + +- fix: support utf-16 encoding (The one with the braid) + ## v2.1.4 - chore: bump SDK diff --git a/lib/pkpass/models/barcode.dart b/lib/pkpass/models/barcode.dart index 83bc06a..6035e90 100644 --- a/lib/pkpass/models/barcode.dart +++ b/lib/pkpass/models/barcode.dart @@ -80,8 +80,10 @@ class PassBarcode { supportedCodecs[(json['messageEncoding'] as String).toLowerCase()]!; return PassBarcode( format: _allowedFormats[json['format']]!, - barcodeData: - Uint8List.fromList(messageEncoding.encode(json['message'] as String)), + barcodeData: Uint8List.fromList( + messageEncoding + .encode((json['message'] as String).replaceAll('\\', '\\\\')), + ), messageEncoding: messageEncoding, altText: json['altText'] as String?, ); diff --git a/lib/pkpass/pass_file.dart b/lib/pkpass/pass_file.dart index c0a4578..4a1386b 100644 --- a/lib/pkpass/pass_file.dart +++ b/lib/pkpass/pass_file.dart @@ -36,7 +36,10 @@ class PassFile { final file = archive.files .singleWhere((element) => element.name == manifestEntry.key); - final content = file.byteContent; + final content = file.readBytes(); + if (content == null) { + return; + } String hash = sha1.convert(content).toString(); @@ -80,7 +83,7 @@ class PassFile { ); if (path == null) return null; final file = _folder.singleWhere((element) => element.name == path); - final content = file.byteContent; + final content = file.readBytes(); return content; } @@ -119,29 +122,25 @@ class PassFile { extension on ArchiveFile { String get stringContent { final codec = Charset.detect( - byteContent, + readBytes()!, defaultEncoding: utf8, orders: [ utf8, ascii, gbk, latin1, + utf16, ], ) ?? utf8; - return codec.decode(content); - } - - Uint8List get byteContent { - decompress(); - - final content = this.content; - if (content is String) { - return utf8.encode(content); - } else if (content is Iterable) { - return Uint8List.fromList(content.cast().toList()); - } else { - return rawContent!.toUint8List(); + try { + return codec.decode(content); + } on FormatException { + // utf8 and utf16 are hard to distinguish + if (codec is Utf8Codec) { + return utf16.decode(content); + } + rethrow; } } } diff --git a/pubspec.yaml b/pubspec.yaml index c442e86..7d558a9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,25 +1,23 @@ name: pkpass description: A Dart native passbook parsing library supporting checksum verification, barcode parsing, localization and much more. -version: 2.1.4 +version: 2.2.0 repository: https://gitlab.com/TheOneWithTheBraid/dart_pkpass.git homepage: https://gitlab.com/TheOneWithTheBraid/dart_pkpass issue_tracker: https://gitlab.com/TheOneWithTheBraid/dart_pkpass/-/issues funding: - https://www.buymeacoffee.com/braid - environment: sdk: ^3.4.0 dependencies: - archive: ^3.3.7 + archive: ^4.0.5 barcode: ^2.2.4 charset: ^2.0.1 crypto: ^3.0.3 http: ^1.0.0 intl: ">=0.17.0 <1.0.0" - topics: - wallet - pkpass