35 #define PARSE_REGEX "(?: *,?!?(?:username|password|will|will_retain|clean_session))+"
38 static int mqtt_connect_flags_id = 0;
104 return rs_mqtt_tx_has_connect_flags(txv,
de->username,
de->password,
de->will,
105 de->will_retain,
de->clean_session);
119 char copy[strlen(rawstr) + 1];
125 pcre2_match_data *match = NULL;
128 SCLogError(
"invalid flag definition: %s", rawstr);
132 de->username =
de->password =
de->will = MQTT_DONT_CARE;
133 de->will_retain =
de->clean_session = MQTT_DONT_CARE;
135 strlcpy(copy, rawstr,
sizeof(copy));
136 char *xsaveptr = NULL;
137 char *flagv = strtok_r(copy,
",", &xsaveptr);
138 while (flagv != NULL) {
139 while (*flagv !=
'\0' && isblank(*flagv)) {
142 if (strlen(flagv) < 2) {
143 SCLogError(
"malformed flag value: %s", flagv);
147 MQTTFlagState fs_to_set = MQTT_MUST_BE_SET;
148 if (flagv[0] ==
'!') {
151 fs_to_set = MQTT_CANT_BE_SET;
153 if (strcmp(flagv+
offset,
"username") == 0) {
154 if (
de->username != MQTT_DONT_CARE) {
155 SCLogError(
"duplicate flag definition: %s", flagv);
158 de->username = fs_to_set;
159 }
else if (strcmp(flagv+
offset,
"password") == 0) {
160 if (
de->password != MQTT_DONT_CARE) {
161 SCLogError(
"duplicate flag definition: %s", flagv);
164 de->password = fs_to_set;
165 }
else if (strcmp(flagv+
offset,
"will") == 0) {
166 if (
de->will != MQTT_DONT_CARE) {
167 SCLogError(
"duplicate flag definition: %s", flagv);
170 de->will = fs_to_set;
171 }
else if (strcmp(flagv+
offset,
"will_retain") == 0) {
172 if (
de->will_retain != MQTT_DONT_CARE) {
173 SCLogError(
"duplicate flag definition: %s", flagv);
176 de->will_retain = fs_to_set;
177 }
else if (strcmp(flagv+
offset,
"clean_session") == 0) {
178 if (
de->clean_session != MQTT_DONT_CARE) {
179 SCLogError(
"duplicate flag definition: %s", flagv);
182 de->clean_session = fs_to_set;
184 SCLogError(
"invalid flag definition: %s", flagv);
188 flagv = strtok_r(NULL,
",", &xsaveptr);
191 pcre2_match_data_free(match);
196 pcre2_match_data_free(match);
222 de = DetectMQTTConnectFlagsParse(rawstr);
268 static int MQTTConnectFlagsTestParse01 (
void)
271 de = DetectMQTTConnectFlagsParse(
"username");
275 de = DetectMQTTConnectFlagsParse(
"username,password,will,will_retain,clean_session");
279 de = DetectMQTTConnectFlagsParse(
"!username,!password,!will,!will_retain,!clean_session");
283 de = DetectMQTTConnectFlagsParse(
" username,password");
296 static int MQTTConnectFlagsTestParse02 (
void)
299 de = DetectMQTTConnectFlagsParse(
"foobar");
314 static int MQTTConnectFlagsTestParse03 (
void)
317 de = DetectMQTTConnectFlagsParse(
"will,!");
332 static int MQTTConnectFlagsTestParse04 (
void)
335 de = DetectMQTTConnectFlagsParse(
"");
350 static int MQTTConnectFlagsTestParse05 (
void)
353 de = DetectMQTTConnectFlagsParse(
"username, username");
358 de = DetectMQTTConnectFlagsParse(
"!username, username");
363 de = DetectMQTTConnectFlagsParse(
"!username,password,!password");
368 de = DetectMQTTConnectFlagsParse(
"will, username,password, !will, will");
386 UtRegisterTest(
"MQTTConnectFlagsTestParse01", MQTTConnectFlagsTestParse01);
387 UtRegisterTest(
"MQTTConnectFlagsTestParse02", MQTTConnectFlagsTestParse02);
388 UtRegisterTest(
"MQTTConnectFlagsTestParse03", MQTTConnectFlagsTestParse03);
389 UtRegisterTest(
"MQTTConnectFlagsTestParse04", MQTTConnectFlagsTestParse04);
390 UtRegisterTest(
"MQTTConnectFlagsTestParse05", MQTTConnectFlagsTestParse05);