shell bypass 403
<?php
/**
* BigBlueButton open source conferencing system - https://www.bigbluebutton.org/.
*
* Copyright (c) 2016-2018 BigBlueButton Inc. and by respective authors (see below).
*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation; either version 3.0 of the License, or (at your option) any later
* version.
*
* BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
*/
namespace BigBlueButton;
use BigBlueButton\Core\ApiMethod;
use BigBlueButton\Parameters\DeleteRecordingsParameters;
use BigBlueButton\Parameters\EndMeetingParameters;
use BigBlueButton\Parameters\GetMeetingInfoParameters;
use BigBlueButton\Parameters\GetRecordingsParameters;
use BigBlueButton\Parameters\IsMeetingRunningParameters;
use BigBlueButton\Parameters\PublishRecordingsParameters;
/**
* Class BigBlueButtonTest
* @package BigBlueButton
*/
class BigBlueButtonTest extends TestCase
{
/**
* @var BigBlueButton
*/
private $bbb;
/**
* Setup test class
*/
public function setUp(): void
{
parent::setUp();
foreach (['BBB_SECRET', 'BBB_SERVER_BASE_URL'] as $k) {
if (!getenv($k)) {
$this->fail('$_SERVER[\'' . $k . '\'] not set in '
. 'phpunit.xml');
}
}
$this->bbb = new BigBlueButton();
}
/* API Version */
/**
* Test API version call
*/
public function testApiVersion()
{
$apiVersion = $this->bbb->getApiVersion();
$this->assertEquals('SUCCESS', $apiVersion->getReturnCode());
$this->assertEquals('2.0', $apiVersion->getVersion());
$this->assertTrue($apiVersion->success());
}
/* Create Meeting */
/**
* Test create meeting URL
*/
public function testCreateMeetingUrl()
{
$params = $this->generateCreateParams();
$url = $this->bbb->getCreateMeetingUrl($this->getCreateMock($params));
foreach ($params as $key => $value) {
if (is_bool($value)) {
$value = $value ? 'true' : 'false';
}
$this->assertContains('=' . urlencode($value), $url);
}
}
/**
* Test create meeting
*/
public function testCreateMeeting()
{
$params = $this->generateCreateParams();
$result = $this->bbb->createMeeting($this->getCreateMock($params));
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
/**
* Test create meeting with a document URL
*/
public function testCreateMeetingWithDocumentUrl()
{
$params = $this->getCreateMock($this->generateCreateParams());
$params->addPresentation('https://picsum.photos/3840/2160/?random');
$result = $this->bbb->createMeeting($params);
$this->assertCount(1, $params->getPresentations());
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
/**
* Test create meeting with a document URL and filename
*/
public function testCreateMeetingWithDocumentUrlAndFileName()
{
$params = $this->getCreateMock($this->generateCreateParams());
$params->addPresentation('https://picsum.photos/3840/2160/?random', null, 'placeholder.png');
$result = $this->bbb->createMeeting($params);
$this->assertCount(1, $params->getPresentations());
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
/**
* Test create meeting with a document URL
*/
public function testCreateMeetingWithDocumentEmbedded()
{
$params = $this->getCreateMock($this->generateCreateParams());
$params->addPresentation('bbb_logo.png', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'fixtures' . DIRECTORY_SEPARATOR . 'bbb_logo.png'));
$result = $this->bbb->createMeeting($params);
$this->assertCount(1, $params->getPresentations());
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
/**
* Test create meeting with a multiple documents
*/
public function testCreateMeetingWithMultiDocument()
{
$params = $this->getCreateMock($this->generateCreateParams());
$params->addPresentation('https://picsum.photos/3840/2160/?random', null, 'presentation.png');
$params->addPresentation('logo.png', file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'fixtures' . DIRECTORY_SEPARATOR . 'bbb_logo.png'));
$result = $this->bbb->createMeeting($params);
$this->assertCount(2, $params->getPresentations());
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
/* Join Meeting */
/**
* Test create join meeting URL
*/
public function testCreateJoinMeetingUrl()
{
$joinMeetingParams = $this->generateJoinMeetingParams();
$joinMeetingMock = $this->getJoinMeetingMock($joinMeetingParams);
$url = $this->bbb->getJoinMeetingURL($joinMeetingMock);
foreach ($joinMeetingParams as $key => $value) {
if (is_bool($value)) {
$value = $value ? 'true' : 'false';
}
$this->assertContains('=' . urlencode($value), $url);
}
}
/**
* @expectedException \Exception
* @expectedExceptionMessage String could not be parsed as XML
*/
public function testJoinMeeting()
{
$joinMeetingParams = $this->generateJoinMeetingParams();
$joinMeetingMock = $this->getJoinMeetingMock($joinMeetingParams);
$joinMeetingMock->setRedirect(false);
$joinMeeting = $this->bbb->joinMeeting($joinMeetingMock);
$this->assertEquals('SUCCESS', $joinMeeting->getReturnCode());
$this->assertTrue($joinMeeting->success());
$this->assertNotEmpty($joinMeeting->getAuthToken());
$this->assertNotEmpty($joinMeeting->getUserId());
$this->assertNotEmpty($joinMeeting->getSessionToken());
$this->assertNotEmpty($joinMeeting->getGuestStatus());
$this->assertNotEmpty($joinMeeting->getUrl());
}
/* Get Default Config XML */
public function testGetDefaultConfigXMLUrl()
{
$url = $this->bbb->getDefaultConfigXMLUrl();
$this->assertContains(ApiMethod::GET_DEFAULT_CONFIG_XML, $url);
}
public function testGetDefaultConfigXML()
{
$result = $this->bbb->getDefaultConfigXML();
$this->assertNotEmpty($result->getRawXml());
}
/* Set Config XML */
public function testSetConfigXMLUrl()
{
$url = $this->bbb->setConfigXMLUrl();
$this->assertContains(ApiMethod::SET_CONFIG_XML, $url);
}
public function testSetConfigXML()
{
// Fetch the Default Config XML file
$defaultConfigXMLResponse = $this->bbb->getDefaultConfigXML();
// Modify the XML file if required
// Create a meeting
$params = $this->generateCreateParams();
$createMeetingResponse = $this->bbb->createMeeting($this->getCreateMock($params));
$this->assertEquals('SUCCESS', $createMeetingResponse->getReturnCode());
$this->assertTrue($createMeetingResponse->success());
// Execute setConfigXML request
$params = ['meetingId' => $createMeetingResponse->getMeetingId()];
$setConfigXMLParams = $this->getSetConfigXMLMock($params);
$setConfigXMLParams = $setConfigXMLParams->setRawXml($defaultConfigXMLResponse->getRawXml());
$this->assertEquals($setConfigXMLParams->getRawXml(), $defaultConfigXMLResponse->getRawXml());
$result = $this->bbb->setConfigXML($setConfigXMLParams);
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
$this->assertNotEmpty($result->getToken());
}
/* End Meeting */
/**
* Test generate end meeting URL
*/
public function testCreateEndMeetingUrl()
{
$params = $this->generateEndMeetingParams();
$url = $this->bbb->getEndMeetingURL($this->getEndMeetingMock($params));
foreach ($params as $key => $value) {
if (is_bool($value)) {
$value = $value ? 'true' : 'false';
}
$this->assertContains('=' . urlencode($value), $url);
}
}
public function testEndMeeting()
{
$meeting = $this->createRealMeeting($this->bbb);
$endMeeting = new EndMeetingParameters($meeting->getMeetingId(), $meeting->getModeratorPassword());
$result = $this->bbb->endMeeting($endMeeting);
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
public function testEndNonExistingMeeting()
{
$params = $this->generateEndMeetingParams();
$result = $this->bbb->endMeeting($this->getEndMeetingMock($params));
$this->assertEquals('FAILED', $result->getReturnCode());
$this->assertTrue($result->failed());
}
/* Is Meeting Running */
public function testIsMeetingRunning()
{
$result = $this->bbb->isMeetingRunning(new IsMeetingRunningParameters($this->faker->uuid));
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
$this->assertEquals(false, $result->isRunning());
}
/* Get Meetings */
public function testGetMeetingsUrl()
{
$url = $this->bbb->getMeetingsUrl();
$this->assertContains(ApiMethod::GET_MEETINGS, $url);
}
public function testGetMeetings()
{
$result = $this->bbb->getMeetings();
$this->assertNotEmpty($result->getMeetings());
}
/* Get meeting info */
public function testGetMeetingInfoUrl()
{
$meeting = $this->createRealMeeting($this->bbb);
$url = $this->bbb->getMeetingInfoUrl(new GetMeetingInfoParameters($meeting->getMeetingId(), $meeting->getModeratorPassword()));
$this->assertContains('=' . urlencode($meeting->getMeetingId()), $url);
$this->assertContains('=' . urlencode($meeting->getModeratorPassword()), $url);
}
public function testGetMeetingInfo()
{
$meeting = $this->createRealMeeting($this->bbb);
$result = $this->bbb->getMeetingInfo(new GetMeetingInfoParameters($meeting->getMeetingId(), $meeting->getModeratorPassword()));
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
public function testGetRecordingsUrl()
{
$url = $this->bbb->getRecordingsUrl(new GetRecordingsParameters());
$this->assertContains(ApiMethod::GET_RECORDINGS, $url);
}
public function testGetRecordings()
{
$result = $this->bbb->getRecordings(new GetRecordingsParameters());
$this->assertEquals('SUCCESS', $result->getReturnCode());
$this->assertTrue($result->success());
}
public function testPublishRecordingsUrl()
{
$url = $this->bbb->getPublishRecordingsUrl(new PublishRecordingsParameters($this->faker->sha1, true));
$this->assertContains(ApiMethod::PUBLISH_RECORDINGS, $url);
}
public function testPublishRecordings()
{
$result = $this->bbb->publishRecordings(new PublishRecordingsParameters('non-existing-id-' . $this->faker->sha1, true));
$this->assertEquals('FAILED', $result->getReturnCode());
$this->assertTrue($result->failed());
}
public function testDeleteRecordingsUrl()
{
$url = $this->bbb->getDeleteRecordingsUrl(new DeleteRecordingsParameters($this->faker->sha1));
$this->assertContains(ApiMethod::DELETE_RECORDINGS, $url);
}
public function testDeleteRecordings()
{
$result = $this->bbb->deleteRecordings(new DeleteRecordingsParameters('non-existing-id-' . $this->faker->sha1));
$this->assertEquals('FAILED', $result->getReturnCode());
$this->assertTrue($result->failed());
}
public function testUpdateRecordingsUrl()
{
$params = $this->generateUpdateRecordingsParams();
$url = $this->bbb->getUpdateRecordingsUrl($this->getUpdateRecordingsParamsMock($params));
foreach ($params as $key => $value) {
if (is_bool($value)) {
$value = $value ? 'true' : 'false';
}
$this->assertContains('=' . urlencode($value), $url);
}
}
public function testUpdateRecordings()
{
$params = $this->generateUpdateRecordingsParams();
$result = $this->bbb->updateRecordings($this->getUpdateRecordingsParamsMock($params));
$this->assertEquals('FAILED', $result->getReturnCode());
$this->assertTrue($result->failed());
}
}