diff --git a/lib/globals.dart b/lib/globals.dart index 03050e3..7642b10 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -19,6 +19,9 @@ final platformIsDesktop = !platformIsMobile; final useImagePicker = kIsWeb || platformIsMobile; +String appVersion = ''; +String userAgent = ''; + const usePhpDebugging = false; const maxViewPortalHeight = 750.0; diff --git a/lib/main.dart b/lib/main.dart index 7e1a85d..8650e76 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:media_kit/media_kit.dart'; import 'package:multi_trigger_autocomplete/multi_trigger_autocomplete.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:provider/provider.dart'; import 'app_theme.dart'; @@ -45,6 +46,7 @@ void main() async { await fixLetsEncryptCertOnOldAndroid(); await dependencyInjectionInitialization(); + await setupPackageInfoAndUserAgent(); runApp(DevicePreview( enabled: !kReleaseMode && enablePreview, @@ -52,6 +54,15 @@ void main() async { )); } +Future setupPackageInfoAndUserAgent() async { + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + appVersion = packageInfo.version; + userAgent = 'Relatica/$appVersion'; + print('App Version: $appVersion'); + print('User Agent: $userAgent'); + print(''); +} + class App extends StatelessWidget { const App({super.key}); diff --git a/lib/utils/network_utils.dart b/lib/utils/network_utils.dart index c6db2b4..f7178f8 100644 --- a/lib/utils/network_utils.dart +++ b/lib/utils/network_utils.dart @@ -19,6 +19,18 @@ enum _RequestType { const _expireDuration = Duration(seconds: 2); +class _UserAgentClient extends http.BaseClient { + http.Client _inner; + + _UserAgentClient() : _inner = http.Client(); + + @override + Future send(http.BaseRequest request) { + request.headers['user-agent'] = userAgent; + return _inner.send(request); + } +} + class _CachedResponse { final _RequestType requestType; final Uri requestUri; @@ -112,7 +124,7 @@ class _ExpiringRequestCache { print('Returning cached response for $type => $url'); response = _responses[requestStub]?.response ?? http.Response('', 555); } else { - final request = http.get( + final request = _UserAgentClient().get( url, headers: headers, ); @@ -184,7 +196,7 @@ FutureResult postUrl( requestHeaders['Cookie'] = 'XDEBUG_SESSION=PHPSTORM;path=/'; } try { - final request = http.post( + final request = _UserAgentClient().post( url, headers: requestHeaders, body: jsonEncode(body), @@ -215,7 +227,7 @@ FutureResult putUrl( }) async { _logger.fine('PUT: $url \n Body: $body'); try { - final request = http.put( + final request = _UserAgentClient().put( url, headers: headers, body: jsonEncode(body), @@ -246,7 +258,7 @@ FutureResult deleteUrl( }) async { _logger.fine('DELETE: $url'); try { - final request = http.delete( + final request = _UserAgentClient().delete( url, headers: headers, body: jsonEncode(body), diff --git a/macos/Podfile.lock b/macos/Podfile.lock index df9ce18..641b848 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -119,7 +119,7 @@ SPEC CHECKSUMS: media_kit_video: c75b07f14d59706c775778e4dd47dd027de8d1e5 ObjectBox: e7ff611291a0663380e0736b46786bcd077294ff objectbox_flutter_libs: 32997857c213cbcc6f9b25ffc73e1e3c34ea3c8e - package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce + package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 screen_brightness_macos: 2d6d3af2165592d9a55ffcd95b7550970e41ebda shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 diff --git a/pubspec.lock b/pubspec.lock index 9daf2bd..9a8d641 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -253,10 +253,10 @@ packages: dependency: transitive description: name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" url: "https://pub.dev" source: hosted - version: "0.7.8" + version: "0.7.10" desktop_window: dependency: "direct main" description: @@ -309,10 +309,10 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" file: dependency: transitive description: @@ -950,21 +950,21 @@ packages: source: hosted version: "2.1.0" package_info_plus: - dependency: transitive + dependency: "direct main" description: name: package_info_plus - sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" + sha256: b93d8b4d624b4ea19b0a5a208b2d6eff06004bc3ce74c06040b120eeadd00ce0 url: "https://pub.dev" source: hosted - version: "4.2.0" + version: "8.0.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" path: dependency: "direct main" description: @@ -1049,10 +1049,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.8" pointycastle: dependency: transitive description: @@ -1567,18 +1567,18 @@ packages: dependency: transitive description: name: wakelock_plus - sha256: f45a6c03aa3f8322e0a9d7f4a0482721c8789cb41d555407367650b8f9c26018 + sha256: "14758533319a462ffb5aa3b7ddb198e59b29ac3b02da14173a1715d65d4e6e68" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.2.5" wakelock_plus_platform_interface: dependency: transitive description: name: wakelock_plus_platform_interface - sha256: "40fabed5da06caff0796dc638e1f07ee395fb18801fbff3255a2372db2d80385" + sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.1" watcher: dependency: transitive description: @@ -1587,6 +1587,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" web_socket_channel: dependency: transitive description: @@ -1599,10 +1607,10 @@ packages: dependency: transitive description: name: win32 - sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" + sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb" url: "https://pub.dev" source: hosted - version: "5.0.9" + version: "5.5.0" win32_registry: dependency: transitive description: @@ -1644,5 +1652,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-0 <4.0.0" - flutter: ">=3.10.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index f86a0fd..41f35f4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: relatica description: A mobile and desktop client for interacting with the Friendica social network publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.10.0 +version: 0.10.1 environment: sdk: '>=3.0.0 <4.0.0' @@ -38,6 +38,7 @@ dependencies: network_to_file_image: ^4.0.1 objectbox: ^2.3.1 objectbox_flutter_libs: ^2.3.1 + package_info_plus: ^8.0.0 path: ^1.8.2 path_provider: ^2.0.11 provider: ^6.0.4