Page MenuHomeWickedGov Phorge

RemoteBoxedExecutor.php
No OneTemporary

Size
4 KB
Referenced Files
None
Subscribers
None

RemoteBoxedExecutor.php

<?php
namespace Shellbox\Command;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use Shellbox\Client;
use Shellbox\Shellbox;
use Shellbox\ShellboxError;
/**
* A BoxedExecutor which works by running the command on a remote server via
* HTTP/HTTPS.
*/
class RemoteBoxedExecutor extends BoxedExecutor {
/** @var Client */
private $client;
/** @var LoggerInterface */
private $logger;
/**
* @param Client $client
*/
public function __construct( Client $client ) {
$this->client = $client;
$this->logger = new NullLogger;
}
/**
* Set the logger
*
* @param LoggerInterface $logger
*/
public function setLogger( LoggerInterface $logger ) {
$this->logger = $logger;
}
public function executeValid( BoxedCommand $command ) {
$this->checkForUrlFiles( $command );
// Compile the binary parts
$parts = [ [
'name' => 'json-data',
'headers' => [
'Content-Disposition' => "json-data",
'Content-Type' => 'application/json',
],
'contents' => Shellbox::jsonEncode( [
'action' => 'shell',
'command' => $command->getClientData(),
] )
] ];
foreach ( $command->getInputFiles() as $boxedName => $file ) {
if ( $file instanceof InputFileWithContents ) {
$parts[] = [
'name' => $boxedName,
'headers' => [
'Content-Disposition' =>
"attachment; name=\"$boxedName\"; filename=\"$boxedName\"",
'Content-Type' => 'application/octet-stream',
],
'contents' => $file->getStreamOrString()
];
}
}
$stdin = $command->getStdin();
if ( $stdin !== '' ) {
$parts[] = [
'name' => 'stdin',
'headers' => [
'Content-Disposition' => "form-data; name=stdin",
'Content-Type' => 'application/octet-stream'
],
'contents' => $stdin
];
}
$files = $command->getOutputFiles();
$globs = $command->getOutputGlobs();
// Send the request
$resultData = $this->client->sendRequest(
'shell/' . $command->getRouteName(),
$parts,
$files,
$globs
);
// Validate the response
if ( !isset( $resultData['exitCode'] ) ) {
throw new ShellboxError( 'Server result is missing the exit code' );
}
// Forward log entries
foreach ( $resultData['log'] ?? [] as $logEntry ) {
$this->logger->log(
$logEntry['level'],
$logEntry['message'],
$logEntry['context']
);
}
// Construct the result
$result = ( new BoxedResult )
->exitCode( $resultData['exitCode'] )
->stdout( $resultData['stdout'] ?? null )
->stderr( $resultData['stderr'] ?? null );
$uploadedFiles = array_fill_keys( $resultData['uploadedFiles'] ?? [], true );
foreach ( $files as $boxedName => $file ) {
if ( $file->wasReceived() || isset( $uploadedFiles[$boxedName] ) ) {
$result->addOutputFile( $boxedName, $file );
}
}
foreach ( $globs as $glob ) {
foreach ( $glob->getFiles() as $boxedName => $file ) {
$result->addOutputFile( $boxedName, $file );
}
}
return $result;
}
public function areUrlFilesAllowed() {
return $this->client->areUrlFilesAllowed();
}
/**
* If URL files are not allowed by client configuration, throw an exception
* if the specified command has any such files.
*
* Applications should check areUrlFilesAllowed() before calling
* inputFileFromUrl() etc. to avoid an exception from this method.
*
* @param BoxedCommand $command
* @throws ShellboxError
*/
private function checkForUrlFiles( BoxedCommand $command ) {
if ( $this->areUrlFilesAllowed() ) {
return;
}
foreach ( $command->getInputFiles() as $boxedName => $file ) {
if ( $file instanceof InputFileFromUrl ) {
throw new ShellboxError(
"Can't download input file \"$boxedName\" when " .
"allowUrlFiles is not set in the Client options" );
}
}
foreach ( $command->getOutputFiles() as $boxedName => $outputFile ) {
if ( $outputFile instanceof OutputFileToUrl ) {
throw new ShellboxError(
"Can't upload output file \"$boxedName\" when " .
"allowUrlOutput is not set in the Client options" );
}
}
foreach ( $command->getOutputGlobs() as $id => $outputGlob ) {
if ( $outputGlob instanceof OutputGlobToUrl ) {
throw new ShellboxError(
"Can't upload output glob \"$id\" when " .
"allowUrlOutput is not set in the Client options" );
}
}
}
}

File Metadata

Mime Type
text/x-php
Expires
Sat, Oct 3, 07:57 (1 w, 6 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
72/06/93db50fb57490ed6361521028548
Default Alt Text
RemoteBoxedExecutor.php (4 KB)

Event Timeline