Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ jobs:
fail-fast: true
matrix:
os: [ubuntu-latest, windows-latest]
php: [8.2, 8.1, 8.0]
laravel: [9.*, 10.*, 11.*, 12.*]
php: [8.4, 8.3, 8.2, 8.1, 8.0]
laravel: [9.*, 10.*, 11.*, 12.*, 13.*]
stability: [prefer-lowest, prefer-stable]
exclude:
- php: 8.0
Expand All @@ -23,11 +23,21 @@ jobs:
laravel: 11.*
- php: 8.0
laravel: 12.*
- php: 8.0
laravel: 13.*
- php: 8.1
laravel: 11.*
- php: 8.1
laravel: 12.*
- php: 8.1
laravel: 13.*
- php: 8.2
laravel: 9.*
- php: 8.2
laravel: 13.*
- php: 8.3
laravel: 9.*
- php: 8.4
laravel: 9.*
include:
- laravel: 9.*
Expand All @@ -46,6 +56,10 @@ jobs:
testbench: 10.*
pest: 3.*
collision: 8.*
- laravel: 13.*
testbench: 11.*
pest: 4.*
collision: 8.*

name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}

Expand All @@ -71,4 +85,4 @@ jobs:
composer update --${{ matrix.stability }} --prefer-dist --no-interaction

