🔥 Remove PowerGrid and related dependencies

-  Deleted PowerGrid configuration file.
- 🔄 Removed `power-components/livewire-powergrid` and its dependencies (e.g., `simplesoftwareio/simple-qrcode` and `calebporzio/sushi`) from `composer.json` and `composer.lock`.
- 🧼 Cleaned up references to PowerGrid in CSS, JS, tests, and package files.
- 🛠️ Refactored `SecurityMonitor` to eliminate unused methods (`getAttemptsFromIp` and `isIpSuspicious`) dependent on deprecated functionality.
This commit is contained in:
HolgerHatGarKeineNode
2026-06-29 22:35:54 +02:00
parent f9d16cc57d
commit 911f9e4316
9 changed files with 4 additions and 566 deletions
+2 -26
View File
@@ -5,6 +5,7 @@ namespace App\Services;
use App\Models\SecurityAttempt;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
use Throwable;
class SecurityMonitor
@@ -103,23 +104,6 @@ class SecurityMonitor
return false;
}
public function getAttemptsFromIp(string $ip, int $hours = 24): int
{
try {
return SecurityAttempt::query()
->fromIp($ip)
->recent($hours)
->count();
} catch (Throwable) {
return 0;
}
}
public function isIpSuspicious(string $ip, int $threshold = 10, int $hours = 24): bool
{
return $this->getAttemptsFromIp($ip, $hours) >= $threshold;
}
private function extractComponentName(Request $request): ?string
{
try {
@@ -224,14 +208,6 @@ class SecurityMonitor
private function truncate(?string $value, int $length): ?string
{
if ($value === null) {
return null;
}
if (strlen($value) <= $length) {
return $value;
}
return substr($value, 0, $length - 3).'...';
return $value === null ? null : Str::limit($value, $length - 3);
}
}
-3
View File
@@ -11,7 +11,6 @@
"php": "^8.3",
"akuechler/laravel-geoly": "^1.0",
"archtechx/enums": "^1.1",
"calebporzio/sushi": "^2.5",
"laravel/framework": "^13.0",
"laravel/nightwatch": "^1.22",
"laravel/reverb": "^1.0",
@@ -21,11 +20,9 @@
"livewire/livewire": "^4.0",
"livewire/volt": "^1.0",
"openspout/openspout": "^5.0",
"power-components/livewire-powergrid": "^6.7",
"pusher/pusher-php-server": "^7.2.2",
"ralphjsmit/laravel-seo": "^1.7",
"sentry/sentry-laravel": "^4.9",
"simplesoftwareio/simple-qrcode": "^4.2",
"spatie/image": "^3.7",
"spatie/laravel-backup": "^10.0",
"spatie/laravel-ciphersweet": "^1.6",
Generated
+1 -305
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "095f8204681ac28f647e13614de92c7d",
"content-hash": "c17c932d5926ab29b7fc71839f5b066b",
"packages": [
{
"name": "akuechler/laravel-geoly",
@@ -117,60 +117,6 @@
},
"time": "2025-06-06T23:15:09+00:00"
},
{
"name": "bacon/bacon-qr-code",
"version": "2.0.8",
"source": {
"type": "git",
"url": "https://github.com/Bacon/BaconQrCode.git",
"reference": "8674e51bb65af933a5ffaf1c308a660387c35c22"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22",
"reference": "8674e51bb65af933a5ffaf1c308a660387c35c22",
"shasum": ""
},
"require": {
"dasprid/enum": "^1.0.3",
"ext-iconv": "*",
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phly/keep-a-changelog": "^2.1",
"phpunit/phpunit": "^7 | ^8 | ^9",
"spatie/phpunit-snapshot-assertions": "^4.2.9",
"squizlabs/php_codesniffer": "^3.4"
},
"suggest": {
"ext-imagick": "to generate QR code images"
},
"type": "library",
"autoload": {
"psr-4": {
"BaconQrCode\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"authors": [
{
"name": "Ben Scholzen 'DASPRiD'",
"email": "mail@dasprids.de",
"homepage": "https://dasprids.de/",
"role": "Developer"
}
],
"description": "BaconQrCode is a QR code generator for PHP.",
"homepage": "https://github.com/Bacon/BaconQrCode",
"support": {
"issues": "https://github.com/Bacon/BaconQrCode/issues",
"source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8"
},
"time": "2022-12-07T17:46:57+00:00"
},
{
"name": "bitwasp/bech32",
"version": "v0.0.1",
@@ -276,60 +222,6 @@
],
"time": "2026-06-14T18:21:03+00:00"
},
{
"name": "calebporzio/sushi",
"version": "v2.5.4",
"source": {
"type": "git",
"url": "https://github.com/calebporzio/sushi.git",
"reference": "ef71a031f78a80b0ed82ce51fc5b648c01145281"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/calebporzio/sushi/zipball/ef71a031f78a80b0ed82ce51fc5b648c01145281",
"reference": "ef71a031f78a80b0ed82ce51fc5b648c01145281",
"shasum": ""
},
"require": {
"ext-pdo_sqlite": "*",
"ext-sqlite3": "*",
"illuminate/database": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0",
"illuminate/support": "^5.8 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0 || ^12.0 || ^13.0",
"php": "^7.1.3|^8.0"
},
"require-dev": {
"doctrine/dbal": "^2.9 || ^3.1.4",
"orchestra/testbench": "3.8.* || 3.9.* || ^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0",
"phpunit/phpunit": "^7.5 || ^8.4 || ^9.0 || ^10.0 || ^11.0 || ^12.5"
},
"type": "library",
"autoload": {
"psr-4": {
"Sushi\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Caleb Porzio",
"email": "calebporzio@gmail.com"
}
],
"description": "Eloquent's missing \"array\" driver.",
"support": {
"source": "https://github.com/calebporzio/sushi/tree/v2.5.4"
},
"funding": [
{
"url": "https://github.com/calebporzio",
"type": "github"
}
],
"time": "2026-02-21T02:53:22+00:00"
},
{
"name": "carbonphp/carbon-doctrine-types",
"version": "3.2.0",
@@ -606,56 +498,6 @@
],
"time": "2025-08-20T19:15:30+00:00"
},
{
"name": "dasprid/enum",
"version": "1.0.7",
"source": {
"type": "git",
"url": "https://github.com/DASPRiD/Enum.git",
"reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/DASPRiD/Enum/zipball/b5874fa9ed0043116c72162ec7f4fb50e02e7cce",
"reference": "b5874fa9ed0043116c72162ec7f4fb50e02e7cce",
"shasum": ""
},
"require": {
"php": ">=7.1 <9.0"
},
"require-dev": {
"phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11",
"squizlabs/php_codesniffer": "*"
},
"type": "library",
"autoload": {
"psr-4": {
"DASPRiD\\Enum\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-2-Clause"
],
"authors": [
{
"name": "Ben Scholzen 'DASPRiD'",
"email": "mail@dasprids.de",
"homepage": "https://dasprids.de/",
"role": "Developer"
}
],
"description": "PHP 7.1 enum implementation",
"keywords": [
"enum",
"map"
],
"support": {
"issues": "https://github.com/DASPRiD/Enum/issues",
"source": "https://github.com/DASPRiD/Enum/tree/1.0.7"
},
"time": "2025-09-16T12:23:56+00:00"
},
{
"name": "dflydev/dot-access-data",
"version": "v3.0.3",
@@ -4928,84 +4770,6 @@
},
"time": "2026-06-22T14:53:45+00:00"
},
{
"name": "power-components/livewire-powergrid",
"version": "v6.10.3",
"source": {
"type": "git",
"url": "https://github.com/Power-Components/livewire-powergrid.git",
"reference": "77557ae0d59b32715c73ebcfc0c3ba3612d44d37"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Power-Components/livewire-powergrid/zipball/77557ae0d59b32715c73ebcfc0c3ba3612d44d37",
"reference": "77557ae0d59b32715c73ebcfc0c3ba3612d44d37",
"shasum": ""
},
"require": {
"laravel/prompts": "*",
"livewire/livewire": "^3.7|^4.0",
"php": "^8.2"
},
"require-dev": {
"composer/composer": "^2.8",
"laradumps/laradumps": "^4.6",
"larastan/larastan": "^2.0|^3.0",
"laravel/pint": "^1.26",
"laravel/scout": "^10.11.3",
"openspout/openspout": "^4.24.5|^5.0",
"orchestra/testbench": "^9.4|^10.0",
"pestphp/pest": "^3.0|^4.0"
},
"suggest": {
"openspout/openspout": "Required to export XLS and CSV"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"PowerComponents\\LivewirePowerGrid\\Providers\\PowerGridServiceProvider"
]
}
},
"autoload": {
"files": [
"src/functions.php"
],
"psr-4": {
"PowerComponents\\LivewirePowerGrid\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Luan Freitas",
"email": "luanfreitas10@protonmail.com",
"role": "Developer"
},
{
"name": "DanSysAnalyst",
"email": "daniel@sysanalyst.eu",
"role": "Developer"
}
],
"description": "PowerGrid generates Advanced Datatables using Laravel Livewire.",
"homepage": "https://github.com/power-components/livewire-powergrid",
"support": {
"issues": "https://github.com/Power-Components/livewire-powergrid/issues",
"source": "https://github.com/Power-Components/livewire-powergrid/tree/v6.10.3"
},
"funding": [
{
"url": "https://github.com/luanfreitasdev",
"type": "github"
}
],
"time": "2026-05-23T13:11:25+00:00"
},
{
"name": "psr/clock",
"version": "1.0.0",
@@ -6681,74 +6445,6 @@
],
"time": "2026-06-11T13:22:14+00:00"
},
{
"name": "simplesoftwareio/simple-qrcode",
"version": "4.2.0",
"source": {
"type": "git",
"url": "https://github.com/SimpleSoftwareIO/simple-qrcode.git",
"reference": "916db7948ca6772d54bb617259c768c9cdc8d537"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/SimpleSoftwareIO/simple-qrcode/zipball/916db7948ca6772d54bb617259c768c9cdc8d537",
"reference": "916db7948ca6772d54bb617259c768c9cdc8d537",
"shasum": ""
},
"require": {
"bacon/bacon-qr-code": "^2.0",
"ext-gd": "*",
"php": ">=7.2|^8.0"
},
"require-dev": {
"mockery/mockery": "~1",
"phpunit/phpunit": "~9"
},
"suggest": {
"ext-imagick": "Allows the generation of PNG QrCodes.",
"illuminate/support": "Allows for use within Laravel."
},
"type": "library",
"extra": {
"laravel": {
"aliases": {
"QrCode": "SimpleSoftwareIO\\QrCode\\Facades\\QrCode"
},
"providers": [
"SimpleSoftwareIO\\QrCode\\QrCodeServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"SimpleSoftwareIO\\QrCode\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Simple Software LLC",
"email": "support@simplesoftware.io"
}
],
"description": "Simple QrCode is a QR code generator made for Laravel.",
"homepage": "https://www.simplesoftware.io/#/docs/simple-qrcode",
"keywords": [
"Simple",
"generator",
"laravel",
"qrcode",
"wrapper"
],
"support": {
"issues": "https://github.com/SimpleSoftwareIO/simple-qrcode/issues",
"source": "https://github.com/SimpleSoftwareIO/simple-qrcode/tree/4.2.0"
},
"time": "2021-02-08T20:43:55+00:00"
},
{
"name": "simplito/bigint-wrapper-php",
"version": "1.0.0",
-160
View File
@@ -1,160 +0,0 @@
<?php
use PowerComponents\LivewirePowerGrid\Components\Exports\OpenSpout\v5\ExportToCsv;
use PowerComponents\LivewirePowerGrid\Components\Exports\OpenSpout\v5\ExportToXLS;
use PowerComponents\LivewirePowerGrid\Themes\Tailwind;
return [
/*
|--------------------------------------------------------------------------
| Theme
|--------------------------------------------------------------------------
|
| PowerGrid supports Tailwind and Bootstrap 5 themes.
| Configure here the theme of your choice.
*/
'theme' => Tailwind::class,
// 'theme' => \PowerComponents\LivewirePowerGrid\Themes\Bootstrap5::class,
/*
|--------------------------------------------------------------------------
| Plugins
|--------------------------------------------------------------------------
|
| Plugins used: flatpickr.js to datepicker.
|
*/
'plugins' => [
/*
* https://flatpickr.js.org
*/
'flatpickr' => [
'locales' => [
'de_DE' => [
'locale' => 'de',
'dateFormat' => 'd.m.Y H:i',
'enableTime' => true,
'time_24hr' => true,
],
],
],
'select' => [
'default' => 'tom',
/*
* TomSelect Options
* https://tom-select.js.org
*/
'tom' => [
'plugins' => [
'clear_button' => [
'title' => 'Remove all selected options',
],
],
],
/*
* Slim Select options
* https://slimselectjs.com/
*/
'slim' => [
'settings' => [
'alwaysOpen' => false,
],
],
],
],
/*
|--------------------------------------------------------------------------
| Filters
|--------------------------------------------------------------------------
|
| PowerGrid supports inline and outside filters.
| 'inline': Filters data inside the table.
| 'outside': Filters data outside the table.
| 'null'
|
*/
'filter' => 'outside',
/*
|--------------------------------------------------------------------------
| Persisting
|--------------------------------------------------------------------------
|
| PowerGrid supports persisting of the filters, columns and sorting.
| 'session': persist in the session.
| 'cache': persist with cache.
| 'cookies': persist with cookies (default).
|
*/
'persist_driver' => 'cookies',
/*
|--------------------------------------------------------------------------
| Cache
|--------------------------------------------------------------------------
|
| Cache is enabled by default to improve search performance when using collections.
| When enabled, data is reloaded whenever the page is refreshed or a field is updated.
|
*/
'cached_data' => true,
/*
|--------------------------------------------------------------------------
| New Release Notification
|--------------------------------------------------------------------------
|
| PowerGrid can verify if a new release is available when you create a new PowerGrid Table.
|
| This feature depends on composer/composer.
| To install, run: `composer require composer/composer --dev`
|
*/
'check_version' => false,
/*
|--------------------------------------------------------------------------
| Exportable class
|--------------------------------------------------------------------------
|
|
*/
'exportable' => [
'default' => 'openspout_v5',
'openspout_v5' => [
'xlsx' => ExportToXLS::class,
'csv' => ExportToCsv::class,
],
'openspout_v4' => [
'xlsx' => PowerComponents\LivewirePowerGrid\Components\Exports\OpenSpout\v4\ExportToXLS::class,
'csv' => PowerComponents\LivewirePowerGrid\Components\Exports\OpenSpout\v4\ExportToCsv::class,
],
],
/*
|--------------------------------------------------------------------------
| Auto-Discover Models
|--------------------------------------------------------------------------
|
| PowerGrid will search for Models in the directories listed below.
| These Models be listed as options when you run the
| "artisan powergrid:create" command.
|
*/
'auto_discover_models_paths' => [
app_path('Models'),
],
];
+1 -2
View File
@@ -19,8 +19,7 @@
"postcss": "^8.4.41",
"pusher-js": "^8.4.0",
"tailwindcss": "^4.1.18",
"vite": "^8.0.0",
"webln": "^0.3.2"
"vite": "^8.0.0"
},
"dependencies": {
"@tailwindcss/vite": "^4.1.18",
-3
View File
@@ -18,7 +18,6 @@
----------------------------------------- */
@import "tailwindcss";
@import "../../vendor/livewire/flux/dist/flux.css";
@import '../../vendor/power-components/livewire-powergrid/resources/css/tailwind4.css';
@import "./theme.css";
@import "./base.css";
@import "./utilities.css";
@@ -32,8 +31,6 @@
----------------------------------------- */
@source "../views/**/*.blade.php";
@source "../js/**/*.js";
@source '../../vendor/power-components/livewire-powergrid/src/Themes/Tailwind.php';
@source '../../vendor/power-components/livewire-powergrid/resources/views/**/*.php';
@source "../../vendor/livewire/flux/dist/**/*.blade.php";
/* ----------------------------------------
-2
View File
@@ -1,7 +1,5 @@
// import './echo';
import './../../vendor/power-components/livewire-powergrid/dist/powergrid'
import flatpickr from 'flatpickr';
import 'flatpickr/dist/flatpickr.min.css';
-39
View File
@@ -89,45 +89,6 @@ it('never throws exceptions itself', function () {
expect(true)->toBeTrue();
});
it('tracks attempts from same IP', function () {
$exception = new CannotUpdateLockedPropertyException('test');
$request = Request::create('/livewire/update', 'POST', [
'components' => [
['snapshot' => '{}', 'updates' => []],
],
], server: ['REMOTE_ADDR' => '192.168.1.100']);
$request->setRouteResolver(fn () => null);
// Record multiple attempts
$this->monitor->recordFromException($exception, $request);
$this->monitor->recordFromException($exception, $request);
$this->monitor->recordFromException($exception, $request);
expect($this->monitor->getAttemptsFromIp('192.168.1.100'))->toBe(3);
});
it('identifies suspicious IPs', function () {
$exception = new CannotUpdateLockedPropertyException('test');
$request = Request::create('/livewire/update', 'POST', [
'components' => [
['snapshot' => '{}', 'updates' => []],
],
], server: ['REMOTE_ADDR' => '10.0.0.1']);
$request->setRouteResolver(fn () => null);
// Record 10 attempts (threshold)
for ($i = 0; $i < 10; $i++) {
$this->monitor->recordFromException($exception, $request);
}
expect($this->monitor->isIpSuspicious('10.0.0.1', threshold: 10))->toBeTrue()
->and($this->monitor->isIpSuspicious('10.0.0.2', threshold: 10))->toBeFalse();
});
it('truncates long values', function () {
$exception = new CannotUpdateLockedPropertyException('test');
-26
View File
@@ -500,25 +500,6 @@
dependencies:
tslib "^2.4.0"
"@types/chrome@^0.0.74":
version "0.0.74"
resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.74.tgz#f69827c48fcf7fecc90c96089807661749a5a5e3"
integrity sha512-hzosS5CkQcIKCgxcsV2AzbJ36KNxG/Db2YEN/erEu7Boprg+KpMDLBQqKFmSo+JkQMGqRcicUyqCowJpuT+C6A==
dependencies:
"@types/filesystem" "*"
"@types/filesystem@*":
version "0.0.36"
resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.36.tgz#7227c2d76bfed1b21819db310816c7821d303857"
integrity sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==
dependencies:
"@types/filewriter" "*"
"@types/filewriter@*":
version "0.0.33"
resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.33.tgz#d9d611db9d9cd99ae4e458de420eeb64ad604ea8"
integrity sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==
"@types/hast@^3.0.0", "@types/hast@^3.0.4":
version "3.0.4"
resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa"
@@ -1312,13 +1293,6 @@ vite@^8.0.0:
optionalDependencies:
fsevents "~2.3.3"
webln@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/webln/-/webln-0.3.2.tgz#bbadf52916666b6059e3661ef5ab73a76b7cd0f4"
integrity sha512-YYT83aOCLup2AmqvJdKtdeBTaZpjC6/JDMe8o6x1kbTYWwiwrtWHyO//PAsPixF3jwFsAkj5DmiceB6w/QSe7Q==
dependencies:
"@types/chrome" "^0.0.74"
wrap-ansi@^9.0.0:
version "9.0.2"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz#956832dea9494306e6d209eb871643bb873d7c98"