- Add LDCNetwork Management

This commit is contained in:
Vincent BRIDIER 2020-04-21 11:59:54 +02:00
parent 6d5a116314
commit 8d80e6c674
18 changed files with 347 additions and 11 deletions

View file

@ -3,6 +3,7 @@
namespace App\Http\Controllers;
use App\Models\DomainNames;
use App\Models\EmailAddresses;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
@ -42,7 +43,12 @@ class DomainNamesController extends Controller
public function delete(Request $request) {
$dm_id = $request->id;
$dm = DomainNames::findOrFail($dm_id);
return view('domain-names.delete', ['dm' => $dm]);
$isUsed = EmailAddresses::where('domain_name_id', '=', $dm->id)->get();
if ($isUsed->count() === 0)
$isUsed = false;
return view('domain-names.delete', ['dm' => $dm, 'isUsed' => $isUsed]);
}
public function forceDelete(Request $request)

View file

@ -0,0 +1,90 @@
<?php
namespace App\Http\Controllers;
use App\Models\LDCNetworks;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use lfkeitel\phptotp\Base32;
use lfkeitel\phptotp\Totp;
class LDCNetworkController extends Controller
{
public function index(Request $request) {
$networks = LDCNetworks::all();
return view('ldc-networks.index', ['networks' => $networks]);
}
public function add(Request $request) {
return view('ldc-networks.add');
}
public function edit(Request $request) {
$network_id = $request->id;
$network = LDCNetworks::findOrFail($network_id);
return view('ldc-networks.edit', ['network' => $network]);
}
public function update(Request $request) {
$network_id = $request->id;
$network = LDCNetworks::findOrFail($network_id);
$this->makeChanges($request, $network);
return redirect()->route('ldc-networks.edit', ['id' => $network->id])->with('status', 'Sauvegardée !');
}
public function store(Request $request) {
$network = new LDCNetworks();
$this->makeChanges($request, $network);
return redirect()->route('ldc-networks.edit', ['id' => $network->id])->with('status', 'Sauvegardée !');
}
public function delete(Request $request) {
$network_id = $request->id;
$network = LDCNetworks::findOrFail($network_id);
return view('ldc-networks.delete', ['network' => $network]);
}
public function forceDelete(Request $request)
{
$network_id = $request->id;
$otp1 = $request->otp1;
$otp2 = $request->otp2;
$otp3 = $request->otp3;
$otp4 = $request->otp4;
$otp5 = $request->otp5;
$otp6 = $request->otp6;
$otp = $otp1 . $otp2 . $otp3 . $otp4 . $otp5 . $otp6;
$lastCode = (new Totp())->GenerateToken(Base32::decode(Auth::user()->totp_secret), Carbon::now()->subSeconds(30)->timestamp);
$code = (new Totp())->GenerateToken(Base32::decode(Auth::user()->totp_secret));
if ($otp === $code || $otp === $lastCode) {
$network = LDCNetworks::findOrFail($network_id);
$network->delete();
return redirect()->route('ldc-networks.index')->with('status', 'IP supprimée !');
}else{
return redirect()->route('ldc-networks.edit', ['id' => $network_id])->with('error', 'Code de vérification invalide.');
}
}
private function makeChanges($request, $network) {
$cidr = $request->cidr;
$range = $this->cidrToRange($cidr);
$network->cidr = $cidr;
$network->first_ip = $range[0];
$network->last_ip = $range[1];
$network->save();
}
private function cidrToRange($cidr) {
$range = array();
$cidr = explode('/', $cidr);
$range[0] = long2ip((ip2long($cidr[0])) & ((-1 << (32 - (int)$cidr[1]))));
$range[1] = long2ip((ip2long($range[0])) + pow(2, (32 - (int)$cidr[1])) - 1);
return $range;
}
}

View file

