/** * Will forward to the regular swf player according to the widget_id */ public function execute() { requestUtils::handleConditionalGet(); $file_sync_id = $this->getRequestParameter("id"); $hash = $this->getRequestParameter("hash"); $file_name = $this->getRequestParameter("fileName"); if ($file_name) { $file_name = base64_decode($file_name); } $file_sync = FileSyncPeer::retrieveByPk($file_sync_id); if (!$file_sync) { $current_dc_id = kDataCenterMgr::getCurrentDcId(); $error = "DC[{$current_dc_id}]: Cannot find FileSync with id [{$file_sync_id}]"; KalturaLog::err($error); KExternalErrors::dieError(KExternalErrors::FILE_NOT_FOUND); } KalturaMonitorClient::initApiMonitor(false, 'extwidget.serveFile', $file_sync->getPartnerId()); kDataCenterMgr::serveFileToRemoteDataCenter($file_sync, $hash, $file_name); die; }
public static function serveFileToRemoteDataCenter($file_sync_id, $file_hash, $file_name) { KalturaLog::log("File sync id [{$file_sync_id}], file_hash [{$file_hash}], file_name [{$file_name}]"); // TODO - verify security $current_dc = self::getCurrentDc(); $current_dc_id = $current_dc["id"]; // retrieve the object $file_sync = FileSyncPeer::retrieveByPk($file_sync_id); if (!$file_sync) { $error = "DC[{$current_dc_id}]: Cannot find FileSync with id [{$file_sync_id}]"; KalturaLog::err($error); throw new Exception($error); } if ($file_sync->getDc() != $current_dc_id) { $error = "DC[{$current_dc_id}]: FileSync with id [{$file_sync_id}] does not belong to this DC"; KalturaLog::err($error); throw new Exception($error); } // resolve if file_sync is link $file_sync_resolved = $file_sync; if ($file_sync->getFileType() == FileSync::FILE_SYNC_FILE_TYPE_LINK) { $file_sync_resolved = kFileSyncUtils::resolve($file_sync); } // check if file sync path leads to a file or a directory $resolvedPath = $file_sync_resolved->getFullPath(); $fileSyncIsDir = is_dir($resolvedPath); if ($fileSyncIsDir && $file_name) { $resolvedPath .= '/' . $file_name; } if (!file_exists($resolvedPath)) { $file_name_msg = $file_name ? "file name [{$file_name}] " : ''; $error = "DC[{$current_dc_id}]: Path for fileSync id [{$file_sync_id}] " . $file_name_msg . "does not exist"; KalturaLog::err($error); throw new Exception($error); } // validate the hash $expected_file_hash = md5($current_dc["secret"] . $file_sync_id); // will be verified on the other side to make sure not some attack or external invalid request if ($file_hash != $expected_file_hash) { $error = "DC[{$current_dc_id}]: FileSync with id [{$file_sync_id}] - invalid hash"; KalturaLog::err($error); throw new Exception($error); } if ($fileSyncIsDir && is_dir($resolvedPath)) { KalturaLog::log("Serving directory content from [" . $resolvedPath . "]"); $contents = kFile::listDir($resolvedPath); sort($contents, SORT_STRING); $contents = serialize($contents); header("file-sync-type: dir"); echo $contents; die; } else { KalturaLog::log("Serving file from [" . $resolvedPath . "]"); kFile::dumpFile($resolvedPath); } }