- name: Execute tests
run: vendor/bin/pest
run: vendor/bin/pest --no-coverage
8 changes: 4 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@
],
"require": {
"php": "^8.0",
"illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0",
"illuminate/contracts": "^8.0|^9.0|^10.0|^11.0|^12.0|^13.0",
"opcodesio/mail-parser": "^0.2.3"
},
"require-dev": {
"guzzlehttp/guzzle": "^7.2",
"itsgoingd/clockwork": "^5.1",
"laravel/pint": "^1.0",
"nunomaduro/collision": "^7.0|^8.0",
"orchestra/testbench": "^7.6|^8.0|^9.5|^10.0",
"pestphp/pest": "^2.0|^3.7",
"pestphp/pest-plugin-laravel": "^2.0|^3.1",
"orchestra/testbench": "^7.6|^8.0|^9.5|^10.0|^11.0",
"pestphp/pest": "^2.0|^3.7|^4.4",
"pestphp/pest-plugin-laravel": "^2.0|^3.1|^4.1",
"spatie/test-time": "^1.3"
},
"suggest": {
Expand Down
8 changes: 5 additions & 3 deletions config/log-viewer.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
use Opcodes\LogViewer\Enums\SortingMethod;
use Opcodes\LogViewer\Enums\SortingOrder;
use Opcodes\LogViewer\Enums\Theme;
use Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer;
use Opcodes\LogViewer\Http\Middleware\EnsureFrontendRequestsAreStateful;

return [

Expand Down Expand Up @@ -102,7 +104,7 @@

'middleware' => [
'web',
\Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
AuthorizeLogViewer::class,
],

/*
Expand All @@ -115,8 +117,8 @@
*/

'api_middleware' => [
\Opcodes\LogViewer\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\Opcodes\LogViewer\Http\Middleware\AuthorizeLogViewer::class,
EnsureFrontendRequestsAreStateful::class,
AuthorizeLogViewer::class,
],

'api_stateful_domains' => env('LOG_VIEWER_API_STATEFUL_DOMAINS') ? explode(',', env('LOG_VIEWER_API_STATEFUL_DOMAINS')) : null,
Expand Down
3 changes: 2 additions & 1 deletion src/Facades/Cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@

namespace Opcodes\LogViewer\Facades;

use Illuminate\Cache\Repository;
use Illuminate\Support\Facades\Facade;

/**
* @mixin \Illuminate\Contracts\Cache\Repository
*
* @see \Illuminate\Cache\Repository
* @see Repository
*/
class Cache extends Facade
{
Expand Down
3 changes: 2 additions & 1 deletion src/Facades/LogViewer.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@
use Opcodes\LogViewer\LogFileCollection;
use Opcodes\LogViewer\LogFolder;
use Opcodes\LogViewer\LogFolderCollection;
use Opcodes\LogViewer\LogViewerService;
use Opcodes\LogViewer\Readers\LogReaderInterface;

/**
* @see \Opcodes\LogViewer\LogViewerService
* @see LogViewerService
*
* @method static string version()
* @method static string timezone()
Expand Down
22 changes: 14 additions & 8 deletions src/Http/Middleware/EnsureFrontendRequestsAreStateful.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

namespace Opcodes\LogViewer\Http\Middleware;

use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Pipeline;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;

Expand All @@ -16,9 +22,9 @@ class EnsureFrontendRequestsAreStateful
/**
* Handle the incoming requests.
*
* @param \Illuminate\Http\Request $request
* @param Request $request
* @param callable $next
* @return \Illuminate\Http\Response
* @return Response
*/
public function handle($request, $next)
{
Expand All @@ -30,10 +36,10 @@ function ($request, $next) {

return $next($request);
},
static::resolveMiddleware('sanctum.middleware.encrypt_cookies', \Illuminate\Cookie\Middleware\EncryptCookies::class),
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
static::resolveMiddleware('sanctum.middleware.verify_csrf_token', \Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class),
static::resolveMiddleware('sanctum.middleware.encrypt_cookies', EncryptCookies::class),
AddQueuedCookiesToResponse::class,
StartSession::class,
static::resolveMiddleware('sanctum.middleware.verify_csrf_token', VerifyCsrfToken::class),
] : [])->then(function ($request) use ($next) {
return $next($request);
});
Expand All @@ -55,7 +61,7 @@ protected function configureSecureCookieSessions()
/**
* Determine if the given request is from the first-party application frontend.
*
* @param \Illuminate\Http\Request $request
* @param Request $request
* @return bool
*/
public static function fromFrontend($request)
Expand Down Expand Up @@ -91,7 +97,7 @@ public static function fromFrontend($request)
/**
* Check if the referer/origin domain matches the current request's domain.
*
* @param \Illuminate\Http\Request $request
* @param Request $request
* @param string $refererDomain
* @return bool
*/
Expand Down
3 changes: 2 additions & 1 deletion src/Http/Resources/LogResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
namespace Opcodes\LogViewer\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;
use Opcodes\LogViewer\Logs\Log;

/**
* @mixin \Opcodes\LogViewer\Logs\Log
* @mixin Log
*/
class LogResource extends JsonResource
{
Expand Down
3 changes: 2 additions & 1 deletion src/LogViewerService.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Opcodes\LogViewer;

use Composer\InstalledVersions;
use GuzzleHttp\Client;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\File;
Expand Down Expand Up @@ -202,7 +203,7 @@ public function getFolder(?string $folderIdentifier): ?LogFolder

public function supportsHostsFeature(): bool
{
return class_exists(\GuzzleHttp\Client::class);
return class_exists(Client::class);
}

public function resolveHostsUsing(callable $callback): void
Expand Down
2 changes: 1 addition & 1 deletion src/Logs/Log.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class Log
/** @var string The regular expression group key, which contains the message */
public static string $regexMessageKey = 'message';

/** @var array|\string[][] The columns displayed on the frontend, and which data they should display */
/** @var array|string[][] The columns displayed on the frontend, and which data they should display */
public static array $columns = [
['label' => 'Datetime', 'data_path' => 'datetime'],
['label' => 'Severity', 'data_path' => 'level'],
Expand Down
6 changes: 4 additions & 2 deletions tests/Feature/Authorization/CanViewLogViewerTest.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
use Opcodes\LogViewer\Facades\LogViewer;
use Opcodes\LogViewer\LogViewerServiceProvider;

use function Pest\Laravel\get;
use function Pest\Laravel\getJson;
Expand All @@ -20,7 +22,7 @@

test('the "auth" callback is given with a Request object to check against', function () {
LogViewer::auth(function ($request) {
expect($request)->toBeInstanceOf(\Illuminate\Http\Request::class);
expect($request)->toBeInstanceOf(Request::class);

return true;
});
Expand Down Expand Up @@ -61,7 +63,7 @@
app()->detectEnvironment(fn () => 'production');
expect(app()->isProduction())->toBeTrue();
// need to reload the routes in order for the new middleware to take place.
(new \Opcodes\LogViewer\LogViewerServiceProvider(app()))->boot();
(new LogViewerServiceProvider(app()))->boot();

get(route('log-viewer.index'))->assertOk();
});
Expand Down
6 changes: 4 additions & 2 deletions tests/Feature/ForwardRequestToHostTest.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
<?php

use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
use Opcodes\LogViewer\Facades\LogViewer;
use Opcodes\LogViewer\Host;

beforeEach(function () {
config(['log-viewer.hosts' => [
Expand All @@ -14,7 +16,7 @@
$this->remoteHost = LogViewer::getHosts()->remote()->first();
});

function expectedNewUrl($originalUrl, Opcodes\LogViewer\Host $host): string
function expectedNewUrl($originalUrl, Host $host): string
{
$newUrl = Str::replaceFirst(
route('log-viewer.index'), // http://localhost/log-viewer
Expand Down Expand Up @@ -47,7 +49,7 @@ function expectedNewUrl($originalUrl, Opcodes\LogViewer\Host $host): string
->assertOk()
->assertJson($proxiedResponseBody);

Http::assertSent(function (Illuminate\Http\Client\Request $request) use ($newUrl, $method) {
Http::assertSent(function (Request $request) use ($newUrl, $method) {
return $request->url() === expectedNewUrl($newUrl, $this->remoteHost)
&& $request->method() === strtoupper($method)
&& collect($this->remoteHost->headers)->every(fn ($value, $key) => $request->hasHeader($key, $value));
Expand Down
6 changes: 4 additions & 2 deletions tests/Feature/LogsControllerTest.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
<?php

use Opcodes\LogViewer\Readers\IndexedLogReader;

use function Pest\Laravel\getJson;

it('can load the logs for a specific file', function () {
Expand Down Expand Up @@ -30,7 +32,7 @@
expect($response->json('logs'))->toHaveCount(count($logEntries));

// now, with the query. Re-instantiate the log reader to make sure we don't have anything cached.
\Opcodes\LogViewer\Readers\IndexedLogReader::clearInstance($file);
IndexedLogReader::clearInstance($file);
$response = getJson(route('log-viewer.logs', [
'file' => $file->identifier,
'query' => 'error',
Expand All @@ -54,7 +56,7 @@
expect($response->json('logs'))->toHaveCount(count($logEntries));

// now, with the query. Re-instantiate the log reader to make sure we don't have anything cached.
\Opcodes\LogViewer\Readers\IndexedLogReader::clearInstance($file);
IndexedLogReader::clearInstance($file);
$response = getJson(route('log-viewer.logs', [
'file' => $file->identifier,
'query' => 'ошибка',
Expand Down
7 changes: 5 additions & 2 deletions tests/Feature/RoutesTest.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
<?php

use Illuminate\Routing\RouteCollection;
use Opcodes\LogViewer\LogViewerServiceProvider;

use function Pest\Laravel\get;

test('the default url can be changed', function () {
Expand Down Expand Up @@ -53,8 +56,8 @@
function reloadRoutes(): void
{
// unset any routes that were set previously
app('router')->setRoutes(new \Illuminate\Routing\RouteCollection);
app('router')->setRoutes(new RouteCollection);

// boot the service provider to register the routes again
(new \Opcodes\LogViewer\LogViewerServiceProvider(app()))->boot();
(new LogViewerServiceProvider(app()))->boot();
}
6 changes: 4 additions & 2 deletions tests/Pest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
use Carbon\CarbonInterface;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
use Opcodes\LogViewer\Facades\LogViewer;
use Opcodes\LogViewer\LogFile;
use Opcodes\LogViewer\LogIndex;
use Opcodes\LogViewer\Logs\LogType;
Expand Down Expand Up @@ -36,7 +38,7 @@ function generateLogFiles(array $files, ?string $content = null, bool $randomCon
function generateLogFile(?string $fileName = null, ?string $content = null, bool $randomContent = false, $type = LogType::LARAVEL): LogFile
{
if (is_null($fileName)) {
$fileName = \Illuminate\Support\Str::random().'.log';
$fileName = Str::random().'.log';
}

$fileName = str_replace('/', DIRECTORY_SEPARATOR, $fileName);
Expand Down Expand Up @@ -79,7 +81,7 @@ function dummyLogData(?int $lines = null, string $type = LogType::LARAVEL): stri

function clearGeneratedLogFiles(): void
{
$logReaderClass = \Opcodes\LogViewer\Facades\LogViewer::logReaderClass();
$logReaderClass = LogViewer::logReaderClass();
$logReaderClass::clearInstances();

File::cleanDirectory(storage_path('logs'));
Expand Down
3 changes: 2 additions & 1 deletion tests/Unit/AccessLogs/HttpNginxErrorLogTest.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?php

use Opcodes\LogViewer\LogFile;
use Opcodes\LogViewer\Logs\HttpNginxErrorLog;

it('can parse a full Nginx error log entry', function () {
Expand Down Expand Up @@ -45,7 +46,7 @@
});

it('can parse multiline nginx log entries', function () {
$file = new \Opcodes\LogViewer\LogFile(__DIR__.'/Fixtures/multiline_nginx_error_dummy.log');
$file = new LogFile(__DIR__.'/Fixtures/multiline_nginx_error_dummy.log');
$file->logs()->scan();

$logs = $file->logs()->get();
Expand Down
Loading
Loading