标签 carddav 下的文章

baikai caldav carddav 服务端与 roundcube 的插件应用 整合 - imap 验证 和 数据表触发器

目的:让 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);
##########################