mirror of
https://github.com/Dr-Blank/Vaani.git
synced 2026-07-06 17:31:33 +00:00
refactor: update all logs to obfuscate sensitive information
This commit is contained in:
parent
f190438807
commit
8e0735a15c
26 changed files with 210 additions and 59 deletions
|
|
@ -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<ServerStatusResponse?> 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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
///
|
||||
|
|
|
|||
|
|
@ -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<model.AuthenticatedUser> 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}) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
///
|
||||
|
|
|
|||
|
|
@ -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<model.AudiobookShelfServer> 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();
|
||||
|
|
|
|||
|
|
@ -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
|
||||
///
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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<void> queueAudioBookDownload(
|
||||
LibraryItemExpanded item,
|
||||
) async {
|
||||
_logger.fine('queueing download for ${item.id}');
|
||||
await state.queueAudioBookDownload(
|
||||
item,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> deleteDownloadedItem(LibraryItemExpanded item) async {
|
||||
_logger.fine('deleting downloaded item ${item.id}');
|
||||
await state.deleteDownloadedItem(item);
|
||||
ref.notifyListeners();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ class _DownloadHistoryProviderElement
|
|||
}
|
||||
|
||||
String _$simpleDownloadManagerHash() =>
|
||||
r'cec95717c86e422f88f78aa014d29e800e5a2089';
|
||||
r'8ab13f06ec5f2f73b73064bd285813dc890b7f36';
|
||||
|
||||
/// See also [SimpleDownloadManager].
|
||||
@ProviderFor(SimpleDownloadManager)
|
||||
|
|
@ -174,7 +174,7 @@ final simpleDownloadManagerProvider = NotifierProvider<SimpleDownloadManager,
|
|||
);
|
||||
|
||||
typedef _$SimpleDownloadManager = Notifier<core.AudiobookDownloadManager>;
|
||||
String _$downloadManagerHash() => r'7296a39439230f77abbe7d3231dae748f09c7ecf';
|
||||
String _$downloadManagerHash() => r'852012e32e613f86445afc7f7e4e85bec808e982';
|
||||
|
||||
/// See also [DownloadManager].
|
||||
@ProviderFor(DownloadManager)
|
||||
|
|
|
|||
|
|
@ -518,7 +518,7 @@ Future<void> 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<void> libraryItemPlayButtonOnPressed({
|
|||
Future<void>? 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<void> 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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -383,7 +383,7 @@ class _BookCover extends HookConsumerWidget {
|
|||
: themeData,
|
||||
);
|
||||
} catch (e) {
|
||||
appLogger.shout('Error changing theme: $e');
|
||||
appLogger.severe('Error changing theme: $e');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<FormState>();
|
||||
|
||||
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'),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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}) {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'api_settings_provider.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$apiSettingsHash() => r'26e7e09e7369bac9fbf0589da9fd97d1f15b7926';
|
||||
String _$apiSettingsHash() => r'5bc1e16e9d72b77fb10637aabadf08e8947da580';
|
||||
|
||||
/// See also [ApiSettings].
|
||||
@ProviderFor(ApiSettings)
|
||||
|
|
|
|||
125
lib/shared/extensions/obfuscation.dart
Normal file
125
lib/shared/extensions/obfuscation.dart
Normal file
|
|
@ -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<T> on List<T> {
|
||||
List<T> 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<T> on Set<T> {
|
||||
Set<T> 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(),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue