Completed
Push — master ( 2a4315...ac93b3 )
by Nicolaas
01:25
created

code/api/PermissionProviderFactory.php (1 issue)

Check for implicit conversion of array to boolean.

Best Practice Bug Minor

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
4
class PermissionProviderFactory extends Object
5
{
6
    public function CreateDefaultMember($email, $firstName = '', $surname = '', $password = '')
7
    {
8
        $filter = array('Email' => $email);
9
        $member = DataObject::get_one(
10
            'Member',
11
            $filter,
12
            $cacheDataObjectGetOne = false
13
        );
14
        if (!$member) {
15
            $member = Member::create($filter);
16
        }
17
        if (!$firstName) {
18
            $firstName = 'Default';
19
        }
20
        if (!$surname) {
21
            $surname = 'User';
22
        }
23
24
        $member->FirstName = $firstName;
25
        $member->Surname = $surname;
26
        $member->write();
27
        if ($password) {
28
            $member->changePassword($password);
29
        }
30
        return $member;
31
    }
32
33
    /**
34
     * set up a group with permissions, roles, etc...
35
     * also note that this class implements PermissionProvider.
36
     *
37
     * @param string          $code            code for the group - will always be converted to lowercase
38
     * @param string          $name            title for the group
39
     * @param Group | String  $parentGroup     group object that is the parent of the group. You can also provide a string (name / title of group)
40
     * @param string          $permissionCode  Permission Code for the group (e.g. CMS_DO_THIS_OR_THAT)
41
     * @param string          $roleTitle       Role Title - e.g. Store Manager
42
     * @param array           $permissionArray Permission Array - list of permission codes applied to the group
43
     * @param Member | String $member          Default Member added to the group (e.g. [email protected]). You can also provide an email address
44
     */
45
    public function CreateGroup($code, $name, $parentGroup = null, $permissionCode = '', $roleTitle = '', $permissionArray = array(), $member = null)
46
    {
47
        if (! $permissionArray) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $permissionArray of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
48
            $permissionArray = array();
49
        }
50
        if (! is_array($permissionArray)) {
51
            user_error('Permission Array expects null or an array... currently: '.print_r($permissionArray, 1));
52
        }
53
        //changing to lower case seems to be very important
54
        //unidentified bug so far
55
        $code = strtolower($code);
56
        if (!$code) {
57
            user_error("Can't create a group without a $code ($name)");
58
        }
59
        if (!$name) {
60
            user_error("Can't create a group without a $name ($code)");
61
        }
62
        $filterArrayForGroup = array('Code' => $code);
63
        $groupDataList = Group::get()->filter($filterArrayForGroup);
64
        $groupCount = $groupDataList->count();
65
        $groupStyle = 'updated';
66
        if ($groupCount > 1) {
67
            user_error("There is more than one group with the $name ($code) Code");
68
        }
69
        if ($groupCount == 0) {
70
            $group = Group::create($filterArrayForGroup);
71
            $groupStyle = 'created';
72
        } else {
73
            $group = $groupDataList->First();
74
        }
75
        $group->Locked = 1;
76
        $group->Title = $name;
77
        $parentGroupStyle = 'updated';
78
        if ($parentGroup) {
79
            DB::alteration_message('adding parent group');
80
            if (is_string($parentGroup)) {
81
                $parentGroupName = $parentGroup;
82
                $parentGroup = DataObject::get_one(
83
                    'Group',
84
                    array('Title' => $parentGroupName),
85
                    $cacheDataObjectGetOne = false
86
                );
87
                if (!$parentGroup) {
88
                    $parentGroup = Group::create();
89
                    $parentGroupStyle = 'created';
90
                    $parentGroup->Title = $parentGroupName;
91
                    $parentGroup->write();
92
                    DB::alteration_message("$parentGroupStyle $parentGroupName", $parentGroupStyle);
93
                }
94
            }
95
            if ($parentGroup) {
96
                $group->ParentID = $parentGroup->ID;
97
            }
98
        }
99
        $group->write();
100
        DB::alteration_message("$groupStyle $name ($code) group", $groupStyle);
101
        $doubleGroups = Group::get()
102
            ->filter(array('Code' => $code))
103
            ->exclude(array('ID' => $group->ID));
104
        if ($doubleGroups->count()) {
105
            DB::alteration_message($doubleGroups->count().' groups with the same name', 'deleted');
106
            $realMembers = $group->Members();
107
            foreach ($doubleGroups as $doubleGroup) {
108
                $fakeMembers = $doubleGroup->Members();
109
                foreach ($fakeMembers as $fakeMember) {
110
                    DB::alteration_message('adding customers: '.$fakeMember->Email, 'created');
111
                    $realMembers->add($fakeMember);
112
                }
113
                DB::alteration_message('deleting double group ', 'deleted');
114
                $doubleGroup->delete();
115
            }
116
        }
117
        if ($permissionCode) {
118
            $permissionCodeCount = DB::query("SELECT * FROM \"Permission\" WHERE \"GroupID\" = '".$group->ID."' AND \"Code\" LIKE '".$permissionCode."'")->numRecords();
119
            if ($permissionCodeCount == 0) {
120
                DB::alteration_message('granting '.$name." permission code $permissionCode ", 'created');
121
                Permission::grant($group->ID, $permissionCode);
122
            } else {
123
                DB::alteration_message($name." permission code $permissionCode already granted");
124
            }
125
        }
126
        //we unset it here to avoid confusion with the
127
        //other codes we use later on
128
        $permissionArray[] = $permissionCode;
129
        unset($permissionCode);
130
        if ($roleTitle) {
131
            $permissionRoleCount = PermissionRole::get()
132
                ->Filter(array('Title' => $roleTitle))
133
                ->Count();
134
            if ($permissionRoleCount > 1) {
135
                db::alteration_message("There is more than one Permission Role with title $roleTitle ($permissionRoleCount)", 'deleted');
136
                $permissionRolesFirst = DataObject::get_one(
137
                    'PermissionRole',
138
                    array('Title' => $roleTitle),
139
                    $cacheDataObjectGetOne = false
140
                );
141
                $permissionRolesToDelete = PermissionRole::get()
142
                    ->Filter(array('Title' => $roleTitle))
143
                    ->Exclude(array('ID' => $permissionRolesFirst->ID));
144
                foreach ($permissionRolesToDelete as $permissionRoleToDelete) {
145
                    db::alteration_message("DELETING double permission role $roleTitle", 'deleted');
146
                    $permissionRoleToDelete->delete();
147
                }
148
            }
149
            elseif ($permissionRoleCount == 1) {
150
                //do nothing
151
                DB::alteration_message("$roleTitle role in place");
152
            } else {
153
                DB::alteration_message("adding $roleTitle role", 'created');
154
                $permissionRole = PermissionRole::create();
155
                $permissionRole->Title = $roleTitle;
156
                $permissionRole->OnlyAdminCanApply = true;
157
                $permissionRole->write();
158
            }
159
            $permissionRole = DataObject::get_one(
160
                'PermissionRole',
161
                array('Title' => $roleTitle),
162
                $cacheDataObjectGetOne = false
163
            );
164
            if ($permissionRole) {
165
                if (is_array($permissionArray) && count($permissionArray)) {
166
                    DB::alteration_message('working with '.implode(', ', $permissionArray));
167
                    foreach ($permissionArray as $permissionRoleCode) {
168
                        $permissionRoleCodeObject = DataObject::get_one(
169
                            'PermissionRoleCode',
170
                            array('Code' => $permissionRoleCode, 'RoleID' => $permissionRole->ID),
171
                            $cacheDataObjectGetOne = false
172
                        );
173
                        $permissionRoleCodeObjectCount = PermissionRoleCode::get()
174
                            ->Filter(array('Code' => $permissionRoleCode, 'RoleID' => $permissionRole->ID))
175
                            ->Count();
176
                        if ($permissionRoleCodeObjectCount > 1) {
177
                            $permissionRoleCodeObjectsToDelete = PermissionRoleCode::get()
178
                                ->Filter(array('Code' => $permissionRoleCode, 'RoleID' => $permissionRole->ID))
179
                                ->Exclude(array('ID' => $permissionRoleCodeObject->ID));
180
                            foreach ($permissionRoleCodeObjectsToDelete as $permissionRoleCodeObjectToDelete) {
181
                                db::alteration_message("DELETING double permission code $permissionRoleCode for ".$permissionRole->Title, 'deleted');
182
                                $permissionRoleCodeObjectToDelete->delete();
183
                            }
184
                            db::alteration_message('There is more than one Permission Role Code in '.$permissionRole->Title." with Code = $permissionRoleCode ($permissionRoleCodeObjectCount)", 'deleted');
185
                        }
186
                        elseif ($permissionRoleCodeObjectCount == 1) {
187
                            //do nothing
188
                        } else {
189
                            $permissionRoleCodeObject = PermissionRoleCode::create();
190
                            $permissionRoleCodeObject->Code = $permissionRoleCode;
191
                            $permissionRoleCodeObject->RoleID = $permissionRole->ID;
192
                        }
193
                        DB::alteration_message('adding '.$permissionRoleCodeObject->Code.' to '.$permissionRole->Title);
194
                        $permissionRoleCodeObject->write();
195
                    }
196
                }
197
                if ($group && $permissionRole) {
198
                    if (DB::query('SELECT COUNT(*) FROM Group_Roles WHERE GroupID = '.$group->ID.' AND PermissionRoleID = '.$permissionRole->ID)->value() == 0) {
199
                        db::alteration_message('ADDING '.$permissionRole->Title.' permission role  to '.$group->Title.' group', 'created');
200
                        $existingGroups = $permissionRole->Groups();
201
                        $existingGroups->add($group);
202
                    } else {
203
                        db::alteration_message('CHECKED '.$permissionRole->Title.' permission role  to '.$group->Title.' group');
204
                    }
205
                } else {
206
                    db::alteration_message('ERROR: missing group or permissionRole', 'deleted');
207
                }
208
            }
209
        }
210
        if ($member) {
211
            if (is_string($member)) {
212
                $email = $member;
213
                $member = $this->CreateDefaultMember($email, $code, $name);
214
            }
215
            if ($member) {
216
                DB::alteration_message(' adding member '.$member->Email.' to group '.$group->Title, 'created');
217
                $member->Groups()->add($group);
218
            }
219
        } else {
220
            DB::alteration_message('No need to add user');
221
        }
222
    }
223
}
224