mirror of
https://github.com/php/php-src.git
synced 2024-12-14 20:33:36 +08:00
add Phar->isWritable() for detecting whether a phar archive can be written to based on phar.readonly combined with actual file permissions
[DOC]
This commit is contained in:
parent
1c3097fcbe
commit
06df9bff83
@ -2094,6 +2094,28 @@ PHP_METHOD(Phar, isCompressed)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool Phar::isWritable()
|
||||
* Returns true if phar.readonly=0 or phar is a PharData AND the actual file is writable.
|
||||
*/
|
||||
PHP_METHOD(Phar, isWritable)
|
||||
{
|
||||
php_stream_statbuf ssb;
|
||||
PHAR_ARCHIVE_OBJECT();
|
||||
|
||||
if (!phar_obj->arc.archive->is_writeable) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
if (SUCCESS != php_stream_stat_path(phar_obj->arc.archive->fname, &ssb)) {
|
||||
if (phar_obj->arc.archive->is_brandnew) {
|
||||
/* assume it works if the file doesn't exist yet */
|
||||
RETURN_TRUE;
|
||||
}
|
||||
RETURN_FALSE;
|
||||
}
|
||||
RETURN_BOOL((ssb.sb.st_mode & (S_IWOTH | S_IWGRP | S_IWUSR)) != 0);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto bool Phar::delete(string entry)
|
||||
* Deletes a named file within the archive.
|
||||
*/
|
||||
@ -3925,6 +3947,7 @@ zend_function_entry php_archive_methods[] = {
|
||||
PHP_ME(Phar, hasMetadata, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Phar, isBuffering, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Phar, isCompressed, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Phar, isWritable, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Phar, isPhar, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Phar, isTar, NULL, ZEND_ACC_PUBLIC)
|
||||
PHP_ME(Phar, isZip, NULL, ZEND_ACC_PUBLIC)
|
||||
|
@ -8,6 +8,7 @@ phar.require_hash=0
|
||||
--FILE--
|
||||
<?php
|
||||
$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.1.phar.php';
|
||||
$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.tar';
|
||||
$pname = 'phar://hio';
|
||||
$file = '<?php include "' . $pname . '/a.php"; __HALT_COMPILER(); ?>';
|
||||
|
||||
@ -17,6 +18,9 @@ $files['dir/'] = '';
|
||||
$hasdir = 1;
|
||||
include 'files/phar_test.inc';
|
||||
$a = new Phar($fname);
|
||||
$b = new PharData($fname2);
|
||||
$b['test'] = 'hi';
|
||||
|
||||
var_dump($a['a.php']->isWritable());
|
||||
var_dump($a['a.php']->isReadable());
|
||||
$a['a.php']->chmod(000);
|
||||
@ -34,10 +38,26 @@ clearstatcache();
|
||||
var_dump($a['a.php']->isWritable());
|
||||
var_dump($a['a.php']->isReadable());
|
||||
?>
|
||||
archive
|
||||
<?php
|
||||
ini_set('phar.readonly',0);
|
||||
clearstatcache();
|
||||
var_dump($a->isWritable());
|
||||
var_dump($b->isWritable());
|
||||
ini_set('phar.readonly',1);
|
||||
clearstatcache();
|
||||
var_dump($a->isWritable());
|
||||
var_dump($b->isWritable());
|
||||
chmod($fname2, 000);
|
||||
clearstatcache();
|
||||
var_dump($a->isWritable());
|
||||
var_dump($b->isWritable());
|
||||
?>
|
||||
===DONE===
|
||||
--CLEAN--
|
||||
<?php
|
||||
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.phar.php');
|
||||
unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.tar');
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
||||
@ -50,4 +70,11 @@ bool(false)
|
||||
bool(true)
|
||||
bool(true)
|
||||
bool(true)
|
||||
archive
|
||||
bool(true)
|
||||
bool(true)
|
||||
bool(false)
|
||||
bool(true)
|
||||
bool(false)
|
||||
bool(false)
|
||||
===DONE===
|
||||
|
Loading…
Reference in New Issue
Block a user