Implemented caching of our base_dn

This commit is contained in:
Deon George 2023-01-28 23:07:39 +11:00
parent 210793e814
commit 413f1ec065
6 changed files with 97 additions and 10 deletions

View File

@ -2,10 +2,11 @@
namespace App\Classes\LDAP; namespace App\Classes\LDAP;
use Carbon\Carbon;
use Exception; use Exception;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Config;
use LdapRecord\Models\Model; use LdapRecord\Models\Model;
use LdapRecord\Query\Collection; use LdapRecord\Query\Collection;
use LdapRecord\Query\Model\Builder; use LdapRecord\Query\Model\Builder;
@ -24,6 +25,7 @@ class Server
{ {
return ($x=(new Entry) return ($x=(new Entry)
->query() ->query()
->cache(Carbon::now()->addSeconds(Config::get('ldap.cache.time')))
->select(['*','hassubordinates']) ->select(['*','hassubordinates'])
->setDn($dn) ->setDn($dn)
->listing() ->listing()
@ -41,6 +43,7 @@ class Server
{ {
return ($x=(new Entry) return ($x=(new Entry)
->query() ->query()
->cache(Carbon::now()->addSeconds(Config::get('ldap.cache.time')))
->select($attrs) ->select($attrs)
->find($dn)) ? $x : NULL; ->find($dn)) ? $x : NULL;
} }

View File

@ -30,7 +30,7 @@ class HomeController extends Controller
*/ */
public function home() public function home()
{ {
$base = (new Entry)->baseDN() ?: collect(); $base = (new Entry)->baseDNs() ?: collect();
return view('home') return view('home')
->with('server',config('ldap.connections.default.name')) ->with('server',config('ldap.connections.default.name'))

View File

@ -2,8 +2,11 @@
namespace App\Ldap; namespace App\Ldap;
use Carbon\Carbon;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Config;
use LdapRecord\LdapRecordException;
use LdapRecord\Models\Model; use LdapRecord\Models\Model;
use LdapRecord\Query\ObjectNotFoundException; use LdapRecord\Query\ObjectNotFoundException;
@ -41,18 +44,33 @@ class Entry extends Model
* @throws ObjectNotFoundException * @throws ObjectNotFoundException
* @testedin GetBaseDNTest::testBaseDNExists(); * @testedin GetBaseDNTest::testBaseDNExists();
*/ */
public static function baseDN($connection = NULL): ?Collection public static function baseDNs($connection = NULL): ?Collection
{ {
$base = static::on($connection ?? (new static)->getConnectionName()) $cachetime = Carbon::now()->addSeconds(Config::get('ldap.cache.time'));
->in(NULL)
->read()
->select(['namingcontexts'])
->whereHas('objectclass')
->firstOrFail();
try {
$base = static::on($connection ?? (new static)->getConnectionName())
->cache($cachetime)
->in(NULL)
->read()
->select(['namingcontexts'])
->whereHas('objectclass')
->firstOrFail();
// If we cannot get to our LDAP server we'll head straight to the error page
} catch (LdapRecordException $e) {
abort(597,$e->getMessage());
}
/**
* @note While we are caching our baseDNs, it seems if we have more than 1,
* our caching doesnt generate a hit on a subsequent call to this function (before the cache expires).
* IE: If we have 5 baseDNs, it takes 5 calls to this function to case them all.
* @todo Possibly a bug wtih ldaprecord, so need to investigate
*/
$result = collect(); $result = collect();
foreach ($base->namingcontexts as $dn) { foreach ($base->namingcontexts as $dn) {
$result->push((new self)->findOrFail($dn)); $result->push((new self)->cache($cachetime)->findOrFail($dn));
} }
return $result; return $result;

View File

@ -69,6 +69,7 @@ return [
'cache' => [ 'cache' => [
'enabled' => env('LDAP_CACHE', false), 'enabled' => env('LDAP_CACHE', false),
'driver' => env('CACHE_DRIVER', 'file'), 'driver' => env('CACHE_DRIVER', 'file'),
'time' => env('LDAP_CACHE_TIME',5*60), // Seconds
], ],
]; ];

View File

@ -0,0 +1,56 @@
<!DOCTYPE html>
<html>
@section('htmlheader')
@include('architect::layouts.partials.htmlheader')
@show
<body class="hold-transition error-page">
<div id="app">
<!-- /.login-logo -->
<div class="app-container app-theme-white body-tabs-shadow">
<div class="app-container">
<div class="h-100 bg-animation">
<div class="d-flex h-100 justify-content-center align-items-center">
<div class="mx-auto app-login-box col-md-8">
<div class="modal-dialog w-100 mx-auto">
<div class="modal-content">
<div class="modal-header">
<div class="app-logo"><img class="w-50" src="{{ url('img/logo-h-lg.png') }}"></div>
</div>
<div class="modal-body">
<div class="text-center">
<span class="badge badge-danger fsize-2 mb-3 ">@yield('error')</span>
</div>
<table class="table">
<tr>
<th>Configuration</th>
<td>{{ $x=config('ldap.default') }}</td>
</tr>
<tr>
<th>Host</th>
<td>{{ ($y=collect(config('ldap.connections.'.$x.'.hosts')))->join(',') }} (IP: <strong>{!! $y->transform(function($item) { return collect(dns_get_record($item))->transform(function($item) { return Arr::get($item,'ip',Arr::get($item,'ipv6')); })->filter()->join('</strong>,<strong>'); })->join(',') !!}</strong>)</td>
</tr>
<tr>
<th>Port</th>
<td>{{ config('ldap.connections.'.$x.'.port') }}</td>
</tr>
<tr>
<th>Message</th>
<td>@yield('content')</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,9 @@
@extends('architect::layouts.error')
@section('error')
@lang('LDAP Server Unavailable')
@endsection
@section('content')
{{ $exception->getMessage() }}
@endsection