@ -18,6 +18,14 @@ class ProjectsController extends Controller
return view('projects.index', ['projects' => $projects]);
}
public function WpAutoLogin(Request $request) {
$url = $request->url;
$login = $request->login;
$pwd = $request->pwd;
return view('projects.wp-auto-login', ['url' => $url, 'login' => $login, 'pwd' => $pwd]);
}
public function add(Request $request) {
$dev_db_server = Servers::where([
['env', 'DEV'],

View file

@ -0,0 +1,10 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class LDCNetworks extends Model
{
protected $table = 'ldc_networks';
}

2
public/js/app.js vendored

File diff suppressed because one or more lines are too long

1
resources/js/app.js vendored
View file

@ -21,6 +21,7 @@ window.Vue = require('vue');
Vue.component('otp-form', require('./components/OTPFormComponent.vue').default);
Vue.component('login-id', require('./components/LoginIDComponent.vue').default);
Vue.component('wp-auto-login', require('./components/WPAutoLoginComponent.vue').default);
/**
* Next, we will create a fresh Vue application instance and attach it to

View file

@ -3,12 +3,12 @@
<div class="row" style="margin: 10px;">
<div v-if="datas.length > 0" class="col-md-12">
<div class="row" v-for="(item, index) in datas">
<div class="col-md-5">
<div :class="type === 'WP' ? 'col-md-4' : 'col-md-5'">
<div class="form-group">
<input v-model="item.login" type="text" placeholder="Login" class="form-control" required>
</div>
</div>
<div class="col-md-5">
<div :class="type === 'WP' ? 'col-md-4' : 'col-md-5'">
<div class="form-group">
<input v-model="item.pwd" type="text" placeholder="Password" class="form-control" required>
</div>
@ -16,6 +16,9 @@
<div class="col-md-2">
<a @click="removeItem(index)" href="#" class="btn btn-danger"><i class="fas fa-user-times"></i></a>
</div>
<div v-if="type === 'WP'" class="col-md-2">
<a :href="'/projects/wp-auto-login?url=' + url + 'wp-login.php&login=' + item.login + '&pwd=' + item.pwd" target="_blank" class="btn btn-success"><i class="fas fa-sign-in-alt"></i></a>
</div>
</div>
</div>
<div class="col-md-12 text-center">
@ -34,7 +37,9 @@
},
props: [
'name',
'dbdatas'
'dbdatas',
'url',
'type'
],
data() {
return {

View file

@ -0,0 +1,20 @@
<template>
<form ref="login" :action="url" method="POST">
<input type="hidden" name="log" :value="login">
<input type="hidden" name="pwd" :value="pwd">
</form>
</template>
<script>
export default {
mounted() {
console.log('WP Auto Login Component mounted.');
this.$refs.login.submit();
},
props: [
'login',
'pwd',
'url'
],
}
</script>

View file

@ -5,11 +5,24 @@
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Confirmation de suppression du nom de domaine <a href="{{route('domain-names.edit', ['id' => $dm->id])}}" class="btn btn-sm btn-primary float-right">Retour</a></div>
@if ($isUsed === false)
<div class="card-header">Confirmation de suppression du nom de domaine <a href="{{route('domain-names.edit', ['id' => $dm->id])}}" class="btn btn-sm btn-primary float-right">Retour</a></div>
<div class="card-body">
<otp-form csrf='{{ csrf_token() }}' action="{{route('domain-names.force-delete', ['id' => $dm->id])}}"></otp-form>
</div>
<div class="card-body">
<otp-form csrf='{{ csrf_token() }}' action="{{route('domain-names.force-delete', ['id' => $dm->id])}}"></otp-form>
</div>
@else
<div class="card-header">Suppression du nom de domaine refusée <a href="{{route('domain-names.edit', ['id' => $dm->id])}}" class="btn btn-sm btn-primary float-right">Retour</a></div>
<div class="card-body">
<p>Le nom de domaine est utilisé par le(s) email(s) suivant(s) :</p>
<ul>
@foreach($isUsed as $email)
<li>{{$email->account}} @ {{$dm->utf8_name}}</li>
@endforeach
</ul>
</div>
@endif
</div>
</div>
</div>

View file

@ -43,6 +43,10 @@
<i class="fas fa-at"></i><br>
Adresses email
</a>
<a href="{{route('ldc-networks.index')}}" class="btn btn-lg btn-primary">
<i class="fas fa-network-wired"></i><br>
Réseau LDC
</a>
</div>
</div>
</div>

View file

@ -58,6 +58,9 @@
<li class="nav-item">
<a href="{{route('email-addresses.index')}}" class="nav-link">Adresses email</a>
</li>
<li class="nav-item">
<a href="{{route('ldc-networks.index')}}" class="nav-link">Réseau LDC</a>
</li>
<li class="nav-item">
<a href="/status-checker" class="nav-link">Status Checker</a>
</li>

View file

@ -0,0 +1,43 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header">Ajout d'une IP LDC</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
@if (session('error'))
<div class="alert alert-danger" role="alert">
{{ session('error') }}
</div>
@endif
<form action="{{route('ldc-networks.store')}}" method="POST">
@csrf
<div class="row">
<div class="col-md-6 offset-md-3">
<div class="form-group">
<label><b>CIDR :</b></label>
<input type="text" class="form-control" name="cidr"
placeholder="ex: 0.0.0.0/0" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12 text-center">
<input type="submit" value="Enregistrer" class="btn btn-primary">
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -0,0 +1,17 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">Confirmation de suppression de l'IP <a href="{{route('ldc-networks.edit', ['id' => $network->id])}}" class="btn btn-sm btn-primary float-right">Retour</a></div>
<div class="card-body">
<otp-form csrf='{{ csrf_token() }}' action="{{route('ldc-networks.force-delete', ['id' => $network->id])}}"></otp-form>
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -0,0 +1,58 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header">Détails de l'IP LDC <a href="{{route('ldc-networks.delete', ['id' => $network->id])}}" class="btn btn-sm btn-danger float-right">Supprimer</a>
</div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
@if (session('error'))
<div class="alert alert-danger" role="alert">
{{ session('error') }}
</div>
@endif
<form action="{{route('ldc-networks.update', ['id' => $network->id])}}" method="POST">
@csrf
<div class="row">
<div class="col-md-6 offset-md-3">
<div class="form-group">
<label><b>CIDR :</b></label>
<input type="text" class="form-control" name="cidr"
placeholder="ex: 0.0.0.0/0" required value="{{$network->cidr}}">
</div>
</div>
</div>
<div class="row">
<div class="col-md-3 offset-md-3">
<div class="form-group">
<label><b>Première IP :</b></label>
<input type="text" class="form-control" value="{{$network->first_ip}}" disabled>
</div>
</div>
<div class="col-md-3">
<div class="form-group">
<label><b>Dernière IP :</b></label>
<input type="text" class="form-control" value="{{$network->last_ip}}" disabled>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12 text-center">
<input type="submit" value="Enregistrer" class="btn btn-primary">
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -0,0 +1,37 @@
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header">Gestion des IP du réseau LDC<a href="{{route('ldc-networks.add')}}" class="btn btn-sm btn-primary float-right">Ajouter</a></div>
<div class="card-body">
@if (session('status'))
<div class="alert alert-success" role="alert">
{{ session('status') }}
</div>
@endif
<table class="table text-center">
<thead class="thead-dark">
<tr>
<th scope="col">CIDR</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@foreach($networks as $network)
<tr>
<td>{{$network->cidr}}</td>
<td><a href="{{route('ldc-networks.edit', ['id' => $network->id])}}" class="btn btn-sm btn-primary">Détails</a></td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
@endsection

View file

@ -115,10 +115,10 @@
</div>
<div class="row">
<div class="col-md-6">
<login-id name="dev_login" dbdatas="{{$project->dev_login}}"/>
<login-id name="dev_login" dbdatas="{{$project->dev_login}}" url="{{$project->dev_url}}" type="{{$project->type}}"/>
</div>
<div class="col-md-6">
<login-id name="prod_login" dbdatas="{{$project->prod_login}}"/>
<login-id name="prod_login" dbdatas="{{$project->prod_login}}" url="{{$project->prod_url}}" type="{{$project->type}}"/>
</div>
</div>
@endif

View file

@ -0,0 +1,12 @@
@extends('layouts.app')
@section('content')
<wp-auto-login url="{{$url}}" login="{{$login}}" pwd="{{$pwd}}"></wp-auto-login>
<div class="container">
<div class="row">
<div class="col-md-12 text-center">
<h1>Connexion en cours...</h1>
</div>
</div>
</div>
@endsection

View file

@ -28,6 +28,7 @@ Route::group(['middleware' => ['auth']], function () {
Route::post('/projects/{uuid}/force-delete', 'ProjectsController@forceDelete');
Route::get('/projects/add', 'ProjectsController@add');
Route::post('/projects/store', 'ProjectsController@store');
Route::get('/projects/wp-auto-login', 'ProjectsController@WpAutoLogin')->name('projects.wp-auto-login');
/* SERVERS */
Route::get('/servers', 'ServersController@index')->name('servers.index');
Route::post('/servers/store', 'ServersController@store')->name('servers.store');
@ -60,4 +61,12 @@ Route::group(['middleware' => ['auth']], function () {
Route::post('/email-addresses/{id}/update', 'EmailAddressesController@update')->name('email-addresses.update');
Route::get('/email-addresses/{id}/delete', 'EmailAddressesController@delete')->name('email-addresses.delete');
Route::post('/email-addresses/{id}/force-delete', 'EmailAddressesController@forceDelete')->name('email-addresses.force-delete');
/* IP LDC NETWORK */
Route::get('/ldc-networks', 'LDCNetworkController@index')->name('ldc-networks.index');
Route::post('/ldc-networks/store', 'LDCNetworkController@store')->name('ldc-networks.store');
Route::get('/ldc-networks/add', 'LDCNetworkController@add')->name('ldc-networks.add');
Route::get('/ldc-networks/{id}', 'LDCNetworkController@edit')->name('ldc-networks.edit');
Route::post('/ldc-networks/{id}/update', 'LDCNetworkController@update')->name('ldc-networks.update');
Route::get('/ldc-networks/{id}/delete', 'LDCNetworkController@delete')->name('ldc-networks.delete');
Route::post('/ldc-networks/{id}/force-delete', 'LDCNetworkController@forceDelete')->name('ldc-networks.force-delete');
});