FEATURE #2048: add missing policies

This commit is contained in:
Michal Kváček
2017-08-11 02:57:54 +02:00
parent 7f43316602
commit ef432702b4
15 changed files with 310 additions and 90 deletions
+3 -3
View File
@@ -5,7 +5,7 @@ namespace App\CMS\Handlers;
use App\CMS\Contracts\Modules\BaseModuleHandler; use App\CMS\Contracts\Modules\BaseModuleHandler;
use App\CMS\Enumerations\TemplatePathsHumanReadableRootOnly; use App\CMS\Enumerations\TemplatePathsHumanReadableRootOnly;
use App\CMS\Enumerations\WidgetTypes; use App\CMS\Enumerations\WidgetTypes;
use App\Models\ActionLog\ActionLogType; use App\Models\ActionLog\ActionLog;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use App\Models\Settings; use App\Models\Settings;
@@ -60,7 +60,7 @@ abstract class BaseHandler implements BaseModuleHandler
// create list of all widget types // create list of all widget types
$widgets = WidgetTypes::getWithTranslations(); $widgets = WidgetTypes::getWithTranslations();
if (!empty($widgets) && $user->can('create-widgets', Widget::class)) { if (!empty($widgets) && $user->can('create', Widget::class)) {
$sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) { $sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) {
$i = 1; $i = 1;
foreach ($widgets as $type => $name) { foreach ($widgets as $type => $name) {
@@ -117,7 +117,7 @@ abstract class BaseHandler implements BaseModuleHandler
} }
} }
if ($user->can('manage', ActionLogType::class)) { if ($user->can('manage', ActionLog::class)) {
$sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']); $sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']);
} }
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\HandlesAuthorization;
class ActionLogPolicy extends BasicPolicy
{
use HandlesAuthorization;
protected $entity = 'actions';
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Policies;
use App\Models\FileManager\Directory;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class DirectoriesPolicy extends BasicPolicy
{
use HandlesAuthorization;
protected $entity = 'directories';
/**
* Determine whether the user can create directories.
*
* @param \App\Models\User $user
* @return mixed
*/
public function create(User $user)
{
return $user->hasAbility('create-directories');
}
/**
* Determine whether the user can update the directory.
*
* @param \App\Models\User $user
* @param \App\Directory $directory
* @return mixed
*/
public function update(User $user, Directory $directory)
{
return $user->hasAbility('update-directories');
}
}
+11
View File
@@ -0,0 +1,11 @@
<?php
namespace App\Policies;
use Illuminate\Auth\Access\HandlesAuthorization;
class SettingsPolicy extends BasicPolicy
{
use HandlesAuthorization;
protected $entity = 'settings';
}
+40
View File
@@ -0,0 +1,40 @@
<?php
namespace App\Policies;
use App\Models\Templates\Template;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class TemplatePolicy extends BasicPolicy
{
use HandlesAuthorization;
protected $entity = 'templates';
/**
* Determine whether the user can view the template.
*
* @param \App\Models\User $user
* @param \App\Template $template
*
* @return mixed
*/
public function copy(User $user, Template $template)
{
return $user->hasAbility('copy-templates');
}
/**
* Determine whether the user can update the template.
*
* @param \App\Models\User $user
* @param \App\Template $template
*
* @return mixed
*/
public function update(User $user, Template $template)
{
return $user->hasAbility('edit-templates');
}
}
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Widgets\WidgetArea;
use Illuminate\Auth\Access\HandlesAuthorization;
class WidgetAreaPolicy extends BasicPolicy
{
use HandlesAuthorization;
protected $entity = 'widgetareas';
/**
* Determine whether the user can create widgetAreas.
*
* @param \App\Models\User $user
* @return mixed
*/
public function create(User $user)
{
return $user->hasAbility('create-widgetareas');
}
/**
* Determine whether the user can update the widgetArea.
*
* @param \App\Models\User $user
* @param \App\WidgetArea $widgetArea
* @return mixed
*/
public function update(User $user, WidgetArea $widgetArea)
{
return $user->hasAbility('edit-widgetareas');
}
}
+48
View File
@@ -0,0 +1,48 @@
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Widgets\Widget;
use Illuminate\Auth\Access\HandlesAuthorization;
class WidgetsPolicy extends BasicPolicy
{
use HandlesAuthorization;
protected $entity = 'widgets';
/**
* Determine whether the user can create widgets.
*
* @param \App\Models\User $user
*
* @return mixed
*/
public function create(User $user)
{
return $user->hasAbility('create-widgets');
}
/**
* Determine whether the user can update the widget.
*
* @param \App\Models\User $user
* @param \App\Widget $widget
*
* @return mixed
*/
public function update(User $user, Widget $widget)
{
return $user->id == $widget->user_id || $user->hasAbility('edit-widgets');
}
public function assign(User $user, Widget $widget)
{
return $user->hasAbility('assign-widgets');
}
public function unassign(User $user, Widget $widget)
{
return $user->hasAbility('unassign-widgets');
}
}
+2
View File
@@ -25,6 +25,7 @@ use App\CMS\Repositories\Module as ModuleRepository;
use App\CMS\Repositories\Templates\Template as TemplateRepository; use App\CMS\Repositories\Templates\Template as TemplateRepository;
use App\CMS\Widgets\HtmlCode\HtmlCode; use App\CMS\Widgets\HtmlCode\HtmlCode;
use App\CMS\Widgets\Menu\Menu; use App\CMS\Widgets\Menu\Menu;
use App\CMS\Widgets\SocialButtons\SocialButtons;
use Barryvdh\Debugbar\ServiceProvider as DebugBarServiceProvider; use Barryvdh\Debugbar\ServiceProvider as DebugBarServiceProvider;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@@ -106,6 +107,7 @@ class AppServiceProvider extends ServiceProvider
// register all available widgets // register all available widgets
$registrator->register(HtmlCode::class); $registrator->register(HtmlCode::class);
$registrator->register(Menu::class); $registrator->register(Menu::class);
$registrator->register(SocialButtons::class);
} }
/** /**
+23 -4
View File
@@ -2,14 +2,26 @@
namespace App\Providers; namespace App\Providers;
use App\Models\ActionLog\ActionLog;
use App\Models\Content\Content; use App\Models\Content\Content;
use App\Models\FileManager\Directory;
use App\Models\FileManager\File; use App\Models\FileManager\File;
use App\Models\Module; use App\Models\Module;
use App\Models\Settings;
use App\Models\Templates\Template;
use App\Models\User; use App\Models\User;
use App\Models\Widgets\Widget;
use App\Models\Widgets\WidgetArea;
use App\Policies\ActionLogPolicy;
use App\Policies\ContentPolicy; use App\Policies\ContentPolicy;
use App\Policies\DirectoriesPolicy;
use App\Policies\FilesPolicy; use App\Policies\FilesPolicy;
use App\Policies\ModulePolicy; use App\Policies\ModulePolicy;
use App\Policies\SettingsPolicy;
use App\Policies\TemplatePolicy;
use App\Policies\UserPolicy; use App\Policies\UserPolicy;
use App\Policies\WidgetAreaPolicy;
use App\Policies\WidgetsPolicy;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as IlluminateAuthServiceProvider; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as IlluminateAuthServiceProvider;
class AuthServiceProvider extends IlluminateAuthServiceProvider class AuthServiceProvider extends IlluminateAuthServiceProvider
@@ -19,10 +31,17 @@ class AuthServiceProvider extends IlluminateAuthServiceProvider
* @var array * @var array
*/ */
protected $policies = [ protected $policies = [
Content::class => ContentPolicy::class, Content::class => ContentPolicy::class,
User::class => UserPolicy::class, User::class => UserPolicy::class,
Module::class => ModulePolicy::class, Module::class => ModulePolicy::class,
File::class => FilesPolicy::class, File::class => FilesPolicy::class,
ActionLog::class => ActionLogPolicy::class,
Template::class => TemplatePolicy::class,
Directory::class => DirectoriesPolicy::class,
Settings::class => SettingsPolicy::class,
Widget::class => WidgetsPolicy::class,
WidgetArea::class => WidgetAreaPolicy::class,
ActionLog::class => ActionLogPolicy::class,
]; ];
/** /**
-21
View File
@@ -1,21 +0,0 @@
<?php
return [
"code" => "Dodatečný HTML/JS kód pro slider",
"containerClass" => "HTML třída pro obalový element tohoto widgetu",
"createNew" => "Vytvořit nový",
"description" => "Popis",
"displayBullets" => "Zobrazit odrážky?",
"edit" => "Upravit :name",
"editExisting" => "Uložit",
"extraSettings" => "Další nastavení",
"fullscreen" => "Zobrazit slider na celou obrazovku",
"imagesPerSlide" => "Obrázků na slide",
"name" => "Jméno slideru",
"new" => "Vytvořit nový slider",
"preview" => "Náhled",
"showInFullscreen" => "Zobrazit na celou obrazovku",
"slideContainerClass" => "HTML třída pro každý obrázek ve slideru",
"upload" => "Přidat obrázky do slideru",
"widgetDescription" => "Slider pro obrázky. Tento widget používá Foundation framework a jeho vlastní slider zvaný Orbit. (Nebude fungovat bez Foundation 6!)",
"widgetName" => "Orbit slider",
];
@@ -0,0 +1,16 @@
<?php
return [
"code" => "HTML kod",
"containerClass" => "HTML třída pro obalový element tohoto widgetu",
"createNew" => "Vytvořit nový widget",
"description" => "Popis",
"edit" => "Edituji widget :name",
"editExisting" => "Upravit widget",
"name" => "Jméno",
"new" => "Vytvořit nový widget",
"preview" => "Náhled",
"save" => "Uložit",
"successfullyEdited" => "Widget úspěšně upraven",
"widgetDescription" => "Jednoduchý widget pro vkládání sociálních tlačítek.",
"widgetName" => "Sociální tlačítka",
];
@@ -8,28 +8,37 @@
{{str_limit($template->description, 150)}} {{str_limit($template->description, 150)}}
</div> </div>
@if($isWritable) @can('copy', $template)
<a data-template-id="{{$template->id}}" data-template-name="{{$template->template_name}}" @if($isWritable)
class="btn btn-pill-left btn-secondary col-lg-6 copy-template" data-toggle="tooltip" <a data-template-id="{{$template->id}}" data-template-name="{{$template->template_name}}"
title="@lang('admin/templates.copy')"> class="btn btn-pill-left btn-secondary col-lg-6 copy-template" data-toggle="tooltip"
<i class="fa fa-copy"></i> title="@lang('admin/templates.copy')">
</a> <i class="fa fa-copy"></i>
</a>
@else
<a href="#" class="btn btn-pill-left btn-secondary disabled col-lg-6" data-toggle="tooltip"
title="@lang('admin/templates.cannotCopy')">
<i class="fa fa-copy"></i>
</a>
@endif
@else @else
<a href="#" class="btn btn-pill-left btn-secondary disabled col-lg-6" data-toggle="tooltip" <a href="#" class="btn btn-pill-left btn-secondary disabled col-lg-6" data-toggle="tooltip"
title="@lang('admin/templates.cannotCopy')"> title="@lang('admin/templates.cannotCopy')">
<i class="fa fa-copy"></i> <i class="fa fa-copy"></i>
</a> </a>
@endif @endcan
@can('update', $template)
<a href="{{route('templates.edit', ['id' => $template->id])}}" <a href="{{route('templates.edit', ['id' => $template->id])}}"
class="btn btn-primary btn-pill-right col-lg-6" data-toggle="tooltip" class="btn btn-primary btn-pill-right col-lg-6" data-toggle="tooltip"
title="@lang('admin/templates.edit', ['name' => $template->name])"> title="@lang('admin/templates.edit', ['name' => $template->name])">
@if ($template->editable) @if ($template->editable)
<i class="fa fa-edit"></i> <i class="fa fa-edit"></i>
@else @else
<i class="fa fa-info"></i> <i class="fa fa-info"></i>
@endif @endif
</a> </a>
@endcan
</div> </div>
@empty @empty
<div class="alert alert-info"> <div class="alert alert-info">
@@ -40,27 +49,27 @@
@section('javascripts') @section('javascripts')
<script type="text/javascript"> <script type="text/javascript">
$ ('.copy-template').click (function () { $ ('.copy-template').click (function () {
var link = $ (this); var link = $ (this);
var templateId = link.data ('template-id'); var templateId = link.data ('template-id');
var templateName = link.data ('template-name'); var templateName = link.data ('template-name');
templateName = templateName.substr (templateName.search ('::') + 2, templateName.length); templateName = templateName.substr (templateName.search ('::') + 2, templateName.length);
var newTemplateName = prompt ("@lang('admin/templates.newTemplateName')", templateName + "_" + "@lang('admin/templates.newTemplateNameSuffix')"); var newTemplateName = prompt ("@lang('admin/templates.newTemplateName')", templateName + "_" + "@lang('admin/templates.newTemplateNameSuffix')");
// no name given - give up // no name given - give up
if (newTemplateName === null) return; if (newTemplateName === null) return;
// copy given template // copy given template
$.post ('{{route('templates.postCopy')}}', { $.post ('{{route('templates.postCopy')}}', {
template: templateId, template: templateId,
newName: newTemplateName, newName: newTemplateName,
_token: "{{csrf_token()}}" _token: "{{csrf_token()}}"
}, function (data) { }, function (data) {
if (data.status === 'success') { if (data.status === 'success') {
location.reload (); location.reload ();
} }
}); });
}); });
</script> </script>
@endsection @endsection
@@ -36,6 +36,7 @@
href="{{route('widgetareas.edit', ['id' => $area->id])}}"><i href="{{route('widgetareas.edit', ['id' => $area->id])}}"><i
class="fa fa-pencil"></i></a> class="fa fa-pencil"></i></a>
</li> </li>
<li> <li>
<a href="{{route('widgets.associate', ['widgetArea' => $area->id])}}" <a href="{{route('widgets.associate', ['widgetArea' => $area->id])}}"
data-toggle="tooltip" data-toggle="tooltip"
@@ -66,18 +67,20 @@
</div> </div>
@endif @endif
</div> </div>
<div class="col-lg-4"> @can('create', \App\Models\Widgets\WidgetArea::class)
<div class="card items"> <div class="col-lg-4">
<div class="card-header"> <div class="card items">
<div class="header-block"> <div class="card-header">
<h3 class="title">@lang('admin/widgetAreas.new')</h3> <div class="header-block">
<h3 class="title">@lang('admin/widgetAreas.new')</h3>
</div>
</div>
<div class="card-block">
@include('admin.widgets.area.form', ['action' => route('widgetareas.postNew'), 'area' => new \App\Models\Widgets\WidgetArea()])
</div> </div>
</div> </div>
<div class="card-block">
@include('admin.widgets.area.form', ['action' => route('widgetareas.postNew'), 'area' => new \App\Models\Widgets\WidgetArea()])
</div>
</div> </div>
</div> @endcan
</div> </div>
@@ -23,38 +23,48 @@
</tr> </tr>
@foreach($widgets as $widget) @foreach($widgets as $widget)
<tr> <tr>
<td><a href="{{route('widgets.edit', ['id' => $widget->id])}}">{{$widget->name}}</a></td> <td>
@can('update', $widget)
<a href="{{route('widgets.edit', ['id' => $widget->id])}}">{{$widget->name}}</a>
@else
{{$widget->name}}
@endcan
</td>
<td>{{trans(call_user_func([$widget->widget_type_handler, 'getName']))}}</td> <td>{{trans(call_user_func([$widget->widget_type_handler, 'getName']))}}</td>
<td>{{$widget->description}}</td> <td>{{$widget->description}}</td>
<td class="text-center"> <td class="text-center">
<div class="item-actions-dropdown"> @if(\Auth::user()->can('update', $widget) || $widget->deletable)
<a class="item-actions-toggle-btn"> <div class="item-actions-dropdown">
<span class="inactive"><i class="fa fa-cog"></i></span> <a class="item-actions-toggle-btn">
<span class="active"><i class="fa fa-chevron-circle-right"></i></span> <span class="inactive"><i class="fa fa-cog"></i></span>
</a> <span class="active"><i class="fa fa-chevron-circle-right"></i></span>
<div class="item-actions-block"> </a>
<ul class="item-actions-list"> <div class="item-actions-block">
<li> <ul class="item-actions-list">
<a class="edit" data-toggle="tooltip" @can('update', $widget)
title="@lang('admin/widgets.editTooltip')" <li>
href="{{route('widgets.edit', ['id' => $widget->id])}}"><i <a class="edit" data-toggle="tooltip"
class="fa fa-pencil"></i></a> title="@lang('admin/widgets.editTooltip')"
</li> href="{{route('widgets.edit', ['id' => $widget->id])}}"><i
class="fa fa-pencil"></i></a>
</li>
@endcan
@if($widget->deletable) @if($widget->deletable)
<li> <li>
<a class="confirm remove" data-toggle="tooltip" <a class="confirm remove" data-toggle="tooltip"
title="@lang('admin/widgets.delete')" title="@lang('admin/widgets.delete')"
href="{{route('widgets.delete', ['id' => $widget->id])}}"><i href="{{route('widgets.delete', ['id' => $widget->id])}}"><i
class="fa fa-trash"></i></a> class="fa fa-trash"></i></a>
</li> </li>
@endif @endif
</ul> </ul>
</div>
</div> </div>
</div> @endif
</td> </td>
</tr> </tr>
+2 -2
View File
@@ -5,7 +5,7 @@ Route::group(['namespace' => 'Widgets'], function () {
// list of all installed widget types // list of all installed widget types
Route::get('widgets', 'WidgetsOverview@index') Route::get('widgets', 'WidgetsOverview@index')
->name('widgets.overview') ->name('widgets.overview')
->middleware('can:update,' . \App\Models\Widgets\Widget::class); ->middleware('can:manage,' . \App\Models\Widgets\Widget::class);
// create new instance of widget of given type // create new instance of widget of given type
Route::get('widgets/new/{widgetType}', 'CreateNewWidget@getNew') Route::get('widgets/new/{widgetType}', 'CreateNewWidget@getNew')
@@ -14,7 +14,7 @@ Route::group(['namespace' => 'Widgets'], function () {
Route::post('widgets/new/{widgetType}', 'CreateNewWidget@postNew') Route::post('widgets/new/{widgetType}', 'CreateNewWidget@postNew')
->name('widgets.postNew') ->name('widgets.postNew')
->middleware('can:createf,' . \App\Models\Widgets\Widget::class); ->middleware('can:create,' . \App\Models\Widgets\Widget::class);
// edit widget settings // edit widget settings
Route::get('widgets/edit/{widget}', 'EditWidget@getEdit') Route::get('widgets/edit/{widget}', 'EditWidget@getEdit')