Files
librenms-librenms/resources/views/service-template/index.blade.php
Tony Murray 19344f0584 Fix JS injection in Service Templates (#15954)
You can't put user data in any "onwhatever" attributes, there is no way to sanitize it there.
Use data attributes instead.
2024-04-18 21:45:30 -05:00

254 lines
12 KiB
PHP

@extends('layouts.librenmsv1')
@section('title', __('Services Templates'))
@section('content')
<div class="container-fluid">
<x-panel id="manage-services-templates-panel">
<x-slot name="title">
<span class="fa-stack" aria-hidden="true">
<i class="fa fa-square fa-stack-2x"></i>
<i class="fa fa-cogs fa-stack-1x fa-inverse"></i>
</span> {{ __('Services Templates') }}
</x-slot>
<div class="row" style="padding-bottom: 16px;">
<div class="col-md-12">
<a type="button" class="btn btn-primary" href="{{ route('services.templates.create') }}">
<i class="fa fa-plus"></i> {{ __('New Service Template') }}
</a>
<button type="button" title="{{ __('Apply Service Templates') }}" class="btn btn-success" aria-label="{{ __('Apply Service Templates') }}"
onclick="applyAll_st(this)">
<i
class="fa fa-refresh" aria-hidden="true"></i> {{ __('Apply Service Templates') }}</button>
</div>
</div>
<div class="table-responsive">
<table id="manage-services-templates-table" class="table table-condensed table-hover">
<thead>
<tr>
<th>{{ __('Name') }}</th>
<th>{{ __('Description') }}</th>
<th>{{ __('Devices') }}</th>
<th>{{ __('Device Groups') }}</th>
<th>{{ __('Device Type') }}</th>
<th>{{ __('Device Rules') }}</th>
<th>{{ __('Actions') }}</th>
</tr>
</thead>
<tbody>
@foreach($service_templates as $template)
<tr id="row_{{ $template->id }}">
<td>{{ $template->name }}</td>
<td>{{ $template->desc }}</td>
<td>
<a href="{{ url("/devices/serviceTemplates=$template->id") }}">{{ $template->devices_count }}</a>
</td>
<td>
<a href="{{ url("/device-groups/serviceTemplates=$template->id") }}">{{ $template->groups_count }}</a>
</td>
<td>{{ __(ucfirst($template->type)) }}</td>
<td>{{ $template->type == 'dynamic' ? $template->getDeviceParser()->toSql(false) : '' }}</td>
<td>
<button type="button" title="{{ __('Apply Services for this Service Template') }}"
class="btn btn-success btn-sm" aria-label="{{ __('Apply') }}"
data-template-name="{{ $template->name }}"
data-template-id="{{ $template->id }}"
onclick="apply_st(this)">
<i class="fa fa-refresh" aria-hidden="true"></i>
</button>
<button type="button" title="{{ __('Remove Services for this Service Template') }}"
class="btn btn-warning btn-sm" aria-label="{{ __('Remove') }}"
data-template-name="{{ $template->name }}"
data-template-id="{{ $template->id }}"
onclick="remove_st(this)">
<i class="fa fa-ban" aria-hidden="true"></i>
</button>
<a type="button" title="{{ __('Edit Service Template') }}"
class="btn btn-primary btn-sm" aria-label="{{ __('Edit') }}"
href="{{ route('services.templates.edit', $template->id) }}">
<i class="fa fa-pencil" aria-hidden="true"></i>
</a>
<button type="button" class="btn btn-danger btn-sm"
title="{{ __('Delete Service Template') }}" aria-label="{{ __('Delete') }}"
data-template-name="{{ $template->name }}"
data-template-id="{{ $template->id }}"
onclick="delete_st(this)">
<i class="fa fa-trash" aria-hidden="true"></i>
</button>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@foreach($groups as $group)
<x-panel id="manage-services-templates-panel-dg">
<x-slot name="title">
<i class="fa fa-th fa-fw fa-lg" aria-hidden="true"></i> {{ __($group->name) }}
</x-slot>
<div class="table-responsive">
<table id="manage-services-templates-table-dg-{{ $group->id }}" class="table table-condensed table-hover">
<thead>
<tr>
<th>{{ __('Name') }}</th>
<th>{{ __('Check Type') }}</th>
<th>{{ __('Parameters') }}</th>
<th>{{ __('Remote Host') }}</th>
<th>{{ __('Description') }}</th>
<th>{{ __('Modified') }}</th>
<th>{{ __('Ignored') }}</th>
<th>{{ __('Disabled') }}</th>
</tr>
</thead>
<tbody>
@foreach($group->serviceTemplates as $template)
<tr id="row_{{ $template->id }}">
<td>{{ $template->name }}</td>
<td>{{ $template->check }}</td>
<td>{{ $template->param }}</td>
<td>{{ $template->ip }}</td>
<td>{{ $template->desc }}</td>
<td>{{ $template->changed }}</td>
<td>{{ $template->ignore }}</td>
<td>{{ $template->disabled }}</td>
<td>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</x-panel>
@endforeach
@foreach($devices as $device)
<x-panel id="manage-services-templates-panel-d">
<x-slot name="title">
<i class="fa fa-server fa-fw fa-lg" aria-hidden="true"></i> {{ __($device->hostname) }}
</x-slot>
<div class="table-responsive">
<table id="manage-services-templates-table-d-{{ $device->id }}" class="table table-condensed table-hover">
<thead>
<tr>
<th>{{ __('Name') }}</th>
<th>{{ __('Check Type') }}</th>
<th>{{ __('Parameters') }}</th>
<th>{{ __('Remote Host') }}</th>
<th>{{ __('Description') }}</th>
<th>{{ __('Modified') }}</th>
<th>{{ __('Ignored') }}</th>
<th>{{ __('Disabled') }}</th>
</tr>
</thead>
<tbody>
@foreach($device->serviceTemplates as $template)
<tr id="row_{{ $template->id }}">
<td>{{ $template->name }}</td>
<td>{{ $template->check }}</td>
<td>{{ $template->param }}</td>
<td>{{ $template->ip }}</td>
<td>{{ $template->desc }}</td>
<td>{{ $template->changed }}</td>
<td>{{ $template->ignore }}</td>
<td>{{ $template->disabled }}</td>
<td>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</x-panel>
@endforeach
</x-panel>
</div>
@endsection
@section('scripts')
<script>
function apply_st(button) {
var id = button.dataset.templateId;
var name = button.dataset.templateName;
var url = "{{ route('services.templates.apply', ':template-id') }}".replace(':template-id', id);
if (confirm('{{ __('Are you sure you want to create Services for ') }}' + name + '?')) {
$.ajax({
url: url,
type: 'POST',
success: function (msg) {
toastr.success(msg);
},
error:function(){
toastr.error('No Services were updated when Applying this Service Template');
}
});
}
}
function applyAll_st(button) {
var url = "{{ route('services.templates.applyAll') }}";
if (confirm('{{ __('Are you sure you want to Apply All Service Templates?') }}')) {
$.ajax({
url: url,
type: 'POST',
success: function (msg) {
toastr.success(msg);
},
error:function(){
toastr.error('No Services were updated');
}
});
}
}
function remove_st(button) {
var id = button.dataset.templateId;
var name = button.dataset.templateName;
var url = "{{ route('services.templates.remove', ':template-id') }}".replace(':template-id', id);
if (confirm('{{ __('Are you sure you want to remove all Services created by ') }}' + name + '?')) {
$.ajax({
url: url,
type: 'POST',
success: function (msg) {
toastr.success(msg);
},
error: function () {
toastr.error('{{ __('No Services for this Service Template were removed') }}');
}
});
}
return false;
}
function delete_st(button) {
var index = button.parentNode.parentNode.rowIndex;
var id = button.dataset.templateId;
var name = button.dataset.templateName;
var url = "{{ route('services.templates.destroy', ':template-id') }}".replace(':template-id', id);
if (confirm('{{ __('Are you sure you want to delete AND remove all Services created by ') }}' + name + '?')) {
$.ajax({
url: url,
type: 'DELETE',
success: function (msg) {
document.getElementById("manage-services-templates-table").deleteRow(index);
toastr.success(msg);
},
error: function () {
toastr.error('{{ __('The Service Template could not be deleted') }}');
}
});
}
return false;
}
</script>
@endsection
@section('css')
<style>
.table-responsive {
padding-top: 16px
}
</style>
@endsection