internal: incomplete vault systems behind feature flag (#2340)

This commit is contained in:
Mo
2023-06-30 09:01:56 -05:00
committed by GitHub
parent d16e401bb9
commit b032eb9c9b
638 changed files with 20321 additions and 4813 deletions

View File

@@ -33,7 +33,7 @@
"typescript": "*"
},
"dependencies": {
"@standardnotes/common": "^1.46.6",
"@standardnotes/common": "^1.48.3",
"@standardnotes/features": "workspace:*",
"@standardnotes/security": "^1.7.6",
"reflect-metadata": "^0.1.13"

View File

@@ -0,0 +1,8 @@
export interface AsymmetricMessageServerHash {
uuid: string
user_uuid: string
sender_uuid: string
encrypted_message: string
created_at_timestamp: number
updated_at_timestamp: number
}

View File

@@ -0,0 +1,23 @@
import { HttpErrorResponse } from '../Http'
export class ClientDisplayableError {
constructor(public text: string, public title?: string, public tag?: string) {
console.error('Client Displayable Error:', text, title || '', tag || '')
}
static FromError(error: { message: string; tag?: string }) {
return new ClientDisplayableError(error.message, undefined, error.tag)
}
static FromString(text: string) {
return new ClientDisplayableError(text)
}
static FromNetworkError(error: HttpErrorResponse) {
return new ClientDisplayableError(error.data.error.message)
}
}
export function isClientDisplayableError(error: unknown): error is ClientDisplayableError {
return error instanceof ClientDisplayableError
}

View File

@@ -1,9 +0,0 @@
export class ClientDisplayableError {
constructor(public text: string, public title?: string, public tag?: string) {
console.error('Client Displayable Error:', text, title || '', tag || '')
}
static FromError(error: { message: string; tag?: string }) {
return new ClientDisplayableError(error.message, undefined, error.tag)
}
}

View File

@@ -1,5 +1,7 @@
import { ValetTokenOperation } from './ValetTokenOperation'
export type CreateValetTokenPayload = {
operation: 'read' | 'write' | 'delete'
operation: ValetTokenOperation
resources: Array<{
remoteIdentifier: string
unencryptedFileSize?: number

View File

@@ -0,0 +1,3 @@
export type MoveFileResponse = {
success: boolean
}

View File

@@ -0,0 +1 @@
export type ValetTokenOperation = 'read' | 'write' | 'delete' | 'move'

View File

@@ -9,6 +9,7 @@ export enum ErrorTag {
RevokedSession = 'revoked-session',
AuthInvalid = 'invalid-auth',
ReadOnlyAccess = 'read-only-access',
ExpiredItemShare = 'expired-item-share',
ClientValidationError = 'client-validation-error',
ClientCanceledMfa = 'client-canceled-mfa',

View File

@@ -22,5 +22,5 @@ export interface HttpSuccessResponse<T = AnySuccessRecord> extends HttpResponseB
export type HttpResponse<T = AnySuccessRecord> = HttpErrorResponse | HttpSuccessResponse<T>
export function isErrorResponse<T>(response: HttpResponse<T>): response is HttpErrorResponse {
return (response.data as HttpErrorResponseBody)?.error != undefined
return (response.data as HttpErrorResponseBody)?.error != undefined || response.status >= 400
}

View File

@@ -4,4 +4,5 @@ export enum ApiEndpointParam {
SyncDlLimit = 'limit',
SyncPayloads = 'items',
ApiVersion = 'api',
SharedVaultUuids = 'shared_vault_uuids',
}

View File

@@ -1,11 +1,98 @@
import { ConflictType } from './ConflictType'
import { ServerItemResponse } from './ServerItemResponse'
export type ConflictParams = {
type BaseConflictParams<T = ServerItemResponse> = {
type: ConflictType
server_item?: ServerItemResponse
unsaved_item?: ServerItemResponse
/** @legacay */
item?: ServerItemResponse
server_item?: T
unsaved_item?: T
}
export type ConflictParamsWithServerItem<T = ServerItemResponse> = BaseConflictParams<T> & {
server_item: T
unsaved_item: never
}
export type ConflictParamsWithUnsavedItem<T = ServerItemResponse> = BaseConflictParams<T> & {
unsaved_item: T
server_item: never
}
export type ConflictParamsWithServerAndUnsavedItem<T = ServerItemResponse> = BaseConflictParams<T> & {
server_item: T
unsaved_item: T
}
export type ConflictConflictingDataParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.ConflictingData
server_item: T
unsaved_item: never
}
export type ConflictUuidConflictParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.UuidConflict
server_item: never
unsaved_item: T
}
export type ConflictContentTypeErrorParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.ContentTypeError
server_item: never
unsaved_item: T
}
export type ConflictContentErrorParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.ContentError
server_item: never
unsaved_item: T
}
export type ConflictReadOnlyErrorParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.ReadOnlyError
server_item: T
unsaved_item: T
}
export type ConflictUuidErrorParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.UuidError
server_item: never
unsaved_item: T
}
export type ConflictSharedVaultNotMemberErrorParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.SharedVaultNotMemberError
server_item: never
unsaved_item: T
}
export type ConflictSharedVaultInsufficientPermissionsErrorParams<T = ServerItemResponse> = BaseConflictParams<T> & {
type: ConflictType.SharedVaultInsufficientPermissionsError
unsaved_item: T
}
export function conflictParamsHasServerItemAndUnsavedItem<T = ServerItemResponse>(
params: BaseConflictParams<T>,
): params is ConflictParamsWithServerAndUnsavedItem<T> {
return params.server_item !== undefined && params.unsaved_item !== undefined
}
export function conflictParamsHasOnlyServerItem<T = ServerItemResponse>(
params: BaseConflictParams<T>,
): params is ConflictParamsWithServerItem<T> {
return params.server_item !== undefined
}
export function conflictParamsHasOnlyUnsavedItem<T = ServerItemResponse>(
params: BaseConflictParams<T>,
): params is ConflictParamsWithUnsavedItem<T> {
return params.unsaved_item !== undefined
}
export type ConflictParams<T = ServerItemResponse> =
| ConflictConflictingDataParams<T>
| ConflictUuidConflictParams<T>
| ConflictContentTypeErrorParams<T>
| ConflictContentErrorParams<T>
| ConflictReadOnlyErrorParams<T>
| ConflictUuidErrorParams<T>
| ConflictSharedVaultNotMemberErrorParams<T>
| ConflictSharedVaultInsufficientPermissionsErrorParams<T>

