Add mosquitto_property_command_check()

pull/1022/head
Roger A. Light 7 years ago
parent 636e813d1c
commit 63a479564b

@ -96,4 +96,5 @@ MOSQ_1.6 {
global:
mosquitto_subscribe_multiple;
mosquitto_property_free_all;
mosquitto_property_command_check;
} MOSQ_1.5;

@ -1897,6 +1897,20 @@ libmosq_EXPORT int mosquitto_validate_utf8(const char *str, int len);
*/
libmosq_EXPORT void mosquitto_property_free_all(mosquitto_property **properties);
/*
* Function: mosquitto_property_command_check
*
* Check whether a property identifier is valid for the given command.
*
* Parameters:
* command - MQTT command (e.g. CMD_CONNECT)
* identifier - MQTT property (e.g. MQTT_PROP_USER_PROPERTY)
*
* Returns:
* MOSQ_ERR_SUCCESS - if the identifier is valid for command
* MOSQ_ERR_PROTOCOL - if the identifier is not valid for use with command.
*/
int mosquitto_property_command_check(int command, int identifier);
#ifdef __cplusplus
}

@ -451,100 +451,108 @@ int property__write_all(struct mosquitto__packet *packet, struct mqtt5__property
}
int mosquitto_property_command_check(int command, int identifier)
{
switch(identifier){
case MQTT_PROP_PAYLOAD_FORMAT_INDICATOR:
case MQTT_PROP_MESSAGE_EXPIRY_INTERVAL:
case MQTT_PROP_CONTENT_TYPE:
case MQTT_PROP_RESPONSE_TOPIC:
case MQTT_PROP_CORRELATION_DATA:
if(command != CMD_PUBLISH && command != CMD_WILL){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_SUBSCRIPTION_IDENTIFIER:
if(command != CMD_PUBLISH && command != CMD_SUBSCRIBE){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_SESSION_EXPIRY_INTERVAL:
if(command != CMD_CONNECT && command != CMD_CONNACK && command != CMD_DISCONNECT){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_AUTHENTICATION_METHOD:
case MQTT_PROP_AUTHENTICATION_DATA:
if(command != CMD_CONNECT && command != CMD_CONNACK && command != CMD_AUTH){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER:
case MQTT_PROP_SERVER_KEEP_ALIVE:
case MQTT_PROP_RESPONSE_INFORMATION:
case MQTT_PROP_MAXIMUM_QOS:
case MQTT_PROP_RETAIN_AVAILABLE:
case MQTT_PROP_WILDCARD_SUB_AVAILABLE:
case MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE:
case MQTT_PROP_SHARED_SUB_AVAILABLE:
if(command != CMD_CONNACK){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_WILL_DELAY_INTERVAL:
if(command != CMD_WILL){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_REQUEST_PROBLEM_INFORMATION:
case MQTT_PROP_REQUEST_RESPONSE_INFORMATION:
if(command != CMD_CONNECT){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_SERVER_REFERENCE:
if(command != CMD_CONNACK && command != CMD_DISCONNECT){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_REASON_STRING:
if(command == CMD_CONNECT || command == CMD_PUBLISH || command == CMD_SUBSCRIBE || command == CMD_UNSUBSCRIBE){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_RECEIVE_MAXIMUM:
case MQTT_PROP_TOPIC_ALIAS_MAXIMUM:
case MQTT_PROP_MAXIMUM_PACKET_SIZE:
if(command != CMD_CONNECT && command != CMD_CONNACK){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_TOPIC_ALIAS:
if(command != CMD_PUBLISH){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_USER_PROPERTY:
break;
default:
return MOSQ_ERR_PROTOCOL;
}
return MOSQ_ERR_SUCCESS;
}
static int property__command_check(int command, struct mqtt5__property *properties)
{
struct mqtt5__property *p;
int rc;
p = properties;
while(p){
switch(p->identifier){
case MQTT_PROP_PAYLOAD_FORMAT_INDICATOR:
case MQTT_PROP_MESSAGE_EXPIRY_INTERVAL:
case MQTT_PROP_CONTENT_TYPE:
case MQTT_PROP_RESPONSE_TOPIC:
case MQTT_PROP_CORRELATION_DATA:
if(command != CMD_PUBLISH && command != CMD_WILL){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_SUBSCRIPTION_IDENTIFIER:
if(command != CMD_PUBLISH && command != CMD_SUBSCRIBE){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_SESSION_EXPIRY_INTERVAL:
if(command != CMD_CONNECT && command != CMD_CONNACK && command != CMD_DISCONNECT){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_AUTHENTICATION_METHOD:
case MQTT_PROP_AUTHENTICATION_DATA:
if(command != CMD_CONNECT && command != CMD_CONNACK && command != CMD_AUTH){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER:
case MQTT_PROP_SERVER_KEEP_ALIVE:
case MQTT_PROP_RESPONSE_INFORMATION:
case MQTT_PROP_MAXIMUM_QOS:
case MQTT_PROP_RETAIN_AVAILABLE:
case MQTT_PROP_WILDCARD_SUB_AVAILABLE:
case MQTT_PROP_SUBSCRIPTION_ID_AVAILABLE:
case MQTT_PROP_SHARED_SUB_AVAILABLE:
if(command != CMD_CONNACK){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_WILL_DELAY_INTERVAL:
if(command != CMD_WILL){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_REQUEST_PROBLEM_INFORMATION:
case MQTT_PROP_REQUEST_RESPONSE_INFORMATION:
if(command != CMD_CONNECT){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_SERVER_REFERENCE:
if(command != CMD_CONNACK && command != CMD_DISCONNECT){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_REASON_STRING:
if(command == CMD_CONNECT || command == CMD_PUBLISH || command == CMD_SUBSCRIBE || command == CMD_UNSUBSCRIBE){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_RECEIVE_MAXIMUM:
case MQTT_PROP_TOPIC_ALIAS_MAXIMUM:
case MQTT_PROP_MAXIMUM_PACKET_SIZE:
if(command != CMD_CONNECT && command != CMD_CONNACK){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_TOPIC_ALIAS:
if(command != CMD_PUBLISH){
return MOSQ_ERR_PROTOCOL;
}
break;
case MQTT_PROP_USER_PROPERTY:
break;
default:
return MOSQ_ERR_PROTOCOL;
}
rc = mosquitto_property_command_check(command, p->identifier);
if(rc) return rc;
p = p->next;
}

Loading…
Cancel
Save