diff --git a/app/CMS/Handlers/BaseHandler.php b/app/CMS/Handlers/BaseHandler.php index c7ae9574..40357e35 100644 --- a/app/CMS/Handlers/BaseHandler.php +++ b/app/CMS/Handlers/BaseHandler.php @@ -1,16 +1,22 @@ route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-fw fa-dashboard']); /** * Content pages - * * Submenus can be registered later */ $menu->dropdown(trans('admin/mainMenu.contentPages'), function ($sub) { @@ -40,63 +45,82 @@ abstract class BaseHandler implements BaseModuleHandler /** * File manager */ - $menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 40, ['icon' => 'fa fa-fw fa-folder']); + if ($user->can('manage', File::class)) { + $menu->route('upload.overview', trans('admin/mainMenu.fileManager'), [], 40, ['icon' => 'fa fa-fw fa-folder']); + } /** * Widgets and widget areas */ - $menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) { - // create list of all widget types - $widgets = WidgetTypes::getWithTranslations(); + if ($user->can('manage', Widget::class) || $user->can('manage', WidgetArea::class)) { + $menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) use ($user) { + // create list of all widget types + $widgets = WidgetTypes::getWithTranslations(); - if (!empty($widgets)) { - $sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) { - $i = 1; - foreach ($widgets as $type => $name) { - $sub->route('widgets.new', $name, ['type' => $type], $i++); - } - }, 10, ['icon' => 'fa fa-fw fa-plus']); - } + if (!empty($widgets) && $user->can('create-widgets', Widget::class)) { + $sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) use ($widgets) { + $i = 1; + foreach ($widgets as $type => $name) { + $sub->route('widgets.new', $name, ['type' => $type], $i++); + } + }, 10, ['icon' => 'fa fa-fw fa-plus']); + } - $sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']); + $sub->route('widgets.overview', trans('admin/mainMenu.widgetsOverview'), [], 20, ['icon' => 'fa fa-fw fa-list']); - // menu for widget areas - $sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) { - $sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-fw fa-plus']); - $sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-fw fa-list']); - }, 50, ['icon' => 'fa fa-fw fa-object-group']); - }, 50, ['icon' => 'fa fa-fw fa-puzzle-piece']); + // menu for widget areas + if ($user->can('manage', WidgetArea::class)) { + $sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) use ($user) { + if ($user->can('create-widgetareas', WidgetArea::class)) { + $sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-fw fa-plus']); + } + $sub->route('widgetareas.overview', trans('admin/mainMenu.widgetAreaOverview'), [], 2, ['icon' => 'fa fa-fw fa-list']); + }, 50, ['icon' => 'fa fa-fw fa-object-group']); + } + }, 50, ['icon' => 'fa fa-fw fa-puzzle-piece']); + } /** * Divide system entries and other links in menu */ $menu->addDivider(9999); - $menu->dropdown(trans('admin/mainMenu.system'), function ($sub) { + $menu->dropdown(trans('admin/mainMenu.system'), function ($sub) use ($user) { /** * User management */ - $sub->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) { - $sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-fw fa-user-plus']); - $sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-fw fa-users']); - }, 20, ['icon' => 'fa fa-fw fa-users']); + if ($user->can('manage', User::class)) { + $sub->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) use ($user) { + if ($user->can('create', User::class)) { + $sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-fw fa-user-plus']); + } + $sub->route('users.overview', trans('admin/mainMenu.usersOverview'), [], 30, ['icon' => 'fa fa-fw fa-users']); + }, 20, ['icon' => 'fa fa-fw fa-users']); + } /** * Templates */ - $templatePaths = TemplatePathsHumanReadableRootOnly::getWithTranslations(); - if (!empty($templatePaths)) { - $sub->dropdown(trans('admin/mainMenu.templates'), function ($sub) use ($templatePaths) { - $i = 1; - foreach ($templatePaths as $id => $name) { - $sub->route('templates.overview', $name, ['id' => $id], $i++); - } - }, 60, ['icon' => 'fa fa-fw fa-file-code-o']); + if ($user->can('manage', Template::class)) { + $templatePaths = TemplatePathsHumanReadableRootOnly::getWithTranslations(); + if (!empty($templatePaths)) { + $sub->dropdown(trans('admin/mainMenu.templates'), function ($sub) use ($templatePaths) { + $i = 1; + foreach ($templatePaths as $id => $name) { + $sub->route('templates.overview', $name, ['id' => $id], $i++); + } + }, 60, ['icon' => 'fa fa-fw fa-file-code-o']); + } } - $sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']); - $sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']); + if ($user->can('manage', ActionLogType::class)) { + $sub->route('log.overview', trans('admin/mainMenu.actionLog'), [], 70, ['icon' => 'fa fa-fw fa-history']); + } + + if ($user->can('manage', Settings::class)) { + $sub->route('settings.overview', trans('admin/mainMenu.settings'), [], 80, ['icon' => 'fa fa-fw fa-gear']); + } }, 10000, ['icon' => 'fa fa-fw fa-gears']); }); diff --git a/app/CMS/MenuPresenters/MetismenuPresenter.php b/app/CMS/MenuPresenters/MetismenuPresenter.php index d32c48c7..a2f290e4 100644 --- a/app/CMS/MenuPresenters/MetismenuPresenter.php +++ b/app/CMS/MenuPresenters/MetismenuPresenter.php @@ -1,4 +1,5 @@ getUrl())) { + return null; + } + return 'getActiveState($item) . '>' . $item->getIcon() . ' ' . $item->title . '' . PHP_EOL; } diff --git a/app/CMS/Repositories/Content/Content.php b/app/CMS/Repositories/Content/Content.php index 2bdfb55b..08dfaefc 100644 --- a/app/CMS/Repositories/Content/Content.php +++ b/app/CMS/Repositories/Content/Content.php @@ -1,4 +1,5 @@ whereNull('contents.deleted_at') ->where('contents.language', LaravelLocalization::getCurrentLocale()) ->where('modules.enabled', 1) + ->with('module') ->orderBy('contents.created_at', 'DESC'); // filter results using handler diff --git a/app/CMS/Repositories/Permissions/Permission.php b/app/CMS/Repositories/Permissions/Permission.php new file mode 100644 index 00000000..f77952c6 --- /dev/null +++ b/app/CMS/Repositories/Permissions/Permission.php @@ -0,0 +1,15 @@ +with('subpermissions') + ->get(); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Admin/Permissions.php b/app/Http/Controllers/Admin/Permissions.php index 4a59deba..ca42208f 100644 --- a/app/Http/Controllers/Admin/Permissions.php +++ b/app/Http/Controllers/Admin/Permissions.php @@ -2,85 +2,40 @@ namespace App\Http\Controllers\Admin; -use Illuminate\Http\Request; use App\Http\Controllers\Controller; -use Illuminate\Support\Facades\Auth; +use App\Models\Permissions\Permission; +use App\Models\User; +use Illuminate\Http\Request; class Permissions extends Controller { - /** - * Display a listing of the resource. - * - * @return \Illuminate\Http\Response - */ - public function index() - { - dd(Auth::user()->permissions); - } - - /** - * Show the form for creating a new resource. - * - * @return \Illuminate\Http\Response - */ - public function create() - { - // - } - - /** - * Store a newly created resource in storage. - * - * @param \Illuminate\Http\Request $request - * @return \Illuminate\Http\Response - */ - public function store(Request $request) - { - // - } - - /** - * Display the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function show($id) - { - // - } - - /** - * Show the form for editing the specified resource. - * - * @param int $id - * @return \Illuminate\Http\Response - */ - public function edit($id) - { - // - } - /** * Update the specified resource in storage. * - * @param \Illuminate\Http\Request $request - * @param int $id - * @return \Illuminate\Http\Response - */ - public function update(Request $request, $id) - { - // - } - - /** - * Remove the specified resource from storage. + * @param \Illuminate\Http\Request $request + * @param int $id * - * @param int $id * @return \Illuminate\Http\Response */ - public function destroy($id) + public function update(Request $request, User $user) { - // + $permissionIds = $request->get('permissions', []); + $permissions = Permission::whereIn('string_id', array_keys($permissionIds)) + ->get(); + + \DB::transaction(function () use ($user, $permissions) { + // remove all permissions + $user->permissions() + ->detach(); + + foreach ($permissions as $permission) { + $user->permissions() + ->attach($permission->id); + } + }); + + return redirect() + ->back() + ->with('success', trans('admin/permissions.successfullySet')); } } diff --git a/app/Http/Controllers/Admin/Users/UserDetail.php b/app/Http/Controllers/Admin/Users/UserDetail.php index 59c2b0e0..47b71498 100644 --- a/app/Http/Controllers/Admin/Users/UserDetail.php +++ b/app/Http/Controllers/Admin/Users/UserDetail.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin\Users; use App\CMS\Enumerations\UserRoles; use App\CMS\Enumerations\UserStates; use App\Cms\Repositories\ActionLog\Actions; +use App\CMS\Repositories\Permissions\Permission; use App\Http\Controllers\Admin\Controller; use App\Models\ActionLog\ActionLog; use App\Models\User; @@ -29,16 +30,17 @@ class UserDetail extends Controller $user = Auth::user(); } - $actions = $this->log->getUserActions($user->id, 10); $roles = UserRoles::getWithTranslations(); $states = UserStates::getWithTranslations(); + $permissions = app(Permission::class)->getRootPermissions(); return view('admin.userManagement.detail', [ - 'user' => $user, - 'statuses' => $states, - 'roles' => $roles, - 'actions' => $actions + 'user' => $user, + 'statuses' => $states, + 'roles' => $roles, + 'actions' => $actions, + 'permissions' => $permissions ]); } } \ No newline at end of file diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 96700ae2..b54abf26 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -57,7 +57,6 @@ class Kernel extends HttpKernel protected $routeMiddleware = [ 'can' => Authorize::class, 'auth' => Middleware\Admin\Authenticate::class, - 'onlyAdmin' => Middleware\Admin\RequireAdminRole::class, 'adminMenu' => Middleware\Admin\AdminMenuRegistrator::class, 'guest' => Middleware\RedirectIfAuthenticated::class, 'throttle' => ThrottleRequests::class, diff --git a/app/Http/Middleware/Admin/RequireAdminRole.php b/app/Http/Middleware/Admin/RequireAdminRole.php deleted file mode 100644 index 5a8c3767..00000000 --- a/app/Http/Middleware/Admin/RequireAdminRole.php +++ /dev/null @@ -1,28 +0,0 @@ -role != User::ROLE_ADMIN) { - return redirect() - ->back() - ->with('error', trans('auth.accessDenied')); - } - - return $next($request); - } -} diff --git a/app/Models/FileManager/ModelTraits/File.php b/app/Models/FileManager/ModelTraits/File.php index 1352792a..3da83ec9 100644 --- a/app/Models/FileManager/ModelTraits/File.php +++ b/app/Models/FileManager/ModelTraits/File.php @@ -6,6 +6,7 @@ use App\Events\UploadFile; use App\Models\FileManager\File as FileModel; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Event; +use Illuminate\Support\Facades\Gate; use Symfony\Component\HttpFoundation\File\File as SymphonyFile; use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -36,6 +37,8 @@ trait File */ public function upload(UploadedFile $file, $data = []) { + abort_unless(Auth::user()->can('upload', FileModel::class), 403); + $data = (object)$data; $destination = config('app.upload_path'); diff --git a/app/Models/Permission.php b/app/Models/Permission.php deleted file mode 100644 index 31616ec2..00000000 --- a/app/Models/Permission.php +++ /dev/null @@ -1,19 +0,0 @@ -hasOne(Permission::class, 'parent_id'); - } -} diff --git a/app/Models/Permissions/Permission.php b/app/Models/Permissions/Permission.php new file mode 100644 index 00000000..fd4d1ed0 --- /dev/null +++ b/app/Models/Permissions/Permission.php @@ -0,0 +1,40 @@ + 'boolean' + ]; + + /** + * Assign observer for this model for logging + */ + protected static function boot() + { + parent::boot(); + + self::observe(PermissionObserver::class); + } + + public function parent() + { + return $this->hasOne(Permission::class, 'parent_id'); + } + + public function subpermissions() + { + return $this->hasMany(Permission::class, 'parent_id'); + } +} diff --git a/app/Models/Permissions/PermissionObserver.php b/app/Models/Permissions/PermissionObserver.php new file mode 100644 index 00000000..f52fb18e --- /dev/null +++ b/app/Models/Permissions/PermissionObserver.php @@ -0,0 +1,26 @@ +default) { + $users = User::where('role', '!=', User::ROLE_VISITOR) + ->get(); + + foreach ($users as $user) { + $user->permissions() + ->attach($permission->id); + } + } + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index cce4841a..748535a8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Models\Permissions\Permission; use App\Notifications\ResetPasswordNotification; use Illuminate\Auth\Authenticatable; use Illuminate\Contracts\Auth\Authenticatable as AuthenticableInterface; diff --git a/app/Policies/BasicPolicy.php b/app/Policies/BasicPolicy.php index c00e12be..85be276d 100644 --- a/app/Policies/BasicPolicy.php +++ b/app/Policies/BasicPolicy.php @@ -4,17 +4,43 @@ namespace App\Policies; use App\Models\User; use Illuminate\Auth\Access\HandlesAuthorization; +use Illuminate\Database\Eloquent\Model; abstract class BasicPolicy { use HandlesAuthorization; + protected $entity; + public function before(User $user, $ability) { - if ($user->role == User::ROLE_ADMIN) { - return true; + // check if user can operate on given entity + if (!$this->manage($user)) { + return false; } + } - return null; + /** + * Can user manage given entity? + * + * @param User $user + * + * @return bool + */ + public function manage(User $user) { + return $user->hasAbility($this->entity.'-management'); + } + + /** + * Determine whether the user can delete the content. + * + * @param \App\Models\User $user + * @param Model $model + * + * @return mixed + */ + public function delete(User $user, Model $model) + { + return $user->hasAbility('delete-'.$this->entity); } } diff --git a/app/Policies/ContentPolicy.php b/app/Policies/ContentPolicy.php index 31815215..a22587cd 100644 --- a/app/Policies/ContentPolicy.php +++ b/app/Policies/ContentPolicy.php @@ -2,48 +2,28 @@ namespace App\Policies; -use App\Models\User; use App\Models\Content\Content; +use App\Models\User; use Illuminate\Auth\Access\HandlesAuthorization; class ContentPolicy extends BasicPolicy { use HandlesAuthorization; - - /** - * Determine whether the user can view the content. - * - * @param \App\Models\User $user - * @param \App\Models\Content\Content $content - * @return mixed - */ - public function view(User $user, Content $content) - { - // - } - - /** - * Determine whether the user can create contents. - * - * @param \App\Models\User $user - * @return mixed - */ - public function create(User $user) - { - return true; - } + protected $entity = 'contents'; /** * Determine whether the user can update the content. * - * @param \App\Models\User $user - * @param \App\Models\Content\Content $content + * @param \App\Models\User $user + * @param \App\Models\Content\Content $content + * * @return mixed */ public function update(User $user, Content $content) { - if (!$user->hasAbility('update-contents-'.$content->module->alias)) + if (!$user->hasAbility('update-contents-' . $content->module->alias)) { return false; + } if ($user->id != $content->user_id) { return $user->hasAbility('update-contents') && $user->hasAbility('update-all-contents'); @@ -52,15 +32,21 @@ class ContentPolicy extends BasicPolicy return $user->hasAbility('update-contents'); } - /** - * Determine whether the user can delete the content. - * - * @param \App\Models\User $user - * @param \App\Models\Content\Content $content - * @return mixed - */ - public function delete(User $user, Content $content) + public function create(User $user, Content $content) { + return $user->hasAbility('create-contents'); + } + + public function publish(User $user, Content $content) { - return $user->hasAbility('delete-contents'); + return $user->hasAbility('publish-contents'); + } + + public function setHomepage(User $user, Content $content) + { + return $user->hasAbility('set-homepage-contents'); + } + + public function viewHistory(User $user, Content $content) { + return $user->hasAbility('view-history-contents'); } } diff --git a/app/Policies/FilesPolicy.php b/app/Policies/FilesPolicy.php new file mode 100644 index 00000000..1c6c0841 --- /dev/null +++ b/app/Policies/FilesPolicy.php @@ -0,0 +1,39 @@ +hasAbility('upload-files'); + } + + /** + * Determine whether the user can update the appModelsFileManagerFile. + * + * @param User $user + * @param File $file + * + * @return mixed + */ + public function update(User $user, File $file) + { + return $user->hasAbility('update-files'); + } +} diff --git a/app/Policies/ModulePolicy.php b/app/Policies/ModulePolicy.php index ee1617cd..7c4d387d 100644 --- a/app/Policies/ModulePolicy.php +++ b/app/Policies/ModulePolicy.php @@ -2,25 +2,15 @@ namespace App\Policies; -use App\Models\User; use App\Models\Module; +use App\Models\User; use Illuminate\Auth\Access\HandlesAuthorization; +use Illuminate\Database\Eloquent\Model; class ModulePolicy extends BasicPolicy { use HandlesAuthorization; - - /** - * Determine whether the user can view the module. - * - * @param \App\Models\User $user - * @param \App\Module $module - * @return mixed - */ - public function view(User $user, Module $module) - { - // - } + protected $entity = 'modules'; /** * Determine whether the user can create modules. @@ -30,32 +20,8 @@ class ModulePolicy extends BasicPolicy * * @return mixed */ - public function create(User $user, Module $module) + public function create(User $user, Model $module) { - return $user->hasAbility('create-contents-'.$module->alias); - } - - /** - * Determine whether the user can update the module. - * - * @param \App\Models\User $user - * @param \App\Module $module - * @return mixed - */ - public function update(User $user, Module $module) - { - // - } - - /** - * Determine whether the user can delete the module. - * - * @param \App\Models\User $user - * @param \App\Module $module - * @return mixed - */ - public function delete(User $user, Module $module) - { - // + return $user->hasAbility('create-contents-' . $module->alias); } } diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index 9a6e6c6a..ba32a24c 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -8,51 +8,80 @@ use Illuminate\Auth\Access\HandlesAuthorization; class UserPolicy extends BasicPolicy { use HandlesAuthorization; + protected $entity = 'users'; /** - * Determine whether the user can view the user. + * Can current user updates other users (or himself?) * - * @param \App\Models\User $user - * @param \App\Models\User $user - * @return mixed + * @param User $currentUser + * @param User $user + * + * @return bool */ - public function view(User $user, User $user) + public function update(User $currentUser, User $user) { - + return $currentUser->id == $user->id || $currentUser->hasAbility('update-users'); } /** - * Determine whether the user can create users. + * Can user create other users? * - * @param \App\Models\User $user - * @return mixed + * @param User $user + * + * @return bool */ - public function create(User $user) - { - // + public function create(User $user) { + return $user->hasAbility('create-users'); } /** - * Determine whether the user can update the user. + * Does current user has permissions for setting permissions to other users? * - * @param \App\Models\User $user - * @param \App\Models\User $user - * @return mixed + * @param User $currentUser + * @param User $user + * + * @return bool */ - public function update(User $user, User $user) + public function setPermissions(User $currentUser, User $user) { - // + if ($currentUser->id == $user->id || $user->role == User::ROLE_VISITOR) { + return false; + } + + return $currentUser->hasAbility('set-permissions-users'); } /** - * Determine whether the user can delete the user. + * Can logged user change status of other users? * - * @param \App\Models\User $user - * @param \App\Models\User $user - * @return mixed + * @param User $currentUser + * @param User $user + * + * @return bool */ - public function delete(User $user, User $user) + public function changeStatus(User $currentUser, User $user) { - // + if ($currentUser->id == $user->id) { + return false; + } + + return $currentUser->hasAbility('change-status-users'); + } + + /** + * Can current user change role of other users? + * + * @param User $currentUser + * @param User $user + * + * @return bool + */ + public function changeRole(User $currentUser, User $user) + { + if ($currentUser->id == $user->id) { + return false; + } + + return $currentUser->hasAbility('change-role-users'); } } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 117fe67e..f451ee79 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -3,9 +3,11 @@ namespace App\Providers; use App\Models\Content\Content; +use App\Models\FileManager\File; use App\Models\Module; use App\Models\User; use App\Policies\ContentPolicy; +use App\Policies\FilesPolicy; use App\Policies\ModulePolicy; use App\Policies\UserPolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as IlluminateAuthServiceProvider; @@ -20,6 +22,7 @@ class AuthServiceProvider extends IlluminateAuthServiceProvider Content::class => ContentPolicy::class, User::class => UserPolicy::class, Module::class => ModulePolicy::class, + File::class => FilesPolicy::class, ]; /** diff --git a/database/migrations/2017_08_10_214109_add_default_permissions.php b/database/migrations/2017_08_10_214109_add_default_permissions.php new file mode 100644 index 00000000..6e4c8d04 --- /dev/null +++ b/database/migrations/2017_08_10_214109_add_default_permissions.php @@ -0,0 +1,66 @@ +boolean('default') + ->default(false); + }); + + Permission::getQuery() + ->delete(); + + $permissions = [ + 'contents' => ['create', 'update', 'update-all', 'delete', 'set-homepage', 'publish', 'draft', 'protect', 'view-history'], + 'users' => ['create', 'update', 'delete', 'set-permissions', 'change-status', 'change-role'], + 'files' => ['upload', 'update', 'delete', 'move-to-directories'], + 'directories' => ['create', 'edit', 'delete'], + 'widgetareas' => ['create', 'edit', 'delete'], + 'widgets' => ['create', 'edit', 'delete', 'assign', 'unassign'], + 'templates' => ['copy', 'edit'], + 'actions' => [], + 'settings' => [] + ]; + foreach ($permissions as $entity => $abilities) { + + $parent = Permission::create([ + 'name' => 'admin/permissions.' . $entity . '.management', + 'string_id' => $entity . '-management', + 'group' => $entity, + 'default' => true, + ]); + + foreach ($abilities as $ability) { + Permission::create([ + 'name' => 'admin/permissions.' . $entity . '.' . $ability, + 'string_id' => $ability . '-' . $entity, + 'group' => $entity, + 'parent_id' => $parent->id, + 'default' => true, + ]); + } + } + } + + /** + * Reverse the migrations. + * @return void + */ + public function down() + { + Schema::table('permissions', function (Blueprint $table) { + $table->dropColumn('default'); + }); + } +} diff --git a/resources/assets/admin/js/app.js b/resources/assets/admin/js/app.js index b649f265..a544afbd 100644 --- a/resources/assets/admin/js/app.js +++ b/resources/assets/admin/js/app.js @@ -317,23 +317,6 @@ $ (function () { }); -$ (function () { - - $ ("body").addClass ("loaded"); - - var notification = $ ('.notification'); - if (notification.length) { - - notification.click (function () { - $ (this).fadeOut ('fast'); - }); - - setTimeout (function () { - notification.fadeOut (1500) - }, 5 * 1000) - } -}); - /** * Makes slug from input string * @@ -370,6 +353,21 @@ function slugify(text, trimSpaces) { // bind some custom methods $ (document).ready (function () { + + $ ("body").addClass ("loaded"); + + var notification = $ ('.notification'); + if (notification.length) { + + notification.click (function () { + $ (this).fadeOut ('fast'); + }); + + setTimeout (function () { + notification.fadeOut (1500) + }, 5 * 1000) + } + var previousTitle, previousMessage; $ ('.confirm').click (function (e) { @@ -439,3 +437,11 @@ $ (document).ready (function () { $('form').areYouSure(); }); + +$('.checkbox').change(function() { + var e = $(this); + var checked = e.is(':checked'); + var id = e.data('id'); + + $('.child-'+id).prop('checked', checked); +}); \ No newline at end of file diff --git a/resources/lang/cs/admin/permissions.php b/resources/lang/cs/admin/permissions.php new file mode 100644 index 00000000..93aba574 --- /dev/null +++ b/resources/lang/cs/admin/permissions.php @@ -0,0 +1,64 @@ + 'Oprávnění úspěšně nastavena.', + 'contents' => [ + 'management' => 'Správa obsahu', + 'create' => 'Vytvořit novou stránku', + 'update' => 'Upravovat své stránky', + 'update-all' => 'Upravovat i cizí stránky', + 'delete' => 'Mazat', + 'set-homepage' => 'Nastavovat domovskou stránku', + 'publish' => 'Publikovat', + 'protect' => 'Publikovat jen pro přihlášené', + 'draft' => 'Skrýt publikovanou stránku', + ], + 'users' => [ + 'management' => 'Správa uživatelů', + 'create' => 'Vytvořit nového uživatele', + 'update' => 'Upravovat ostatní uživatele', + 'block' => 'Zablokovat', + 'delete' => 'Mazat', + 'unblock' => 'Odblokovat', + 'set-permissions' => 'Nastavovat oprávnění', + 'change-role' => 'Změnit roli', + 'change-status' => 'Změnit status uživatele (zablokovat/odblokovat)' + ], + 'files' => [ + 'management' => 'Správa souborů', + 'upload' => 'Nahrávání', + 'update' => 'Úprava', + 'delete' => 'Mazání', + 'move-to-directories' => 'Přesouvat soubory mezi adresáři' + ], + 'directories' => [ + 'management' => 'Správa složek', + 'create' => 'Vytváření', + 'edit' => 'Úprava', + 'delete' => 'Mazání' + ], + 'widgetareas' => [ + 'management' => 'Správa ploch pro widgety', + 'create' => 'Vytváření', + 'edit' => 'Úprava', + 'delete' => 'Mazání' + ], + 'widgets' => [ + 'management' => 'Správa widgetů', + 'create' => 'Vytváření', + 'edit' => 'Úprava', + 'delete' => 'Mazání', + 'assign' => 'Přiřazování widgetů do plochy', + 'unassign' => 'Odstraňování widgetů z plochy' + ], + 'templates' => [ + 'management' => 'Správa šablon', + 'copy' => 'Kopírování', + 'edit' => 'Úprava', + ], + 'actions' => [ + 'management' => 'Zobrazení přehledu akcí', + ], + 'settings' => [ + 'management' => 'Správa nastavení', + ] +]; \ No newline at end of file diff --git a/resources/lang/cs/admin/userManagement.php b/resources/lang/cs/admin/userManagement.php index 0cec8e24..ec7e6a7e 100644 --- a/resources/lang/cs/admin/userManagement.php +++ b/resources/lang/cs/admin/userManagement.php @@ -1,32 +1,32 @@ "Přidat nového uživatele", - "allStatuses" => "Všechny", - "detail" => "Detaily uživatele :name (:email)", - "edit" => "Upravit uživatele", - "editUser" => "Editace uživatele :name (:email)", - "email" => "E-mail", - "gravatarLink" => 'Nastavte si avatar na gravatar.com', - "moreUserActions" => "Zobrazit více...", - "name" => "Celé jméno", - "noActions" => "Uživatel zatím v systému nic neudělal.", - "noUsers" => "Žádní uživatelé.", - "overview" => "Seznam všech uživatelů", - "password" => "Heslo", - "passwordLeaveEmpty" => "Nevyplňujte, pokud nechcete změnit heslo.", - "profile" => "Profil uživatele", - "register" => "Vytvořit uživatele", + "addNewUser" => "Přidat nového uživatele", + "allStatuses" => "Všechny", + "detail" => "Detaily uživatele :name (:email)", + "edit" => "Upravit uživatele", + "editUser" => "Editace uživatele :name (:email)", + "email" => "E-mail", + "gravatarLink" => 'Nastavte si avatar na gravatar.com', + "moreUserActions" => "Zobrazit více...", + "name" => "Celé jméno", + "noActions" => "Uživatel zatím v systému nic neudělal.", + "noUsers" => "Žádní uživatelé.", + "overview" => "Seznam všech uživatelů", + "password" => "Heslo", + "passwordLeaveEmpty" => "Nevyplňujte, pokud nechcete změnit heslo.", + "profile" => "Profil uživatele", + "register" => "Vytvořit uživatele", "registrationSuccessfull" => "Nový úživatel úspěšně přidán.", - "role_admin" => "Administrátor", - "role_editor" => "Editor", - "role_visitor" => "Návštěvník", - "roles" => "Prosím, zvolte roli uživatele", - "status" => "Stav", - "status_active" => "Aktivní", - "status_blocked" => "Zablokovaný", - "status_deleted" => "Smazaný", - "update" => "Upravit informace", - "userDetail" => "Informace", - "userSuccessfullyEdited" => "Uživatel úspěšně upraven.", - "usersActions" => "Akce uživatele", + "role_admin" => "Uživatel s přístupem do administrace", + "role_visitor" => "Návštěvník (bez přístupu do administrace)", + "roles" => "Prosím, zvolte roli uživatele", + "status" => "Stav", + "status_active" => "Aktivní", + "status_blocked" => "Zablokovaný", + "status_deleted" => "Smazaný", + "update" => "Upravit informace", + "userDetail" => "Informace", + "userSuccessfullyEdited" => "Uživatel úspěšně upraven.", + "usersActions" => "Akce uživatele", + 'permissions' => 'Oprávnění' ]; diff --git a/resources/views/admin/content/edit.blade.php b/resources/views/admin/content/edit.blade.php index ba31fe6c..49bdee65 100644 --- a/resources/views/admin/content/edit.blade.php +++ b/resources/views/admin/content/edit.blade.php @@ -21,9 +21,12 @@ @if ($historySize > 0) -
- @lang('admin/contents.showHistory', ['count' => $historySize]) -
+ @can('viewHistory', $page) +
+ @lang('admin/contents.showHistory', ['count' => $historySize]) +
+ @endcan @endif diff --git a/resources/views/admin/content/overview.blade.php b/resources/views/admin/content/overview.blade.php index c1b3f433..c0b649b0 100644 --- a/resources/views/admin/content/overview.blade.php +++ b/resources/views/admin/content/overview.blade.php @@ -4,9 +4,11 @@ @section('headerButtons') @if($module->exists === true) - - - + @can('create', $module) + + + + @endcan @endif @endsection @@ -36,26 +38,38 @@ @foreach($pages as $page)
- + @can('update', $page) + + {{$page->title}} + + @else {{$page->title}} - + @endcan + @if($page->isHomepage) @lang('admin/contents.homepage') @endif @@ -85,38 +99,45 @@
    @if(!$page->isHomepage) -
  • - - - - -
  • + @can('set-homepage', $page) +
  • + + + +
  • + @endcan @endif -
  • - - - -
  • + @can('update', $page) +
  • + + + +
  • + @endcan @if($page->isDraft()) -
  • - - - -
  • -
  • - - - -
  • + @can('publish', $page) +
  • + + + +
  • + @endcan + @can('protect', $page) +
  • + + + +
  • + @endcan @else
  • -
  • - - - -
  • + @can('draft', $page) +
  • + + + +
  • + @endcan @endif -
  • - - -
  • + @can('delete', $page) +
  • + + +
  • + @endcan +
