diff --git a/lib/api/api_provider.dart b/lib/api/api_provider.dart index daffff8..1d3745f 100644 --- a/lib/api/api_provider.dart +++ b/lib/api/api_provider.dart @@ -8,6 +8,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:vaani/db/cache_manager.dart'; import 'package:vaani/settings/api_settings_provider.dart'; +import 'package:vaani/shared/extensions/obfuscation.dart'; part 'api_provider.g.dart'; @@ -80,7 +81,7 @@ FutureOr serverStatus( Uri baseUrl, [ ResponseErrorHandler? responseErrorHandler, ]) async { - _logger.fine('fetching server status: $baseUrl'); + _logger.fine('fetching server status: ${baseUrl.obfuscate()}'); final api = ref.watch(audiobookshelfApiProvider(baseUrl)); final res = await api.server.status(responseErrorHandler: responseErrorHandler); @@ -145,7 +146,6 @@ class PersonalizedView extends _$PersonalizedView { _logger.warning('failed to fetch personalized view'); yield []; } - } // method to force refresh the view and ignore the cache diff --git a/lib/api/api_provider.g.dart b/lib/api/api_provider.g.dart index 67e86e2..7758c7b 100644 --- a/lib/api/api_provider.g.dart +++ b/lib/api/api_provider.g.dart @@ -327,7 +327,7 @@ class _IsServerAliveProviderElement String get address => (origin as IsServerAliveProvider).address; } -String _$serverStatusHash() => r'2739906a1862d09b098588ebd16749a09032ee99'; +String _$serverStatusHash() => r'd7079e19e68f5f61b0afa0f73a2af8807c4b3cf6'; /// fetch status of server /// diff --git a/lib/api/authenticated_user_provider.dart b/lib/api/authenticated_user_provider.dart index c10f799..c4f065c 100644 --- a/lib/api/authenticated_user_provider.dart +++ b/lib/api/authenticated_user_provider.dart @@ -5,8 +5,8 @@ import 'package:vaani/api/server_provider.dart' import 'package:vaani/db/storage.dart'; import 'package:vaani/settings/api_settings_provider.dart'; import 'package:vaani/settings/models/audiobookshelf_server.dart'; -import 'package:vaani/settings/models/authenticated_user.dart' - as model; +import 'package:vaani/settings/models/authenticated_user.dart' as model; +import 'package:vaani/shared/extensions/obfuscation.dart'; part 'authenticated_user_provider.g.dart'; @@ -35,7 +35,9 @@ class AuthenticatedUser extends _$AuthenticatedUser { Set readFromBoxOrCreate() { if (_box.isNotEmpty) { final foundData = _box.getRange(0, _box.length); - _logger.fine('found users in box: $foundData'); + _logger.fine( + 'found users in box: ${foundData.obfuscate()}', + ); return foundData.toSet(); } else { _logger.fine('no settings found in box'); @@ -49,7 +51,7 @@ class AuthenticatedUser extends _$AuthenticatedUser { return; } _box.addAll(state); - _logger.fine('writing state to box: $state'); + _logger.fine('writing state to box: ${state.obfuscate()}'); } void addUser(model.AuthenticatedUser user, {bool setActive = false}) { diff --git a/lib/api/authenticated_user_provider.g.dart b/lib/api/authenticated_user_provider.g.dart index 7fca094..65f7c32 100644 --- a/lib/api/authenticated_user_provider.g.dart +++ b/lib/api/authenticated_user_provider.g.dart @@ -6,7 +6,7 @@ part of 'authenticated_user_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$authenticatedUserHash() => r'308f19b33ae04af6340fb83167fa64aa23400a09'; +String _$authenticatedUserHash() => r'1983527595207c63a12bc84cf0bf1a3c1d729506'; /// provides with a set of authenticated users /// diff --git a/lib/api/server_provider.dart b/lib/api/server_provider.dart index 4ad4b1e..f4d8a21 100644 --- a/lib/api/server_provider.dart +++ b/lib/api/server_provider.dart @@ -1,16 +1,18 @@ import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:vaani/api/authenticated_user_provider.dart'; import 'package:vaani/db/storage.dart'; import 'package:vaani/settings/api_settings_provider.dart'; -import 'package:vaani/settings/models/audiobookshelf_server.dart' - as model; +import 'package:vaani/settings/models/audiobookshelf_server.dart' as model; +import 'package:vaani/shared/extensions/obfuscation.dart'; part 'server_provider.g.dart'; final _box = AvailableHiveBoxes.serverBox; +final _logger = Logger('AudiobookShelfServerProvider'); + class ServerAlreadyExistsException implements Exception { final model.AudiobookShelfServer server; @@ -47,10 +49,10 @@ class AudiobookShelfServer extends _$AudiobookShelfServer { Set readFromBoxOrCreate() { if (_box.isNotEmpty) { final foundServers = _box.getRange(0, _box.length); - debugPrint('found servers in box: $foundServers'); + _logger.info('found servers in box: ${foundServers.obfuscate()}'); return foundServers.whereNotNull().toSet(); } else { - debugPrint('no settings found in box'); + _logger.info('no settings found in box'); return {}; } } @@ -61,7 +63,7 @@ class AudiobookShelfServer extends _$AudiobookShelfServer { return; } _box.addAll(state); - debugPrint('writing state to box: $state'); + _logger.info('writing state to box: ${state.obfuscate()}'); } void addServer(model.AudiobookShelfServer server) { @@ -71,8 +73,8 @@ class AudiobookShelfServer extends _$AudiobookShelfServer { state = {...state, server}; } - void removeServer(model.AudiobookShelfServer server, - { + void removeServer( + model.AudiobookShelfServer server, { bool removeUsers = false, }) { state = state.where((s) => s != server).toSet(); diff --git a/lib/api/server_provider.g.dart b/lib/api/server_provider.g.dart index 69478cc..7ff40c2 100644 --- a/lib/api/server_provider.g.dart +++ b/lib/api/server_provider.g.dart @@ -7,7 +7,7 @@ part of 'server_provider.dart'; // ************************************************************************** String _$audiobookShelfServerHash() => - r'f0d645bb42233c59886bc43fdc473897484ceca1'; + r'0084fb72c4c54323207928b95716cfd9ca496c11'; /// provides with a set of servers added by the user /// diff --git a/lib/db/init.dart b/lib/db/init.dart index ad875db..8b5e7d0 100644 --- a/lib/db/init.dart +++ b/lib/db/init.dart @@ -1,28 +1,28 @@ -// does the initial setup of the storage - import 'dart:io'; -import 'package:flutter/material.dart'; import 'package:hive/hive.dart'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; +import 'package:vaani/main.dart'; import 'package:vaani/settings/constants.dart'; import 'register_models.dart'; +// does the initial setup of the storage Future initStorage() async { final dir = await getApplicationDocumentsDirectory(); // use vaani as the directory for hive - final storageDir = Directory(p.join( - dir.path, + final storageDir = Directory( + p.join( + dir.path, AppMetadata.appNameLowerCase, ), ); await storageDir.create(recursive: true); Hive.defaultDirectory = storageDir.path; - debugPrint('Hive storage directory init: ${Hive.defaultDirectory}'); + appLogger.config('Hive storage directory init: ${Hive.defaultDirectory}'); await registerModels(); } diff --git a/lib/features/downloads/core/download_manager.dart b/lib/features/downloads/core/download_manager.dart index 5b6229d..0e808b1 100644 --- a/lib/features/downloads/core/download_manager.dart +++ b/lib/features/downloads/core/download_manager.dart @@ -8,6 +8,7 @@ import 'package:logging/logging.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:vaani/shared/extensions/model_conversions.dart'; +import 'package:vaani/shared/extensions/obfuscation.dart'; final _logger = Logger('AudiobookDownloadManager'); final tq = MemoryTaskQueue(); @@ -35,7 +36,9 @@ class AudiobookDownloadManager { FileDownloader().addTaskQueue(tq); - _logger.fine('initialized with baseUrl: $baseUrl, token: $token'); + _logger.fine( + 'initialized with baseUrl: ${Uri.parse(baseUrl).obfuscate()} and token: ${token.obfuscate()}', + ); _logger.fine( 'requiresWiFi: $requiresWiFi, retries: $retries, allowPause: $allowPause', ); diff --git a/lib/features/downloads/providers/download_manager.dart b/lib/features/downloads/providers/download_manager.dart index 87a2191..9f56129 100644 --- a/lib/features/downloads/providers/download_manager.dart +++ b/lib/features/downloads/providers/download_manager.dart @@ -31,9 +31,11 @@ class SimpleDownloadManager extends _$SimpleDownloadManager { core.tq.maxConcurrentByGroup = downloadSettings.maxConcurrentByGroup; ref.onDispose(() { + _logger.info('disposing download manager'); manager.dispose(); }); + _logger.config('initialized download manager'); return manager; } } @@ -52,12 +54,14 @@ class DownloadManager extends _$DownloadManager { Future queueAudioBookDownload( LibraryItemExpanded item, ) async { + _logger.fine('queueing download for ${item.id}'); await state.queueAudioBookDownload( item, ); } Future deleteDownloadedItem(LibraryItemExpanded item) async { + _logger.fine('deleting downloaded item ${item.id}'); await state.deleteDownloadedItem(item); ref.notifyListeners(); } diff --git a/lib/features/downloads/providers/download_manager.g.dart b/lib/features/downloads/providers/download_manager.g.dart index 43fc01c..47cbf4d 100644 --- a/lib/features/downloads/providers/download_manager.g.dart +++ b/lib/features/downloads/providers/download_manager.g.dart @@ -158,7 +158,7 @@ class _DownloadHistoryProviderElement } String _$simpleDownloadManagerHash() => - r'cec95717c86e422f88f78aa014d29e800e5a2089'; + r'8ab13f06ec5f2f73b73064bd285813dc890b7f36'; /// See also [SimpleDownloadManager]. @ProviderFor(SimpleDownloadManager) @@ -174,7 +174,7 @@ final simpleDownloadManagerProvider = NotifierProvider; -String _$downloadManagerHash() => r'7296a39439230f77abbe7d3231dae748f09c7ecf'; +String _$downloadManagerHash() => r'852012e32e613f86445afc7f7e4e85bec808e982'; /// See also [DownloadManager]. @ProviderFor(DownloadManager) diff --git a/lib/features/item_viewer/view/library_item_actions.dart b/lib/features/item_viewer/view/library_item_actions.dart index f1eec3d..1b1b5a8 100644 --- a/lib/features/item_viewer/view/library_item_actions.dart +++ b/lib/features/item_viewer/view/library_item_actions.dart @@ -518,7 +518,7 @@ Future libraryItemPlayButtonOnPressed({ required shelfsdk.BookExpanded book, shelfsdk.MediaProgress? userMediaProgress, }) async { - debugPrint('Pressed play/resume button'); + appLogger.info('Pressed play/resume button'); final player = ref.watch(audiobookPlayerProvider); final isCurrentBookSetInPlayer = player.book == book; @@ -527,8 +527,8 @@ Future libraryItemPlayButtonOnPressed({ Future? setSourceFuture; // set the book to the player if not already set if (!isCurrentBookSetInPlayer) { - debugPrint('Setting the book ${book.libraryItemId}'); - debugPrint('Initial position: ${userMediaProgress?.currentTime}'); + appLogger.info('Setting the book ${book.libraryItemId}'); + appLogger.info('Initial position: ${userMediaProgress?.currentTime}'); final downloadManager = ref.watch(simpleDownloadManagerProvider); final libItem = await ref.read(libraryItemProvider(book.libraryItemId).future); @@ -539,9 +539,9 @@ Future libraryItemPlayButtonOnPressed({ downloadedUris: downloadedUris, ); } else { - debugPrint('Book was already set'); + appLogger.info('Book was already set'); if (isPlayingThisBook) { - debugPrint('Pausing the book'); + appLogger.info('Pausing the book'); await player.pause(); return; } diff --git a/lib/features/item_viewer/view/library_item_hero_section.dart b/lib/features/item_viewer/view/library_item_hero_section.dart index ea21da6..83b5555 100644 --- a/lib/features/item_viewer/view/library_item_hero_section.dart +++ b/lib/features/item_viewer/view/library_item_hero_section.dart @@ -383,7 +383,7 @@ class _BookCover extends HookConsumerWidget { : themeData, ); } catch (e) { - appLogger.shout('Error changing theme: $e'); + appLogger.severe('Error changing theme: $e'); } }); } diff --git a/lib/features/onboarding/view/user_login_with_open_id.dart b/lib/features/onboarding/view/user_login_with_open_id.dart index e403c81..71baa42 100644 --- a/lib/features/onboarding/view/user_login_with_open_id.dart +++ b/lib/features/onboarding/view/user_login_with_open_id.dart @@ -11,6 +11,7 @@ import 'package:vaani/models/error_response.dart'; import 'package:vaani/router/router.dart'; import 'package:vaani/settings/constants.dart'; import 'package:vaani/settings/models/models.dart' as model; +import 'package:vaani/shared/extensions/obfuscation.dart'; import 'package:vaani/shared/utils.dart'; class UserLoginWithOpenID extends HookConsumerWidget { @@ -89,7 +90,9 @@ class UserLoginWithOpenID extends HookConsumerWidget { return; } - appLogger.fine('Got OpenID login endpoint: $openIDLoginEndpoint'); + appLogger.fine( + 'Got OpenID login endpoint: ${openIDLoginEndpoint.obfuscate()}', + ); // add the flow to the provider ref.read(oauthFlowsProvider.notifier).addFlow( diff --git a/lib/features/playback_reporting/core/playback_reporter.dart b/lib/features/playback_reporting/core/playback_reporter.dart index faffb4d..b2be336 100644 --- a/lib/features/playback_reporting/core/playback_reporter.dart +++ b/lib/features/playback_reporting/core/playback_reporter.dart @@ -1,8 +1,10 @@ import 'dart:async'; +import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:vaani/features/player/core/audiobook_player.dart'; +import 'package:vaani/shared/extensions/obfuscation.dart'; final _logger = Logger('PlaybackReporter'); @@ -255,9 +257,9 @@ class PlaybackReporter { _logger.fine('cancelled timer'); } - void _responseErrorHandler(response, [error]) { + void _responseErrorHandler(http.Response response, [error]) { if (response.statusCode != 200) { - _logger.shout('Error with api: $response, $error'); + _logger.severe('Error with api: ${response.obfuscate()}, $error'); throw PlaybackSyncError( 'Error syncing position: ${response.body}, $error', ); diff --git a/lib/features/player/core/audiobook_player.dart b/lib/features/player/core/audiobook_player.dart index 726e91d..579be33 100644 --- a/lib/features/player/core/audiobook_player.dart +++ b/lib/features/player/core/audiobook_player.dart @@ -11,6 +11,7 @@ import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:vaani/settings/app_settings_provider.dart'; import 'package:vaani/settings/models/app_settings.dart'; import 'package:vaani/shared/extensions/model_conversions.dart'; +import 'package:vaani/shared/extensions/obfuscation.dart'; final _logger = Logger('AudiobookPlayer'); @@ -124,7 +125,7 @@ class AudiobookPlayer extends AudioPlayer { final retrievedUri = _getUri(track, downloadedUris, baseUrl: baseUrl, token: token); _logger.fine( - 'Setting source for track: ${track.title}, URI: $retrievedUri', + 'Setting source for track: ${track.title}, URI: ${retrievedUri.obfuscate()}', ); return AudioSource.uri( retrievedUri, diff --git a/lib/features/player/view/widgets/chapter_selection_button.dart b/lib/features/player/view/widgets/chapter_selection_button.dart index d4da604..889392a 100644 --- a/lib/features/player/view/widgets/chapter_selection_button.dart +++ b/lib/features/player/view/widgets/chapter_selection_button.dart @@ -4,6 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/features/player/providers/audiobook_player.dart'; import 'package:vaani/features/player/providers/currently_playing_provider.dart'; import 'package:vaani/features/player/view/player_when_expanded.dart'; +import 'package:vaani/main.dart'; import 'package:vaani/shared/extensions/chapter.dart'; import 'package:vaani/shared/extensions/duration_format.dart'; import 'package:vaani/shared/hooks.dart'; @@ -55,7 +56,7 @@ class ChapterSelectionModal extends HookConsumerWidget { final currentChapterIndex = currentChapter?.id; final chapterKey = GlobalKey(); scrollToCurrentChapter() async { - debugPrint('scrolling to chapter'); + appLogger.fine('scrolling to chapter'); await Scrollable.ensureVisible( chapterKey.currentContext!, duration: 200.ms, diff --git a/lib/features/sleep_timer/core/sleep_timer.dart b/lib/features/sleep_timer/core/sleep_timer.dart index 9350436..2d9ea31 100644 --- a/lib/features/sleep_timer/core/sleep_timer.dart +++ b/lib/features/sleep_timer/core/sleep_timer.dart @@ -69,7 +69,7 @@ class SleepTimer { }), ); - _logger.fine('created with duration: $duration'); + _logger.info('created with duration: $duration'); } /// resets the timer and stops it @@ -90,7 +90,7 @@ class SleepTimer { if (player.playing) { startCountDown(); } - _logger.fine('restarted timer'); + _logger.info('restarted timer'); } /// starts the timer with the given duration or the default duration @@ -105,7 +105,7 @@ class SleepTimer { _logger.fine('paused player after $duration'); }); startedAt = DateTime.now(); - _logger.fine('started for $duration at $startedAt'); + _logger.info('started for $duration at $startedAt'); } Duration get remainingTime { @@ -130,6 +130,6 @@ class SleepTimer { for (var sub in _subscriptions) { sub.cancel(); } - _logger.fine('disposed'); + _logger.info('disposed'); } } diff --git a/lib/features/you/view/server_manager.dart b/lib/features/you/view/server_manager.dart index 2ab70ea..8a385f2 100644 --- a/lib/features/you/view/server_manager.dart +++ b/lib/features/you/view/server_manager.dart @@ -5,10 +5,12 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/api/api_provider.dart'; import 'package:vaani/api/authenticated_user_provider.dart'; import 'package:vaani/api/server_provider.dart'; +import 'package:vaani/main.dart'; import 'package:vaani/models/error_response.dart'; import 'package:vaani/router/router.dart'; import 'package:vaani/settings/api_settings_provider.dart'; import 'package:vaani/settings/models/models.dart' as model; +import 'package:vaani/shared/extensions/obfuscation.dart'; import 'package:vaani/shared/widgets/add_new_server.dart'; class ServerManagerPage extends HookConsumerWidget { @@ -25,8 +27,8 @@ class ServerManagerPage extends HookConsumerWidget { final serverURIController = useTextEditingController(); final formKey = GlobalKey(); - debugPrint('registered servers: $registeredServers'); - debugPrint('available users: $availableUsers'); + appLogger.fine('registered servers: ${registeredServers.obfuscate()}'); + appLogger.fine('available users: ${availableUsers.obfuscate()}'); return Scaffold( appBar: AppBar( title: const Text('Manage Accounts'), diff --git a/lib/models/error_response.dart b/lib/models/error_response.dart index 2e4c926..954f3f3 100644 --- a/lib/models/error_response.dart +++ b/lib/models/error_response.dart @@ -1,5 +1,6 @@ import 'package:http/http.dart' as http; import 'package:logging/logging.dart'; +import 'package:vaani/shared/extensions/obfuscation.dart'; final _logger = Logger('ErrorResponse'); @@ -13,7 +14,7 @@ class ErrorResponseHandler { }) : _response = response ?? http.Response('', 418); void storeError(http.Response response, [Object? error]) { - _logger.fine('for $name got response: $response'); + _logger.fine('for $name got response: ${response.obfuscate()}'); _response = response; } diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 5b3ab41..4d402b3 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -3,6 +3,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/api/api_provider.dart'; +import 'package:vaani/main.dart'; import 'package:vaani/router/router.dart'; import 'package:vaani/settings/api_settings_provider.dart'; @@ -59,7 +60,7 @@ class HomePage extends HookConsumerWidget { final shelvesToDisplay = data // .where((element) => !element.id.contains('discover')) .map((shelf) { - debugPrint('building shelf ${shelf.label}'); + appLogger.fine('building shelf ${shelf.label}'); return HomeShelf( title: shelf.label, shelf: shelf, diff --git a/lib/pages/library_page.dart b/lib/pages/library_page.dart index fb97221..18eedee 100644 --- a/lib/pages/library_page.dart +++ b/lib/pages/library_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:vaani/api/api_provider.dart'; +import 'package:vaani/main.dart'; import 'package:vaani/settings/api_settings_provider.dart'; import '../shared/widgets/drawer.dart'; @@ -47,7 +48,7 @@ class LibraryPage extends HookConsumerWidget { final shelvesToDisplay = data // .where((element) => !element.id.contains('discover')) .map((shelf) { - debugPrint('building shelf ${shelf.label}'); + appLogger.fine('building shelf ${shelf.label}'); return HomeShelf( title: shelf.label, shelf: shelf, diff --git a/lib/router/router.dart b/lib/router/router.dart index 28f9cca..c5b1a67 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -10,6 +10,7 @@ import 'package:vaani/features/onboarding/view/callback_page.dart'; import 'package:vaani/features/onboarding/view/onboarding_single_page.dart'; import 'package:vaani/features/you/view/server_manager.dart'; import 'package:vaani/features/you/view/you_page.dart'; +import 'package:vaani/main.dart'; import 'package:vaani/pages/home_page.dart'; import 'package:vaani/settings/view/app_settings_page.dart'; import 'package:vaani/settings/view/auto_sleep_timer_settings_page.dart'; @@ -234,7 +235,7 @@ class MyAppRouter { // extract the code and state from the uri final code = state.uri.queryParameters['code']; final stateParam = state.uri.queryParameters['state']; - debugPrint('deep linking callback: code: $code, state: $stateParam'); + appLogger.fine('deep linking callback: code: $code, state: $stateParam'); var callbackPage = CallbackPage(code: code, state: stateParam, key: ValueKey(stateParam)); diff --git a/lib/router/scaffold_with_nav_bar.dart b/lib/router/scaffold_with_nav_bar.dart index 467ec71..0a89162 100644 --- a/lib/router/scaffold_with_nav_bar.dart +++ b/lib/router/scaffold_with_nav_bar.dart @@ -6,6 +6,7 @@ import 'package:vaani/features/explore/providers/search_controller.dart'; import 'package:vaani/features/player/providers/player_form.dart'; import 'package:vaani/features/player/view/audiobook_player.dart'; import 'package:vaani/features/player/view/player_when_expanded.dart'; +import 'package:vaani/main.dart'; import 'package:vaani/router/router.dart'; // stack to track changes in navigationShell.currentIndex @@ -42,13 +43,13 @@ class ScaffoldWithNavBar extends HookConsumerWidget { onBackButtonPressed() async { final isPlayerExpanded = playerProgress != playerMinHeight; - debugPrint( + appLogger.fine( 'BackButtonListener: Back button pressed, isPlayerExpanded: $isPlayerExpanded, stack: $navigationShellStack, pendingPlayerModals: $pendingPlayerModals', ); // close miniplayer if it is open if (isPlayerExpanded && pendingPlayerModals == 0) { - debugPrint( + appLogger.fine( 'BackButtonListener: closing the player', ); audioBookMiniplayerController.animateToHeight(state: PanelState.MIN); @@ -59,7 +60,7 @@ class ScaffoldWithNavBar extends HookConsumerWidget { final canPop = GoRouter.of(context).canPop(); if (canPop) { - debugPrint( + appLogger.fine( 'BackButtonListener: passing it to the router as canPop is true', ); return false; @@ -69,7 +70,7 @@ class ScaffoldWithNavBar extends HookConsumerWidget { // pop the last index from the stack and navigate to it final index = navigationShellStack.last; navigationShellStack.remove(index); - debugPrint('BackButtonListener: popping the stack, index: $index'); + appLogger.fine('BackButtonListener: popping the stack, index: $index'); // if the stack is empty, navigate to home else navigate to the last index if (navigationShellStack.isNotEmpty) { @@ -79,12 +80,12 @@ class ScaffoldWithNavBar extends HookConsumerWidget { } if (navigationShell.currentIndex != 0) { // if the stack is empty and the current branch is not home, navigate to home - debugPrint('BackButtonListener: navigating to home'); + appLogger.fine('BackButtonListener: navigating to home'); navigationShell.goBranch(0); return true; } - debugPrint('BackButtonListener: passing it to the router'); + appLogger.fine('BackButtonListener: passing it to the router'); return false; } @@ -149,12 +150,11 @@ class ScaffoldWithNavBar extends HookConsumerWidget { navigationShellStack.remove(index); } navigationShellStack.add(index); - debugPrint('Tapped index: $index, stack: $navigationShellStack'); + appLogger.fine('Tapped index: $index, stack: $navigationShellStack'); // Check if the current branch is the same as the branch that was tapped. - // If it is, debugPrint a message to the console. if (index == navigationShell.currentIndex) { - debugPrint('Tapped the current branch'); + appLogger.fine('Tapped the current branch'); // if current branch is explore, open the search view if (index == 2) { diff --git a/lib/settings/api_settings_provider.dart b/lib/settings/api_settings_provider.dart index ecd297e..91334f0 100644 --- a/lib/settings/api_settings_provider.dart +++ b/lib/settings/api_settings_provider.dart @@ -4,6 +4,7 @@ import 'package:logging/logging.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:vaani/db/available_boxes.dart'; import 'package:vaani/settings/models/api_settings.dart' as model; +import 'package:vaani/shared/extensions/obfuscation.dart'; part 'api_settings_provider.g.dart'; @@ -19,6 +20,7 @@ class ApiSettings extends _$ApiSettings { ref.listenSelf((_, __) { writeToBox(); }); + return state; } @@ -33,7 +35,7 @@ class ApiSettings extends _$ApiSettings { activeServer: foundSettings.activeUser?.server, ); } - _logger.fine('found api settings in box: $foundSettings'); + _logger.fine('found api settings in box: ${foundSettings.obfuscate()}'); return foundSettings; } else { // create a new settings object @@ -47,7 +49,7 @@ class ApiSettings extends _$ApiSettings { void writeToBox() { _box.clear(); _box.add(state); - _logger.fine('wrote api settings to box: $state'); + _logger.fine('wrote api settings to box: ${state.obfuscate()}'); } void updateState(model.ApiSettings newSettings, {bool force = false}) { diff --git a/lib/settings/api_settings_provider.g.dart b/lib/settings/api_settings_provider.g.dart index 0bfacbf..d9a222c 100644 --- a/lib/settings/api_settings_provider.g.dart +++ b/lib/settings/api_settings_provider.g.dart @@ -6,7 +6,7 @@ part of 'api_settings_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$apiSettingsHash() => r'26e7e09e7369bac9fbf0589da9fd97d1f15b7926'; +String _$apiSettingsHash() => r'5bc1e16e9d72b77fb10637aabadf08e8947da580'; /// See also [ApiSettings]. @ProviderFor(ApiSettings) diff --git a/lib/shared/extensions/obfuscation.dart b/lib/shared/extensions/obfuscation.dart new file mode 100644 index 0000000..c70715a --- /dev/null +++ b/lib/shared/extensions/obfuscation.dart @@ -0,0 +1,125 @@ +import 'package:flutter/foundation.dart'; +import 'package:http/http.dart' as http; +import 'package:vaani/settings/models/api_settings.dart'; +import 'package:vaani/settings/models/audiobookshelf_server.dart'; +import 'package:vaani/settings/models/authenticated_user.dart'; + +// bool kReleaseMode = true; + +extension ObfuscateString on String { + String obfuscate() { + if (!kReleaseMode) { + return this; + } + return 'obfuscated'; + } +} + +extension ObfuscateURI on Uri { + /// keeps everything except the base url for security reasons + Uri obfuscate() { + if (!kReleaseMode) { + return this; + } + + // do not obfuscate the local host + if ([null, 'localhost'].contains(host)) { + return this; + } + + // do not obfuscate file urls + if (scheme == 'file') { + return this; + } + + return replace( + userInfo: userInfo == '' ? '' : 'userInfoObfuscated', + host: 'hostObfuscated', + ); + } +} + +extension ObfuscateList on List { + List obfuscate() { + return map((e) { + if (e is AuthenticatedUser) { + return e.obfuscate() as T; + } else if (e is AudiobookShelfServer) { + return e.obfuscate() as T; + } else if (e is Uri) { + return e.obfuscate() as T; + } else { + return e; + } + }).toList(); + } +} + +extension ObfuscateSet on Set { + Set obfuscate() { + return toList().obfuscate().toSet(); + } +} + +extension ObfuscateAuthenticatedUser on AuthenticatedUser { + AuthenticatedUser obfuscate() { + if (!kReleaseMode) { + return this; + } + return copyWith( + password: password == null ? null : 'passwordObfuscated', + username: username == null ? null : 'usernameObfuscated', + authToken: 'authTokenObfuscated', + server: server.obfuscate(), + ); + } +} + +extension ObfuscateServer on AudiobookShelfServer { + AudiobookShelfServer obfuscate() { + if (!kReleaseMode) { + return this; + } + return copyWith( + serverUrl: serverUrl.obfuscate(), + ); + } +} + +extension ObfuscateApiSettings on ApiSettings { + ApiSettings obfuscate() { + if (!kReleaseMode) { + return this; + } + return copyWith( + activeServer: activeServer?.obfuscate(), + activeUser: activeUser?.obfuscate(), + ); + } +} + +extension ObfuscateRequest on http.BaseRequest { + http.BaseRequest obfuscate() { + if (!kReleaseMode) { + return this; + } + return http.Request( + method, + url.obfuscate(), + ); + } +} + +extension ObfuscateResponse on http.Response { + http.Response obfuscate() { + if (!kReleaseMode) { + return this; + } + return http.Response( + body, + statusCode, + headers: headers, + request: request?.obfuscate(), + ); + } +}