Start on fetching DN from server

This commit is contained in:
Deon George 2020-09-13 21:30:04 +10:00
parent 130ae005a3
commit f323be3d7f
10 changed files with 162 additions and 52 deletions

View File

@ -54,6 +54,27 @@ class Server
}
}
/**
* Fetch a DN from the server
*
* @param $dn
* @return |null
*/
public function fetch(string $dn,array $attributes=['*'])
{
try {
return ($x=(new Adldap)
->addProvider(config('ldap.connections.default.settings'))
->search()
->select($attributes)
->findByDn($dn)) ? $x : NULL;
// @todo Tidy up this exception
} catch (\Exception $e) {
dd(['e'=>$e]);
}
}
/**
* Query the server for a DN
*

View File

@ -26,6 +26,7 @@ class APIController extends Controller
'item'=>Crypt::encryptString($item),
'lazy'=>TRUE,
'icon'=>'fa-fw fas fa-sitemap',
'tooltip'=>$item,
];
});
}
@ -39,12 +40,12 @@ class APIController extends Controller
return (new Server())
->query($dn)
->transform(function($item) {
//dd($item->getDistinguishedName(),$item);
return [
'title'=>$item->getDistinguishedName(),
'item'=>Crypt::encryptString($item->getDistinguishedName()),
'icon'=>'fa-fw fas fa-sitemap',
'lazy'=>TRUE,
'tooltip'=>$item->getDistinguishedName(),
];
});

View File

@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Crypt;
use App\Classes\LDAP\Server;
@ -12,7 +13,23 @@ class HomeController extends Controller
$o = new Server;
return view('home')
->with('server',config('ldap.connections.default.name')) // @todo This connection name should be a config item
->with('bases',$o->getBaseDN());
->with('server',config('ldap.connections.default.name'))
->with('bases',$o->getBaseDN()->transform(function($item) {
return [
'title'=>$item,
'item'=>Crypt::encryptString($item),
'lazy'=>TRUE,
'icon'=>'fa-fw fas fa-sitemap',
'tooltip'=>$item,
];
}));
}
public function render(Request $request) {
$dn = Crypt::decryptString($request->post('key'));
return view('widgets.dn')
->with('dn',$dn)
->with('leaf',(new Server())->fetch($dn));
}
}

33
public/js/custom.js vendored
View File

@ -12,6 +12,13 @@ function expandChildren(node) {
}
$(document).ready(function() {
// If our bases have been set, we'll render them directly
if (typeof basedn !== 'undefined') {
sources = basedn;
} else {
sources = { url: 'api/bases' };
}
// Attach the fancytree widget to an existing <div id="tree"> element
// and pass the tree options as an argument to the fancytree() function:
$('#tree').fancytree({
@ -20,16 +27,24 @@ $(document).ready(function() {
autoCollapse: true, // Automatically collapse all siblings, when a node is expanded.
autoScroll: true, // Automatically scroll nodes into visible area.
focusOnSelect: true, // Set focus when node is checked by a mouse click
click: function(event, data) {
if (data.targetType == 'title')
return false;
},
init: function(event, data) {
expandChildren(data.tree.rootNode);
},
source: {
url: "api/bases"
click: function(event,data) {
if (data.targetType == 'title') {
$.ajax({
url: 'render',
method: 'POST',
data: { key: data.node.data.item },
dataType: 'html',
}).done(function(html) {
console.log(data);
$('.main-content').empty().append(html);
}).fail(function() {
alert('Failed');
});
}
},
source: sources,
lazyLoad: function(event,data) {
data.result = {
url: "api/query",

View File

@ -15,13 +15,17 @@
<div class="app-main__outer">
<div class="app-main__inner">
@include('architect::layouts.partials.contentheader')
<div class="main-content">
@if (trim($__env->yieldContent('page_title')))
@include('architect::layouts.partials.contentheader')
@endif
<!-- Main content -->
<div class="row">
<div class="col-12">
<!-- Your Page Content Here -->
@yield('main-content')
<!-- Main content -->
<div class="row">
<div class="col-12">
<!-- Your Page Content Here -->
@yield('main-content')
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,11 @@
@if (trim($__env->yieldContent('page_title')))
@include('architect::layouts.partials.contentheader')
@endif
<!-- Main content -->
<div class="row">
<div class="col-12">
<!-- Your Page Content Here -->
@yield('main-content')
</div>
</div>

View File

@ -1,44 +1,49 @@
<div class="app-page-title">
<div class="page-title-wrapper">
<div class="page-title-heading">
<div class="page-title-icon">
<i class="@yield('page_icon','pe-7s-car')"></i>
</div>
@if (trim($__env->yieldContent('page_icon')))
<div class="page-title-icon">
<i class="@yield('page_icon','')"></i>
</div>
@endif
<div>
@yield('page_title','Page Title')
<div class="page-title-subheading">
@yield('page_subtitle','Page Sub Title')
@yield('page_subtitle','')
</div>
</div>
</div>
<div class="page-title-actions">
{{--
<button type="button" data-toggle="tooltip" title="Example Tooltip" data-placement="bottom" class="btn-shadow mr-3 btn btn-dark">
<i class="fa fa-star"></i>
</button>
--}}
<div class="d-inline-block dropdown">
<button type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="btn-shadow dropdown-toggle btn btn-info">
<span class="btn-icon-wrapper pr-2 opacity-7">
<i class="fa fa-business-time fa-w-20"></i>
</span>
Item Menu
</button>
<div tabindex="-1" role="menu" aria-hidden="true" class="dropdown-menu dropdown-menu-right">
<ul class="nav flex-column">
{{--
<li class="nav-item">
<a href="javascript:void(0);" class="nav-link">
<i class="nav-link-icon lnr-inbox"></i>
<span>Inbox</span>
<div class="ml-auto badge badge-pill badge-secondary">86</div>
</a>
</li>
--}}
</ul>
@isset($page_actions)
<div class="page-title-actions">
{{--
<button type="button" data-toggle="tooltip" title="Example Tooltip" data-placement="bottom" class="btn-shadow mr-3 btn btn-dark">
<i class="fa fa-star"></i>
</button>
--}}
<div class="d-inline-block dropdown">
<button type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="btn-shadow dropdown-toggle btn btn-info">
<span class="btn-icon-wrapper pr-2 opacity-7">
<i class="fa fa-business-time fa-w-20"></i>
</span>
Item Menu
</button>
<div tabindex="-1" role="menu" aria-hidden="true" class="dropdown-menu dropdown-menu-right">
<ul class="nav flex-column">
{{--
<li class="nav-item">
<a href="javascript:void(0);" class="nav-link">
<i class="nav-link-icon lnr-inbox"></i>
<span>Inbox</span>
<div class="ml-auto badge badge-pill badge-secondary">86</div>
</a>
</li>
--}}
</ul>
</div>
</div>
</div>
</div>
@endif
</div>
</div>

View File

@ -4,10 +4,12 @@
Home
@endsection
@section('contentheader_title')
Home
@section('page_title')
@endsection
@section('contentheader_description')
@section('page_subtitle')
Content Header - Description
@endsection
@section('page_icon')
@endsection
@section('main-content')
@ -38,4 +40,8 @@
</div>
@endsection
@section('page-scripts')
<script>
var basedn = {!! $bases->toJson() !!};
</script>
@append

View File

@ -0,0 +1,29 @@
@extends('architect::layouts.dn')
@section('htmlheader_title')
Home
@endsection
@section('page_title')
{{ $dn }}
@endsection
@section('page_subtitle')
{{ $leaf->entryuuid[0] }}
@endsection
@section('page_icon')
fas fa-cog
@endsection
@section('main-content')
<table class="table">
<tr>
<td colspan="2">@dump($leaf->getOriginal(),$leaf->countAttributes())</td>
</tr>
@foreach ($leaf->getAttributes() as $attribute => $value)
<tr>
<th>{{ $attribute }}</th>
<td>{!! is_array($value) ? join('<br>',$value) : $value !!}</td>
</tr>
@endforeach
</table>
@endsection

View File

@ -23,3 +23,4 @@ Auth::routes([
Route::redirect('/','home');
Route::get('logout','Auth\LoginController@logout');
Route::get('home','HomeController@home');
Route::post('render','HomeController@render');