chore: display shared vault file usage (#2399)

* chore: display shared vault file usage

* fix: specs

* fix: reshape filtering result

* fix: resolving invalid server items

* fix: get revisions specs

* fix: processing issue

* fix: tests

---------

Co-authored-by: Mo <mo@standardnotes.com>
This commit is contained in:
Karol Sójko
2023-08-11 08:59:16 +02:00
committed by GitHub
parent 05f3672526
commit 5bca53736b
87 changed files with 505 additions and 169 deletions

View File

@@ -12,14 +12,38 @@ function CreateFilteredServerItem(item: ServerItemResponse): FilteredServerItem
}
}
export function FilterDisallowedRemotePayloadsAndMap(payloads: ServerItemResponse[]): FilteredServerItem[] {
return payloads.filter(isRemotePayloadAllowed).map(CreateFilteredServerItem)
}
export function isRemotePayloadAllowed(payload: ServerItemResponse): boolean {
if (isCorruptTransferPayload(payload)) {
return false
export function FilterDisallowedRemotePayloadsAndMap(payloads: ServerItemResponse[]): {
filtered: FilteredServerItem[]
disallowed: ServerItemResponse[]
} {
const filtered = []
const disallowed = []
for (const payload of payloads) {
const result = checkRemotePayloadAllowed(payload)
if (result.allowed === undefined) {
disallowed.push(payload)
} else {
filtered.push(CreateFilteredServerItem(result.allowed))
}
}
return isEncryptedTransferPayload(payload) || payload.content == undefined
return {
filtered,
disallowed,
}
}
export function checkRemotePayloadAllowed(payload: ServerItemResponse): {
allowed?: ServerItemResponse
disallowed?: ServerItemResponse
} {
if (isCorruptTransferPayload(payload)) {
return { disallowed: payload }
}
if (isEncryptedTransferPayload(payload) || payload.content == undefined) {
return { allowed: payload }
} else {
return { disallowed: payload }
}
}

View File

@@ -1,4 +1,4 @@
import { ProtocolVersion } from '@standardnotes/common'
import { ProtocolVersion } from '../../../Local/Protocol/ProtocolVersion'
import { EncryptedPayloadInterface } from '../../Payload/Interfaces/EncryptedPayload'
import { ItemInterface } from './ItemInterface'

View File

@@ -1,4 +1,5 @@
import { ProtocolVersion, protocolVersionFromEncryptedString } from '@standardnotes/common'
import { ProtocolVersion } from '../../../Local/Protocol/ProtocolVersion'
import { ProtocolVersionFromEncryptedString } from '../../../Local/Protocol/ProtocolVersionFromEncryptedString'
import { SyncResolvedParams, SyncResolvedPayload } from '../../../Runtime/Deltas/Utilities/SyncResolvedPayload'
import { EncryptedTransferPayload } from '../../TransferPayload/Interfaces/EncryptedTransferPayload'
import { EncryptedPayloadInterface } from '../Interfaces/EncryptedPayload'
@@ -18,13 +19,18 @@ export class EncryptedPayload extends PurePayload<EncryptedTransferPayload> impl
constructor(rawPayload: EncryptedTransferPayload, source = PayloadSource.Constructor) {
super(rawPayload, source)
const versionResult = ProtocolVersionFromEncryptedString(rawPayload.content)
if (versionResult.isFailed()) {
throw new Error('EncryptedPayload constructor versionResult is failed')
}
this.auth_hash = rawPayload.auth_hash
this.content = rawPayload.content
this.deleted = false
this.enc_item_key = rawPayload.enc_item_key
this.errorDecrypting = rawPayload.errorDecrypting
this.items_key_id = rawPayload.items_key_id
this.version = protocolVersionFromEncryptedString(this.content)
this.version = versionResult.getValue()
this.waitingForKey = rawPayload.waitingForKey
}

View File

@@ -1,4 +1,4 @@
import { ProtocolVersion } from '@standardnotes/common'
import { ProtocolVersion } from '../../../Local/Protocol/ProtocolVersion'
import { EncryptedTransferPayload } from '../../TransferPayload/Interfaces/EncryptedTransferPayload'
import { PayloadInterface } from './PayloadInterface'

View File

@@ -42,7 +42,7 @@ describe('type check', () => {
expect(
isCorruptTransferPayload({
uuid: '123',
content_type: ContentType.TYPES.Unknown,
content_type: 'Unknown',
content: '123',
...PayloadTimestampDefaults(),
}),

View File

@@ -26,5 +26,7 @@ export function isDeletedTransferPayload(payload: TransferPayload): payload is D
export function isCorruptTransferPayload(payload: TransferPayload): boolean {
const invalidDeletedState = payload.deleted === true && payload.content != undefined
return payload.uuid == undefined || invalidDeletedState || payload.content_type === ContentType.TYPES.Unknown
const contenTypeOrError = ContentType.create(payload.content_type)
return payload.uuid == undefined || invalidDeletedState || contenTypeOrError.isFailed()
}

View File

@@ -0,0 +1 @@
export type ApplicationIdentifier = string

View File

@@ -1,5 +1,5 @@
import { ProtocolVersion } from '@standardnotes/common'
import { KeySystemIdentifier } from '../../Syncable/KeySystemRootKey/KeySystemIdentifier'
import { ProtocolVersion } from '../Protocol/ProtocolVersion'
import { KeySystemPasswordType } from './KeySystemPasswordType'
/**

View File

@@ -0,0 +1,47 @@
export enum ProtocolVersion {
V001 = '001',
V002 = '002',
V003 = '003',
V004 = '004',
}
export const ProtocolVersionLatest = ProtocolVersion.V004
/** The last protocol version to not use root-key based items keys */
export const ProtocolVersionLastNonrootItemsKey = ProtocolVersion.V003
export const ProtocolExpirationDates: Partial<Record<ProtocolVersion, number>> = Object.freeze({
[ProtocolVersion.V001]: Date.parse('2018-01-01'),
[ProtocolVersion.V002]: Date.parse('2020-01-01'),
})
export function isProtocolVersionExpired(version: ProtocolVersion) {
const expireDate = ProtocolExpirationDates[version]
if (!expireDate) {
return false
}
const expired = new Date().getTime() > expireDate
return expired
}
export const ProtocolVersionLength = 3
/**
* -1 if a < b
* 0 if a == b
* 1 if a > b
*/
export function compareVersions(a: ProtocolVersion, b: ProtocolVersion): number {
const aNum = Number(a)
const bNum = Number(b)
return aNum - bNum
}
export function leftVersionGreaterThanOrEqualToRight(a: ProtocolVersion, b: ProtocolVersion): boolean {
return compareVersions(a, b) >= 0
}
export function isVersionLessThanOrEqualTo(input: ProtocolVersion, compareTo: ProtocolVersion): boolean {
return compareVersions(input, compareTo) <= 0
}

View File

@@ -0,0 +1,15 @@
import { Result } from '@standardnotes/domain-core'
import { ProtocolVersion, ProtocolVersionLength } from './ProtocolVersion'
export function ProtocolVersionFromEncryptedString(string: string): Result<ProtocolVersion> {
try {
const version = string.substring(0, ProtocolVersionLength) as ProtocolVersion
if (Object.values(ProtocolVersion).includes(version)) {
return Result.ok(version)
}
} catch (error) {
return Result.fail(JSON.stringify(error))
}
return Result.fail(`Invalid encrypted string ${string}`)
}

View File

@@ -1,9 +1,9 @@
import { PkcKeyPair } from '@standardnotes/sncrypto-common'
import { ProtocolVersion } from '@standardnotes/common'
import { DecryptedItemInterface } from '../../Abstract/Item/Interfaces/DecryptedItem'
import { RootKeyParamsInterface } from '../KeyParams/RootKeyParamsInterface'
import { NamespacedRootKeyInKeychain, RootKeyContentInStorage } from './KeychainTypes'
import { RootKeyContent } from './RootKeyContent'
import { ProtocolVersion } from '../Protocol/ProtocolVersion'
export interface RootKeyInterface extends DecryptedItemInterface<RootKeyContent> {
readonly keyParams: RootKeyParamsInterface

View File

@@ -19,6 +19,7 @@ export type AsymmetricMessageSharedVaultInvite = {
name: string
description?: string
iconString: IconType | EmojiString
fileBytesUsed: number
}
}
}

View File

@@ -1,6 +1,6 @@
import { ProtocolVersion } from '@standardnotes/common'
import { DecryptedItemInterface } from './../../Abstract/Item/Interfaces/DecryptedItem'
import { ItemContent, SpecializedContent } from '../../Abstract/Content/ItemContent'
import { ProtocolVersion } from '../../Local/Protocol/ProtocolVersion'
export interface ItemsKeyContentSpecialized extends SpecializedContent {
version: ProtocolVersion

View File

@@ -1,5 +1,5 @@
import { ProtocolVersion } from '@standardnotes/common'
import { ItemContent, SpecializedContent } from '../../Abstract/Content/ItemContent'
import { ProtocolVersion } from '../../Local/Protocol/ProtocolVersion'
export interface KeySystemItemsKeyContentSpecialized extends SpecializedContent {
version: ProtocolVersion

View File

@@ -1,5 +1,5 @@
import { ProtocolVersion } from '@standardnotes/common'
import { DecryptedItemInterface } from '../../Abstract/Item/Interfaces/DecryptedItem'
import { ProtocolVersion } from '../../Local/Protocol/ProtocolVersion'
import { KeySystemItemsKeyContent } from './KeySystemItemsKeyContent'
export interface KeySystemItemsKeyInterface extends DecryptedItemInterface<KeySystemItemsKeyContent> {

View File

@@ -1,4 +1,3 @@
import { ProtocolVersion } from '@standardnotes/common'
import { ConflictStrategy, DecryptedItem } from '../../Abstract/Item'
import { DecryptedPayloadInterface } from '../../Abstract/Payload'
import { HistoryEntryInterface } from '../../Runtime/History'
@@ -7,6 +6,7 @@ import { KeySystemRootKeyInterface } from './KeySystemRootKeyInterface'
import { KeySystemIdentifier } from './KeySystemIdentifier'
import { KeySystemRootKeyParamsInterface } from '../../Local/KeyParams/KeySystemRootKeyParamsInterface'
import { ContentType } from '@standardnotes/domain-core'
import { ProtocolVersion } from '../../Local/Protocol/ProtocolVersion'
export function isKeySystemRootKey(x: { content_type: string }): x is KeySystemRootKey {
return x.content_type === ContentType.TYPES.KeySystemRootKey

View File

@@ -1,7 +1,7 @@
import { ProtocolVersion } from '@standardnotes/common'
import { ItemContent } from '../../Abstract/Content/ItemContent'
import { KeySystemIdentifier } from './KeySystemIdentifier'
import { KeySystemRootKeyParamsInterface } from '../../Local/KeyParams/KeySystemRootKeyParamsInterface'
import { ProtocolVersion } from '../../Local/Protocol/ProtocolVersion'
export type KeySystemRootKeyContentSpecialized = {
keyParams: KeySystemRootKeyParamsInterface

View File

@@ -1,8 +1,8 @@
import { ProtocolVersion } from '@standardnotes/common'
import { DecryptedItemInterface } from '../../Abstract/Item/Interfaces/DecryptedItem'
import { KeySystemRootKeyContent } from './KeySystemRootKeyContent'
import { KeySystemIdentifier } from './KeySystemIdentifier'
import { KeySystemRootKeyParamsInterface } from '../../Local/KeyParams/KeySystemRootKeyParamsInterface'
import { ProtocolVersion } from '../../Local/Protocol/ProtocolVersion'
export interface KeySystemRootKeyInterface extends DecryptedItemInterface<KeySystemRootKeyContent> {
keyParams: KeySystemRootKeyParamsInterface

View File

@@ -1,4 +1,5 @@
export type VaultListingSharingInfo = {
sharedVaultUuid: string
ownerUserUuid: string
fileBytesUsed: number
}

View File

@@ -15,7 +15,6 @@ export * from './Abstract/Contextual/ComponentCreate'
export * from './Abstract/Contextual/ComponentRetrieved'
export * from './Abstract/Contextual/ContextPayload'
export * from './Abstract/Contextual/FilteredServerItem'
export * from './Abstract/Contextual/TrustedConflictParams'
export * from './Abstract/Contextual/Functions'
export * from './Abstract/Contextual/LocalStorage'
export * from './Abstract/Contextual/OfflineSyncPush'
@@ -23,30 +22,33 @@ export * from './Abstract/Contextual/OfflineSyncSaved'
export * from './Abstract/Contextual/ServerSyncPush'
export * from './Abstract/Contextual/ServerSyncSaved'
export * from './Abstract/Contextual/SessionHistory'
export * from './Abstract/Contextual/TrustedConflictParams'
export * from './Abstract/Item'
export * from './Abstract/Payload'
export * from './Abstract/TransferPayload'
export * from './Api/Subscription/Invitation'
export * from './Api/Subscription/InvitationStatus'
export * from './Api/Subscription/InviteeIdentifierType'
export * from './Api/Subscription/InviterIdentifierType'
export * from './Device/Environment'
export * from './Device/Platform'
export * from './Local/KeyParams/RootKeyParamsInterface'
export * from './Local/KeyParams/KeySystemRootKeyParamsInterface'
export * from './Local/ApplicationIdentifier'
export * from './Local/KeyParams/KeySystemPasswordType'
export * from './Local/KeyParams/KeySystemRootKeyParamsInterface'
export * from './Local/KeyParams/RootKeyParamsInterface'
export * from './Local/Protocol/ProtocolVersion'
export * from './Local/Protocol/ProtocolVersionFromEncryptedString'
export * from './Local/RootKey/KeychainTypes'
export * from './Local/RootKey/RootKeyContent'
export * from './Local/RootKey/RootKeyInterface'
export * from './Local/RootKey/RootKeyWithKeyPairsInterface'
export * from './Runtime/Feature/TypeGuards'
export * from './Runtime/Feature/UIFeature'
export * from './Runtime/Feature/UIFeatureInterface'
export * from './Runtime/AsymmetricMessage/AsymmetricMessagePayload'
export * from './Runtime/AsymmetricMessage/AsymmetricMessagePayloadType'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSenderKeypairChanged'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSharedVaultInvite'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSharedVaultMetadataChanged'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSharedVaultRootKeyChanged'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageTrustedContactShare'
export * from './Runtime/Collection/CollectionSort'
export * from './Runtime/Collection/Item/ItemCollection'
export * from './Runtime/Collection/Item/ItemCounter'
@@ -57,6 +59,13 @@ export * from './Runtime/DirtyCounter/DirtyCounter'
export * from './Runtime/Display'
export * from './Runtime/Display/ItemDisplayController'
export * from './Runtime/Display/Types'
export * from './Runtime/Encryption/ContentTypesUsingRootKeyEncryption'
export * from './Runtime/Encryption/ContentTypeUsesKeySystemRootKeyEncryption'
export * from './Runtime/Encryption/ContentTypeUsesRootKeyEncryption'
export * from './Runtime/Encryption/PersistentSignatureData'
export * from './Runtime/Feature/TypeGuards'
export * from './Runtime/Feature/UIFeature'
export * from './Runtime/Feature/UIFeatureInterface'
export * from './Runtime/History'
export * from './Runtime/Index/ItemDelta'
export * from './Runtime/Index/SNIndex'
@@ -69,20 +78,6 @@ export * from './Runtime/Predicate/NotPredicate'
export * from './Runtime/Predicate/Operator'
export * from './Runtime/Predicate/Predicate'
export * from './Runtime/Predicate/Utils'
export * from './Runtime/AsymmetricMessage/AsymmetricMessagePayload'
export * from './Runtime/AsymmetricMessage/AsymmetricMessagePayloadType'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSenderKeypairChanged'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSharedVaultInvite'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSharedVaultMetadataChanged'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageSharedVaultRootKeyChanged'
export * from './Runtime/AsymmetricMessage/MessageTypes/AsymmetricMessageTrustedContactShare'
export * from './Runtime/Encryption/PersistentSignatureData'
export * from './Runtime/Encryption/ContentTypeUsesRootKeyEncryption'
export * from './Runtime/Encryption/ContentTypesUsingRootKeyEncryption'
export * from './Runtime/Encryption/ContentTypeUsesKeySystemRootKeyEncryption'
export * from './Syncable/ActionsExtension'
export * from './Syncable/Component'
export * from './Syncable/Editor'
@@ -90,36 +85,32 @@ export * from './Syncable/FeatureRepo'
export * from './Syncable/File'
export * from './Syncable/ItemsKey/ItemsKeyInterface'
export * from './Syncable/ItemsKey/ItemsKeyMutatorInterface'
export * from './Syncable/KeySystemItemsKey/KeySystemItemsKeyContent'
export * from './Syncable/KeySystemItemsKey/KeySystemItemsKeyInterface'
export * from './Syncable/KeySystemItemsKey/KeySystemItemsKeyMutatorInterface'
export * from './Syncable/KeySystemRootKey/KeySystemIdentifier'
export * from './Syncable/KeySystemRootKey/KeySystemRootKey'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyContent'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyInterface'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyMutator'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyStorageMode'
export * from './Syncable/Note'
export * from './Syncable/SmartView'
export * from './Syncable/Tag'
export * from './Syncable/UserPrefs'
export * from './Syncable/TrustedContact/TrustedContact'
export * from './Syncable/TrustedContact/Mutator/TrustedContactMutator'
export * from './Syncable/TrustedContact/Content/TrustedContactContent'
export * from './Syncable/TrustedContact/TrustedContactInterface'
export * from './Syncable/TrustedContact/PublicKeySet/ContactPublicKeySetInterface'
export * from './Syncable/TrustedContact/Mutator/TrustedContactMutator'
export * from './Syncable/TrustedContact/PublicKeySet/ContactPublicKeySet'
export * from './Syncable/TrustedContact/PublicKeySet/ContactPublicKeySetInterface'
export * from './Syncable/TrustedContact/TrustedContact'
export * from './Syncable/TrustedContact/TrustedContactInterface'
export * from './Syncable/TrustedContact/Types/PortablePublicKeySet'
export * from './Syncable/TrustedContact/Types/PublicKeyTrustStatus'
export * from './Syncable/KeySystemRootKey/KeySystemRootKey'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyMutator'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyContent'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyInterface'
export * from './Syncable/KeySystemRootKey/KeySystemRootKeyStorageMode'
export * from './Syncable/KeySystemItemsKey/KeySystemItemsKeyInterface'
export * from './Syncable/KeySystemItemsKey/KeySystemItemsKeyContent'
export * from './Syncable/KeySystemItemsKey/KeySystemItemsKeyMutatorInterface'
export * from './Syncable/UserPrefs'
export * from './Syncable/VaultListing/VaultListing'
export * from './Syncable/VaultListing/VaultListingContent'
export * from './Syncable/VaultListing/VaultListingInterface'
export * from './Syncable/VaultListing/VaultListingMutator'
export * from './Syncable/VaultListing/VaultListingSharingInfo'
export * from './Utilities/Icon/IconType'
export * from './Utilities/Item/FindItem'
export * from './Utilities/Item/ItemContentsDiffer'
@@ -132,4 +123,3 @@ export * from './Utilities/Payload/PayloadContentsEqual'
export * from './Utilities/Payload/PayloadsByAlternatingUuid'
export * from './Utilities/Payload/PayloadsByDuplicating'
export * from './Utilities/Payload/PayloadSplit'
export * from './Syncable/KeySystemRootKey/KeySystemIdentifier'