1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
<?php
use MediaWiki\Shell\Command;
use MediaWiki\Shell\Shell;
/**
* @covers \MediaWiki\Shell\Shell
* @group Shell
*/
class ShellTest extends MediaWikiIntegrationTestCase {
public function testIsDisabled() {
$this->assertIsBool( Shell::isDisabled() );
}
/**
* @dataProvider provideEscape
*/
public function testEscape( $args, $expected ) {
if ( wfIsWindows() ) {
$this->markTestSkipped( 'This test requires a POSIX environment.' );
}
$this->assertSame( $expected, Shell::escape( ...$args ) );
}
public function provideEscape() {
return [
'simple' => [ [ 'true' ], "'true'" ],
'with args' => [ [ 'convert', '-font', 'font name' ], "'convert' '-font' 'font name'" ],
'array' => [ [ [ 'convert', '-font', 'font name' ] ], "'convert' '-font' 'font name'" ],
'skip nulls' => [ [ 'ls', null ], "'ls'" ],
];
}
/**
* @covers \MediaWiki\Shell\Shell::makeScriptCommand
* @dataProvider provideMakeScriptCommand
*
* @param string $expected expected in POSIX
* @param string $expectedWin expected in Windows
* @param string $script
* @param string[] $parameters
* @param string[] $options
* @param callable|null $hook
*/
public function testMakeScriptCommand(
$expected,
$expectedWin,
$script,
$parameters,
$options = [],
$hook = null
) {
// Running tests under Vagrant involves MWMultiVersion that uses the below hook
$this->setMwGlobals( 'wgHooks', [] );
if ( $hook ) {
$this->setTemporaryHook( 'wfShellWikiCmd', $hook );
}
$command = Shell::makeScriptCommand( $script, $parameters, $options );
$command->params( 'safe' )
->unsafeParams( 'unsafe' );
$this->assertInstanceOf( Command::class, $command );
if ( wfIsWindows() ) {
$this->assertEquals( $expectedWin, $command->getCommandString() );
} else {
$this->assertEquals( $expected, $command->getCommandString() );
}
$this->assertSame( [], $command->getDisallowedPaths() );
}
public function provideMakeScriptCommand() {
global $wgPhpCli;
return [
[
"'$wgPhpCli' 'maintenance/foobar.php' 'bar'\\''\"baz' 'safe' unsafe",
'"' . $wgPhpCli . '" "maintenance/foobar.php" "bar\'\\"baz" "safe" unsafe',
'maintenance/foobar.php',
[ 'bar\'"baz' ],
],
[
"'$wgPhpCli' 'changed.php' '--wiki=somewiki' 'bar'\\''\"baz' 'safe' unsafe",
'"' . $wgPhpCli . '" "changed.php" "--wiki=somewiki" "bar\'\\"baz" "safe" unsafe',
'maintenance/foobar.php',
[ 'bar\'"baz' ],
[],
static function ( &$script, array &$parameters ) {
$script = 'changed.php';
array_unshift( $parameters, '--wiki=somewiki' );
}
],
[
"'/bin/perl' 'maintenance/foobar.php' 'bar'\\''\"baz' 'safe' unsafe",
'"/bin/perl" "maintenance/foobar.php" "bar\'\\"baz" "safe" unsafe',
'maintenance/foobar.php',
[ 'bar\'"baz' ],
[ 'php' => '/bin/perl' ],
],
[
"'$wgPhpCli' 'foobinize' 'maintenance/foobar.php' 'bar'\\''\"baz' 'safe' unsafe",
'"' . $wgPhpCli . '" "foobinize" "maintenance/foobar.php" "bar\'\\"baz" "safe" unsafe',
'maintenance/foobar.php',
[ 'bar\'"baz' ],
[ 'wrapper' => 'foobinize' ],
],
];
}
}
|