Skip to content

Commit 313db9e

Browse files
committed
Add recursion check to screen consolidatior and exporter
1 parent d6e57f5 commit 313db9e

6 files changed

Lines changed: 22 additions & 3 deletions

File tree

‎ProcessMaker/Assets/ScreensInScreen.php‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
use ProcessMaker\Models\Process;
88
use ProcessMaker\Models\Screen;
99
use ProcessMaker\Providers\WorkflowServiceProvider;
10+
use ProcessMaker\Exception\MaximumRecursionException;
1011

1112
class ScreensInScreen
1213
{
1314
public $type = Screen::class;
1415
public $owner = Screen::class;
16+
private $recursion = 0;
1517

1618
/**
1719
* Get the screens (nested) used in a screen
@@ -23,12 +25,19 @@ class ScreensInScreen
2325
*/
2426
public function referencesToExport(Screen $screen, array $screens = [])
2527
{
28+
if ($this->recursion > 10) {
29+
throw new MaximumRecursionException(
30+
"Max screen recursion depth of 10 exceeded. Is a child screen referencing its parent?"
31+
);
32+
}
33+
2634
$config = $screen->config;
2735
if (is_array($config)) {
2836
$this->findInArray($config, function ($item) use (&$screens) {
2937
if (is_array($item) && isset($item['component']) && $item['component'] === 'FormNestedScreen' && !empty($item['config']['screen'])) {
3038
$screens[] = [Screen::class, $item['config']['screen']];
3139
$screen = Screen::findOrFail($item['config']['screen']);
40+
$this->recursion++;
3241
$screens = $this->referencesToExport($screen, $screens);
3342
}
3443
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace ProcessMaker\Exception;
4+
5+
use Exception;
6+
7+
class MaximumRecursionException extends Exception
8+
{
9+
}

‎ProcessMaker/Http/Controllers/Api/ProcessController.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ public function export(Request $request, Process $process)
670670
$url = url("/processes/{$process->id}/download/{$fileKey}");
671671
return ['url' => $url];
672672
} else {
673-
return response(['error' => __('Unable to Export Process')], 500);
673+
return response(['message' => __('Unable to Export Process')], 500);
674674
}
675675
}
676676

‎resources/views/processes/export.blade.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
ProcessMaker.alert('{{__('The process was exported.')}}', 'success');
5656
})
5757
.catch(error => {
58-
ProcessMaker.alert(error.response.data.error, 'danger');
58+
ProcessMaker.alert(error.response.data.message, 'danger');
5959
});
6060
}
6161
}

‎resources/views/processes/screens/export.blade.php‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
ProcessMaker.alert('{{__('The screen was exported.')}}', 'success');
6161
})
6262
.catch(error => {
63-
ProcessMaker.alert(error.response.data.error, 'danger');
63+
ProcessMaker.alert(error.response.data.message, 'danger');
6464
});
6565
}
6666
}

‎routes/api.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
Route::delete('screens/{screen}', 'ScreenController@destroy')->name('screens.destroy')->middleware('can:delete-screens');
5757
Route::post('screens/{screen}/export', 'ScreenController@export')->name('screens.export')->middleware('can:export-screens');
5858
Route::post('screens/import', 'ScreenController@import')->name('screens.import')->middleware('can:import-screens');
59+
Route::post('screens/preview', 'ScreenController@preview')->name('screens.preview')->middleware('can:edit-screens');
5960

6061
// Screen Categories
6162
Route::get('screen_categories', 'ScreenCategoryController@index')->name('screen_categories.index')->middleware('can:view-screen-categories');

0 commit comments

Comments
 (0)