feat: 接入消息加密与实名认证能力
This commit is contained in:
@@ -721,6 +721,8 @@ CREATE TABLE IF NOT EXISTS `im_group_messages` (
|
||||
`msg_type` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'text' COMMENT 'text/image/file/audio/video/system 等',
|
||||
`status` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'normal' COMMENT 'normal/recalled/deleted/blocked',
|
||||
`content` json DEFAULT NULL COMMENT '消息正文或 Drafty 内容',
|
||||
`content_nonce` varbinary(12) DEFAULT NULL COMMENT '每条消息独立随机Nonce',
|
||||
`key_version` int NOT NULL DEFAULT '0' COMMENT '商户消息DEK版本',
|
||||
`head` json DEFAULT NULL COMMENT '消息头,包含 @、引用、客户端能力等',
|
||||
`mentioned_user_ids` json DEFAULT NULL COMMENT '@ 用户列表,便于提醒和检索',
|
||||
`mention_all` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否 @ 全体',
|
||||
@@ -1088,6 +1090,8 @@ CREATE TABLE IF NOT EXISTS `im_message_revisions` (
|
||||
`actor` bigint NOT NULL,
|
||||
`head` json DEFAULT NULL,
|
||||
`content` json DEFAULT NULL,
|
||||
`content_nonce` varbinary(12) DEFAULT NULL,
|
||||
`key_version` int NOT NULL DEFAULT '0',
|
||||
`reason` varchar(256) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_im_message_revisions_version` (`topic`,`seqid`,`version`)
|
||||
@@ -1108,6 +1112,8 @@ CREATE TABLE IF NOT EXISTS `im_messages` (
|
||||
`recalled_by` bigint DEFAULT NULL,
|
||||
`head` json DEFAULT NULL,
|
||||
`content` json DEFAULT NULL,
|
||||
`content_nonce` varbinary(12) DEFAULT NULL,
|
||||
`key_version` int NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `messages_sender_client_mid` (`from`,`client_msg_id`),
|
||||
UNIQUE KEY `uk_im_messages_topic_seq` (`topic`,`seqid`)
|
||||
|
||||
@@ -383,6 +383,7 @@ func main() {
|
||||
profile_visibility VARCHAR(32) NOT NULL DEFAULT 'friends',
|
||||
last_seen_visibility VARCHAR(32) NOT NULL DEFAULT 'friends',
|
||||
read_receipts TINYINT NOT NULL DEFAULT 1,
|
||||
friend_request_verification TINYINT NOT NULL DEFAULT 1,
|
||||
group_invite_verification TINYINT NOT NULL DEFAULT 0,
|
||||
version INT NOT NULL DEFAULT 1,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
@@ -540,6 +541,7 @@ func main() {
|
||||
"ALTER TABLE tinode.im_youth_mode_settings ADD COLUMN enabled_at DATETIME(3) AFTER restrictions",
|
||||
"ALTER TABLE tinode.im_users ADD COLUMN phone VARCHAR(32) NULL AFTER useragent",
|
||||
"ALTER TABLE tinode.im_user_profiles ADD COLUMN email VARCHAR(128) NOT NULL DEFAULT '' AFTER region",
|
||||
"ALTER TABLE tinode.im_user_privacy_settings ADD COLUMN friend_request_verification TINYINT NOT NULL DEFAULT 1 AFTER read_receipts",
|
||||
"ALTER TABLE tinode.im_user_privacy_settings ADD COLUMN group_invite_verification TINYINT NOT NULL DEFAULT 0 AFTER read_receipts",
|
||||
} {
|
||||
if _, err = db.Exec(stmt); err != nil && !strings.Contains(err.Error(), "Duplicate column name") {
|
||||
|
||||
@@ -0,0 +1,86 @@
|
||||
-- 在当前商户业务库增加消息加密字段。
|
||||
-- 可重复执行,覆盖单聊、消息修订、群聊主表及全部现有群消息月分片。
|
||||
|
||||
DELIMITER $$
|
||||
|
||||
DROP PROCEDURE IF EXISTS add_message_crypto_column$$
|
||||
CREATE PROCEDURE add_message_crypto_column(
|
||||
IN p_table VARCHAR(64),
|
||||
IN p_column VARCHAR(64),
|
||||
IN p_definition TEXT
|
||||
)
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_table
|
||||
) AND NOT EXISTS (
|
||||
SELECT 1 FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_table AND COLUMN_NAME = p_column
|
||||
) THEN
|
||||
SET @ddl = CONCAT('ALTER TABLE `', REPLACE(p_table, '`', '``'), '` ADD COLUMN `',
|
||||
REPLACE(p_column, '`', '``'), '` ', p_definition);
|
||||
PREPARE stmt FROM @ddl;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END$$
|
||||
|
||||
DROP PROCEDURE IF EXISTS drop_message_crypto_column$$
|
||||
CREATE PROCEDURE drop_message_crypto_column(IN p_table VARCHAR(64), IN p_column VARCHAR(64))
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = p_table AND COLUMN_NAME = p_column
|
||||
) THEN
|
||||
SET @ddl = CONCAT('ALTER TABLE `', REPLACE(p_table, '`', '``'), '` DROP COLUMN `',
|
||||
REPLACE(p_column, '`', '``'), '`');
|
||||
PREPARE stmt FROM @ddl;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
END IF;
|
||||
END$$
|
||||
|
||||
DROP PROCEDURE IF EXISTS migrate_message_crypto_table$$
|
||||
CREATE PROCEDURE migrate_message_crypto_table(IN p_table VARCHAR(64))
|
||||
BEGIN
|
||||
CALL add_message_crypto_column(p_table, 'content_nonce', 'VARBINARY(12) NULL COMMENT ''每条消息独立随机Nonce'' AFTER `content`');
|
||||
CALL add_message_crypto_column(p_table, 'key_version', 'INT NOT NULL DEFAULT 0 COMMENT ''商户消息DEK版本'' AFTER `content_nonce`');
|
||||
CALL drop_message_crypto_column(p_table, 'content_ciphertext');
|
||||
CALL drop_message_crypto_column(p_table, 'encryption_alg');
|
||||
CALL drop_message_crypto_column(p_table, 'encrypted');
|
||||
END$$
|
||||
|
||||
DROP PROCEDURE IF EXISTS migrate_message_crypto_schema$$
|
||||
CREATE PROCEDURE migrate_message_crypto_schema()
|
||||
BEGIN
|
||||
DECLARE done INT DEFAULT 0;
|
||||
DECLARE table_name_value VARCHAR(64);
|
||||
DECLARE shard_cursor CURSOR FOR
|
||||
SELECT TABLE_NAME
|
||||
FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME REGEXP '^im_group_messages_[0-9]{6}$';
|
||||
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
|
||||
|
||||
CALL migrate_message_crypto_table('im_messages');
|
||||
CALL migrate_message_crypto_table('im_message_revisions');
|
||||
CALL migrate_message_crypto_table('im_group_messages');
|
||||
|
||||
OPEN shard_cursor;
|
||||
shard_loop: LOOP
|
||||
FETCH shard_cursor INTO table_name_value;
|
||||
IF done = 1 THEN
|
||||
LEAVE shard_loop;
|
||||
END IF;
|
||||
CALL migrate_message_crypto_table(table_name_value);
|
||||
END LOOP;
|
||||
CLOSE shard_cursor;
|
||||
END$$
|
||||
|
||||
CALL migrate_message_crypto_schema()$$
|
||||
DROP PROCEDURE migrate_message_crypto_schema$$
|
||||
DROP PROCEDURE migrate_message_crypto_table$$
|
||||
DROP PROCEDURE drop_message_crypto_column$$
|
||||
DROP PROCEDURE add_message_crypto_column$$
|
||||
|
||||
DELIMITER ;
|
||||
Reference in New Issue
Block a user