@@ -64,32 +64,18 @@ static int process_bad_message(struct mosquitto *context, struct mosquitto__base
6464}
6565
6666
67- int handle__accepted_publish (struct mosquitto * context , struct mosquitto__base_msg * base_msg , uint16_t mid , int dup , uint32_t * message_expiry_interval )
67+ static int handle__accepted_publish_plugin (struct mosquitto__base_msg * base_msg )
6868{
69- int rc ;
70- int rc2 ;
71- struct mosquitto__base_msg * stored = NULL ;
72- struct mosquitto__client_msg * cmsg_stored = NULL ;
73-
74- {
75- rc = plugin__handle_message_in (context , & base_msg -> data );
76- if (rc == MOSQ_ERR_ACL_DENIED ){
77- log__printf (NULL , MOSQ_LOG_DEBUG ,
78- "Denied PUBLISH from %s (d%d, q%d, r%d, m%d, '%s', ... (%ld bytes))" ,
79- context -> id , dup , base_msg -> data .qos , base_msg -> data .retain , base_msg -> data .source_mid , base_msg -> data .topic ,
80- (long )base_msg -> data .payloadlen );
69+ return sub__messages_queue ("plugin" , base_msg -> data .topic , base_msg -> data .qos , base_msg -> data .retain , & base_msg );
70+ }
8171
82- return process_bad_message (context , base_msg , MQTT_RC_NOT_AUTHORIZED );
83- }else if (rc == MOSQ_ERR_QUOTA_EXCEEDED ){
84- log__printf (NULL , MOSQ_LOG_DEBUG ,
85- "Rejected PUBLISH from %s, quota exceeded." , context -> id );
8672
87- return process_bad_message ( context , base_msg , MQTT_RC_QUOTA_EXCEEDED );
88- } else if ( rc != MOSQ_ERR_SUCCESS ) {
89- db__msg_store_free ( base_msg ) ;
90- return rc ;
91- }
92- }
73+ static int handle__accepted_publish_client ( struct mosquitto * context , struct mosquitto__base_msg * base_msg , uint16_t mid , int dup , uint32_t * message_expiry_interval )
74+ {
75+ struct mosquitto__client_msg * cmsg_stored = NULL ;
76+ struct mosquitto__base_msg * stored = NULL ;
77+ int rc ;
78+ int rc2 ;
9379
9480 if (base_msg -> data .qos > 0 ){
9581 db__message_store_find (context , base_msg -> data .source_mid , & cmsg_stored );
@@ -107,7 +93,7 @@ int handle__accepted_publish(struct mosquitto *context, struct mosquitto__base_m
10793 }
10894
10995 if (!cmsg_stored ){
110- if (base_msg -> data .qos > 0 && context -> msgs_in .inflight_quota == 0 ){
96+ if (base_msg -> data .qos > 0 && context && context -> msgs_in .inflight_quota == 0 ){
11197 /* Client isn't allowed any more incoming messages, so fail early */
11298 db__msg_store_free (base_msg );
11399 return MOSQ_ERR_RECEIVE_MAXIMUM_EXCEEDED ;
@@ -195,6 +181,41 @@ int handle__accepted_publish(struct mosquitto *context, struct mosquitto__base_m
195181}
196182
197183
184+ int handle__accepted_publish (struct mosquitto * context , struct mosquitto__base_msg * base_msg , uint16_t mid , int dup , uint32_t * message_expiry_interval )
185+ {
186+ int rc ;
187+ const char * clientid = context ?context -> id :"plugin" ;
188+
189+ /* context == NULL happens if mosquitto_plugin_publish*() is used message */
190+
191+ {
192+ rc = plugin__handle_message_in (context , & base_msg -> data );
193+ if (rc == MOSQ_ERR_ACL_DENIED ){
194+ log__printf (NULL , MOSQ_LOG_DEBUG ,
195+ "Denied PUBLISH from %s (d%d, q%d, r%d, m%d, '%s', ... (%ld bytes))" ,
196+ clientid , dup , base_msg -> data .qos , base_msg -> data .retain , base_msg -> data .source_mid , base_msg -> data .topic ,
197+ (long )base_msg -> data .payloadlen );
198+
199+ return process_bad_message (context , base_msg , MQTT_RC_NOT_AUTHORIZED );
200+ }else if (rc == MOSQ_ERR_QUOTA_EXCEEDED ){
201+ log__printf (NULL , MOSQ_LOG_DEBUG ,
202+ "Rejected PUBLISH from %s, quota exceeded." , clientid );
203+
204+ return process_bad_message (context , base_msg , MQTT_RC_QUOTA_EXCEEDED );
205+ }else if (rc != MOSQ_ERR_SUCCESS ){
206+ db__msg_store_free (base_msg );
207+ return rc ;
208+ }
209+ }
210+
211+ if (context ){
212+ return handle__accepted_publish_client (context , base_msg , mid , dup , message_expiry_interval );
213+ }else {
214+ return handle__accepted_publish_plugin (base_msg );
215+ }
216+ }
217+
218+
198219int handle__publish (struct mosquitto * context )
199220{
200221 uint8_t dup ;
0 commit comments