Passed
Pull Request — 2.x (#1049)
by
unknown
13:20
created

PermissionAuthServiceProvider   A

Complexity

Total Complexity 33

Size/Duplication

Total Lines 182
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 92
c 1
b 0
f 0
dl 0
loc 182
rs 9.76
wmc 33

2 Methods

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