View File

@@ -5,5 +5,9 @@ export enum ConflictType {
ContentError = 'content_error',
ReadOnlyError = 'readonly_error',
UuidError = 'uuid_error',
SyncError = 'sync_error',
SharedVaultSnjsVersionError = 'shared_vault_snjs_version_error',
SharedVaultInsufficientPermissionsError = 'shared_vault_insufficient_permissions_error',
SharedVaultNotMemberError = 'shared_vault_not_member_error',
SharedVaultInvalidState = 'shared_vault_invalid_state',
}

View File

@@ -1,6 +1,10 @@
import { SharedVaultInviteServerHash } from '../SharedVaults/SharedVaultInviteServerHash'
import { ApiEndpointParam } from './ApiEndpointParam'
import { ConflictParams } from './ConflictParams'
import { ServerItemResponse } from './ServerItemResponse'
import { SharedVaultServerHash } from '../SharedVaults/SharedVaultServerHash'
import { UserEventServerHash } from '../UserEvent/UserEventServerHash'
import { AsymmetricMessageServerHash } from '../AsymmetricMessage/AsymmetricMessageServerHash'
export type RawSyncData = {
error?: unknown
@@ -10,5 +14,9 @@ export type RawSyncData = {
saved_items?: ServerItemResponse[]
conflicts?: ConflictParams[]
unsaved?: ConflictParams[]
shared_vaults?: SharedVaultServerHash[]
shared_vault_invites?: SharedVaultInviteServerHash[]
user_events?: UserEventServerHash[]
asymmetric_messages?: AsymmetricMessageServerHash[]
status?: number
}

View File

@@ -12,4 +12,8 @@ export interface ServerItemResponse {
updated_at_timestamp: number
updated_at: Date
uuid: string
user_uuid: string
shared_vault_uuid: string | undefined
key_system_identifier: string | undefined
last_edited_by_uuid?: string
}

View File

@@ -0,0 +1,13 @@
import { AsymmetricMessageServerHash } from '../AsymmetricMessage/AsymmetricMessageServerHash'
import { SharedVaultPermission } from './SharedVaultPermission'
export interface SharedVaultInviteServerHash extends AsymmetricMessageServerHash {
uuid: string
shared_vault_uuid: string
user_uuid: string
sender_uuid: string
encrypted_message: string
permissions: SharedVaultPermission
created_at_timestamp: number
updated_at_timestamp: number
}

View File

@@ -0,0 +1,5 @@
export enum SharedVaultPermission {
Read = 'read',
Write = 'write',
Admin = 'admin',
}

View File

@@ -0,0 +1,4 @@
export interface SharedVaultServerHash {
uuid: string
user_uuid: string
}

View File

@@ -0,0 +1,9 @@
import { SharedVaultPermission } from './SharedVaultPermission'
export interface SharedVaultUserServerHash {
uuid: string
shared_vault_uuid: string
user_uuid: string
permissions: SharedVaultPermission
updated_at_timestamp: number
}

View File

@@ -0,0 +1,14 @@
import { UserEventType } from './UserEventType'
export type UserEventPayload =
| {
eventType: UserEventType.SharedVaultItemRemoved
itemUuid: string
sharedVaultUuid: string
version: string
}
| {
eventType: UserEventType.RemovedFromSharedVault
sharedVaultUuid: string
version: string
}

View File

@@ -0,0 +1,10 @@
import { UserEventType } from './UserEventType'
export type UserEventServerHash = {
uuid: string
user_uuid: string
event_type: UserEventType
event_payload: string
created_at_timestamp?: number
updated_at_timestamp?: number
}

View File

@@ -0,0 +1,4 @@
export enum UserEventType {
SharedVaultItemRemoved = 'shared_vault_item_removed',
RemovedFromSharedVault = 'removed_from_shared_vault',
}

View File

@@ -13,7 +13,9 @@ export * from './Auth/SignInData'
export * from './Auth/SignInResponse'
export * from './Auth/SignOutResponse'
export * from './Auth/User'
export * from './Error/ClientError'
export * from './Error/ClientDisplayableError'
export * from './Files/CloseUploadSessionResponse'
export * from './Files/CreateValetTokenPayload'
export * from './Files/CreateValetTokenResponse'
@@ -21,7 +23,18 @@ export * from './Files/CreateValetTokenResponseData'
export * from './Files/DownloadFileChunkResponse'
export * from './Files/StartUploadSessionResponse'
export * from './Files/UploadFileChunkResponse'
export * from './Files/MoveFileResponse'
export * from './Files/ValetTokenOperation'
export * from './Http'
export * from './SharedVaults/SharedVaultInviteServerHash'
export * from './SharedVaults/SharedVaultUserServerHash'
export * from './SharedVaults/SharedVaultServerHash'
export * from './SharedVaults/SharedVaultPermission'
export * from './AsymmetricMessage/AsymmetricMessageServerHash'
export * from './Item/ApiEndpointParam'
export * from './Item/CheckIntegrityResponse'
export * from './Item/ConflictParams'
@@ -31,11 +44,13 @@ export * from './Item/RawSyncData'
export * from './Item/RawSyncResponse'
export * from './Item/ServerItemResponse'
export * from './Item/IntegrityPayload'
export * from './Listed/ActionResponse'
export * from './Listed/ListedAccount'
export * from './Listed/ListedAccountInfo'
export * from './Listed/ListedAccountInfoResponse'
export * from './Listed/ListedRegistrationResponse'
export * from './User/AvailableSubscriptions'
export * from './User/DeleteSettingResponse'
export * from './User/GetAvailableSubscriptionsResponse'
@@ -48,3 +63,7 @@ export * from './User/SettingData'
export * from './User/UpdateSettingResponse'
export * from './User/UserFeaturesData'
export * from './User/UserFeaturesResponse'
export * from './UserEvent/UserEventServerHash'
export * from './UserEvent/UserEventType'
export * from './UserEvent/UserEventPayload'