目的:让 roundcube 的 日历 和 地址簿 插件,能连上 baikai 的服务端,且正常更新数据。
问题1:用户验证。
回答:使用已有的 IMAP 来验证用户。
参考:https://github.com/sabre-io/Baikal/pull/1292
问题:baikai 里 用户数据的更新,怎么实现?
回答:可以在 vmail.mailbox 里创建 触发器,当数据变更时,同步到 baikai 里的 principals 数据表。
参考:https://sabre.io/dav/principals/
参考的SQL语句:
DELIMITER //
CREATE TRIGGER after_mailbox_insert
AFTER INSERT ON mailbox -- 直接引用 mailbox 表
FOR EACH ROW
BEGIN
INSERT INTO baikal.principals (uri, email, displayname) -- 使用完全限定名
VALUES (UNHEX(HEX(CONCAT('principals/', NEW.username))), UNHEX(HEX(NEW.username)), NEW.name)
ON DUPLICATE KEY UPDATE
displayname = NEW.name;
END //
DELIMITER ;
#########
DELIMITER //
CREATE TRIGGER after_mailbox_update
AFTER UPDATE ON mailbox
FOR EACH ROW
BEGIN
UPDATE baikal.principals
SET displayname = NEW.name
WHERE email = UNHEX(HEX(NEW.username));
END //
DELIMITER ;
#############################
DELIMITER //
CREATE TRIGGER after_mailbox_delete
AFTER DELETE ON mailbox
FOR EACH ROW
BEGIN
DELETE FROM baikal.principals
WHERE email = UNHEX(HEX(OLD.username));
END //
DELIMITER ;
########################
#手工执行一次,如果之前有用户数据未同步
INSERT INTO baikal.principals (uri, email, displayname)
SELECT
UNHEX(HEX(CONCAT('principals/', username))),
UNHEX(HEX(username)),
name
FROM
vmail.mailbox
ON DUPLICATE KEY UPDATE
displayname = VALUES(displayname);
##########################