1 | <?php |
||
2 | |||
3 | /* For license terms, see /license.txt */ |
||
4 | |||
5 | use Chamilo\PluginBundle\Zoom\API\RecordingMeeting; |
||
6 | use Chamilo\PluginBundle\Zoom\Meeting; |
||
7 | use Chamilo\PluginBundle\Zoom\MeetingActivity; |
||
8 | use Chamilo\PluginBundle\Zoom\Recording; |
||
9 | use Symfony\Component\HttpFoundation\Response; |
||
10 | |||
11 | require_once __DIR__.'/config.php'; |
||
12 | if ('POST' !== $_SERVER['REQUEST_METHOD']) { |
||
13 | http_response_code(Response::HTTP_NOT_FOUND); // Not found |
||
14 | exit; |
||
15 | } |
||
16 | |||
17 | // @todo handle non-apache installations |
||
18 | $authorizationHeaderValue = apache_request_headers()['Authorization']; |
||
19 | |||
20 | if (api_get_plugin_setting('zoom', 'verificationToken') !== $authorizationHeaderValue) { |
||
21 | error_log('verificationToken not valid, please check your zoom configuration'); |
||
22 | http_response_code(Response::HTTP_UNAUTHORIZED); |
||
23 | exit; |
||
24 | } |
||
25 | |||
26 | $body = file_get_contents('php://input'); |
||
27 | $decoded = json_decode($body); |
||
28 | if (is_null($decoded) || !is_object($decoded) || !isset($decoded->event) || !isset($decoded->payload->object)) { |
||
29 | error_log(sprintf('Did not recognize event notification: %s', $body)); |
||
30 | http_response_code(Response::HTTP_UNPROCESSABLE_ENTITY); |
||
31 | exit; |
||
32 | } |
||
33 | |||
34 | $object = $decoded->payload->object; |
||
35 | list($objectType, $action) = explode('.', $decoded->event); |
||
36 | |||
37 | $em = Database::getManager(); |
||
38 | |||
39 | $meetingRepository = $em->getRepository(Meeting::class); |
||
40 | $meeting = null; |
||
41 | if ($object->id) { |
||
42 | /** @var Meeting $meeting */ |
||
43 | $meeting = $meetingRepository->findOneBy(['meetingId' => $object->id]); |
||
44 | } |
||
45 | |||
46 | if (null === $meeting) { |
||
47 | error_log("Meeting not found"); |
||
48 | error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body)); |
||
49 | http_response_code(Response::HTTP_NOT_FOUND); |
||
50 | exit; |
||
51 | } |
||
52 | |||
53 | $activity = new MeetingActivity(); |
||
54 | $activity->setName($action); |
||
55 | $activity->setType($objectType); |
||
56 | $activity->setEvent(json_encode($object)); |
||
57 | |||
58 | switch ($objectType) { |
||
59 | case 'meeting': |
||
60 | error_log('Meeting '.$action.' - '.$meeting->getId()); |
||
61 | error_log(print_r($object, 1)); |
||
62 | |||
63 | switch ($action) { |
||
64 | case 'deleted': |
||
65 | $em->remove($meeting); |
||
66 | break; |
||
67 | case 'ended': |
||
68 | case 'started': |
||
69 | $meeting->setStatus($action); |
||
70 | $meeting->addActivity($activity); |
||
71 | $em->persist($meeting); |
||
72 | break; |
||
73 | default: |
||
74 | $meeting->addActivity($activity); |
||
75 | $em->persist($meeting); |
||
76 | break; |
||
77 | } |
||
78 | $em->flush(); |
||
79 | break; |
||
80 | case 'recording': |
||
81 | $recordingRepository = $em->getRepository(Recording::class); |
||
82 | |||
83 | $recordingEntity = null; |
||
84 | if ($object->uuid) { |
||
85 | /** @var Recording $recordingEntity */ |
||
86 | $recordingEntity = $recordingRepository->findOneBy(['uuid' => $object->uuid, 'meeting' => $meeting]); |
||
87 | } |
||
88 | |||
89 | error_log("Recording: $action"); |
||
90 | error_log(print_r($object, 1)); |
||
91 | |||
92 | switch ($action) { |
||
93 | case 'completed': |
||
94 | $recording = new Recording(); |
||
95 | $recording->setRecordingMeeting(RecordingMeeting::fromObject($object)); |
||
96 | $recording->setMeeting($meeting); |
||
97 | $meeting->addActivity($activity); |
||
98 | $em->persist($meeting); |
||
99 | $em->persist($recording); |
||
100 | $em->flush(); |
||
101 | break; |
||
102 | case 'recovered': |
||
103 | /*if (null === $recordingEntity) { |
||
104 | $em->persist( |
||
105 | (new Recording())->setRecordingMeeting(RecordingMeeting::fromObject($object)) |
||
106 | ); |
||
107 | $em->flush(); |
||
108 | }*/ |
||
109 | break; |
||
110 | case 'trashed': |
||
111 | case 'deleted': |
||
112 | $meeting->addActivity($activity); |
||
113 | if (null !== $recordingEntity) { |
||
114 | $recordMeeting = $recordingEntity->getRecordingMeeting(); |
||
115 | $recordingToDelete = RecordingMeeting::fromObject($object); |
||
116 | $files = []; |
||
117 | if ($recordingToDelete->recording_files) { |
||
0 ignored issues
–
show
|
|||
118 | foreach ($recordingToDelete->recording_files as $fileToDelete) { |
||
119 | foreach ($recordMeeting->recording_files as $file) { |
||
120 | if ($fileToDelete->id != $file->id) { |
||
121 | $files[] = $file; |
||
122 | } |
||
123 | } |
||
124 | } |
||
125 | } |
||
126 | |||
127 | if (empty($files)) { |
||
128 | $em->remove($recordingEntity); |
||
129 | } else { |
||
130 | $recordMeeting->recording_files = $files; |
||
131 | $recordingEntity->setRecordingMeeting($recordMeeting); |
||
132 | $em->persist($recordingEntity); |
||
133 | } |
||
134 | } |
||
135 | $em->persist($meeting); |
||
136 | $em->flush(); |
||
137 | break; |
||
138 | default: |
||
139 | $meeting->addActivity($activity); |
||
140 | $em->persist($meeting); |
||
141 | $em->flush(); |
||
142 | //error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body)); |
||
143 | //http_response_code(501); // Not Implemented |
||
144 | break; |
||
145 | } |
||
146 | break; |
||
147 | default: |
||
148 | error_log(sprintf('Event "%s" on %s was unhandled: %s', $action, $objectType, $body)); |
||
149 | http_response_code(501); // Not Implemented |
||
150 | break; |
||
151 | } |
||
152 |
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.