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);
124 SCLogError(
"invalid flag definition: %s", rawstr);
131 de->username =
de->password =
de->will = MQTT_DONT_CARE;
132 de->will_retain =
de->clean_session = MQTT_DONT_CARE;
134 char copy[strlen(rawstr)+1];
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);
218 de = DetectMQTTConnectFlagsParse(rawstr);
264 static int MQTTConnectFlagsTestParse01 (
void)
267 de = DetectMQTTConnectFlagsParse(
"username");
271 de = DetectMQTTConnectFlagsParse(
"username,password,will,will_retain,clean_session");
275 de = DetectMQTTConnectFlagsParse(
"!username,!password,!will,!will_retain,!clean_session");
279 de = DetectMQTTConnectFlagsParse(
" username,password");
292 static int MQTTConnectFlagsTestParse02 (
void)
295 de = DetectMQTTConnectFlagsParse(
"foobar");
310 static int MQTTConnectFlagsTestParse03 (
void)
313 de = DetectMQTTConnectFlagsParse(
"will,!");
328 static int MQTTConnectFlagsTestParse04 (
void)
331 de = DetectMQTTConnectFlagsParse(
"");
346 static int MQTTConnectFlagsTestParse05 (
void)
349 de = DetectMQTTConnectFlagsParse(
"username, username");
354 de = DetectMQTTConnectFlagsParse(
"!username, username");
359 de = DetectMQTTConnectFlagsParse(
"!username,password,!password");
364 de = DetectMQTTConnectFlagsParse(
"will, username,password, !will, will");
382 UtRegisterTest(
"MQTTConnectFlagsTestParse01", MQTTConnectFlagsTestParse01);
383 UtRegisterTest(
"MQTTConnectFlagsTestParse02", MQTTConnectFlagsTestParse02);
384 UtRegisterTest(
"MQTTConnectFlagsTestParse03", MQTTConnectFlagsTestParse03);
385 UtRegisterTest(
"MQTTConnectFlagsTestParse04", MQTTConnectFlagsTestParse04);
386 UtRegisterTest(
"MQTTConnectFlagsTestParse05", MQTTConnectFlagsTestParse05);