Browse Source

fix: Add row limit to DataCommunicator row data requests (#12415)

* Add row limit to DataCommunicator row data requests

* Add missing constant

* Add unit test

* Add test for extending Grid

* Fixed test
tags/8.15.0
Tatu Lund 2 years ago
parent
commit
2fc98eaf9c
No account linked to committer's email address

+ 15
- 0
server/src/main/java/com/vaadin/data/provider/DataCommunicator.java View File

@@ -60,6 +60,7 @@ import elemental.json.JsonObject;
public class DataCommunicator<T> extends AbstractExtension {

private Registration dataProviderUpdateRegistration;
private static final int MAXIMUM_ALLOWED_ROWS = 500;

/**
* Simple implementation of collection data provider communication. All data
@@ -306,10 +307,24 @@ public class DataCommunicator<T> extends AbstractExtension {
*/
protected void onRequestRows(int firstRowIndex, int numberOfRows,
int firstCachedRowIndex, int cacheSize) {
if (numberOfRows > getMaximumAllowedRows()) {
throw new IllegalStateException(
"Client tried fetch more rows than allowed. This is denied to prevent denial of service.");
}
setPushRows(Range.withLength(firstRowIndex, numberOfRows));
markAsDirty();
}

/**
* Set the maximum allowed rows to be fetched in one query.
*
* @return Maximum allowed rows for one query.
* @since 8.14.1
*/
protected int getMaximumAllowedRows() {
return MAXIMUM_ALLOWED_ROWS;
}

/**
* Triggered when rows have been dropped from the client side cache.
*

+ 8
- 0
server/src/test/java/com/vaadin/data/provider/DataCommunicatorTest.java View File

@@ -314,4 +314,12 @@ public class DataCommunicatorTest {
assertTrue("DataCommunicator should be marked as dirty",
ui.getConnectorTracker().isDirty(communicator));
}


@Test(expected = IllegalStateException.class)
public void requestTooMuchRowsFail() {
TestDataCommunicator communicator = new TestDataCommunicator();
communicator.onRequestRows(0, communicator.getMaximumAllowedRows() + 10,
0, 0);
}
}

+ 19
- 0
server/src/test/java/com/vaadin/tests/server/component/grid/GridTest.java View File

@@ -827,4 +827,23 @@ public class GridTest {
column.isSortableByUser());
}

@Test
public void extendGridCustomDataCommunicator() {
Grid<String> grid = new MyGrid<>();
}

public class MyDataCommunicator<T> extends DataCommunicator<T> {
@Override
protected int getMaximumAllowedRows() {
return 600;
}
}

public class MyGrid<T> extends Grid<T> {

public MyGrid() {
super(new MyDataCommunicator());
}

}
}

Loading…
Cancel
Save