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

code/api/PermissionProviderFactory.php (1 issue)

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