Заменены \n на реальный символ переноса
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 209 KiB After Width: | Height: | Size: 202 KiB |
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 105 KiB |
@@ -54,7 +54,8 @@ fork
|
|||||||
:StorageSyncEngine.syncAllGroups;
|
:StorageSyncEngine.syncAllGroups;
|
||||||
while (Есть группа синхронизации?) is (да)
|
while (Есть группа синхронизации?) is (да)
|
||||||
:Слияние журналов → победитель по пути;
|
:Слияние журналов → победитель по пути;
|
||||||
:findSourceStorage → applyEntry\nна отстающие Storage;
|
:findSourceStorage → applyEntry
|
||||||
|
на отстающие Storage;
|
||||||
endwhile (нет)
|
endwhile (нет)
|
||||||
}
|
}
|
||||||
end fork
|
end fork
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ skinparam state {
|
|||||||
skinparam noteBackgroundColor #E3F2FD
|
skinparam noteBackgroundColor #E3F2FD
|
||||||
skinparam noteBorderColor #1565C0
|
skinparam noteBorderColor #1565C0
|
||||||
|
|
||||||
state "(Б) Список storage\n(LocalVault или VaultBrowser)" as List
|
state "(Б) Список storage (LocalVault / VaultBrowser)" as List
|
||||||
|
|
||||||
List --> Create : Создать storage\n(FAB)
|
List --> Create : Создать storage (FAB)
|
||||||
Create --> List : Storage создан
|
Create --> List : Storage создан
|
||||||
|
|
||||||
List --> EncryptDlg : Включить шифрование storage
|
List --> EncryptDlg : Включить шифрование storage
|
||||||
@@ -36,7 +36,7 @@ OpenDlg --> Opened : Ключ верный
|
|||||||
OpenDlg --> List : Отмена / неверный ключ
|
OpenDlg --> List : Отмена / неверный ключ
|
||||||
|
|
||||||
state Opened {
|
state Opened {
|
||||||
state "Файлы, секреты, 2FA\n(StorageHome)" as Browse
|
state "Файлы, секреты, 2FA (StorageHome)" as Browse
|
||||||
}
|
}
|
||||||
Opened --> List : Закрыть / заблокировать storage
|
Opened --> List : Закрыть / заблокировать storage
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,8 @@ skinparam noteBorderColor #C2185B
|
|||||||
start
|
start
|
||||||
|
|
||||||
partition "**Main: нижняя навигация**" {
|
partition "**Main: нижняя навигация**" {
|
||||||
:(A) Вкладка LocalVault\n(один LocalVault на устройстве);
|
:(A) Вкладка LocalVault
|
||||||
|
(один LocalVault на устройстве);
|
||||||
note right
|
note right
|
||||||
На экране — список **IStorage**,
|
На экране — список **IStorage**,
|
||||||
не список vault
|
не список vault
|
||||||
@@ -25,9 +26,11 @@ partition "**Main: нижняя навигация**" {
|
|||||||
backward:Назад с вложенного экрана;
|
backward:Назад с вложенного экрана;
|
||||||
switch (Действие?)
|
switch (Действие?)
|
||||||
case (FAB)
|
case (FAB)
|
||||||
:createStorage()\nновый **storage** в LocalVault;
|
:createStorage()
|
||||||
|
новый **storage** в LocalVault;
|
||||||
case (Выбор storage)
|
case (Выбор storage)
|
||||||
:StorageHome:\nфайлы, 2FA, текстовые секреты;
|
:StorageHome:
|
||||||
|
файлы, 2FA, текстовые секреты;
|
||||||
case (Вкладка «Удалённые vault»)
|
case (Вкладка «Удалённые vault»)
|
||||||
:Список **IVault** (Yandex по OAuth);
|
:Список **IVault** (Yandex по OAuth);
|
||||||
if (Нужен OAuth?) then (да)
|
if (Нужен OAuth?) then (да)
|
||||||
|
|||||||
@@ -4,18 +4,27 @@ title Контекстная диаграмма Wallenc
|
|||||||
skinparam defaultFontName "DejaVu Sans"
|
skinparam defaultFontName "DejaVu Sans"
|
||||||
|
|
||||||
actor "Пользователь" as User
|
actor "Пользователь" as User
|
||||||
rectangle "Wallenc\n(Android)" as App {
|
rectangle "Wallenc (Android)" as App {
|
||||||
component "UI\nCompose" as UI
|
component UI [
|
||||||
component "Домен и\nкриптография" as Domain
|
UI
|
||||||
component "Room\nметаданные" as Room
|
Compose
|
||||||
|
]
|
||||||
|
component Domain [
|
||||||
|
Домен и
|
||||||
|
криптография
|
||||||
|
]
|
||||||
|
component Room [
|
||||||
|
Room
|
||||||
|
метаданные
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
cloud "Внешний провайдер\n(Яндекс Диск API)" as Cloud
|
cloud "Внешний провайдер (Яндекс Диск API)" as Cloud
|
||||||
|
|
||||||
User --> UI : storage, vault,\nOAuth, файлы
|
User --> UI : storage, vault, OAuth, файлы
|
||||||
UI --> Domain
|
UI --> Domain
|
||||||
Domain --> Room
|
Domain --> Room
|
||||||
Domain --> Cloud : ciphertext,\nOAuth, метаданные API
|
Domain --> Cloud : ciphertext, OAuth, метаданные API
|
||||||
|
|
||||||
note right of Cloud
|
note right of Cloud
|
||||||
Сервер приложения
|
Сервер приложения
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ skinparam activity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
start
|
start
|
||||||
:Создать **storage** в vault\n(createStorage);
|
:Создать **storage** в vault
|
||||||
|
(createStorage);
|
||||||
note right
|
note right
|
||||||
Vault (IVault) не шифруется.
|
Vault (IVault) не шифруется.
|
||||||
Шифрование только у **storage**
|
Шифрование только у **storage**
|
||||||
@@ -18,10 +19,13 @@ if (Включить шифрование storage?) then (да)
|
|||||||
:enableEncryption(storage);
|
:enableEncryption(storage);
|
||||||
else (нет)
|
else (нет)
|
||||||
endif
|
endif
|
||||||
:openStorage(storage)\nпри необходимости;
|
:openStorage(storage)
|
||||||
:Работа с содержимым storage:\nфайлы, 2FA, секреты;
|
при необходимости;
|
||||||
|
:Работа с содержимым storage:
|
||||||
|
файлы, 2FA, секреты;
|
||||||
if (Storage в группе синхронизации?) then (да)
|
if (Storage в группе синхронизации?) then (да)
|
||||||
:StorageSyncEngine\n(журнал ревизий);
|
:StorageSyncEngine
|
||||||
|
(журнал ревизий);
|
||||||
else (нет)
|
else (нет)
|
||||||
endif
|
endif
|
||||||
:closeStorage / блокировка;
|
:closeStorage / блокировка;
|
||||||
|
|||||||
@@ -4,19 +4,23 @@ title DFD уровень 0: Wallenc
|
|||||||
skinparam defaultFontName "DejaVu Sans"
|
skinparam defaultFontName "DejaVu Sans"
|
||||||
|
|
||||||
actor User
|
actor User
|
||||||
rectangle "Процесс 0\nWallenc" as P0 {
|
rectangle "Процесс 0 — Wallenc" as P0 {
|
||||||
usecase "UI" as UI
|
usecase "UI" as UI
|
||||||
usecase "Домен" as Dom
|
usecase "Домен" as Dom
|
||||||
usecase "Крипто" as Crypto
|
usecase "Крипто" as Crypto
|
||||||
usecase "Адаптеры\nхранилищ" as Store
|
usecase Store [
|
||||||
|
Адаптеры
|
||||||
|
----
|
||||||
|
хранилищ
|
||||||
|
]
|
||||||
database "Room" as DB
|
database "Room" as DB
|
||||||
}
|
}
|
||||||
|
|
||||||
cloud Provider
|
cloud Provider
|
||||||
|
|
||||||
User --> UI : команды,\nфайлы
|
User --> UI : команды, файлы
|
||||||
UI --> Dom
|
UI --> Dom
|
||||||
Dom --> Crypto : ключ,\nданные
|
Dom --> Crypto : ключ, данные
|
||||||
Dom --> Store
|
Dom --> Store
|
||||||
Dom --> DB : метаданные
|
Dom --> DB : метаданные
|
||||||
Store --> Provider : ciphertext
|
Store --> Provider : ciphertext
|
||||||
|
|||||||
@@ -6,12 +6,36 @@ left to right direction
|
|||||||
|
|
||||||
actor "Пользователь" as User
|
actor "Пользователь" as User
|
||||||
rectangle "Wallenc" {
|
rectangle "Wallenc" {
|
||||||
usecase "Управление storage\n(локальный vault)" as UC1
|
usecase UC1 [
|
||||||
usecase "Шифрование\nи открытие storage" as UC2
|
Управление storage
|
||||||
usecase "Работа с\nсодержимым" as UC3
|
----
|
||||||
usecase "OAuth и\nудалённые vault" as UC4
|
локальный vault
|
||||||
usecase "Синхронизация\nгрупп" as UC5
|
]
|
||||||
usecase "Фоновые\nзадачи" as UC6
|
usecase UC2 [
|
||||||
|
Шифрование
|
||||||
|
----
|
||||||
|
и открытие storage
|
||||||
|
]
|
||||||
|
usecase UC3 [
|
||||||
|
Работа с
|
||||||
|
----
|
||||||
|
содержимым
|
||||||
|
]
|
||||||
|
usecase UC4 [
|
||||||
|
OAuth и
|
||||||
|
----
|
||||||
|
удалённые vault
|
||||||
|
]
|
||||||
|
usecase UC5 [
|
||||||
|
Синхронизация
|
||||||
|
----
|
||||||
|
групп
|
||||||
|
]
|
||||||
|
usecase UC6 [
|
||||||
|
Фоновые
|
||||||
|
----
|
||||||
|
задачи
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
User --> UC1
|
User --> UC1
|
||||||
|
|||||||
@@ -5,14 +5,22 @@ skinparam defaultFontName "DejaVu Sans"
|
|||||||
|
|
||||||
node "Устройство Android" {
|
node "Устройство Android" {
|
||||||
artifact "Wallenc.apk" as App
|
artifact "Wallenc.apk" as App
|
||||||
database "Room\n(SQLite)" as DB
|
database DB [
|
||||||
|
Room
|
||||||
|
----
|
||||||
|
(SQLite)
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
node "Облако провайдера" {
|
node "Облако провайдера" {
|
||||||
artifact "REST API\n(Яндекс Диск)" as API
|
artifact API [
|
||||||
|
REST API
|
||||||
|
----
|
||||||
|
(Яндекс Диск)
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
App --> DB
|
App --> DB
|
||||||
App --> API : HTTPS,\nOAuth 2.0
|
App --> API : HTTPS, OAuth 2.0
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
|||||||
@@ -18,7 +18,11 @@ package ":domain" as DOM {
|
|||||||
}
|
}
|
||||||
|
|
||||||
package ":infrastructure-android" as INF {
|
package ":infrastructure-android" as INF {
|
||||||
[Room, OAuth,\nадаптеры]
|
component INF_BLOCK [
|
||||||
|
Room, OAuth,
|
||||||
|
----
|
||||||
|
адаптеры
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
package ":app" as APP {
|
package ":app" as APP {
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ skinparam activity {
|
|||||||
start
|
start
|
||||||
:Пользователь включает шифрование;
|
:Пользователь включает шифрование;
|
||||||
:Сформировать EncryptKey;
|
:Сформировать EncryptKey;
|
||||||
:Encryptor: шифрование файлов\n**storage** (IStorageAccessor);
|
:Encryptor: шифрование файлов
|
||||||
:storage.setEncInfo → Room\n(DbStorageMetaInfo);
|
**storage** (IStorageAccessor);
|
||||||
|
:storage.setEncInfo → Room
|
||||||
|
(DbStorageMetaInfo);
|
||||||
:checkKey(ключ);
|
:checkKey(ключ);
|
||||||
if (Ключ верный?) then (да)
|
if (Ключ верный?) then (да)
|
||||||
:IUnlockManager.open(storage)\nвиртуальное представление;
|
:IUnlockManager.open(storage)
|
||||||
|
виртуальное представление;
|
||||||
:Доступ к файлам storage;
|
:Доступ к файлам storage;
|
||||||
else (нет)
|
else (нет)
|
||||||
:Ошибка, storage не открыт;
|
:Ошибка, storage не открыт;
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ skinparam defaultFontName "DejaVu Sans"
|
|||||||
|Лояльность|
|
|Лояльность|
|
||||||
|
|
||||||
|Действия|
|
|Действия|
|
||||||
|Понимает риск\nоблака|
|
|Понимает риск облака|
|
||||||
|Создаёт storage,\nвключает шифрование storage|
|
|Создаёт storage, включает шифрование storage|
|
||||||
|Открывает storage,\nработает с файлами|
|
|Открывает storage, работает с файлами|
|
||||||
|Синхронизирует storage\nбез передачи ключей|
|
|Синхронизирует storage без передачи ключей|
|
||||||
|
|
||||||
|Ожидания|
|
|Ожидания|
|
||||||
|Данные не читаются\nпровайдером|
|
|Данные не читаются провайдером|
|
||||||
|Простой ввод пароля|
|
|Простой ввод пароля|
|
||||||
|Быстрый доступ|
|
|Быстрый доступ|
|
||||||
|Надёжная синхронизация|
|
|Надёжная синхронизация|
|
||||||
|
|||||||
@@ -13,10 +13,12 @@ start
|
|||||||
|
|
||||||
:Группа Storage (≥ 2 UUID из DbStorageSyncGroup);
|
:Группа Storage (≥ 2 UUID из DbStorageSyncGroup);
|
||||||
:Захват блокировок sync (lease);
|
:Захват блокировок sync (lease);
|
||||||
:Параллельно: flush + readSyncJournal\nдля каждого Storage;
|
:Параллельно: flush + readSyncJournal
|
||||||
|
для каждого Storage;
|
||||||
|
|
||||||
partition "Слияние (StorageSyncJournalMerge)" {
|
partition "Слияние (StorageSyncJournalMerge)" {
|
||||||
:Для каждого пути — запись\nс максимальной ревизией;
|
:Для каждого пути — запись
|
||||||
|
с максимальной ревизией;
|
||||||
note right
|
note right
|
||||||
compare: sequence → actorId → createdAt
|
compare: sequence → actorId → createdAt
|
||||||
end note
|
end note
|
||||||
@@ -25,14 +27,18 @@ partition "Слияние (StorageSyncJournalMerge)" {
|
|||||||
while (Есть необработанный путь?) is (да)
|
while (Есть необработанный путь?) is (да)
|
||||||
:winnerEntry = победитель по пути;
|
:winnerEntry = победитель по пути;
|
||||||
:sourceStorage = findSourceStorage(winnerEntry);
|
:sourceStorage = findSourceStorage(winnerEntry);
|
||||||
if (operation == UPSERT\nи source == null?) then (да)
|
if (operation == UPSERT
|
||||||
|
и source == null?) then (да)
|
||||||
:пропуск пути;
|
:пропуск пути;
|
||||||
else (нет)
|
else (нет)
|
||||||
while (Есть target Storage?) is (да)
|
while (Есть target Storage?) is (да)
|
||||||
if (ревизия target ≥ winner?) then (да)
|
if (ревизия target ≥ winner?) then (да)
|
||||||
:пропуск target;
|
:пропуск target;
|
||||||
else (нет)
|
else (нет)
|
||||||
:applyEntry:\nUPSERT — copy stream\nDELETE/TRASH — на target\n(recordSyncJournal = false);
|
:applyEntry:
|
||||||
|
UPSERT — copy stream
|
||||||
|
DELETE/TRASH — на target
|
||||||
|
(recordSyncJournal = false);
|
||||||
endif
|
endif
|
||||||
endwhile (нет)
|
endwhile (нет)
|
||||||
endif
|
endif
|
||||||
|
|||||||
@@ -7,24 +7,38 @@ skinparam componentStyle rectangle
|
|||||||
|
|
||||||
package "Приложение Wallenc" {
|
package "Приложение Wallenc" {
|
||||||
[UI / use cases] as UI
|
[UI / use cases] as UI
|
||||||
[Метаданные:\nжурнал sync, имена,\nразмеры] as Meta
|
component Meta [
|
||||||
[TFLite / ML Kit\n(inference)] as ML
|
Метаданные
|
||||||
[Зашифрованные\nфайлы storage] as Enc
|
----
|
||||||
|
журнал sync, имена, размеры
|
||||||
|
]
|
||||||
|
component ML [
|
||||||
|
TFLite / ML Kit
|
||||||
|
----
|
||||||
|
(inference)
|
||||||
|
]
|
||||||
|
component Enc [
|
||||||
|
Зашифрованные
|
||||||
|
----
|
||||||
|
файлы storage
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
cloud "Провайдер\n(недоверенный)" as Cloud {
|
cloud "Провайдер (недоверенный)" as Cloud {
|
||||||
[Зашифрованные\nобъекты] as Obj
|
[Зашифрованные объекты] as Obj
|
||||||
}
|
}
|
||||||
|
|
||||||
UI --> Meta : анализ
|
UI --> Meta : анализ
|
||||||
Meta --> ML : признаки\nбез plaintext
|
Meta --> ML : признаки без plaintext
|
||||||
ML --> UI : решение /\nподсказка
|
ML --> UI : решение / подсказка
|
||||||
Enc --> Cloud : только ciphertext
|
Enc --> Cloud : только ciphertext
|
||||||
Enc ..> ML : опционально\nлокальные эмбеддинги\nпосле decrypt на устройстве
|
Enc ..> ML : опционально: эмбеддинги после decrypt на устройстве
|
||||||
|
|
||||||
note bottom of ML
|
note bottom of ML
|
||||||
Обучение: офлайн на размеченных\nсинтетических/агрегированных данных;
|
Обучение: офлайн на размеченных
|
||||||
выгрузка содержимого storage\nна облако для train — не используется
|
синтетических/агрегированных данных;
|
||||||
|
выгрузка содержимого storage
|
||||||
|
на облако для train — не используется
|
||||||
end note
|
end note
|
||||||
|
|
||||||
@enduml
|
@enduml
|
||||||
|
|||||||