add auth to all container chip widgets

This commit is contained in:
Fabian Freund
2025-09-29 14:54:28 +02:00
parent c029d92fe0
commit a51f4d0a18
4 changed files with 45 additions and 23 deletions
@@ -25,6 +25,7 @@ import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:weblibre/features/geckoview/domain/repositories/tab.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/providers/selected_container.dart';
import 'package:weblibre/features/geckoview/features/tabs/presentation/widgets/container_chips.dart';
import 'package:weblibre/utils/form_validators.dart';
@@ -69,8 +70,16 @@ class OpenSharedContent extends HookConsumerWidget {
child: ContainerChips(
displayMenu: false,
selectedContainer: selectedContainer.value,
onSelected: (container) {
selectedContainer.value = container;
onSelected: (container) async {
if (container != null) {
if (await ref
.read(selectedContainerProvider.notifier)
.authenticateContainer(container)) {
selectedContainer.value = container;
}
} else {
selectedContainer.value = container;
}
},
onDeleted: (container) {
selectedContainer.value = null;
@@ -100,8 +100,16 @@ class TabSearch extends HookConsumerWidget {
ContainerChips(
displayMenu: false,
selectedContainer: selectedContainer.value,
onSelected: (container) {
selectedContainer.value = container;
onSelected: (container) async {
if (container != null) {
if (await ref
.read(selectedContainerProvider.notifier)
.authenticateContainer(container)) {
selectedContainer.value = container;
}
} else {
selectedContainer.value = container;
}
},
onDeleted: (container) {
selectedContainer.value = null;
@@ -45,30 +45,35 @@ class SelectedContainer extends _$SelectedContainer {
return null;
}
Future<bool> authenticateContainer(ContainerData container) async {
var passAuth = false;
if (container.metadata.authSettings.authenticationRequired) {
final authResult = await ref
.read(localAuthenticationServiceProvider.notifier)
.authenticate(
authKey: 'container_access::${container.id}',
localizedReason: 'Require authentication for container',
settings: container.metadata.authSettings,
useAuthCache: true,
);
if (authResult) {
passAuth = true;
}
} else {
passAuth = true;
}
return passAuth;
}
Future<SetContainerResult> setContainerId(String id) async {
final container = await ref
.read(containerRepositoryProvider.notifier)
.getContainerData(id);
if (container != null) {
var passAuth = false;
if (container.metadata.authSettings.authenticationRequired) {
final authResult = await ref
.read(localAuthenticationServiceProvider.notifier)
.authenticate(
authKey: 'container_access::${container.id}',
localizedReason: 'Require authentication for container',
settings: container.metadata.authSettings,
useAuthCache: true,
);
if (authResult) {
passAuth = true;
}
} else {
passAuth = true;
}
final passAuth = await authenticateContainer(container);
if (passAuth) {
if (container.metadata.useProxy) {
final proxyPluginHealthy = await GeckoContainerProxyService()
@@ -41,7 +41,7 @@ final class SelectedContainerProvider
}
}
String _$selectedContainerHash() => r'9e9a9b5e3c91ff1fbf8544e329524f8e064587fe';
String _$selectedContainerHash() => r'94d68a5b8f2746166ab2269afb6cd50c7c7599bf';
abstract class _$SelectedContainer extends $Notifier<String?> {
String? build();