mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-07-17 13:02:05 +00:00
Addresses the TOFU vulnerability where peer-claimed simplex_name was accepted unverified. Adds: - contacts.simplex_name_verified_at + groups.simplex_name_verified_at (M20260606_simplex_name_verified) - APIVerifySimplexName ChatRef command: RSLV-resolves the claimed name and compares the resolved link to the peer's stored connection link; on match writes verified_at and emits CEvtSimplexNameVerified; on mismatch emits CEvtSimplexNameVerifyFailed - CEvtSimplexNameUnverified passive warning emitted on incoming XInfo / XGrpInfo when a name claim arrives without a current verification - updateContactProfileWithConflict / updateGroupProfileWithConflict clear simplex_name_verified_at whenever the peer's claim transitions (any value change including Nothing<->Just): the prior verification was bound to the prior claim. UI can surface the unverified indicator next to a contact / group's name, and prompt the user to invoke the verify command. This shifts the security model from "TOFU + last-writer-wins" to "TOFU + on-demand RSLV verification".
86 lines
6.4 KiB
Haskell
86 lines
6.4 KiB
Haskell
{-# LANGUAGE NamedFieldPuns #-}
|
|
|
|
module Simplex.Chat.Store.Postgres.Migrations (migrations) where
|
|
|
|
import Data.List (sortOn)
|
|
import Data.Text (Text)
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20241220_initial
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250402_short_links
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250512_member_admission
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250513_group_scope
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250526_short_links
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250702_contact_requests_remove_cascade_delete
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250704_groups_conn_link_prepared_connection
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250709_profile_short_descr
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250721_indexes
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250729_member_contact_requests
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250801_via_group_link_uri
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250802_chat_peer_type
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250813_delivery_tasks
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250919_group_summary
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20250922_remove_unused_connections
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20251007_connections_sync
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20251017_chat_tags_cascade
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20251117_member_relations_vector
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20251128_migrate_member_relations
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20251230_strict_tables
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260108_chat_indices
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260122_has_link
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260222_chat_relays
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260403_item_viewed
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260429_relay_request_retries
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260507_relay_inactive_at
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260514_relay_request_group_link_index
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260515_public_group_access
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260529_delivery_job_senders
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260530_client_services
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260531_member_removed_at
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260603_simplex_name
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260604_simplex_name_profiles
|
|
import Simplex.Chat.Store.Postgres.Migrations.M20260606_simplex_name_verified
|
|
import Simplex.Messaging.Agent.Store.Shared (Migration (..))
|
|
|
|
schemaMigrations :: [(String, Text, Maybe Text)]
|
|
schemaMigrations =
|
|
[ ("20241220_initial", m20241220_initial, Nothing),
|
|
("20250402_short_links", m20250402_short_links, Just down_m20250402_short_links),
|
|
("20250512_member_admission", m20250512_member_admission, Just down_m20250512_member_admission),
|
|
("20250513_group_scope", m20250513_group_scope, Just down_m20250513_group_scope),
|
|
("20250526_short_links", m20250526_short_links, Just down_m20250526_short_links),
|
|
("20250702_contact_requests_remove_cascade_delete", m20250702_contact_requests_remove_cascade_delete, Just down_m20250702_contact_requests_remove_cascade_delete),
|
|
("20250704_groups_conn_link_prepared_connection", m20250704_groups_conn_link_prepared_connection, Just down_m20250704_groups_conn_link_prepared_connection),
|
|
("20250709_profile_short_descr", m20250709_profile_short_descr, Just down_m20250709_profile_short_descr),
|
|
("20250721_indexes", m20250721_indexes, Just down_m20250721_indexes),
|
|
("20250729_member_contact_requests", m20250729_member_contact_requests, Just down_m20250729_member_contact_requests),
|
|
("20250801_via_group_link_uri", m20250801_via_group_link_uri, Just down_m20250801_via_group_link_uri),
|
|
("20250802_chat_peer_type", m20250802_chat_peer_type, Just down_m20250802_chat_peer_type),
|
|
("20250813_delivery_tasks", m20250813_delivery_tasks, Just down_m20250813_delivery_tasks),
|
|
("20250919_group_summary", m20250919_group_summary, Just down_m20250919_group_summary),
|
|
("20250922_remove_unused_connections", m20250922_remove_unused_connections, Just down_m20250922_remove_unused_connections),
|
|
("20251007_connections_sync", m20251007_connections_sync, Just down_m20251007_connections_sync),
|
|
("20251017_chat_tags_cascade", m20251017_chat_tags_cascade, Just down_m20251017_chat_tags_cascade),
|
|
("20251117_member_relations_vector", m20251117_member_relations_vector, Just down_m20251117_member_relations_vector),
|
|
("20251128_migrate_member_relations", m20251128_migrate_member_relations, Just down_m20251128_migrate_member_relations),
|
|
("20251230_strict_tables", m20251230_strict_tables, Just down_m20251230_strict_tables),
|
|
("20260108_chat_indices", m20260108_chat_indices, Just down_m20260108_chat_indices),
|
|
("20260122_has_link", m20260122_has_link, Just down_m20260122_has_link),
|
|
("20260222_chat_relays", m20260222_chat_relays, Just down_m20260222_chat_relays),
|
|
("20260403_item_viewed", m20260403_item_viewed, Just down_m20260403_item_viewed),
|
|
("20260429_relay_request_retries", m20260429_relay_request_retries, Just down_m20260429_relay_request_retries),
|
|
("20260507_relay_inactive_at", m20260507_relay_inactive_at, Just down_m20260507_relay_inactive_at),
|
|
("20260514_relay_request_group_link_index", m20260514_relay_request_group_link_index, Just down_m20260514_relay_request_group_link_index),
|
|
("20260515_public_group_access", m20260515_public_group_access, Just down_m20260515_public_group_access),
|
|
("20260529_delivery_job_senders", m20260529_delivery_job_senders, Just down_m20260529_delivery_job_senders),
|
|
("20260530_client_services", m20260530_client_services, Just down_m20260530_client_services),
|
|
("20260531_member_removed_at", m20260531_member_removed_at, Just down_m20260531_member_removed_at),
|
|
("20260603_simplex_name", m20260603_simplex_name, Just down_m20260603_simplex_name),
|
|
("20260604_simplex_name_profiles", m20260604_simplex_name_profiles, Just down_m20260604_simplex_name_profiles),
|
|
("20260606_simplex_name_verified", m20260606_simplex_name_verified, Just down_m20260606_simplex_name_verified)
|
|
]
|
|
|
|
-- | The list of migrations in ascending order by date
|
|
migrations :: [Migration]
|
|
migrations = sortOn name $ map migration schemaMigrations
|
|
where
|
|
migration (name, up, down) = Migration {name, up, down}
|