Changeset View
Changeset View
Standalone View
Standalone View
src/app/Http/Controllers/API/V4/OpenViduController.php
<?php | <?php | ||||
namespace App\Http\Controllers\API\V4; | namespace App\Http\Controllers\API\V4; | ||||
use App\Http\Controllers\Controller; | use App\Http\Controllers\Controller; | ||||
use App\OpenVidu\Room; | use App\OpenVidu\Room; | ||||
use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||
use Illuminate\Support\Facades\Auth; | use Illuminate\Support\Facades\Auth; | ||||
use Illuminate\Support\Facades\Validator; | use Illuminate\Support\Facades\Validator; | ||||
class OpenViduController extends Controller | class OpenViduController extends Controller | ||||
{ | { | ||||
/** | /** | ||||
* Accepting the room join request. | |||||
* | |||||
* @param string $id Room identifier (name) | |||||
* @param string $reqid Request identifier | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse | |||||
*/ | |||||
public function acceptJoinRequest($id, $reqid) | |||||
{ | |||||
$room = Room::where('name', $id)->first(); | |||||
// This isn't a room, bye bye | |||||
if (!$room) { | |||||
return $this->errorResponse(404, \trans('meet.room-not-found')); | |||||
} | |||||
$user = Auth::guard()->user(); | |||||
// Only the room owner can do it | |||||
if (!$user || $user->id != $room->user_id) { | |||||
return $this->errorResponse(403); | |||||
} | |||||
if (!$room->requestAccept($reqid)) { | |||||
return $this->errorResponse(500, \trans('meet.session-request-accept-error')); | |||||
} | |||||
return response()->json(['status' => 'success']); | |||||
} | |||||
/** | |||||
* Denying the room join request. | |||||
* | |||||
* @param string $id Room identifier (name) | |||||
* @param string $reqid Request identifier | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse | |||||
*/ | |||||
public function denyJoinRequest($id, $reqid) | |||||
{ | |||||
$room = Room::where('name', $id)->first(); | |||||
// This isn't a room, bye bye | |||||
if (!$room) { | |||||
return $this->errorResponse(404, \trans('meet.room-not-found')); | |||||
} | |||||
$user = Auth::guard()->user(); | |||||
// Only the room owner can do it | |||||
if (!$user || $user->id != $room->user_id) { | |||||
return $this->errorResponse(403); | |||||
} | |||||
if (!$room->requestDeny($reqid)) { | |||||
return $this->errorResponse(500, \trans('meet.session-request-deny-error')); | |||||
} | |||||
return response()->json(['status' => 'success']); | |||||
} | |||||
/** | |||||
* Close the room session. | * Close the room session. | ||||
* | * | ||||
* @param string $id Room identifier (name) | * @param string $id Room identifier (name) | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse | * @return \Illuminate\Http\JsonResponse | ||||
*/ | */ | ||||
public function closeRoom($id) | public function closeRoom($id) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 109 Lines • ▼ Show 20 Lines | public function joinRoom($id) | ||||
'password' => $isOwner ? $password : '', | 'password' => $isOwner ? $password : '', | ||||
'requires_password' => !$isOwner && strlen($password), | 'requires_password' => !$isOwner && strlen($password), | ||||
]; | ]; | ||||
// Validate room password | // Validate room password | ||||
if (!$isOwner && strlen($password)) { | if (!$isOwner && strlen($password)) { | ||||
$request_password = request()->input('password'); | $request_password = request()->input('password'); | ||||
if ($request_password !== $password) { | if ($request_password !== $password) { | ||||
// Note: We send the config to the client so it knows to display the password field | return $this->errorResponse(425, \trans('meet.session-password-error'), ['config' => $config]); | ||||
$response = [ | } | ||||
'config' => $config, | } | ||||
'message' => \trans('meet.session-password-error'), | |||||
'status' => 'error', | // Handle locked room | ||||
]; | if (!$isOwner && $config['locked']) { | ||||
$nickname = request()->input('nickname'); | |||||
$picture = request()->input('picture'); | |||||
$requestId = request()->input('requestId'); | |||||
$request = $requestId ? $room->requestGet($requestId) : null; | |||||
$error = \trans('meet.session-room-locked-error'); | |||||
// Request already has been processed (not accepted yet, but it could be denied) | |||||
if (empty($request['status']) || $request['status'] != Room::REQUEST_ACCEPTED) { | |||||
if (!$request) { | |||||
if (empty($nickname) || empty($requestId) || !preg_match('/^[a-z0-9]{8,32}$/i', $requestId)) { | |||||
return $this->errorResponse(426, $error, ['config' => $config]); | |||||
} | |||||
if (empty($picture)) { | |||||
$svg = file_get_contents(resource_path('images/user.svg')); | |||||
$picture = 'data:image/svg+xml;base64,' . base64_encode($svg); | |||||
} elseif (!preg_match('|^data:image/png;base64,[a-zA-Z0-9=+/]+$|', $picture)) { | |||||
return $this->errorResponse(426, $error, ['config' => $config]); | |||||
} | |||||
// TODO: Resize when big/make safe the user picture? | |||||
$request = ['nickname' => $nickname, 'requestId' => $requestId, 'picture' => $picture]; | |||||
if (!$room->requestSave($requestId, $request)) { | |||||
// FIXME: should we use error code 500? | |||||
return $this->errorResponse(426, $error, ['config' => $config]); | |||||
} | |||||
// Send the request (signal) to the owner | |||||
$result = $room->signal('joinRequest', $request, 'MODERATOR'); | |||||
} | |||||
return response()->json($response, 425); | return $this->errorResponse(427, $error, ['config' => $config]); | ||||
} | } | ||||
} | } | ||||
// Create session token for the current user/connection | // Create session token for the current user/connection | ||||
$response = $room->getSessionToken('PUBLISHER'); | $response = $room->getSessionToken($isOwner ? 'MODERATOR' : 'PUBLISHER'); | ||||
if (empty($response)) { | if (empty($response)) { | ||||
return $this->errorResponse(500, \trans('meet.session-join-error')); | return $this->errorResponse(500, \trans('meet.session-join-error')); | ||||
} | } | ||||
// Create session token for screen sharing connection | // Create session token for screen sharing connection | ||||
if (!empty(request()->input('screenShare'))) { | if (!empty(request()->input('screenShare'))) { | ||||
$add_token = $room->getSessionToken('PUBLISHER'); | $add_token = $room->getSessionToken('PUBLISHER'); | ||||
▲ Show 20 Lines • Show All 102 Lines • Show Last 20 Lines |