- @endforeach diff --git a/resources/views/admin/fileManager/edit.blade.php b/resources/views/admin/fileManager/edit.blade.php index a7336f4f..06f1df66 100644 --- a/resources/views/admin/fileManager/edit.blade.php +++ b/resources/views/admin/fileManager/edit.blade.php @@ -2,10 +2,13 @@ @section('pageHeading', @trans('admin/fileManager.edit', ['name' => $file->original_filename])) @section('headerButtons') - - - - @endsection + @can('delete', $file) + + + + @endcan +@endsection @section('content') @@ -18,21 +21,24 @@
-

{{$file->original_filename}}

+

{{$file->original_filename}}

-
    -
  • @lang('admin/fileManager.createdAt'): {{$file->created_at}}
  • -
  • @lang('admin/fileManager.updatedAt'): {{$file->updated_at}}
  • -
  • @lang('admin/fileManager.mime'): {{$file->mime_type}}
  • -
  • @lang('admin/fileManager.hash'): {{str_limit($file->file_hash, 10)}}
  • -
  • @lang('admin/fileManager.url'): {{$file->filename}}
  • -
  • @lang('admin/fileManager.fileSize'): {{\App\CMS\Helpers\FileManager::getFormattedSize($file)}}
  • +
      +
    • @lang('admin/fileManager.createdAt'): {{$file->created_at}}
    • +
    • @lang('admin/fileManager.updatedAt'): {{$file->updated_at}}
    • +
    • @lang('admin/fileManager.mime'): {{$file->mime_type}}
    • +
    • @lang('admin/fileManager.hash'): {{str_limit($file->file_hash, 10)}}
    • +
    • @lang('admin/fileManager.url'): {{$file->filename}}
    • +
    • @lang('admin/fileManager.fileSize') + : {{\App\CMS\Helpers\FileManager::getFormattedSize($file)}}
    • - @foreach($extraInfo as $column => $info) -
    • {{$column}}: {{$info}}
    • - @endforeach + @foreach($extraInfo as $column => $info) +
    • {{$column}}: {{$info}}
    • + @endforeach -
    +
@@ -49,6 +55,6 @@ @section('javascripts') @stop diff --git a/resources/views/admin/fileManager/editForm.blade.php b/resources/views/admin/fileManager/editForm.blade.php index d7d0e21d..ef8e93db 100644 --- a/resources/views/admin/fileManager/editForm.blade.php +++ b/resources/views/admin/fileManager/editForm.blade.php @@ -1,33 +1,34 @@ -
- {!! csrf_field() !!} +@can('update', $file) + + {!! csrf_field() !!} - + - + - + - + - - @lang('admin/fileManager.directory') - + + @lang('admin/fileManager.directory') + - + - + - - - -
+ + + +@endcan diff --git a/resources/views/admin/fileManager/filesTiles.blade.php b/resources/views/admin/fileManager/filesTiles.blade.php index cef41a0e..e1f2148e 100644 --- a/resources/views/admin/fileManager/filesTiles.blade.php +++ b/resources/views/admin/fileManager/filesTiles.blade.php @@ -4,7 +4,7 @@ 'body' => ''.\App\CMS\Helpers\FileManager::getPreview($file).'', 'footerClass' => 'text-right', 'cardClass' => 'file-preview', - 'footer' => (!isset($hideDelete) || !$hideDelete) ? ' \Auth::user()->can('delete', $file) && (!isset($hideDelete) || !$hideDelete) ? ' diff --git a/resources/views/admin/fileManager/overview.blade.php b/resources/views/admin/fileManager/overview.blade.php index 54d4c027..a71969ed 100644 --- a/resources/views/admin/fileManager/overview.blade.php +++ b/resources/views/admin/fileManager/overview.blade.php @@ -16,20 +16,24 @@
-
- + @endcan + @if (!$directory->is_root)
@@ -48,20 +52,22 @@
@endif -
- + @endcan
diff --git a/resources/views/admin/history/overview.blade.php b/resources/views/admin/history/overview.blade.php index 78f15280..4cf92a77 100644 --- a/resources/views/admin/history/overview.blade.php +++ b/resources/views/admin/history/overview.blade.php @@ -33,7 +33,9 @@ @endforeach - - @lang('admin/history.backToEdit') - + @can('update', $page) + + @lang('admin/history.backToEdit') + + @endcan @stop \ No newline at end of file diff --git a/resources/views/admin/userManagement/detail.blade.php b/resources/views/admin/userManagement/detail.blade.php index 4d566885..2e930cd2 100644 --- a/resources/views/admin/userManagement/detail.blade.php +++ b/resources/views/admin/userManagement/detail.blade.php @@ -32,12 +32,24 @@ - + @can('update', $user) + + @endcan + + @can('set-permissions', $user) + + @endcan