Skip to content

Commit

Permalink
[xdata] Only require list-multi and list-single fields to have a value
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Flowdalic committed Sep 1, 2024
1 parent 6c7e88f commit 4d790aa
Showing 1 changed file with 14 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import org.jivesoftware.smackx.xdata.AbstractSingleStringValueFormField;
import org.jivesoftware.smackx.xdata.FormField;
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.jxmpp.jid.Jid;
Expand Down Expand Up @@ -226,11 +228,20 @@ public final void write(FormField filledFormField) {
if (filledFormField.getType() == FormField.Type.fixed) {
throw new IllegalArgumentException();
}
if (!filledFormField.hasValueSet()) {
throw new IllegalArgumentException();
}

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)) {
throw new IllegalArgumentException();
}
Expand Down

0 comments on commit 4d790aa

Please sign in to comment.