From 47e19d762c30d673a960fc470f58e6eb94db1846 Mon Sep 17 00:00:00 2001 From: Michael Engel Date: Sun, 24 Mar 2024 16:57:35 +0000 Subject: [PATCH] Added Logger area and compatibility with Kirby4 --- .editorconfig | 12 + .gitattributes | 26 +- .github/kirby-logger.png | Bin 0 -> 142788 bytes LICENSE.md | 2 +- Logger.php | 105 ++++ README.md | 104 +++- classes/Log.php | 148 ----- classes/Logger.php | 346 ----------- composer.json | 27 +- composer.lock | 744 ------------------------ config/api.php | 63 ++ config/areas.php | 29 + config/hooks.php | 46 ++ config/translations.php | 30 + index.css | 2 +- index.js | 7 +- index.php | 98 +--- logs-schema.sql | 20 +- src/LoggerArea.vue | 232 ++++++++ src/components/LoggerArea.vue | 192 ------ src/index.js | 18 +- vendor/autoload.php | 7 - vendor/composer/ClassLoader.php | 572 ------------------ vendor/composer/InstalledVersions.php | 337 ----------- vendor/composer/autoload_classmap.php | 16 - vendor/composer/autoload_namespaces.php | 9 - vendor/composer/autoload_psr4.php | 11 - vendor/composer/autoload_real.php | 57 -- vendor/composer/autoload_static.php | 50 -- vendor/composer/installed.php | 32 - vendor/composer/platform_check.php | 26 - 31 files changed, 682 insertions(+), 2686 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/kirby-logger.png create mode 100644 Logger.php delete mode 100644 classes/Log.php delete mode 100644 classes/Logger.php delete mode 100644 composer.lock create mode 100644 config/api.php create mode 100644 config/areas.php create mode 100644 config/hooks.php create mode 100644 config/translations.php create mode 100644 src/LoggerArea.vue delete mode 100644 src/components/LoggerArea.vue delete mode 100644 vendor/autoload.php delete mode 100644 vendor/composer/ClassLoader.php delete mode 100644 vendor/composer/InstalledVersions.php delete mode 100644 vendor/composer/autoload_classmap.php delete mode 100644 vendor/composer/autoload_namespaces.php delete mode 100644 vendor/composer/autoload_psr4.php delete mode 100644 vendor/composer/autoload_real.php delete mode 100644 vendor/composer/autoload_static.php delete mode 100644 vendor/composer/installed.php delete mode 100644 vendor/composer/platform_check.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..942ac34 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true + +[*.php] +indent_size = 4 \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index dfe0770..30001a9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,24 @@ -# Auto detect text files and perform LF normalization -* text=auto +# Git +.gitattributes export-ignore +.github/ export-ignore +.gitignore export-ignore + +# Source files +scripts/ export-ignore +src/panel/ export-ignore + +# Development files +.editorconfig export-ignore +.eslintrc.js export-ignore +composer.lock export-ignore +package.json export-ignore +pnpm-lock.yaml export-ignore + +# Tests +.codecov.yml export-ignore +.composer-require-checker.json export-ignore +.php-cs-fixer.dist.php export-ignore +phpmd.xml.dist export-ignore +phpunit.xml.dist export-ignore +psalm.xml.dist export-ignore +tests/ export-ignore diff --git a/.github/kirby-logger.png b/.github/kirby-logger.png new file mode 100644 index 0000000000000000000000000000000000000000..70cff5af810fa42455a64f3dc45100bf16407f86 GIT binary patch literal 142788 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
    Q)SAwj;o)Z+hWWT)dVlFNKqZ~ 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 literal 0 HcmV?d00001 diff --git a/LICENSE.md b/LICENSE.md index c4968ae..b28bf0f 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Michael Scheurich +Copyright (c) 2021 Michael Engel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Logger.php b/Logger.php new file mode 100644 index 0000000..f781252 --- /dev/null +++ b/Logger.php @@ -0,0 +1,105 @@ + 'sqlite', + 'database' => kirby()->root('logs') . "/logger.sqlite" + ]); + + if (!self::$connection->validateTable('logs')) { + self::$connection->execute(F::read(__DIR__ . '/logs-schema.sql')); + } + + return self::$connection; + } + + public static function write( + string $message, + string $level = self::LEVEL_INFO, + string $channel = self::CHANNEL_DEFAULT, + array $context = [], + array $extra = [], + ): void { + if (!in_array($channel, self::getChannels())) { + throw new \Exception("Logger channel $channel is not configured!"); + } + (self::connect())->table('monolog')->insert([ + 'channel' => $channel, + 'level' => $level, + 'message' => $message, + 'context' => Json::encode($context), + 'extra' => Json::encode($extra), + 'created_at' => Date::now()->format("Y-m-d\TH:i:s.uO"), + ]); + } + + + public static function __callStatic(string $method, array $arguments) + { + $level = Str::upper($method); + if (in_array($level, static::LEVELS)) { + $arguments['level'] = $level; + self::write(...$arguments); + return; + } + + throw new InvalidArgumentException('Invalid static Db method: ' . $method); + } + + public static function getLevels(): array + { + return self::LEVELS; + } + + public static function getChannels(): array + { + $channelsFromConfig = option('michnhokn.logger.channels', []); + return A::merge(self::CHANNELS, $channelsFromConfig); + } +} diff --git a/README.md b/README.md index 96e743f..067a6f6 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,92 @@ -# A Website logger for Kirby3 +![Kirby Logger](./.github/kirby-logger.png) -![Release](https://flat.badgen.net/packagist/v/michnhokn/kirby3-logger?color=92a9c4) -![Last Commit](https://flat.badgen.net/github/last-commit/michnhokn/kirby3-logger?color=92c496) +# Kirby Logger -![Kirby Logger](https://user-images.githubusercontent.com/38752255/141615310-f35b7dde-c732-4d5e-81b7-506d5dfc55db.png) +Gain deeper insights into your Kirby website's behavior with the powerful Logger. The new Logger panel area provides a +clear view of what's happening behind the scenes, while the included Logger utility lets you easily log events within +your custom code. This combination empowers you to both understand your website's activity and streamline debugging for +a smoother development experience. -## Commercial Usage +## Key Features -This plugin is free but if you use it in a commercial project please consider to - -- [buy me a 🍺](https://buymeacoff.ee/michnhokn) +* 🕵️ **Effortless Log Exploration:** The intuitive panel view makes exploring your website's logs a breeze. Quickly find + the information you need to understand what's happening. +* 💾 **Reliable Log Storage:** Enjoy peace of mind knowing your logs are saved securely and efficiently using SQLite, a + robust database technology. +* 🐞 **Comprehensive Logging:** Gain a complete picture of your website's behavior. The extension automatically captures + all Kirby after hooks and logs exceptions, providing valuable insights. +* ⚡️ **Customizable Event Logging:** Take control of your debugging process! The custom Logger utility empowers you to + effortlessly log specific events within your custom code, allowing you to pinpoint issues with greater speed and + accuracy. ## Installation -- unzip [main.zip](https://github.com/michnhokn/kirby3-logger/archive/main.zip) as - folder `site/plugins/kirby3-logger` or -- `git submodule add https://github.com/michnhokn/kirby3-logger.git site/plugins/kirby3-logger` or -- `composer require michnhokn/kirby3-logger` +### Composer + +``` +composer require michnhokn/kirby-logger +``` + +### Download + +Download and copy this repository to `/site/plugins/kirby-logger` + +## Usage + +Bolster your website's security with the comprehensive Audit Logs feature. This new panel section offers a centralized +view of all activity, complete with timestamps for context. Leverage granular filtering by channel and log level, or +utilize the powerful search bar to pinpoint specific events with ease. Gain actionable insights and stay on top of +everything happening within your website. + +### Configuration + +```php + [ + // optional - add your custom channels for better filtering in the panel + 'channels' => ['custom', 'my-plugin-a'], + + // optional - add specific hooks to an ignore list to prevent spamming in the panel + 'ignoreHooks' => [ + 'page.render:after', + 'kirbytags:after' + ] + ] +]; +``` + +### Logger Utility + +The `Michnhokn\Logger` class lets you easily add new log entries. Available levels +are `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`. + +```php +// Write a custom log entry +\Michnhokn\Logger::write( + message: 'Whoops! Something bad happened.', + level: Logger::LEVEL_ERROR, + context: ['userId' => App::instance()->user()?->id()] +); -## Features -⚠️ This plugin is under development. Please rethink using it in a commercial project. -* Log the following actions to a searchable and filterable table: `user`, `file`, `page`, `site` -* Seperate panel view +// you can also use all available levels as a method name +\Michnhokn\Logger::info('A user logged in.',context: ['userId' => App::instance()->user()?->id()]); +``` -## Setup -Just install the plugin. At the moment there are no settings what soever. +## Upcoming features -## Upcomming features -* Permissions to view the logs -* More configuration for the panel view -* More details in the panel view +* More details in the panel view (e.g. event arguments) +* More configuration for the panel view (e.g. date filter, event context) +* Better translations for the panel -## Misc +## Support the project -**License**: `MIT` +> [!NOTE] +> This plugin is provided free of charge & published under the permissive MIT License. If you use it in a commercial +> project, please consider to [buy me a beer 🍺](https://buymeacoff.ee/michnhokn) -**Credits**: [MichnHokn](https://github.com/michnhokn) +## License -**Inspiration**: [Kirby Logger](https://github.com/texnixe/kirby-logger) by @texnixe | [Logger for Kirby 3](https://github.com/medienbaecker/kirby-logger) by @medienbaecker +[MIT](./LICENSE.md) License © 2021-PRESENT [Michael Engel](https://github.com/michnhokn) diff --git a/classes/Log.php b/classes/Log.php deleted file mode 100644 index 5ff4ac9..0000000 --- a/classes/Log.php +++ /dev/null @@ -1,148 +0,0 @@ -type = $parameter['type'] ?? null; - $this->action = $parameter['action'] ?? null; - $this->user = $parameter['user'] ?? null; - $this->slug = $parameter['slug'] ?? null; - $this->language = $parameter['language'] ?? null; - } - - public function toArray(): array - { - return [ - 'type' => $this->type, - 'action' => $this->action, - 'user' => $this->user, - 'slug' => $this->slug, - 'language' => $this->language, - 'oldData' => $this->oldData, - 'newData' => $this->newData, - ]; - } - - /** - * @return string - */ - public function getType(): string - { - return $this->type; - } - - /** - * @return string - */ - public function getAction(): string - { - return $this->action; - } - - /** - * @param string $action - */ - public function setAction(string $action): void - { - $this->action = $action; - } - - /** - * @return string - */ - public function getUser(): string - { - return $this->user; - } - - /** - * @param string $user - */ - public function setUser(string $user): void - { - $this->user = $user; - } - - /** - * @return string - */ - public function getSlug(): string - { - return $this->slug; - } - - /** - * @param string $slug - */ - public function setSlug(string $slug): void - { - $this->slug = $slug; - } - - /** - * @return string - */ - public function getLanguage(): string - { - return $this->language; - } - - /** - * @param string $language - */ - public function setLanguage(string $language): void - { - $this->language = $language; - } - - /** - * @return - */ - public function getOldData() - { - return $this->oldData; - } - - /** - * @param $oldData - */ - public function setOldData($oldData = null) - { - $this->oldData = $oldData; - } - - /** - * @return - */ - public function getNewData() - { - return $this->newData; - } - - /** - * @param $newData - */ - public function setNewData($newData): void - { - $this->newData = $newData; - } - - /** - * @param string $type - */ - public function setType(string $type): void - { - $this->type = $type; - } -} \ No newline at end of file diff --git a/classes/Logger.php b/classes/Logger.php deleted file mode 100644 index 1c32973..0000000 --- a/classes/Logger.php +++ /dev/null @@ -1,346 +0,0 @@ -root('logs') . '/kirby3-logger/'; - $schema = F::read(__DIR__ . '/../logs-schema.sql'); - - Dir::make($logDir, true); - - static::$connection = new Database(['type' => 'sqlite', 'database' => $logDir . 'logs.sqlite']); - if (!self::$connection->validateTable('logs')) { - self::$connection->execute($schema); - } - - return self::$connection; - } - - /** - * @param int $page - * @param int $limit - * @param array $filter - * @return array - */ - public static function logs(int $page = 1, int $limit = 10, array $filter = []): array - { - if (!self::$connection->validateTable('logs')) { - return []; - } - - $query = self::$connection->table('logs')->select('*'); - - if (!empty($filter['timestamp'])) { - $query->where("timestamp >= '{$filter['timestamp']}'"); - } - if (!empty($filter['oldSearch'])) { - $query->where("oldData LIKE '%{$filter['oldSearch']}%'"); - } - if (!empty($filter['newSearch'])) { - $query->where("newData LIKE '%{$filter['newSearch']}%'"); - } - if (!empty($filter['slug'])) { - $query->where("slug LIKE '%{$filter['slug']}%'"); - } - if (!empty($filter['action'])) { - $query->where(['action' => $filter['action']]); - } - if (!empty($filter['type'])) { - $query->where(['type' => $filter['type']]); - } - if (!empty($filter['user'])) { - $query->where(['user' => $filter['user']]); - } - if (!empty($filter['language'])) { - $query->where(['language' => $filter['language']]); - } - - $totalQuery = clone $query; - - $total = $totalQuery->count(); - /** @var Collection $result */ - $result = $query->page($page, $limit); - - return [ - 'logs' => $result ? array_values($result->toArray()) : [], - 'total' => $total ?? 0, - ]; - } - - /** - * @return int - */ - public static function total(): int - { - if (!self::$connection->validateTable('logs')) { - return 0; - } - - return self::$connection - ->table('logs') - ->count(); - } - - /** - * @param string $field - * @return array - */ - public static function options(string $field): array - { - if (!self::$connection->validateTable('logs')) { - return []; - } - $results = self::$connection - ->table('logs') - ->select($field) - ->distinct() - ->fetch('array') - ->all() - ->data(); - - return array_map(function ($result) { - return [ - 'value' => current($result), - 'text' => current($result), - ]; - }, $results); - } - - /** - * @param Event $event - */ - public static function log(Event $event): void - { - if (!in_array($event->type(), self::TYPES)) { - return; - } - - $log = self::getLog($event); - self::$connection->table('logs')->insert($log->toArray()); - } - - /** - * @param Event $event - * @return Log - */ - private static function getLog(Event $event): Log - { - $log = new Log([ - 'type' => $event->type(), - 'action' => $event->action(), - 'user' => kirby()->user()->email(), - 'language' => kirby()->languageCode(), - ]); - $type = $event->type(); - $action = $event->action(); - - switch ($type) { - case 'site': - $log->setSlug($event->newSite()->id()); - switch ($action) { - case 'changeTitle': - $log->setOldData($event->oldSite()->title()->toString()); - $log->setNewData($event->newSite()->title()->toString()); - - return $log; - case 'update': - $log->setOldData($event->oldSite()->content()->toArray()); - $log->setNewData($event->newSite()->content()->toArray()); - - return $log; - } - break; - case 'page': - switch ($action) { - case 'changeNum': - $log->setSlug($event->newPage()->id()); - $log->setOldData($event->oldPage()->num()); - $log->setNewData($event->newPage()->num()); - - return $log; - case 'changeSlug': - $log->setSlug($event->newPage()->id()); - $log->setOldData($event->oldPage()->slug()); - $log->setNewData($event->newPage()->slug()); - - return $log; - case 'changeStatus': - $log->setSlug($event->newPage()->id()); - $log->setOldData($event->oldPage()->status()); - $log->setNewData($event->newPage()->status()); - - return $log; - case 'changeTemplate': - $log->setSlug($event->newPage()->id()); - $log->setOldData($event->oldPage()->template()->name()); - $log->setNewData($event->newPage()->template()->name()); - - return $log; - case 'changeTitle': - $log->setSlug($event->newPage()->id()); - $log->setOldData($event->oldPage()->title()->toString()); - $log->setNewData($event->newPage()->title()->toString()); - - return $log; - case 'create': - $log->setSlug($event->page()->id()); - $log->setOldData(); - $log->setNewData($event->page()->toArray()); - - return $log; - case 'delete': - $log->setSlug($event->page()->id()); - $log->setOldData($event->page()->toArray()); - $log->setNewData('x'); - - return $log; - case 'duplicate': - $log->setSlug($event->duplicatePage()->id()); - $log->setOldData($event->originalPage()->toArray()); - $log->setNewData($event->duplicatePage()->toArray()); - - return $log; - case 'update': - $log->setSlug($event->newPage()->id()); - $log->setOldData($event->oldPage()->content()->toArray()); - $log->setNewData($event->newPage()->content()->toArray()); - - return $log; - } - break; - case 'file': - switch ($action) { - case 'changeName': - $log->setSlug($event->newFile()->id()); - $log->setOldData($event->oldFile()->title()->toString()); - $log->setNewData($event->newFile()->title()->toString()); - - return $log; - case 'changeSort': - $log->setSlug($event->newFile()->id()); - $log->setOldData($event->oldFile()->sort()); - $log->setNewData($event->newFile()->sort()); - - return $log; - case 'create': - $log->setSlug($event->file()->id()); - $log->setOldData(); - $log->setNewData($event->file()->toArray()); - - return $log; - case 'delete': - $log->setSlug($event->file()->id()); - $log->setOldData($event->file()->toArray()); - $log->setNewData('x'); - - return $log; - case 'update': - case 'replace': - $log->setSlug($event->newFile()->id()); - $log->setOldData($event->oldFile()->toArray()); - $log->setNewData($event->newFile()->toArray()); - - return $log; - } - break; - case 'user': - switch ($action) { - case 'changeEmail': - $log->setSlug($event->newUser()->id()); - $log->setOldData($event->oldUser()->email()); - $log->setNewData($event->newUser()->email()); - - return $log; - case 'changeLanguage': - $log->setSlug($event->newUser()->id()); - $log->setOldData($event->oldUser()->language()); - $log->setNewData($event->newUser()->language()); - - return $log; - case 'changeName': - $log->setSlug($event->newUser()->id()); - $log->setOldData($event->oldUser()->name()->toString()); - $log->setNewData($event->newUser()->name()->toString()); - - return $log; - case 'changePassword': - $log->setSlug($event->newUser()->id()); - $log->setOldData($event->oldUser()->password()); - $log->setNewData('●●●●●●●●'); - - return $log; - case 'changeRole': - $log->setSlug($event->newUser()->id()); - $log->setOldData($event->oldUser()->role()->name()); - $log->setNewData($event->newUser()->role()->name()); - - return $log; - case 'create': - $log->setSlug($event->user()->id()); - $log->setOldData(''); - $log->setNewData($event->user()->toArray()); - - return $log; - case 'delete': - $log->setSlug($event->user()->id()); - $log->setOldData($event->user()->toArray()); - $log->setNewData('x'); - - return $log; - case 'update': - $log->setSlug($event->newUser()->id()); - $log->setOldData($event->oldUser()->toArray()); - $log->setNewData($event->newUser()->toArray()); - - return $log; - case 'login': - $log->setSlug($event->user()->id()); - $log->setOldData(); - $log->setNewData('-'); - - return $log; - case 'logout': - $log->setSlug($event->user()->id()); - $log->setOldData(); - $log->setNewData('x'); - - return $log; - } - break; - } - - $log->setSlug('error'); - $log->setOldData('-'); - $log->setNewData('-'); - - return $log; - } -} diff --git a/composer.json b/composer.json index 1ae01dc..87f0ba7 100644 --- a/composer.json +++ b/composer.json @@ -1,34 +1,31 @@ { - "name": "michnhokn/kirby3-logger", - "description": "Add a logger to your Kirby3 website", + "name": "michnhokn/kirby-logger", + "description": "Add a logger to your Kirby website", "type": "kirby-plugin", - "version": "0.9.0", + "version": "1.0.0", "license": "MIT", "authors": [ { - "name": "Michael Scheurich", - "email": "support@michaelscheurich.dev" + "name": "Michael Engel", + "email": "support@michaelengel.dev" } ], "keywords": [ - "kirby3", - "kirby3-cms", - "kirby3-plugin", + "kirby", + "kirby-plugin", "logger", "website-log", "user-log", - "panel-log" + "panel-log", + "monolog" ], "config": { - "optimize-autoloader": true - }, - "autoload": { - "psr-4": { - "Michnhokn\\": "classes/" + "optimize-autoloader": true, + "allow-plugins": { + "getkirby/composer-installer": true } }, "require": { - "php": ">=8.0.0", "getkirby/composer-installer": "^1.1" } } diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 4e3a6db..0000000 --- a/composer.lock +++ /dev/null @@ -1,744 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "1a98da105a8991d1384172d086b5e240", - "packages": [ - { - "name": "getkirby/composer-installer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/getkirby/composer-installer.git", - "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getkirby/composer-installer/zipball/c98ece30bfba45be7ce457e1102d1b169d922f3d", - "reference": "c98ece30bfba45be7ce457e1102d1b169d922f3d", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0" - }, - "require-dev": { - "composer/composer": "^1.8 || ^2.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Kirby\\ComposerInstaller\\Plugin" - }, - "autoload": { - "psr-4": { - "Kirby\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins", - "homepage": "https://getkirby.com", - "support": { - "issues": "https://github.com/getkirby/composer-installer/issues", - "source": "https://github.com/getkirby/composer-installer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://getkirby.com/buy", - "type": "custom" - } - ], - "time": "2020-12-28T12:54:39+00:00" - } - ], - "packages-dev": [ - { - "name": "claviska/simpleimage", - "version": "3.6.3", - "source": { - "type": "git", - "url": "https://github.com/claviska/SimpleImage.git", - "reference": "21b6f4bf4ef1927158b3e29bd0c2d99c6681c750" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/claviska/SimpleImage/zipball/21b6f4bf4ef1927158b3e29bd0c2d99c6681c750", - "reference": "21b6f4bf4ef1927158b3e29bd0c2d99c6681c750", - "shasum": "" - }, - "require": { - "ext-gd": "*", - "league/color-extractor": "0.3.*", - "php": ">=5.6.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "claviska": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Cory LaViska", - "homepage": "http://www.abeautifulsite.net/", - "role": "Developer" - } - ], - "description": "A PHP class that makes working with images as simple as possible.", - "support": { - "issues": "https://github.com/claviska/SimpleImage/issues", - "source": "https://github.com/claviska/SimpleImage/tree/3.6.3" - }, - "funding": [ - { - "url": "https://github.com/claviska", - "type": "github" - } - ], - "time": "2021-04-20T12:18:18+00:00" - }, - { - "name": "filp/whoops", - "version": "2.14.4", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "f056f1fe935d9ed86e698905a957334029899895" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/f056f1fe935d9ed86e698905a957334029899895", - "reference": "f056f1fe935d9ed86e698905a957334029899895", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "symfony/var-dumper": "Pretty print complex values better with var-dumper available", - "whoops/soap": "Formats errors as SOAP responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Whoops\\": "src/Whoops/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" - } - ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", - "keywords": [ - "error", - "exception", - "handling", - "library", - "throwable", - "whoops" - ], - "support": { - "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.4" - }, - "funding": [ - { - "url": "https://github.com/denis-sokolov", - "type": "github" - } - ], - "time": "2021-10-03T12:00:00+00:00" - }, - { - "name": "getkirby/cms", - "version": "3.6.0-rc.5", - "source": { - "type": "git", - "url": "https://github.com/getkirby/kirby.git", - "reference": "e49fd8265823ec630085aa310c335864b8f8e65c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getkirby/kirby/zipball/e49fd8265823ec630085aa310c335864b8f8e65c", - "reference": "e49fd8265823ec630085aa310c335864b8f8e65c", - "shasum": "" - }, - "require": { - "claviska/simpleimage": "3.6.3", - "ext-ctype": "*", - "ext-mbstring": "*", - "filp/whoops": "2.14.4", - "getkirby/composer-installer": "^1.2.1", - "laminas/laminas-escaper": "2.9.0", - "michelf/php-smartypants": "1.8.1", - "mustangostang/spyc": "0.6.3", - "php": ">=7.4.0 <8.1.0", - "phpmailer/phpmailer": "6.5.1", - "psr/log": "1.1.4", - "true/punycode": "2.1.1" - }, - "type": "kirby-cms", - "autoload": { - "psr-4": { - "Kirby\\": "src/" - }, - "classmap": [ - "dependencies/" - ], - "files": [ - "config/setup.php", - "config/helpers.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "proprietary" - ], - "authors": [ - { - "name": "Kirby Team", - "email": "support@getkirby.com", - "homepage": "https://getkirby.com" - } - ], - "description": "The Kirby 3 core", - "homepage": "https://getkirby.com", - "keywords": [ - "cms", - "core", - "kirby" - ], - "support": { - "email": "support@getkirby.com", - "forum": "https://forum.getkirby.com", - "issues": "https://github.com/getkirby/kirby/issues", - "source": "https://github.com/getkirby/kirby" - }, - "funding": [ - { - "url": "https://getkirby.com/buy", - "type": "custom" - } - ], - "time": "2021-11-12T15:56:35+00:00" - }, - { - "name": "laminas/laminas-escaper", - "version": "2.9.0", - "source": { - "type": "git", - "url": "https://github.com/laminas/laminas-escaper.git", - "reference": "891ad70986729e20ed2e86355fcf93c9dc238a5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/891ad70986729e20ed2e86355fcf93c9dc238a5f", - "reference": "891ad70986729e20ed2e86355fcf93c9dc238a5f", - "shasum": "" - }, - "require": { - "php": "^7.3 || ~8.0.0 || ~8.1.0" - }, - "conflict": { - "zendframework/zend-escaper": "*" - }, - "require-dev": { - "laminas/laminas-coding-standard": "~2.3.0", - "phpunit/phpunit": "^9.3", - "psalm/plugin-phpunit": "^0.12.2", - "vimeo/psalm": "^3.16" - }, - "suggest": { - "ext-iconv": "*", - "ext-mbstring": "*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Laminas\\Escaper\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", - "homepage": "https://laminas.dev", - "keywords": [ - "escaper", - "laminas" - ], - "support": { - "chat": "https://laminas.dev/chat", - "docs": "https://docs.laminas.dev/laminas-escaper/", - "forum": "https://discourse.laminas.dev", - "issues": "https://github.com/laminas/laminas-escaper/issues", - "rss": "https://github.com/laminas/laminas-escaper/releases.atom", - "source": "https://github.com/laminas/laminas-escaper" - }, - "funding": [ - { - "url": "https://funding.communitybridge.org/projects/laminas-project", - "type": "community_bridge" - } - ], - "time": "2021-09-02T17:10:53+00:00" - }, - { - "name": "league/color-extractor", - "version": "0.3.2", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/color-extractor.git", - "reference": "837086ec60f50c84c611c613963e4ad2e2aec806" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/color-extractor/zipball/837086ec60f50c84c611c613963e4ad2e2aec806", - "reference": "837086ec60f50c84c611c613963e4ad2e2aec806", - "shasum": "" - }, - "require": { - "ext-gd": "*", - "php": ">=5.4.0" - }, - "replace": { - "matthecat/colorextractor": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2", - "phpunit/phpunit": "~5" - }, - "type": "library", - "autoload": { - "psr-4": { - "": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mathieu Lechat", - "email": "math.lechat@gmail.com", - "homepage": "http://matthecat.com", - "role": "Developer" - } - ], - "description": "Extract colors from an image as a human would do.", - "homepage": "https://github.com/thephpleague/color-extractor", - "keywords": [ - "color", - "extract", - "human", - "image", - "palette" - ], - "support": { - "issues": "https://github.com/thephpleague/color-extractor/issues", - "source": "https://github.com/thephpleague/color-extractor/tree/master" - }, - "time": "2016-12-15T09:30:02+00:00" - }, - { - "name": "michelf/php-smartypants", - "version": "1.8.1", - "source": { - "type": "git", - "url": "https://github.com/michelf/php-smartypants.git", - "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/michelf/php-smartypants/zipball/47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", - "reference": "47d17c90a4dfd0ccf1f87e25c65e6c8012415aad", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Michelf": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Michel Fortin", - "email": "michel.fortin@michelf.ca", - "homepage": "https://michelf.ca/", - "role": "Developer" - }, - { - "name": "John Gruber", - "homepage": "https://daringfireball.net/" - } - ], - "description": "PHP SmartyPants", - "homepage": "https://michelf.ca/projects/php-smartypants/", - "keywords": [ - "dashes", - "quotes", - "spaces", - "typographer", - "typography" - ], - "support": { - "issues": "https://github.com/michelf/php-smartypants/issues", - "source": "https://github.com/michelf/php-smartypants/tree/1.8.1" - }, - "time": "2016-12-13T01:01:17+00:00" - }, - { - "name": "mustangostang/spyc", - "version": "0.6.3", - "source": { - "type": "git", - "url": "git@github.com:mustangostang/spyc.git", - "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mustangostang/spyc/zipball/4627c838b16550b666d15aeae1e5289dd5b77da0", - "reference": "4627c838b16550b666d15aeae1e5289dd5b77da0", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "phpunit/phpunit": "4.3.*@dev" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5.x-dev" - } - }, - "autoload": { - "files": [ - "Spyc.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "mustangostang", - "email": "vlad.andersen@gmail.com" - } - ], - "description": "A simple YAML loader/dumper class for PHP", - "homepage": "https://github.com/mustangostang/spyc/", - "keywords": [ - "spyc", - "yaml", - "yml" - ], - "time": "2019-09-10T13:16:29+00:00" - }, - { - "name": "phpmailer/phpmailer", - "version": "v6.5.1", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dd803df5ad7492e1b40637f7ebd258fee5ca7355", - "reference": "dd803df5ad7492e1b40637f7ebd258fee5ca7355", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.2", - "php-parallel-lint/php-console-highlighter": "^0.5.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.6.0", - "yoast/phpunit-polyfills": "^1.0.0" - }, - "suggest": { - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "support": { - "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.5.1" - }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2021-08-18T09:14:16+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.23.1", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", - "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T12:26:48+00:00" - }, - { - "name": "true/punycode", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/true/php-punycode.git", - "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/true/php-punycode/zipball/a4d0c11a36dd7f4e7cd7096076cab6d3378a071e", - "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "symfony/polyfill-mbstring": "^1.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.7", - "squizlabs/php_codesniffer": "~2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "TrueBV\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Renan Gonçalves", - "email": "renan.saddam@gmail.com" - } - ], - "description": "A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)", - "homepage": "https://github.com/true/php-punycode", - "keywords": [ - "idna", - "punycode" - ], - "support": { - "issues": "https://github.com/true/php-punycode/issues", - "source": "https://github.com/true/php-punycode/tree/master" - }, - "time": "2016-11-16T10:37:54+00:00" - } - ], - "aliases": [], - "minimum-stability": "RC", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": ">=8.0.0" - }, - "platform-dev": [], - "plugin-api-version": "2.1.0" -} diff --git a/config/api.php b/config/api.php new file mode 100644 index 0000000..12b076c --- /dev/null +++ b/config/api.php @@ -0,0 +1,63 @@ + function (App $kirby) { + return [ + [ + 'pattern' => 'logs.json', + 'method' => 'POST', + 'action' => function () use ($kirby) { + $logger = Logger::connect(); + $term = $kirby->request()->get('term'); + $page = (int)$kirby->request()->get('page', 1); + $limit = (int)$kirby->request()->get('limit', 20); + $logLevel = $kirby->request()->get('level'); + $logChannel = $kirby->request()->get('channel'); + + $query = $logger->table('monolog') + ->select('*') + ->order('created_at DESC') + ->offset(($page - 1) * $limit) + ->limit($limit); + + $countQuery = $logger->table('monolog'); + + if ($logLevel and is_array($logLevel)) { + $query->where('level', 'in', $logLevel); + $countQuery->where('level', 'in', $logLevel); + } + + if ($logChannel and is_array($logChannel)) { + $query->where('channel', 'in', $logChannel); + $countQuery->where('channel', 'in', $logChannel); + } + + if (!empty($term)) { + $term = trim(Str::esc($term)); + $query->where('message', 'like', "%$term%"); + $countQuery->where('message', 'like', "%$term%"); + } + + $lines = $query->all(); + + return [ + 'page' => $page, + 'limit' => $limit, + 'total' => $countQuery->count(), + 'logs' => A::map($lines->data(), function ($log) { + $log->context = Json::decode($log->context); + $log->extra = Json::decode($log->extra); + return $log; + }), + ]; + } + ], + ]; + } +]; diff --git a/config/areas.php b/config/areas.php new file mode 100644 index 0000000..2665e19 --- /dev/null +++ b/config/areas.php @@ -0,0 +1,29 @@ + function () { + return [ + 'label' => t('michnhokn.logger.label'), + 'icon' => 'file-search', + 'menu' => true, + 'link' => 'logger', + 'views' => [ + [ + 'pattern' => 'logger', + 'action' => function () { + return [ + 'component' => 'k-logger-area', + 'title' => t('michnhokn.logger.logs'), + 'props' => [ + 'channels' => Logger::getChannels(), + 'levels' => Logger::getLevels() + ] + ]; + }, + ], + ], + ]; + }, +]; diff --git a/config/hooks.php b/config/hooks.php new file mode 100644 index 0000000..0e3edb7 --- /dev/null +++ b/config/hooks.php @@ -0,0 +1,46 @@ + function (Throwable $exception) { + Logger::write( + $exception->getMessage(), + Logger::LEVEL_ERROR, + Logger::CHANNEL_DEFAULT, + [ + 'userId' => App::instance()->user()?->id(), + 'code' => $exception->getCode(), + 'trace' => $exception->getTrace() + ], + ); + }, + '*:after' => function (Event $event) { + $types = ['file', 'page', 'user', 'site', 'language', 'kirbytags']; + + if (!in_array($event->type(), $types)) { + return; + } + + if (in_array($event->name(), option('michnhokn.logger.ignoreHooks', []))) { + return; + } + + $kirby = App::instance(); + + Logger::write( + $event->name(), + Logger::LEVEL_INFO, + Logger::CHANNEL_AUDIT, + [ + 'type' => $event->type(), + 'action' => $event->action(), + 'state' => $event->state(), + 'userId' => $kirby->user()?->id(), + 'language' => $kirby->language()->code() + ], + ); + }, +]; diff --git a/config/translations.php b/config/translations.php new file mode 100644 index 0000000..4652a6e --- /dev/null +++ b/config/translations.php @@ -0,0 +1,30 @@ + [ + 'michnhokn.logger.label' => 'Audit Logs', + 'michnhokn.logger.logs' => 'Logs', + 'michnhokn.logger.reset' => 'Reset filter', + 'michnhokn.logger.type' => 'Type', + 'michnhokn.logger.action' => 'Action', + 'michnhokn.logger.slug' => 'Slug', + 'michnhokn.logger.old' => 'Old data', + 'michnhokn.logger.searchOld' => 'Search old data', + 'michnhokn.logger.new' => 'New data', + 'michnhokn.logger.searchNew' => 'Search new data', + 'michnhokn.logger.empty' => 'No log entries yet', + ], + 'de' => [ + 'michnhokn.logger.label' => 'Audit Logs', + 'michnhokn.logger.logs' => 'Logs', + 'michnhokn.logger.reset' => 'Filter zurücksetzten', + 'michnhokn.logger.type' => 'Typ', + 'michnhokn.logger.action' => 'Aktion', + 'michnhokn.logger.slug' => 'Slug', + 'michnhokn.logger.old' => 'Alte Daten', + 'michnhokn.logger.searchOld' => 'Alte Daten durchsuchen', + 'michnhokn.logger.new' => 'Neue Daten', + 'michnhokn.logger.searchNew' => 'Neue Daten durchsuchen', + 'michnhokn.logger.empty' => 'Bisher keine Log Einträge', + ], +]; \ No newline at end of file diff --git a/index.css b/index.css index b73a575..371b589 100644 --- a/index.css +++ b/index.css @@ -1 +1 @@ -table[data-v-bfa507fc]{width:100%;border-collapse:collapse;display:block}@media screen and (min-width: 65em){table[data-v-bfa507fc]{display:table}}table td[data-v-bfa507fc],table th[data-v-bfa507fc]{border:1px solid var(--color-border);overflow:auto;vertical-align:baseline;text-overflow:unset;white-space:normal} +.context[data-v-5bacaa39]{height:21px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis} diff --git a/index.js b/index.js index 4bfae52..a2a1e40 100644 --- a/index.js +++ b/index.js @@ -1 +1,6 @@ -(()=>{(function(){"use strict";var g=function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("k-inside",[e("k-view",{staticClass:"k-logger-view"},[e("k-header",[t._v(" "+t._s(t.$t("michnhokn.logger.title"))+" "),e("k-button-group",{attrs:{slot:"left"},slot:"left"},[e("k-button",{attrs:{icon:"refresh"},on:{click:t.reset}},[t._v(t._s(t.$t("michnhokn.logger.reset")))])],1),e("template",{slot:"right"},[e("k-pagination",{attrs:{align:"right",details:!0,page:t.page,limit:t.limit,total:t.total},on:{paginate:t.paginate}})],1)],2),e("k-grid",{attrs:{gutter:"medium"}},[e("k-column",{attrs:{width:"2/6"}},[e("k-select-field",{attrs:{options:t.userOptions,label:t.$t("user"),type:"select",icon:"angle-down"},model:{value:t.filter.user,callback:function(l){t.$set(t.filter,"user",l)},expression:"filter.user"}})],1),e("k-column",{attrs:{width:"1/6"}},[e("k-date-field",{attrs:{display:"YYYY-MM-DD",label:t.$t("date"),calendar:!0,type:"date"},model:{value:t.filter.timestamp,callback:function(l){t.$set(t.filter,"timestamp",l)},expression:"filter.timestamp"}})],1),e("k-column",{attrs:{width:"1/6"}},[e("k-select-field",{attrs:{options:t.typeOptions,label:t.$t("michnhokn.logger.type"),type:"select",icon:"angle-down"},model:{value:t.filter.type,callback:function(l){t.$set(t.filter,"type",l)},expression:"filter.type"}})],1),e("k-column",{attrs:{width:"1/6"}},[e("k-select-field",{attrs:{options:t.actionOptions,label:t.$t("michnhokn.logger.action"),type:"select",icon:"angle-down"},model:{value:t.filter.action,callback:function(l){t.$set(t.filter,"action",l)},expression:"filter.action"}})],1),e("k-column",{attrs:{width:"1/6"}},[e("k-select-field",{attrs:{options:t.languageOptions,label:t.$t("language"),type:"select",icon:"angle-down"},model:{value:t.filter.language,callback:function(l){t.$set(t.filter,"language",l)},expression:"filter.language"}})],1),e("k-column",{attrs:{width:"1/3"}},[e("k-text-field",{attrs:{type:"text",label:t.$t("michnhokn.logger.slug"),placeholder:"Suche ...",icon:"search"},model:{value:t.filter.slug,callback:function(l){t.$set(t.filter,"slug",l)},expression:"filter.slug"}})],1),e("k-column",{attrs:{width:"1/3"}},[e("k-text-field",{attrs:{type:"text",label:t.$t("michnhokn.logger.searchOld"),placeholder:t.$t("search"),icon:"search"},model:{value:t.filter.oldSearch,callback:function(l){t.$set(t.filter,"oldSearch",l)},expression:"filter.oldSearch"}})],1),e("k-column",{attrs:{width:"1/3"}},[e("k-text-field",{attrs:{type:"text",label:t.$t("michnhokn.logger.searchNew"),placeholder:t.$t("search"),icon:"search"},model:{value:t.filter.newSearch,callback:function(l){t.$set(t.filter,"newSearch",l)},expression:"filter.newSearch"}})],1),e("k-column",{staticStyle:{overflow:"auto"},attrs:{width:"1/1"}},[t.logs.length?e("table",{staticClass:"k-system-plugins"},[e("thead",[e("tr",[e("th",{staticStyle:{width:"175px"}},[t._v(t._s(t.$t("date")))]),e("th",[t._v(t._s(t.$t("user")))]),e("th",{staticStyle:{width:"70px"}},[t._v(t._s(t.$t("michnhokn.logger.type")))]),e("th",{staticStyle:{width:"140px"}},[t._v(t._s(t.$t("michnhokn.logger.action")))]),e("th",[t._v(t._s(t.$t("michnhokn.logger.slug")))]),e("th",{staticStyle:{width:"90px"}},[t._v(t._s(t.$t("language")))]),e("th",[t._v(t._s(t.$t("michnhokn.logger.old")))]),e("th",[t._v(t._s(t.$t("michnhokn.logger.new")))])])]),e("tbody",t._l(t.logs,function(l){return e("tr",{key:l.id},[e("td",[t._v(t._s(l.timestamp))]),e("td",[t._v(t._s(l.user))]),e("td",[t._v(t._s(l.type))]),e("td",[t._v(t._s(l.action))]),e("td",[t._v(t._s(l.slug))]),e("td",[t._v(t._s(l.language))]),e("td",[t._v(t._s(l.oldData))]),e("td",[t._v(t._s(l.newData))])])}),0)]):e("k-empty",{attrs:{icon:"table",layout:"cards"}},[t._v(t._s(t.$t("michnhokn.logger.empty")))])],1)],1)],1)],1)},p=[],b="";function f(t,a,e,l,o,c,h,$){var i=typeof t=="function"?t.options:t;a&&(i.render=a,i.staticRenderFns=e,i._compiled=!0),l&&(i.functional=!0),c&&(i._scopeId="data-v-"+c);var s;if(h?(s=function(n){n=n||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,!n&&typeof __VUE_SSR_CONTEXT__!="undefined"&&(n=__VUE_SSR_CONTEXT__),o&&o.call(this,n),n&&n._registeredComponents&&n._registeredComponents.add(h)},i._ssrRegister=s):o&&(s=$?function(){o.call(this,(i.functional?this.parent:this).$root.$options.shadowRoot)}:o),s)if(i.functional){i._injectStyles=s;var y=i.render;i.render=function(w,d){return s.call(d),y(w,d)}}else{var u=i.beforeCreate;i.beforeCreate=u?[].concat(u,s):[s]}return{exports:t,options:i}}const _={name:"LoggerArea",props:["userOptions","typeOptions","actionOptions","languageOptions"],data(){return{logs:[],total:0,page:1,limit:10,filter:{timestamp:"",oldSearch:"",newSearch:"",action:"",type:"",user:"",slug:"",language:""}}},mounted(){this.fetch(this.page,this.limit)},watch:{filter:{handler(t){this.fetch(this.page,this.limit,t)},deep:!0}},methods:{fetch(t=1,a=10,e=null){return this.$api.post("logs.json",{page:t,limit:a,filter:e}).then(l=>{this.logs=l.logs,this.total=l.total})},paginate({page:t,limit:a}){this.page=t,this.limit=a,this.fetch(t,a)},reset(){this.filter={timestamp:"",oldSearch:"",newSearch:"",action:"",type:"",user:"",slug:"",language:""}}}},r={};var m=f(_,g,p,!1,k,"bfa507fc",null,null);function k(t){for(let a in r)this[a]=r[a]}var v=function(){return m.exports}();window.panel.plugin("michnhokn/logger",{components:{"k-logger-area":v}})})();})(); +(function(){"use strict";function d(a,e,t,n,o,i,c,_){var r=typeof a=="function"?a.options:a;e&&(r.render=e,r.staticRenderFns=t,r._compiled=!0),n&&(r.functional=!0),i&&(r._scopeId="data-v-"+i);var s;if(c?(s=function(l){l=l||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,!l&&typeof __VUE_SSR_CONTEXT__<"u"&&(l=__VUE_SSR_CONTEXT__),o&&o.call(this,l),l&&l._registeredComponents&&l._registeredComponents.add(c)},r._ssrRegister=s):o&&(s=_?function(){o.call(this,(r.functional?this.parent:this).$root.$options.shadowRoot)}:o),s)if(r.functional){r._injectStyles=s;var k=r.render;r.render=function(C,u){return s.call(u),k(C,u)}}else{var h=r.beforeCreate;r.beforeCreate=h?[].concat(h,s):[s]}return{exports:a,options:r}}const v={props:{channels:[],levels:[]},data(){return{logs:[],term:null,level:null,channel:null,page:1,limit:50,total:0}},computed:{channelOptions(){return this.channels.map(a=>({value:a,text:a}))},levelOptions(){return this.levels.map(a=>({value:a,text:a}))}},created(){this.fetchLogs()},methods:{onSearch(a){if(a.length>2){this.term=a,this.fetchLogs();return}this.term=null,this.fetchLogs()},async fetchLogs(a=null){this.page=(a==null?void 0:a.page)||this.page,this.limit=(a==null?void 0:a.limit)||this.limit;const e=await window.panel.api.post("logs.json",{page:this.page,limit:this.limit,level:this.level,channel:this.channel,term:this.term});this.logs=e.logs,this.total=e.total},resetFilters(){this.page=1,this.level=[],this.channel=[],this.term=null,this.fetchLogs()},onLevelChange(a){this.level=a,this.fetchLogs()},onChannelChange(a){this.channel=a,this.fetchLogs()},onPreview(a){window.panel.drawer.open({component:"k-logger-drawer",props:{icon:"preview",title:`[${a.level}] ${this.$library.dayjs(a.datetime).format("DD.MM.YYYY HH:mm:ss")}: ${a.channel}`,text:a,options:[{icon:"cancel",title:"Schließen",click:()=>window.panel.drawer.close()}]}})},getLevelBackground(a){switch(a){case"DEBUG":return{backgroundColor:"var(--color-gray-400"};case"INFO":return{backgroundColor:"var(--color-blue-400"};case"WARNING":return{backgroundColor:"var(--color-yellow-400"};case"ERROR":return{backgroundColor:"var(--color-red-400"};case"CRITICAL":return{backgroundColor:"var(--color-pink-400"};default:return{backgroundColor:"transparent"}}}}};var m=function(){var e=this,t=e._self._c;return t("k-panel-inside",{staticClass:"k-logger-area"},[t("k-header",{scopedSlots:e._u([{key:"buttons",fn:function(){return[t("k-button-group",[t("k-button",{attrs:{icon:"undo",variant:"filled"},on:{click:e.resetFilters}},[e._v("Zurücksetzten ")]),t("k-button",{attrs:{icon:"refresh",variant:"filled"},on:{click:e.fetchLogs}},[e._v("Neu laden ")])],1)]},proxy:!0}])},[e._v(" Logs ("+e._s(e.total)+") ")]),t("k-grid",{staticStyle:{gap:"1rem","--columns":"3","margin-bottom":"2rem"}},[t("k-text-field",{attrs:{name:"search",label:"Suche",icon:"search",placeholder:"Logs durchsuchen ...",value:e.term},on:{input:e.onSearch}}),t("k-multiselect-field",{attrs:{name:"levels",label:"Log Level",icon:"filter",options:e.levelOptions,value:e.level},on:{input:e.onLevelChange}}),t("k-multiselect-field",{attrs:{name:"channel",label:"Channel",icon:"filter",options:e.channelOptions,value:e.channel},on:{input:e.onChannelChange}})],1),t("div",{staticClass:"k-table"},[t("table",[t("thead",[t("tr",[t("th",{staticStyle:{width:"12rem"},attrs:{"data-mobile":"true"}},[e._v("Date")]),t("th",{staticStyle:{width:"8rem"},attrs:{"data-mobile":"true"}},[e._v("Level")]),t("th",{staticStyle:{width:"10rem"},attrs:{"data-mobile":"true"}},[e._v("Channel")]),t("th",[e._v("Message")]),t("th",[e._v("Context")]),t("th",{staticClass:"k-table-options-column",attrs:{"data-mobile":"true"}})])]),t("tbody",[e.logs.length>0?e._l(e.logs,function(n){return t("tr",{key:e.i},[t("td",{attrs:{"data-mobile":"true"}},[e._v(e._s(e.$library.dayjs(n.created_at).format("DD.MM.YYYY HH:mm:ss")))]),t("td",{attrs:{"data-mobile":"true"}},[t("k-bubble",{style:e.getLevelBackground(n.level),attrs:{text:n.level}})],1),t("td",{attrs:{"data-mobile":"true"}},[e._v(e._s(n.channel))]),t("td",[e._v(e._s(n.message))]),t("td",[t("div",{staticClass:"context"},[e._v(e._s(n.context))])]),t("td",{staticClass:"k-table-options-column",attrs:{"data-mobile":"true"}},[t("k-button",{attrs:{icon:"preview"},on:{click:function(o){return e.onPreview(n)}}})],1)])}):[t("tr",[t("td",{staticClass:"k-table-empty",attrs:{colspan:"10"}},[e._v("Keine Logs gefunden")])])]],2)]),t("k-pagination",{staticClass:"k-table-pagination",attrs:{details:!0,limit:e.limit,page:e.page,total:e.total},on:{paginate:e.fetchLogs}})],1)],1)},p=[],f=d(v,m,p,!1,null,"5bacaa39",null,null);const g=f.exports;window.panel.plugin("michnhokn/logger",{icons:{"file-search":''},components:{"k-logger-area":g,"k-logger-drawer":{extends:"k-text-drawer",template:` + {{ text }} +`}}})})(); diff --git a/index.php b/index.php index bcab3a5..5f45a72 100644 --- a/index.php +++ b/index.php @@ -1,84 +1,22 @@ __DIR__ . '/Logger.php']); -\Kirby\Cms\App::plugin('michnhokn/logger', [ - 'translations' => [ - 'en' => [ - 'michnhokn.logger.title' => 'Logger', - 'michnhokn.logger.logs' => 'Logs', - 'michnhokn.logger.reset' => 'Reset filter', - 'michnhokn.logger.type' => 'Type', - 'michnhokn.logger.action' => 'Action', - 'michnhokn.logger.slug' => 'Slug', - 'michnhokn.logger.old' => 'Old data', - 'michnhokn.logger.searchOld' => 'Search old data', - 'michnhokn.logger.new' => 'New data', - 'michnhokn.logger.searchNew' => 'Search new data', - 'michnhokn.logger.empty' => 'No log entries yet', - ], - 'de' => [ - 'michnhokn.logger.title' => 'Logger', - 'michnhokn.logger.logs' => 'Logs', - 'michnhokn.logger.reset' => 'Filter zurücksetzten', - 'michnhokn.logger.type' => 'Typ', - 'michnhokn.logger.action' => 'Aktion', - 'michnhokn.logger.slug' => 'Slug', - 'michnhokn.logger.old' => 'Alte Daten', - 'michnhokn.logger.searchOld' => 'Alte Daten durchsuchen', - 'michnhokn.logger.new' => 'Neue Daten', - 'michnhokn.logger.searchNew' => 'Neue Daten durchsuchen', - 'michnhokn.logger.empty' => 'Bisher keine Log Einträge', - ], - ], - 'hooks' => [ - 'system.loadPlugins:after' => function () { - \Michnhokn\Logger::connect(); - }, - '*:after' => function (\Kirby\Cms\Event $event) { - \Michnhokn\Logger::log($event); - }, - ], - 'api' => [ - 'routes' => [ - [ - 'pattern' => 'logs.json', - 'method' => 'POST', - 'action' => function () { - return \Michnhokn\Logger::logs( - $this->requestBody('page', 1), - $this->requestBody('limit', 10), - $this->requestBody('filter', []) - ); - }, - ], - ], - ], - 'areas' => [ - 'kirby3-logger' => function () { - return [ - 'label' => t('michnhokn.logger.title'), - 'icon' => 'table', - 'menu' => true, - 'link' => 'logger', - 'views' => [ - [ - 'pattern' => 'logger', - 'action' => function () { - return [ - 'component' => 'k-logger-area', - 'title' => t('michnhokn.logger.logs'), - 'props' => [ - 'userOptions' => \Michnhokn\Logger::options('user'), - 'typeOptions' => \Michnhokn\Logger::options('type'), - 'actionOptions' => \Michnhokn\Logger::options('action'), - 'languageOptions' => \Michnhokn\Logger::options('language'), - ], - ]; - }, - ], - ], - ]; - }, - ], -]); \ No newline at end of file +App::plugin('michnhokn/logger', [ + 'icons' => [], + 'api' => require_once __DIR__ . "/config/api.php", + 'translations' => require_once __DIR__ . "/config/translations.php", + 'hooks' => require_once __DIR__ . "/config/hooks.php", + 'areas' => require_once __DIR__ . "/config/areas.php", + 'options' => [ + 'channels' => [], + 'ignoreHooks' => [ + 'page.render:after', + 'kirbytags:after' + ] + ] +]); diff --git a/logs-schema.sql b/logs-schema.sql index 652a631..a8b694c 100644 --- a/logs-schema.sql +++ b/logs-schema.sql @@ -1,12 +1,10 @@ -CREATE TABLE IF NOT EXISTS logs +CREATE TABLE IF NOT EXISTS monolog ( - id INTEGER PRIMARY KEY, - type TEXT NOT NULL, - action TEXT NOT NULL, - user TEXT NULL, - slug TEXT NOT NULL, - language TEXT NOT NULL, - oldData TEXT NULL, - newData TEXT NOT NULL, - timestamp TEXT NOT NULL DEFAULT current_timestamp -); \ No newline at end of file + id INTEGER PRIMARY KEY AUTOINCREMENT, + channel VARCHAR(255), + level VARCHAR(255), + message TEXT, + context TEXT, + extra TEXT, + created_at TEXT +) diff --git a/src/LoggerArea.vue b/src/LoggerArea.vue new file mode 100644 index 0000000..5167e25 --- /dev/null +++ b/src/LoggerArea.vue @@ -0,0 +1,232 @@ + + + + + diff --git a/src/components/LoggerArea.vue b/src/components/LoggerArea.vue deleted file mode 100644 index f5c133f..0000000 --- a/src/components/LoggerArea.vue +++ /dev/null @@ -1,192 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/index.js b/src/index.js index d402158..2bced4c 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,19 @@ -import LoggerArea from './components/LoggerArea.vue'; +import LoggerArea from './LoggerArea.vue'; window.panel.plugin('michnhokn/logger', { - components: {'k-logger-area': LoggerArea}, + icons: { + 'file-search': '', + }, + components: { + 'k-logger-area': LoggerArea, + 'k-logger-drawer': { + extends: 'k-text-drawer', + template: ` + {{ text }} +`, + }, + }, }); diff --git a/vendor/autoload.php b/vendor/autoload.php deleted file mode 100644 index b84184c..0000000 --- a/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - * @see https://www.php-fig.org/psr/psr-0/ - * @see https://www.php-fig.org/psr/psr-4/ - */ -class ClassLoader -{ - /** @var ?string */ - private $vendorDir; - - // PSR-4 - /** - * @var array[] - * @psalm-var array> - */ - private $prefixLengthsPsr4 = array(); - /** - * @var array[] - * @psalm-var array> - */ - private $prefixDirsPsr4 = array(); - /** - * @var array[] - * @psalm-var array - */ - private $fallbackDirsPsr4 = array(); - - // PSR-0 - /** - * @var array[] - * @psalm-var array> - */ - private $prefixesPsr0 = array(); - /** - * @var array[] - * @psalm-var array - */ - private $fallbackDirsPsr0 = array(); - - /** @var bool */ - private $useIncludePath = false; - - /** - * @var string[] - * @psalm-var array - */ - private $classMap = array(); - - /** @var bool */ - private $classMapAuthoritative = false; - - /** - * @var bool[] - * @psalm-var array - */ - private $missingClasses = array(); - - /** @var ?string */ - private $apcuPrefix; - - /** - * @var self[] - */ - private static $registeredLoaders = array(); - - /** - * @param ?string $vendorDir - */ - public function __construct($vendorDir = null) - { - $this->vendorDir = $vendorDir; - } - - /** - * @return string[] - */ - public function getPrefixes() - { - if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); - } - - return array(); - } - - /** - * @return array[] - * @psalm-return array> - */ - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - /** - * @return array[] - * @psalm-return array - */ - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - /** - * @return array[] - * @psalm-return array - */ - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - /** - * @return string[] Array of classname => path - * @psalm-var array - */ - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param string[] $classMap Class to filename map - * @psalm-param array $classMap - * - * @return void - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - * - * @return void - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories - * - * @return void - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - * - * @return void - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - * - * @return void - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Turns off searching the prefix and fallback directories for classes - * that have not been registered with the class map. - * - * @param bool $classMapAuthoritative - * - * @return void - */ - public function setClassMapAuthoritative($classMapAuthoritative) - { - $this->classMapAuthoritative = $classMapAuthoritative; - } - - /** - * Should class lookup fail if not found in the current class map? - * - * @return bool - */ - public function isClassMapAuthoritative() - { - return $this->classMapAuthoritative; - } - - /** - * APCu prefix to use to cache found/not-found classes, if the extension is enabled. - * - * @param string|null $apcuPrefix - * - * @return void - */ - public function setApcuPrefix($apcuPrefix) - { - $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; - } - - /** - * The APCu prefix in use, or null if APCu caching is not enabled. - * - * @return string|null - */ - public function getApcuPrefix() - { - return $this->apcuPrefix; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - * - * @return void - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - - if (null === $this->vendorDir) { - return; - } - - if ($prepend) { - self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; - } else { - unset(self::$registeredLoaders[$this->vendorDir]); - self::$registeredLoaders[$this->vendorDir] = $this; - } - } - - /** - * Unregisters this instance as an autoloader. - * - * @return void - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - - if (null !== $this->vendorDir) { - unset(self::$registeredLoaders[$this->vendorDir]); - } - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return true|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - - return null; - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { - return false; - } - if (null !== $this->apcuPrefix) { - $file = apcu_fetch($this->apcuPrefix.$class, $hit); - if ($hit) { - return $file; - } - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if (false === $file && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if (null !== $this->apcuPrefix) { - apcu_add($this->apcuPrefix.$class, $file); - } - - if (false === $file) { - // Remember that this class does not exist. - $this->missingClasses[$class] = true; - } - - return $file; - } - - /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. - * - * @return self[] - */ - public static function getRegisteredLoaders() - { - return self::$registeredLoaders; - } - - /** - * @param string $class - * @param string $ext - * @return string|false - */ - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - $subPath = $class; - while (false !== $lastPos = strrpos($subPath, '\\')) { - $subPath = substr($subPath, 0, $lastPos); - $search = $subPath . '\\'; - if (isset($this->prefixDirsPsr4[$search])) { - $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); - foreach ($this->prefixDirsPsr4[$search] as $dir) { - if (file_exists($file = $dir . $pathEnd)) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - - return false; - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php deleted file mode 100644 index 7c5502c..0000000 --- a/vendor/composer/InstalledVersions.php +++ /dev/null @@ -1,337 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer; - -use Composer\Autoload\ClassLoader; -use Composer\Semver\VersionParser; - -/** - * This class is copied in every Composer installed project and available to all - * - * See also https://getcomposer.org/doc/07-runtime.md#installed-versions - * - * To require its presence, you can require `composer-runtime-api ^2.0` - */ -class InstalledVersions -{ - private static $installed; - private static $canGetVendors; - private static $installedByVendor = array(); - - /** - * Returns a list of all package names which are present, either by being installed, replaced or provided - * - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackages() - { - $packages = array(); - foreach (self::getInstalled() as $installed) { - $packages[] = array_keys($installed['versions']); - } - - if (1 === \count($packages)) { - return $packages[0]; - } - - return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); - } - - /** - * Returns a list of all package names with a specific type e.g. 'library' - * - * @param string $type - * @return string[] - * @psalm-return list - */ - public static function getInstalledPackagesByType($type) - { - $packagesByType = array(); - - foreach (self::getInstalled() as $installed) { - foreach ($installed['versions'] as $name => $package) { - if (isset($package['type']) && $package['type'] === $type) { - $packagesByType[] = $name; - } - } - } - - return $packagesByType; - } - - /** - * Checks whether the given package is installed - * - * This also returns true if the package name is provided or replaced by another package - * - * @param string $packageName - * @param bool $includeDevRequirements - * @return bool - */ - public static function isInstalled($packageName, $includeDevRequirements = true) - { - foreach (self::getInstalled() as $installed) { - if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); - } - } - - return false; - } - - /** - * Checks whether the given package satisfies a version constraint - * - * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: - * - * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') - * - * @param VersionParser $parser Install composer/semver to have access to this class and functionality - * @param string $packageName - * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package - * @return bool - */ - public static function satisfies(VersionParser $parser, $packageName, $constraint) - { - $constraint = $parser->parseConstraints($constraint); - $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); - - return $provided->matches($constraint); - } - - /** - * Returns a version constraint representing all the range(s) which are installed for a given package - * - * It is easier to use this via isInstalled() with the $constraint argument if you need to check - * whether a given version of a package is installed, and not just whether it exists - * - * @param string $packageName - * @return string Version constraint usable with composer/semver - */ - public static function getVersionRanges($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - $ranges = array(); - if (isset($installed['versions'][$packageName]['pretty_version'])) { - $ranges[] = $installed['versions'][$packageName]['pretty_version']; - } - if (array_key_exists('aliases', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); - } - if (array_key_exists('replaced', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); - } - if (array_key_exists('provided', $installed['versions'][$packageName])) { - $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); - } - - return implode(' || ', $ranges); - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['version'])) { - return null; - } - - return $installed['versions'][$packageName]['version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present - */ - public static function getPrettyVersion($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['pretty_version'])) { - return null; - } - - return $installed['versions'][$packageName]['pretty_version']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference - */ - public static function getReference($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - if (!isset($installed['versions'][$packageName]['reference'])) { - return null; - } - - return $installed['versions'][$packageName]['reference']; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @param string $packageName - * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. - */ - public static function getInstallPath($packageName) - { - foreach (self::getInstalled() as $installed) { - if (!isset($installed['versions'][$packageName])) { - continue; - } - - return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; - } - - throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); - } - - /** - * @return array - * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string} - */ - public static function getRootPackage() - { - $installed = self::getInstalled(); - - return $installed[0]['root']; - } - - /** - * Returns the raw installed.php data for custom implementations - * - * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. - * @return array[] - * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} - */ - public static function getRawData() - { - @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = include __DIR__ . '/installed.php'; - } else { - self::$installed = array(); - } - } - - return self::$installed; - } - - /** - * Returns the raw data of all installed.php which are currently loaded for custom implementations - * - * @return array[] - * @psalm-return list}> - */ - public static function getAllRawData() - { - return self::getInstalled(); - } - - /** - * Lets you reload the static array from another file - * - * This is only useful for complex integrations in which a project needs to use - * this class but then also needs to execute another project's autoloader in process, - * and wants to ensure both projects have access to their version of installed.php. - * - * A typical case would be PHPUnit, where it would need to make sure it reads all - * the data it needs from this class, then call reload() with - * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure - * the project in which it runs can then also use this class safely, without - * interference between PHPUnit's dependencies and the project's dependencies. - * - * @param array[] $data A vendor/composer/installed.php data set - * @return void - * - * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array} $data - */ - public static function reload($data) - { - self::$installed = $data; - self::$installedByVendor = array(); - } - - /** - * @return array[] - * @psalm-return list}> - */ - private static function getInstalled() - { - if (null === self::$canGetVendors) { - self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); - } - - $installed = array(); - - if (self::$canGetVendors) { - foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { - if (isset(self::$installedByVendor[$vendorDir])) { - $installed[] = self::$installedByVendor[$vendorDir]; - } elseif (is_file($vendorDir.'/composer/installed.php')) { - $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; - if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { - self::$installed = $installed[count($installed) - 1]; - } - } - } - } - - if (null === self::$installed) { - // only require the installed.php file if this file is loaded from its dumped location, - // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 - if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = require __DIR__ . '/installed.php'; - } else { - self::$installed = array(); - } - } - $installed[] = self::$installed; - - return $installed; - } -} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index 6c294b3..0000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,16 +0,0 @@ - $vendorDir . '/composer/InstalledVersions.php', - 'Kirby\\ComposerInstaller\\CmsInstaller' => $vendorDir . '/getkirby/composer-installer/src/ComposerInstaller/CmsInstaller.php', - 'Kirby\\ComposerInstaller\\Installer' => $vendorDir . '/getkirby/composer-installer/src/ComposerInstaller/Installer.php', - 'Kirby\\ComposerInstaller\\Plugin' => $vendorDir . '/getkirby/composer-installer/src/ComposerInstaller/Plugin.php', - 'Kirby\\ComposerInstaller\\PluginInstaller' => $vendorDir . '/getkirby/composer-installer/src/ComposerInstaller/PluginInstaller.php', - 'Michnhokn\\Log' => $baseDir . '/classes/Log.php', - 'Michnhokn\\Logger' => $baseDir . '/classes/Logger.php', -); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php deleted file mode 100644 index b7fc012..0000000 --- a/vendor/composer/autoload_namespaces.php +++ /dev/null @@ -1,9 +0,0 @@ - array($baseDir . '/classes'), - 'Kirby\\' => array($vendorDir . '/getkirby/composer-installer/src'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index c300918..0000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,57 +0,0 @@ -= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit7e68e9e02ab58512172fe5c7171b95ec::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } - - $loader->register(true); - - return $loader; - } -} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php deleted file mode 100644 index 6284b5f..0000000 --- a/vendor/composer/autoload_static.php +++ /dev/null @@ -1,50 +0,0 @@ - - array ( - 'Michnhokn\\' => 10, - ), - 'K' => - array ( - 'Kirby\\' => 6, - ), - ); - - public static $prefixDirsPsr4 = array ( - 'Michnhokn\\' => - array ( - 0 => __DIR__ . '/../..' . '/classes', - ), - 'Kirby\\' => - array ( - 0 => __DIR__ . '/..' . '/getkirby/composer-installer/src', - ), - ); - - public static $classMap = array ( - 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', - 'Kirby\\ComposerInstaller\\CmsInstaller' => __DIR__ . '/..' . '/getkirby/composer-installer/src/ComposerInstaller/CmsInstaller.php', - 'Kirby\\ComposerInstaller\\Installer' => __DIR__ . '/..' . '/getkirby/composer-installer/src/ComposerInstaller/Installer.php', - 'Kirby\\ComposerInstaller\\Plugin' => __DIR__ . '/..' . '/getkirby/composer-installer/src/ComposerInstaller/Plugin.php', - 'Kirby\\ComposerInstaller\\PluginInstaller' => __DIR__ . '/..' . '/getkirby/composer-installer/src/ComposerInstaller/PluginInstaller.php', - 'Michnhokn\\Log' => __DIR__ . '/../..' . '/classes/Log.php', - 'Michnhokn\\Logger' => __DIR__ . '/../..' . '/classes/Logger.php', - ); - - public static function getInitializer(ClassLoader $loader) - { - return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit7e68e9e02ab58512172fe5c7171b95ec::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit7e68e9e02ab58512172fe5c7171b95ec::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit7e68e9e02ab58512172fe5c7171b95ec::$classMap; - - }, null, ClassLoader::class); - } -} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php deleted file mode 100644 index 1180956..0000000 --- a/vendor/composer/installed.php +++ /dev/null @@ -1,32 +0,0 @@ - array( - 'pretty_version' => '0.9.0', - 'version' => '0.9.0.0', - 'type' => 'kirby-plugin', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'reference' => NULL, - 'name' => 'michnhokn/kirby3-logger', - 'dev' => false, - ), - 'versions' => array( - 'getkirby/composer-installer' => array( - 'pretty_version' => '1.2.1', - 'version' => '1.2.1.0', - 'type' => 'composer-plugin', - 'install_path' => __DIR__ . '/../getkirby/composer-installer', - 'aliases' => array(), - 'reference' => 'c98ece30bfba45be7ce457e1102d1b169d922f3d', - 'dev_requirement' => false, - ), - 'michnhokn/kirby3-logger' => array( - 'pretty_version' => '0.9.0', - 'version' => '0.9.0.0', - 'type' => 'kirby-plugin', - 'install_path' => __DIR__ . '/../../', - 'aliases' => array(), - 'reference' => NULL, - 'dev_requirement' => false, - ), - ), -); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php deleted file mode 100644 index adfb472..0000000 --- a/vendor/composer/platform_check.php +++ /dev/null @@ -1,26 +0,0 @@ -= 80000)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.'; -} - -if ($issues) { - if (!headers_sent()) { - header('HTTP/1.1 500 Internal Server Error'); - } - if (!ini_get('display_errors')) { - if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { - fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); - } elseif (!headers_sent()) { - echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; - } - } - trigger_error( - 'Composer detected issues in your platform: ' . implode(' ', $issues), - E_USER_ERROR - ); -}