From c61ea483ba8f90966cedc8d6d0b6c27a833b03e4 Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Thu, 22 May 2025 16:35:24 +0100 Subject: [PATCH] fix: mobile user agent set to immich_platform_version (#18478) * fix: mobile user agent * refactor: typo in MapService --- mobile/.fvmrc | 2 +- mobile/.vscode/settings.json | 2 +- .../lib/providers/map/map_service.provider.dart | 2 +- .../lib/providers/map/map_service.provider.g.dart | 6 +++--- mobile/lib/services/api.service.dart | 7 +++++++ mobile/lib/services/map.service.dart | 13 +++++++++++-- mobile/lib/utils/user_agent.dart | 15 +++++++++++++++ 7 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 mobile/lib/utils/user_agent.dart diff --git a/mobile/.fvmrc b/mobile/.fvmrc index 07470f9cab..b987073ac6 100644 --- a/mobile/.fvmrc +++ b/mobile/.fvmrc @@ -1,3 +1,3 @@ { "flutter": "3.29.3" -} +} \ No newline at end of file diff --git a/mobile/.vscode/settings.json b/mobile/.vscode/settings.json index ceaf9a6ab8..9c5244f098 100644 --- a/mobile/.vscode/settings.json +++ b/mobile/.vscode/settings.json @@ -1,5 +1,5 @@ { - "dart.flutterSdkPath": ".fvm/versions/3.24.3", + "dart.flutterSdkPath": ".fvm/versions/3.29.3", "search.exclude": { "**/.fvm": true }, diff --git a/mobile/lib/providers/map/map_service.provider.dart b/mobile/lib/providers/map/map_service.provider.dart index 0d998c5173..4ae199789f 100644 --- a/mobile/lib/providers/map/map_service.provider.dart +++ b/mobile/lib/providers/map/map_service.provider.dart @@ -6,4 +6,4 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'map_service.provider.g.dart'; @riverpod -MapSerivce mapService(Ref ref) => MapSerivce(ref.watch(apiServiceProvider)); +MapService mapService(Ref ref) => MapService(ref.watch(apiServiceProvider)); diff --git a/mobile/lib/providers/map/map_service.provider.g.dart b/mobile/lib/providers/map/map_service.provider.g.dart index 70e44da621..0bb5094c61 100644 --- a/mobile/lib/providers/map/map_service.provider.g.dart +++ b/mobile/lib/providers/map/map_service.provider.g.dart @@ -6,11 +6,11 @@ part of 'map_service.provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$mapServiceHash() => r'7b26bcd231ed5728ac51fe015dddbf8f91491abb'; +String _$mapServiceHash() => r'ffc8f38b726083452b9df236ed58903879348987'; /// See also [mapService]. @ProviderFor(mapService) -final mapServiceProvider = AutoDisposeProvider.internal( +final mapServiceProvider = AutoDisposeProvider.internal( mapService, name: r'mapServiceProvider', debugGetCreateSourceHash: @@ -21,6 +21,6 @@ final mapServiceProvider = AutoDisposeProvider.internal( @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element -typedef MapServiceRef = AutoDisposeProviderRef; +typedef MapServiceRef = AutoDisposeProviderRef; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/mobile/lib/services/api.service.dart b/mobile/lib/services/api.service.dart index 92b077ef59..24bdccc04d 100644 --- a/mobile/lib/services/api.service.dart +++ b/mobile/lib/services/api.service.dart @@ -10,6 +10,7 @@ import 'package:immich_mobile/entities/store.entity.dart'; import 'package:immich_mobile/utils/url_helper.dart'; import 'package:logging/logging.dart'; import 'package:openapi/api.dart'; +import 'package:immich_mobile/utils/user_agent.dart'; class ApiService implements Authentication { late ApiClient _apiClient; @@ -48,6 +49,7 @@ class ApiService implements Authentication { setEndpoint(String endpoint) { _apiClient = ApiClient(basePath: endpoint, authentication: this); + _setUserAgentHeader(); if (_accessToken != null) { setAccessToken(_accessToken!); } @@ -72,6 +74,11 @@ class ApiService implements Authentication { memoriesApi = MemoriesApi(_apiClient); } + Future _setUserAgentHeader() async { + final userAgent = await getUserAgentString(); + _apiClient.addDefaultHeader('User-Agent', userAgent); + } + Future resolveAndSetEndpoint(String serverUrl) async { final endpoint = await resolveEndpoint(serverUrl); setEndpoint(endpoint); diff --git a/mobile/lib/services/map.service.dart b/mobile/lib/services/map.service.dart index 26a0746414..2d236f77ef 100644 --- a/mobile/lib/services/map.service.dart +++ b/mobile/lib/services/map.service.dart @@ -2,13 +2,22 @@ import 'package:immich_mobile/mixins/error_logger.mixin.dart'; import 'package:immich_mobile/models/map/map_marker.model.dart'; import 'package:immich_mobile/services/api.service.dart'; import 'package:logging/logging.dart'; +import 'package:maplibre_gl/maplibre_gl.dart'; +import 'package:immich_mobile/utils/user_agent.dart'; -class MapSerivce with ErrorLoggerMixin { +class MapService with ErrorLoggerMixin { final ApiService _apiService; @override final logger = Logger("MapService"); - MapSerivce(this._apiService); + MapService(this._apiService) { + _setMapUserAgentHeader(); + } + + Future _setMapUserAgentHeader() async { + final userAgent = await getUserAgentString(); + setHttpHeaders({'User-Agent': userAgent}); + } Future> getMapMarkers({ bool? isFavorite, diff --git a/mobile/lib/utils/user_agent.dart b/mobile/lib/utils/user_agent.dart new file mode 100644 index 0000000000..232bcaec38 --- /dev/null +++ b/mobile/lib/utils/user_agent.dart @@ -0,0 +1,15 @@ +import 'dart:io' show Platform; +import 'package:package_info_plus/package_info_plus.dart'; + +Future getUserAgentString() async { + final packageInfo = await PackageInfo.fromPlatform(); + String platform; + if (Platform.isAndroid) { + platform = 'Android'; + } else if (Platform.isIOS) { + platform = 'iOS'; + } else { + platform = 'Unknown'; + } + return 'Immich_${platform}_${packageInfo.version}'; +}