diff --git a/apps/wallet/src/components/request-policies/InteractiveNamedRule.vue b/apps/wallet/src/components/request-policies/InteractiveNamedRule.vue index 3cbbd3c8d..99b803ec5 100644 --- a/apps/wallet/src/components/request-policies/InteractiveNamedRule.vue +++ b/apps/wallet/src/components/request-policies/InteractiveNamedRule.vue @@ -24,6 +24,7 @@ import { computed } from 'vue'; import { toRefs } from 'vue'; import ErrorTooltip from '~/components/error/ErrorTooltip.vue'; import { useRuleToTooltip } from '~/composables/request-policies.composable'; +import { useVerifiedReads } from '~/composables/verified-reads.composable'; import { NamedRule, UUID } from '~/generated/station/station.did'; import { services } from '~/plugins/services.plugin'; import { useAppStore } from '~/stores/app.store'; @@ -38,6 +39,7 @@ const namedRule = ref(null); const loading = ref(true); const error = ref(null); const appStore = useAppStore(); +const verifiedReads = useVerifiedReads(); const rule = computed(() => (namedRule.value ? namedRule.value.rule : null)); const tooltip = useRuleToTooltip(rule); @@ -45,7 +47,9 @@ const tooltip = useRuleToTooltip(rule); onMounted(async () => { loading.value = true; try { - namedRule.value = (await services().station.getNamedRule(props.id.value)).named_rule; + namedRule.value = ( + await services().station.getNamedRule(props.id.value, verifiedReads) + ).named_rule; } catch (e) { appStore.sendErrorNotification(e); error.value = getErrorMessage(e); diff --git a/apps/wallet/src/components/request-policies/rule/NamedRule.vue b/apps/wallet/src/components/request-policies/rule/NamedRule.vue index 5186872fb..6262fee5b 100644 --- a/apps/wallet/src/components/request-policies/rule/NamedRule.vue +++ b/apps/wallet/src/components/request-policies/rule/NamedRule.vue @@ -45,6 +45,7 @@ import { computed } from 'vue'; import { toRefs } from 'vue'; import ErrorTooltip from '~/components/error/ErrorTooltip.vue'; import { useRuleToTooltip } from '~/composables/request-policies.composable'; +import { useVerifiedReads } from '~/composables/verified-reads.composable'; import { NamedRule, UUID } from '~/generated/station/station.did'; import { services } from '~/plugins/services.plugin'; import { useAppStore } from '~/stores/app.store'; @@ -65,6 +66,7 @@ const namedRule = ref(null); const loading = ref(true); const error = ref(null); const appStore = useAppStore(); +const verifiedReads = useVerifiedReads(); const rule = computed(() => (namedRule.value ? namedRule.value.rule : null)); @@ -77,7 +79,9 @@ const emit = defineEmits<{ onMounted(async () => { loading.value = true; try { - namedRule.value = (await services().station.getNamedRule(props.namedRuleId.value)).named_rule; + namedRule.value = ( + await services().station.getNamedRule(props.namedRuleId.value, verifiedReads) + ).named_rule; } catch (e) { appStore.sendErrorNotification(e); error.value = getErrorMessage(e); diff --git a/apps/wallet/src/components/request-policies/specifier/AddressBookEntrySpecifier.vue b/apps/wallet/src/components/request-policies/specifier/AddressBookEntrySpecifier.vue index 7f81d9eba..f6bda20c6 100644 --- a/apps/wallet/src/components/request-policies/specifier/AddressBookEntrySpecifier.vue +++ b/apps/wallet/src/components/request-policies/specifier/AddressBookEntrySpecifier.vue @@ -36,6 +36,7 @@ import { computed, ref, toRefs, watch } from 'vue'; import AddressBookAutocomplete from '~/components/inputs/AddressBookAutocomplete.vue'; import { AddressBookEntry, ResourceIds } from '~/generated/station/station.did'; import { services } from '~/plugins/services.plugin'; +import { useVerifiedReads } from '~/composables/verified-reads.composable'; import { variantIs } from '~/utils/helper.utils'; const input = withDefaults( @@ -54,6 +55,7 @@ const input = withDefaults( const props = toRefs(input); const stationService = services().station; +const verifiedReads = useVerifiedReads(); const emit = defineEmits<{ (event: 'update:modelValue', payload: ResourceIds): void; @@ -96,9 +98,12 @@ watch( const list = variantIs(model.value, 'Ids') ? model.value['Ids'] : []; const allEntries = []; while (list.length > 0) { - const entries = await stationService.listAddressBook({ - ids: list.splice(0, 100), - }); + const entries = await stationService.listAddressBook( + { + ids: list.splice(0, 100), + }, + verifiedReads, + ); allEntries.push(...entries.address_book_entries); } loadedEntries.value = allEntries; diff --git a/apps/wallet/src/components/requests/RequestDialog.spec.ts b/apps/wallet/src/components/requests/RequestDialog.spec.ts index 100239e4f..53715d7ab 100644 --- a/apps/wallet/src/components/requests/RequestDialog.spec.ts +++ b/apps/wallet/src/components/requests/RequestDialog.spec.ts @@ -226,7 +226,11 @@ describe('RequestDialog', () => { await flushPromises(); - expect(services().station.getNextApprovableRequest).toHaveBeenCalled(); + // the next request is rendered from this response, so it is loaded like the initial one + expect(services().station.getNextApprovableRequest).toHaveBeenCalledWith( + expect.anything(), + true, + ); contents = wrapper.findComponent(VCard); diff --git a/apps/wallet/src/components/requests/RequestDialog.vue b/apps/wallet/src/components/requests/RequestDialog.vue index 752d60e59..ed76acd13 100644 --- a/apps/wallet/src/components/requests/RequestDialog.vue +++ b/apps/wallet/src/components/requests/RequestDialog.vue @@ -99,6 +99,7 @@ import RequestDetailView from './RequestDetailView.vue'; import LoadingMessage from '~/components/LoadingMessage.vue'; import { RequestApprovalStatusEnum } from '~/types/requests.types'; import { getRequestUrl } from '~/utils/app.utils'; +import { provideVerifiedReads } from '~/composables/verified-reads.composable'; type DataType = { request: GetRequestResultData['request']; @@ -137,6 +138,9 @@ const skippedRequestIds = ref([]); const requestType = ref(); const loadNext = ref(false); +// Shared components rendered inside this dialog load their data with verified calls too. +provideVerifiedReads(); + watch(props.open, isOpen => { if (isOpen) { currentRequestId.value = props.requestId.value; @@ -221,10 +225,14 @@ const onRequestLoaded = (data: Awaited>): void => }; const loadNextRequest = async (): Promise => { - const nextRequest = await services().station.getNextApprovableRequest({ - types: [requestType.value!], - excludedRequestIds: skippedRequestIds.value, - }); + // The result is rendered directly, so it is loaded with a verified call like in `loadRequest`. + const nextRequest = await services().station.getNextApprovableRequest( + { + types: [requestType.value!], + excludedRequestIds: skippedRequestIds.value, + }, + true, + ); if (nextRequest.length === 0) { return null; diff --git a/apps/wallet/src/components/requests/operations/CallExternalCanisterOperation.vue b/apps/wallet/src/components/requests/operations/CallExternalCanisterOperation.vue index dcb3b46f3..b703dd517 100644 --- a/apps/wallet/src/components/requests/operations/CallExternalCanisterOperation.vue +++ b/apps/wallet/src/components/requests/operations/CallExternalCanisterOperation.vue @@ -57,10 +57,13 @@ const fillReviewContext = ( const loadWithFullInformation = async (): Promise => { try { - const result = await station.service.getRequest({ - request_id: props.request.id, - with_full_info: [true], - }); + const result = await station.service.getRequest( + { + request_id: props.request.id, + with_full_info: [true], + }, + true, + ); if (variantIs(result.request.operation, 'CallExternalCanister')) { const candidIdl = await fetchCanisterIdlFromMetadata( diff --git a/apps/wallet/src/components/requests/operations/EditNamedRuleOperation.vue b/apps/wallet/src/components/requests/operations/EditNamedRuleOperation.vue index 00fb10b39..793080c64 100644 --- a/apps/wallet/src/components/requests/operations/EditNamedRuleOperation.vue +++ b/apps/wallet/src/components/requests/operations/EditNamedRuleOperation.vue @@ -78,6 +78,7 @@ onBeforeMount(async () => { try { const { named_rule } = await station.service.getNamedRule( props.operation.input.named_rule_id, + true, ); if (!formValue.value.description) { diff --git a/apps/wallet/src/components/requests/operations/EditPermissionOperation.vue b/apps/wallet/src/components/requests/operations/EditPermissionOperation.vue index 583ce635d..245f3e12d 100644 --- a/apps/wallet/src/components/requests/operations/EditPermissionOperation.vue +++ b/apps/wallet/src/components/requests/operations/EditPermissionOperation.vue @@ -76,9 +76,12 @@ const fetchDetails = async () => { } loading.value = true; - const { permission: result } = await station.service.getPermission({ - resource: props.operation.input.resource, - }); + const { permission: result } = await station.service.getPermission( + { + resource: props.operation.input.resource, + }, + true, + ); if (isDiffMode.value) { // snapshot original for diff diff --git a/apps/wallet/src/components/requests/operations/EditRequestPolicyOperation.vue b/apps/wallet/src/components/requests/operations/EditRequestPolicyOperation.vue index 524aa3f21..8c19718a3 100644 --- a/apps/wallet/src/components/requests/operations/EditRequestPolicyOperation.vue +++ b/apps/wallet/src/components/requests/operations/EditRequestPolicyOperation.vue @@ -77,7 +77,10 @@ const fetchDetails = async () => { } loading.value = true; - const currentEntry = await station.service.getRequestPolicy(props.operation.input.policy_id); + const currentEntry = await station.service.getRequestPolicy( + props.operation.input.policy_id, + true, + ); if (isDiffMode.value) { currentRequestPolicy.value = deepClone(currentEntry.policy); diff --git a/apps/wallet/src/components/requests/operations/EditUserGroupOperation.vue b/apps/wallet/src/components/requests/operations/EditUserGroupOperation.vue index 007841851..9a941002a 100644 --- a/apps/wallet/src/components/requests/operations/EditUserGroupOperation.vue +++ b/apps/wallet/src/components/requests/operations/EditUserGroupOperation.vue @@ -68,7 +68,10 @@ onBeforeMount(async () => { if (isDiffMode.value) { try { currentUserGroup.value = ( - await stationService.getUserGroup({ user_group_id: props.operation.input.user_group_id }) + await stationService.getUserGroup( + { user_group_id: props.operation.input.user_group_id }, + true, + ) ).user_group; } catch (e) { currentUserGroupFailed.value = getErrorMessage(e); diff --git a/apps/wallet/src/components/requests/operations/EditUserOperation.vue b/apps/wallet/src/components/requests/operations/EditUserOperation.vue index 23fe6d0ba..4c1bbeecb 100644 --- a/apps/wallet/src/components/requests/operations/EditUserOperation.vue +++ b/apps/wallet/src/components/requests/operations/EditUserOperation.vue @@ -90,7 +90,7 @@ onBeforeMount(async () => { { user_id: props.operation.input.id, }, - false, + true, ) ).user; } catch (error) { diff --git a/apps/wallet/src/components/requests/operations/ManageSystemInfoOperation.vue b/apps/wallet/src/components/requests/operations/ManageSystemInfoOperation.vue index 681a698fd..e94e5e1c9 100644 --- a/apps/wallet/src/components/requests/operations/ManageSystemInfoOperation.vue +++ b/apps/wallet/src/components/requests/operations/ManageSystemInfoOperation.vue @@ -56,7 +56,7 @@ const appStore = useAppStore(); onMounted(async () => { try { - const { system } = await stationService.systemInfo(); + const { system } = await stationService.systemInfo(!isListMode.value); currentSystemInfo.value = system; } catch (error) { appStore.sendErrorNotification(error); diff --git a/apps/wallet/src/components/requests/operations/RemoveNamedRuleOperation.vue b/apps/wallet/src/components/requests/operations/RemoveNamedRuleOperation.vue index 40650c2c6..a7cf899f1 100644 --- a/apps/wallet/src/components/requests/operations/RemoveNamedRuleOperation.vue +++ b/apps/wallet/src/components/requests/operations/RemoveNamedRuleOperation.vue @@ -64,7 +64,10 @@ const fetchDetails = async () => { } loading.value = true; - const { named_rule } = await station.service.getNamedRule(props.operation.input.named_rule_id); + const { named_rule } = await station.service.getNamedRule( + props.operation.input.named_rule_id, + !isListMode.value, + ); formValue.value = named_rule; } catch (e) { diff --git a/apps/wallet/src/components/requests/operations/RemoveRequestPolicyOperation.vue b/apps/wallet/src/components/requests/operations/RemoveRequestPolicyOperation.vue index a96b7a21a..fbedfa478 100644 --- a/apps/wallet/src/components/requests/operations/RemoveRequestPolicyOperation.vue +++ b/apps/wallet/src/components/requests/operations/RemoveRequestPolicyOperation.vue @@ -53,7 +53,10 @@ const fetchDetails = async () => { } loading.value = true; - const currentEntry = await station.service.getRequestPolicy(props.operation.input.policy_id); + const currentEntry = await station.service.getRequestPolicy( + props.operation.input.policy_id, + true, + ); formValue.value = currentEntry.policy; } catch (e) { diff --git a/apps/wallet/src/components/users/InteractiveUserGroup.vue b/apps/wallet/src/components/users/InteractiveUserGroup.vue index f0b3a6498..5bb8da48d 100644 --- a/apps/wallet/src/components/users/InteractiveUserGroup.vue +++ b/apps/wallet/src/components/users/InteractiveUserGroup.vue @@ -23,6 +23,7 @@