Skip to content

Commit

Permalink
Keeps the dashboard sessions from expiring. (#9263)
Browse files Browse the repository at this point in the history
* Keeps the dashboard sessions from expiring.
Route dashboard ajax calls through Laravel.
Boots minimal cookies and sessions.
Does not fix other pages for now, real fix is to fully port.

* Check Laravel auth for the legacy calls.
Display Laravel errors in the dashboard.
legacy auth checks are mostly extraneous now.
  • Loading branch information
murrant committed Oct 1, 2018
1 parent c36a9e9 commit 14a168b
Show file tree
Hide file tree
Showing 9 changed files with 175 additions and 66 deletions.
14 changes: 14 additions & 0 deletions LibreNMS/Util/Laravel.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,20 @@

class Laravel
{
public static function bootCli()
{
// make sure Laravel isn't already booted
if (class_exists('App') && App::isBooted()) {
return;
}

define('LARAVEL_START', microtime(true));
$install_dir = realpath(__DIR__ . '/../..');
$app = require_once $install_dir . '/bootstrap/app.php';
$kernel = $app->make(\Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();
}

public static function enableQueryDebug()
{
$db = Eloquent::DB();
Expand Down
10 changes: 10 additions & 0 deletions app/Http/Controllers/LegacyController.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,14 @@ public function api($path = '')
{
include base_path('html/legacy_api_v0.php');
}

public function dash()
{
ob_start();
include base_path('html/legacy/ajax_dash.php');
$output = ob_get_contents();
ob_end_clean();

return response($output, 200, ['Content-Type' => 'application/json']);
}
}
5 changes: 5 additions & 0 deletions app/Http/Kernel.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ class Kernel extends HttpKernel
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],

'minimal' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
],

'api' => [
'bindings',
'auth:token'
Expand Down
13 changes: 13 additions & 0 deletions app/Providers/RouteServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,26 @@ public function boot()
*/
public function map()
{
$this->mapLegacyRoutes();

$this->mapApiRoutes();

$this->mapWebRoutes();

//
}

/**
* Define legacy routes for the application.
* Only initializing minimal middleware: Cookies and Session.
*/
protected function mapLegacyRoutes()
{
Route::middleware('minimal')
->namespace($this->namespace)
->group(base_path('routes/legacy.php'));
}

/**
* Define the "web" routes for the application.
*
Expand Down
113 changes: 56 additions & 57 deletions html/ajax_dash.php
Original file line number Diff line number Diff line change
@@ -1,62 +1,61 @@
<?php

/*
* LibreNMS
*
* Copyright (c) 2014 Neil Lathwood <https://github.com/laf/ http://www.lathwood.co.uk/fa>
/**
* Laravel - A PHP Framework For Web Artisans
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version. Please see LICENSE.txt at the top level of
* the source code distribution for details.
* @package Laravel
* @author Taylor Otwell <taylor@laravel.com>
*/

use LibreNMS\Authentication\LegacyAuth;

$init_modules = array('web', 'auth');
require realpath(__DIR__ . '/..') . '/includes/init.php';

set_debug($_REQUEST['debug']);

header('Content-type: application/json');

if (!LegacyAuth::check()) {
$response = array(
'status' => 'error',
'message' => 'Unauthenticated',
);
echo _json_encode($response);
exit;
}

$type = $vars['type'];

if ($type == 'placeholder') {
$output = "<span style='text-align:left;'><br><h3>Click on the Edit Dashboard button (next to the list of dashboards) to add widgets</h3><br><h4><strong>Remember:</strong> You can only move & resize widgets when you're in <strong>Edit Mode</strong>.</h4><span>";
$status = 'ok';
$title = 'Placeholder';
} elseif (is_file('includes/common/'.$type.'.inc.php')) {
$results_limit = 10;
$typeahead_limit = $config['webui']['global_search_result_limit'];
$no_form = true;
$unique_id = str_replace(array("-","."), "_", uniqid($type, true));
$widget_id = $vars['id'];
$widget_settings = json_decode(dbFetchCell('select settings from users_widgets where user_widget_id = ?', array($widget_id)), true);
$widget_dimensions = $vars['dimensions'];
if (!empty($vars['settings'])) {
define('SHOW_SETTINGS', true);
}
include 'includes/common/'.$type.'.inc.php';
$output = implode('', $common_output);
$status = 'ok';
$title = display($widget_settings['title']) ?: ucfirst(display($type));
}

$response = array(
'status' => $status,
'html' => $output,
'title' => $title,
);

echo _json_encode($response);
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels great to relax.
|
*/

require __DIR__.'/../bootstrap/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once __DIR__.'/../bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

// rewrite the request uri
$_SERVER['REQUEST_URI'] = '/legacy_ajax_dash';

$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);
64 changes: 64 additions & 0 deletions html/legacy/ajax_dash.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
<?php

/*
* LibreNMS
*
* Copyright (c) 2014 Neil Lathwood <https://github.com/laf/ http://www.lathwood.co.uk/fa>
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version. Please see LICENSE.txt at the top level of
* the source code distribution for details.
* @package Laravel
* @author Taylor Otwell <taylor@laravel.com>
*/

use LibreNMS\Authentication\LegacyAuth;

$init_modules = ['web', 'auth'];
require realpath(__DIR__ . '/../..') . '/includes/init.php';

set_debug(isset($_REQUEST['debug']) && $_REQUEST['debug']);

header('Content-type: application/json');

if (!LegacyAuth::check()) {
$response = array(
'status' => 'error',
'message' => 'Unauthenticated',
);
echo _json_encode($response);
exit;
}

$type = isset($vars['type']) ? $vars['type'] : 'placeholder';

if ($type == 'placeholder') {
$output = "<span style='text-align:left;'><br><h3>Click on the Edit Dashboard button (next to the list of dashboards) to add widgets</h3><br><h4><strong>Remember:</strong> You can only move & resize widgets when you're in <strong>Edit Mode</strong>.</h4><span>";
$status = 'ok';
$title = 'Placeholder';
} elseif (is_file('includes/common/'.$type.'.inc.php')) {
$results_limit = 10;
$typeahead_limit = $config['webui']['global_search_result_limit'];
$no_form = true;
$unique_id = str_replace(array("-","."), "_", uniqid($type, true));
$widget_id = $vars['id'];
$widget_settings = json_decode(dbFetchCell('select settings from users_widgets where user_widget_id = ?', array($widget_id)), true);
$widget_dimensions = $vars['dimensions'];
if (!empty($vars['settings'])) {
define('SHOW_SETTINGS', true);
}
include 'includes/common/'.$type.'.inc.php';
$output = implode('', $common_output);
$status = 'ok';
$title = display($widget_settings['title']) ?: ucfirst(display($type));
}

$response = array(
'status' => $status,
'html' => $output,
'title' => $title,
);

echo _json_encode($response);
8 changes: 6 additions & 2 deletions html/pages/front/tiles.php
Original file line number Diff line number Diff line change
Expand Up @@ -653,8 +653,12 @@ function widget_reload(id,data_type) {
$("#widget_body_"+id).html('<div class="alert alert-info">' + data.message + '</div>');
}
},
error: function () {
$("#widget_body_"+id).html('<div class="alert alert-info">Problem with backend</div>');
error: function (data) {
if (data.responseJSON.error) {
$("#widget_body_"+id).html('<div class="alert alert-info">' + data.responseJSON.error + '</div>');
} else {
$("#widget_body_"+id).html('<div class="alert alert-info">Problem with backend</div>');
}
}
});
}
Expand Down
8 changes: 1 addition & 7 deletions includes/init.php
Original file line number Diff line number Diff line change
Expand Up @@ -93,13 +93,7 @@ function module_selected($module, $modules)
}

if (module_selected('laravel', $init_modules)) {
// make sure Laravel isn't already booted
if (!class_exists('App') || !App::isBooted()) {
define(LARAVEL_START, microtime(true));
$app = require_once $install_dir . '/bootstrap/app.php';
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$kernel->bootstrap();
}
\LibreNMS\Util\Laravel::bootCli();
}

if (!module_selected('nodb', $init_modules)) {
Expand Down
6 changes: 6 additions & 0 deletions routes/legacy.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?php


Route::group(['middleware' => ['auth'], 'guard' => 'auth'], function () {
Route::any('legacy_ajax_dash', 'LegacyController@dash');
});

0 comments on commit 14a168b

Please sign in to comment.