編譯mosquitto-auth-plug

編譯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>

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *