chamilo /
chamilo-lms
| 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.