Skip to content

Commit

Permalink
Merge pull request #621 from Flowdalic/fillable-forms-only-require-li…
Browse files Browse the repository at this point in the history
…st-fields-to-have-value-set

[xdata] Only require list-multi and list-single fields to have a value
  • Loading branch information
Flowdalic authored Sep 2, 2024
2 parents 6c7e88f + 4d790aa commit 38c6dd2
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 38c6dd2

Please sign in to comment.