Заменены \n на реальный символ переноса

This commit is contained in:
2026-05-28 17:30:20 +03:00
parent 0c15c7b786
commit 32c579e0c0
26 changed files with 134 additions and 54 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 209 KiB

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 105 KiB

View File

@@ -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

View File

@@ -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

View File

@@ -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 (да)

View File

@@ -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
Сервер приложения Сервер приложения

View File

@@ -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 / блокировка;

View File

@@ -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 "Процесс 0Wallenc" 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

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -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 не открыт;

View File

@@ -10,13 +10,13 @@ skinparam defaultFontName "DejaVu Sans"
|Лояльность| |Лояльность|
|Действия| |Действия|
|Понимает риск\nоблака| |Понимает риск облака|
|Создаёт storage,\nвключает шифрование storage| |Создаёт storage, включает шифрование storage|
|Открывает storage,\nработает с файлами| |Открывает storage, работает с файлами|
|Синхронизирует storage\nбез передачи ключей| |Синхронизирует storage без передачи ключей|
|Ожидания| |Ожидания|
|Данные не читаются\nпровайдером| |Данные не читаются провайдером|
|Простой ввод пароля| |Простой ввод пароля|
|Быстрый доступ| |Быстрый доступ|
|Надёжная синхронизация| |Надёжная синхронизация|

View File

@@ -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

View File

@@ -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