fix: mobile user agent set to immich_platform_version (#18478)

* fix: mobile user agent

* refactor: typo in MapService
This commit is contained in:
Zack Pollard 2025-05-22 16:35:24 +01:00 committed by GitHub
parent c278bb0e5b
commit c61ea483ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 39 additions and 8 deletions

View File

@ -1,5 +1,5 @@
{ {
"dart.flutterSdkPath": ".fvm/versions/3.24.3", "dart.flutterSdkPath": ".fvm/versions/3.29.3",
"search.exclude": { "search.exclude": {
"**/.fvm": true "**/.fvm": true
}, },

View File

@ -6,4 +6,4 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'map_service.provider.g.dart'; part 'map_service.provider.g.dart';
@riverpod @riverpod
MapSerivce mapService(Ref ref) => MapSerivce(ref.watch(apiServiceProvider)); MapService mapService(Ref ref) => MapService(ref.watch(apiServiceProvider));

View File

@ -6,11 +6,11 @@ part of 'map_service.provider.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$mapServiceHash() => r'7b26bcd231ed5728ac51fe015dddbf8f91491abb'; String _$mapServiceHash() => r'ffc8f38b726083452b9df236ed58903879348987';
/// See also [mapService]. /// See also [mapService].
@ProviderFor(mapService) @ProviderFor(mapService)
final mapServiceProvider = AutoDisposeProvider<MapSerivce>.internal( final mapServiceProvider = AutoDisposeProvider<MapService>.internal(
mapService, mapService,
name: r'mapServiceProvider', name: r'mapServiceProvider',
debugGetCreateSourceHash: debugGetCreateSourceHash:
@ -21,6 +21,6 @@ final mapServiceProvider = AutoDisposeProvider<MapSerivce>.internal(
@Deprecated('Will be removed in 3.0. Use Ref instead') @Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element // ignore: unused_element
typedef MapServiceRef = AutoDisposeProviderRef<MapSerivce>; typedef MapServiceRef = AutoDisposeProviderRef<MapService>;
// ignore_for_file: type=lint // 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 // 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

View File

@ -10,6 +10,7 @@ import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/utils/url_helper.dart'; import 'package:immich_mobile/utils/url_helper.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:openapi/api.dart'; import 'package:openapi/api.dart';
import 'package:immich_mobile/utils/user_agent.dart';
class ApiService implements Authentication { class ApiService implements Authentication {
late ApiClient _apiClient; late ApiClient _apiClient;
@ -48,6 +49,7 @@ class ApiService implements Authentication {
setEndpoint(String endpoint) { setEndpoint(String endpoint) {
_apiClient = ApiClient(basePath: endpoint, authentication: this); _apiClient = ApiClient(basePath: endpoint, authentication: this);
_setUserAgentHeader();
if (_accessToken != null) { if (_accessToken != null) {
setAccessToken(_accessToken!); setAccessToken(_accessToken!);
} }
@ -72,6 +74,11 @@ class ApiService implements Authentication {
memoriesApi = MemoriesApi(_apiClient); memoriesApi = MemoriesApi(_apiClient);
} }
Future<void> _setUserAgentHeader() async {
final userAgent = await getUserAgentString();
_apiClient.addDefaultHeader('User-Agent', userAgent);
}
Future<String> resolveAndSetEndpoint(String serverUrl) async { Future<String> resolveAndSetEndpoint(String serverUrl) async {
final endpoint = await resolveEndpoint(serverUrl); final endpoint = await resolveEndpoint(serverUrl);
setEndpoint(endpoint); setEndpoint(endpoint);

View File

@ -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/models/map/map_marker.model.dart';
import 'package:immich_mobile/services/api.service.dart'; import 'package:immich_mobile/services/api.service.dart';
import 'package:logging/logging.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; final ApiService _apiService;
@override @override
final logger = Logger("MapService"); final logger = Logger("MapService");
MapSerivce(this._apiService); MapService(this._apiService) {
_setMapUserAgentHeader();
}
Future<void> _setMapUserAgentHeader() async {
final userAgent = await getUserAgentString();
setHttpHeaders({'User-Agent': userAgent});
}
Future<Iterable<MapMarker>> getMapMarkers({ Future<Iterable<MapMarker>> getMapMarkers({
bool? isFavorite, bool? isFavorite,

View File

@ -0,0 +1,15 @@
import 'dart:io' show Platform;
import 'package:package_info_plus/package_info_plus.dart';
Future<String> 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}';
}