編譯mosquitto-auth-plug
這段日子和mosquitto-auth-plug朝夕相處,可以說是對其又愛又恨,在此簡單整理一些編譯mosquitto-auth-plug時需要做的前置作業,也方便自己日後查閱。
修改config.mk.in
- 設定BACKEND_xxx,將想要使用的backend模組(如:mysql),設定為yes。
- 設定MOSQUITTO_SRC,指定mosquitto原始碼的位置。
- 設定OPENSSLDIR,若無特別需求,可以維持/usr不變。
修改auth_plug.c
由於mosquitto-auth-plug在2018年即不再維護,但mosquitto在某一版以後,修改了mosquitto plugin API定義,這會使得編譯過程發生錯誤,因此需要修改auth-plug.c關於plugin API的部份。
相關API如下:
- mosquitto_auth_unpwd_check
- mosquitto_auth_acl_check
- mosquitto_auth_psk_key_get
要將以上3個API參數裡的mosquitto struct前面的const修飾子去除。
為了維持與舊版的相容性,這邊可以使用#if前置處理指令判斷MOSQ_AUTH_PLUGIN_VERSION是否>=4即可,例如:
#if MOSQ_AUTH_PLUGIN_VERSION >=4 int mosquitto_auth_unpwd_check(void *userdata, struct mosquitto *client, const char *username, const char *password) #elif MOSQ_AUTH_PLUGIN_VERSION >=3 int mosquitto_auth_unpwd_check(void *userdata, const struct mosquitto *client, const char *username, const char *password) #else int mosquitto_auth_unpwd_check(void *userdata, const char *username, const char *password) #endif
修正訂閱ACL判斷(以be-mysql.c為例)
在mosquitto的security_default.c裡,預設的ACL判斷邏輯在遇到access == MOSQ_ACL_SUBSCRIBE時,會直接放行通過,然而在mosquitto-auth-plug裡卻不是,這會導致client訂閱某些包含wildcard字元(‘#’)時,無法成功訂閱,自然也無法正常收到訊息。
可以在be_mysql_aclcheck函式裡新增以下邏輯:
// 比照 mosquitto security_default.c 寫法,若 access == MOSQ_ACL_SUBSCRIBE,直接放行通過 if (acc == MOSQ_ACL_SUBSCRIBE) return (BACKEND_ALLOW);
記得前面補上header file宣告:
#include <mosquitto_plugin.h>