1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-10-18 12:15:58 +02:00

[xdata] Only require list-multi and list-single fields to have a value

Only list-multi and list-single fields require at least one value when
submitting a form. In other cases, for example XEP-0045's
muc#roomconfig_roomadmins, which is of type jid-multi, is used without
any values to reset the room's admins list.

Fixes SMACK-946.
This commit is contained in:
Florian Schmaus 2024-09-01 21:52:25 +02:00
parent 6c7e88f3a0
commit 4d790aa7db

View file

@ -30,6 +30,8 @@ import org.jivesoftware.smackx.xdata.AbstractMultiFormField;
import org.jivesoftware.smackx.xdata.AbstractSingleStringValueFormField; import org.jivesoftware.smackx.xdata.AbstractSingleStringValueFormField;
import org.jivesoftware.smackx.xdata.FormField; import org.jivesoftware.smackx.xdata.FormField;
import org.jivesoftware.smackx.xdata.FormFieldChildElement; import org.jivesoftware.smackx.xdata.FormFieldChildElement;
import org.jivesoftware.smackx.xdata.ListMultiFormField;
import org.jivesoftware.smackx.xdata.ListSingleFormField;
import org.jivesoftware.smackx.xdata.packet.DataForm; import org.jivesoftware.smackx.xdata.packet.DataForm;
import org.jxmpp.jid.Jid; import org.jxmpp.jid.Jid;
@ -226,11 +228,20 @@ public class FillableForm extends FilledForm {
if (filledFormField.getType() == FormField.Type.fixed) { if (filledFormField.getType() == FormField.Type.fixed) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
if (!filledFormField.hasValueSet()) {
throw new IllegalArgumentException();
}
String fieldName = filledFormField.getFieldName(); String fieldName = filledFormField.getFieldName();
boolean isListField = filledFormField instanceof ListMultiFormField
|| filledFormField instanceof ListSingleFormField;
// Only list-* fields require a value to be set. Other fields types can be empty. For example MUC's
// muc#roomconfig_roomadmins, which is of type jid-multi, is submitted without values to reset the room's admin
// list.
if (isListField && !filledFormField.hasValueSet()) {
throw new IllegalArgumentException("Tried to write form field " + fieldName + " of type "
+ filledFormField.getType()
+ " without any values set. However, according to XEP-0045 § 3.3 fields of type list-multi or list-single must have one item set.");
}
if (!getDataForm().hasField(fieldName)) { if (!getDataForm().hasField(fieldName)) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }