Passed
Pull Request — 2.x (#1049)
by
unknown
08:35
created

PermissionAuthServiceProvider   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 186
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 95
c 2
b 0
f 0
dl 0
loc 186
rs 9.76
wmc 33

2 Methods

Rating   Name   Duplication   Size   Complexity  
A authorize() 0 11 3
D boot() 0 169 30
1
<?php
2
3
namespace A17\Twill;
4
5
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
6
use Illuminate\Support\Facades\Config;
7
use Illuminate\Support\Facades\Gate;
8
9
class PermissionAuthServiceProvider extends ServiceProvider
10
{
11
    protected static $cache = [];
12
13
    protected function authorize($user, $callback, $moduleName = null)
0 ignored issues
show
Unused Code introduced by
The parameter $moduleName is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

13
    protected function authorize($user, $callback, /** @scrutinizer ignore-unused */ $moduleName = null)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
14
    {
15
        if ($user->is_superadmin) {
16
            return true;
17
        }
18
19
        if (!$user->published) {
20
            return false;
21
        }
22
23
        return $callback($user);
24
    }
25
26
    public function boot()
27
    {
28
        /***
29
         *
30
         *    Global permissions
31
         *
32
         ***/
33
34
        Gate::define('edit-settings', function ($user) {
35
            return $this->authorize($user, function ($user) {
36
                return $user->role->permissions()->global()->where('name', 'edit-settings')->exists();
37
            });
38
        });
39
40
        Gate::define('edit-users', function ($user) {
41
            return $this->authorize($user, function ($user) {
42
                return $user->role->permissions()->global()->where('name', 'edit-users')->exists();
43
            });
44
        });
45
46
        Gate::define('edit-user-role', function ($user) {
47
            return $this->authorize($user, function ($user) {
48
                return $user->role->permissions()->global()->where('name', 'edit-user-role')->exists();
49
            });
50
        });
51
52
        Gate::define('edit-user-groups', function ($user) {
53
            if (!in_array(Config::get('twill.permissions.level'), ['roleGroup', 'roleGroupModule'])) {
54
                return false;
55
            }
56
57
            return $this->authorize($user, function ($user) {
58
                return $user->role->permissions()->global()->where('name', 'edit-user-groups')->exists();
59
            });
60
        });
61
62
        Gate::define('access-user-management', function ($user) {
63
            return $this->authorize($user, function ($user) {
64
                return $user->can('edit-users') || $user->can('edit-user-role') || $user->can('edit-user-groups');
65
            });
66
        });
67
68
        Gate::define('manage-modules', function ($user) {
69
            if (isset(self::$cache['manage-modules'])) {
70
                return self::$cache['manage-modules'];
71
            }
72
            return self::$cache['manage-modules'] = $this->authorize($user, function ($user) {
73
                return $user->role->permissions()->global()->where('name', 'manage-modules')->exists()
74
                || isUserGroupPermissionModuleExists($user, 'global', 'manage-modules');
75
            });
76
        });
77
78
        Gate::define('access-media-library', function ($user) {
79
            return $this->authorize($user, function ($user) {
80
                return $user->role->permissions()->global()->where('name', 'access-media-library')->exists();
81
            });
82
        });
83
84
        Gate::define('edit-media-library', function ($user) {
85
            return $this->authorize($user, function ($user) {
86
                return $user->role->permissions()->global()->where('name', 'edit-media-library')->exists();
87
            });
88
        });
89
90
        Gate::define('impersonate', function ($user) {
91
            return $this->authorize($user, function ($user) {
92
                return $user->is_superadmin;
93
            });
94
        });
95
96
        /***
97
         *
98
         *    Module permissions
99
         *
100
         ***/
101
102
        Gate::define('access-module-list', function ($user, $moduleName) {
103
            if (isset(self::$cache['access-module-list-' . $moduleName])) {
104
                return self::$cache['access-module-list-' . $moduleName];
105
            }
106
107
            return self::$cache['access-module-list-' . $moduleName] = $this->authorize($user, function ($user) use ($moduleName) {
108
                return $user->can('view-module', $moduleName)
109
                || $user->allPermissions()->ofModuleName($moduleName)->exists();
110
            });
111
        });
112
113
        // The gate of accessing module list page,
114
        Gate::define('view-module', function ($user, $moduleName) {
115
            if (isset(self::$cache['view-module-' . $moduleName])) {
116
                return self::$cache['view-module-' . $moduleName];
117
            }
118
119
            return self::$cache['view-module-' . $moduleName] = $this->authorize($user, function ($user) use ($moduleName) {
120
                return $user->can('edit-module', $moduleName)
121
                || $user->role->permissions()->ofModuleName($moduleName)->where('name', 'view-module')->exists()
122
                || isUserGroupPermissionModuleExists($user, $moduleName, 'view-module');
123
            });
124
        });
125
126
        Gate::define('edit-module', function ($user, $moduleName) {
127
            if (isset(self::$cache['edit-module-' . $moduleName])) {
128
                return self::$cache['edit-module-' . $moduleName];
129
            }
130
            return self::$cache['edit-module-' . $moduleName] = $this->authorize($user, function ($user) use ($moduleName) {
131
                return $user->can('manage-module', $moduleName)
132
                || $user->role->permissions()->module()->ofModuleName($moduleName)->where('name', 'edit-module')->exists()
133
                || isUserGroupPermissionModuleExists($user, $moduleName, 'edit-module');
134
            });
135
        });
136
137
        Gate::define('manage-module', function ($user, $moduleName) {
138
            if (isset(self::$cache['manage-module-' . $moduleName])) {
139
                return self::$cache['manage-module-' . $moduleName];
140
            }
141
142
            return self::$cache['manage-module-' . $moduleName] = $this->authorize($user, function ($user) use ($moduleName) {
143
                if (!isPermissionableModule($moduleName)) {
144
                    return true;
145
                }
146
                return $user->can('manage-modules')
147
                || $user->role->permissions()->module()->ofModuleName($moduleName)->where('name', 'manage-module')->exists()
148
                || isUserGroupPermissionModuleExists($user, $moduleName, 'manage-module');
149
            });
150
        });
151
152
        /***
153
         *
154
         *    Module item permissions
155
         *
156
         ***/
157
158
        Gate::define('view-item', function ($user, $item) {
159
            $key = 'view-item-' . str_replace("\\", "-", get_class($item)) . '-' . $item->id;
160
            if (isset(self::$cache[$key])) {
161
                return self::$cache[$key];
162
            }
163
164
            return self::$cache[$key] = $this->authorize($user, function ($user) use ($item) {
165
                return $item->public
166
                || $user->can('edit-item', $item)
167
                || $user->can('view-module', getModuleNameByModel(get_class($item)))
168
                || $user->permissions()->ofItem($item)->where('name', 'view-item')->exists()
169
                || isUserGroupPermissionItemExists($user, $item, 'view-item');
170
            });
171
        });
172
173
        Gate::define('edit-item', function ($user, $item) {
174
            $key = 'edit-item-' . str_replace("\\", "-", get_class($item)) . '-' . $item->id;
175
            if (isset(self::$cache[$key])) {
176
                return self::$cache[$key];
177
            }
178
            return self::$cache[$key] = $this->authorize($user, function ($user) use ($item) {
179
                return $user->can('manage-item', $item)
180
                || $user->can('edit-module', getModuleNameByModel(get_class($item)))
181
                || $user->permissions()->ofItem($item)->where('name', 'edit-item')->exists()
182
                || isUserGroupPermissionItemExists($user, $item, 'edit-item');
183
            });
184
        });
185
186
        Gate::define('manage-item', function ($user, $item) {
187
            $key = 'manage-item-' . str_replace("\\", "-", get_class($item)) . '-' . $item->id;
188
            if (isset(self::$cache[$key])) {
189
                return self::$cache[$key];
190
            }
191
            return self::$cache[$key] = $this->authorize($user, function ($user) use ($item) {
192
                return $user->can('manage-module', getModuleNameByModel(get_class($item)))
193
                || $user->permissions()->ofItem($item)->where('name', 'manage-item')->exists()
194
                || isUserGroupPermissionItemExists($user, $item, 'manage-item');
195
            });
196
        });
197
    }
198
}
199