Compare commits

...

5 Commits

Author SHA1 Message Date
Imran
e8f9159571 Merge pull request #2455 from ImranR98/dev
Fix "Bad state" bug on mark as updated/installed (#2453)
2025-08-06 18:39:36 -04:00
Imran Remtulla
d8cd17c858 Increment version 2025-08-06 18:38:50 -04:00
Imran
01f423a741 Merge pull request #2447 from ar-lex/bugfix/rustore-charset
RuStore: fix charset detection (#2304)
2025-08-06 18:38:25 -04:00
Imran Remtulla
77e764e76a Fix "Bad state" but on mark as updated/installed (#2453) 2025-08-06 18:37:11 -04:00
Alexey Arutyunov
9524148de7 RuStore: fix charset detection (#2304)
Decode whole response body in bytes and fallback to UTF-8 instead
of auto-decoding individual fields.
2025-08-03 01:45:55 +02:00
3 changed files with 12 additions and 13 deletions

View File

@@ -36,13 +36,15 @@ class RuStore extends AppSource {
return Uri.parse(standardUrl).pathSegments.last; return Uri.parse(standardUrl).pathSegments.last;
} }
Future<String> decodeString(String str) async { Future<dynamic> decodeJsonBody(Uint8List bytes) async {
try { try {
return (await CharsetDetector.autoDecode( return jsonDecode((await CharsetDetector.autoDecode(bytes)).string);
Uint8List.fromList(str.codeUnits),
)).string;
} catch (e) { } catch (e) {
return str; try {
return jsonDecode(utf8.decode(bytes));
} catch (_) {
rethrow;
}
} }
} }
@@ -59,7 +61,7 @@ class RuStore extends AppSource {
if (res0.statusCode != 200) { if (res0.statusCode != 200) {
throw getObtainiumHttpError(res0); throw getObtainiumHttpError(res0);
} }
var appDetails = jsonDecode(res0.body)['body']; var appDetails = (await decodeJsonBody(res0.bodyBytes))['body'];
if (appDetails['appId'] == null) { if (appDetails['appId'] == null) {
throw NoReleasesError(); throw NoReleasesError();
} }
@@ -83,15 +85,11 @@ class RuStore extends AppSource {
followRedirects: false, followRedirects: false,
postBody: {"appId": appDetails['appId'], "firstInstall": true}, postBody: {"appId": appDetails['appId'], "firstInstall": true},
); );
var downloadDetails = jsonDecode(res1.body)['body']; var downloadDetails = (await decodeJsonBody(res1.bodyBytes))['body'];
if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) { if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) {
throw NoAPKError(); throw NoAPKError();
} }
appName = await decodeString(appName);
author = await decodeString(author);
changeLog = changeLog != null ? await decodeString(changeLog) : null;
return APKDetails( return APKDetails(
version, version,
getApkUrlsFromUrls([ getApkUrlsFromUrls([

View File

@@ -1084,7 +1084,8 @@ class AppsProvider with ChangeNotifier {
var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == true; var trackOnly = apps[id]!.app.additionalSettings['trackOnly'] == true;
var refreshBeforeDownload = var refreshBeforeDownload =
apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true || apps[id]!.app.additionalSettings['refreshBeforeDownload'] == true ||
apps[id]!.app.apkUrls.first.value == 'placeholder'; apps[id]!.app.apkUrls.isNotEmpty &&
apps[id]!.app.apkUrls.first.value == 'placeholder';
if (refreshBeforeDownload) { if (refreshBeforeDownload) {
await checkUpdate(apps[id]!.app.id); await checkUpdate(apps[id]!.app.id);
} }

View File

@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.2.2+2318 version: 1.2.3+2319
environment: environment:
sdk: ^3.8.1 sdk: ^3.8.1