cellog Thu Apr 10 03:32:09 2008 UTC
Modified files:
/pecl/phar phar_object.c
/pecl/phar/tests phar_oo_iswriteable.phpt
Log:
add Phar->isWritable() for detecting whether a phar archive can be written to
based on phar.readonly combined with actual file permissions
[DOC]
http://cvs.php.net/viewvc.cgi/pecl/phar/phar_object.c?r1=1.196&r2=1.197&diff_format=u
Index: pecl/phar/phar_object.c
diff -u pecl/phar/phar_object.c:1.196 pecl/phar/phar_object.c:1.197
--- pecl/phar/phar_object.c:1.196 Wed Apr 9 19:23:30 2008
+++ pecl/phar/phar_object.c Thu Apr 10 03:32:09 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: phar_object.c,v 1.196 2008/04/09 19:23:30 cellog Exp $ */
+/* $Id: phar_object.c,v 1.197 2008/04/10 03:32:09 cellog Exp $ */
#include "phar_internal.h"
#include "func_interceptors.h"
@@ -2094,6 +2094,28 @@
}
/* }}} */
+/* {{{ 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 @@
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)
http://cvs.php.net/viewvc.cgi/pecl/phar/tests/phar_oo_iswriteable.phpt?r1=1.1&r2=1.2&diff_format=u
Index: pecl/phar/tests/phar_oo_iswriteable.phpt
diff -u pecl/phar/tests/phar_oo_iswriteable.phpt:1.1
pecl/phar/tests/phar_oo_iswriteable.phpt:1.2
--- pecl/phar/tests/phar_oo_iswriteable.phpt:1.1 Thu Apr 10 03:12:07 2008
+++ pecl/phar/tests/phar_oo_iswriteable.phpt Thu Apr 10 03:32:09 2008
@@ -8,6 +8,7 @@
--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 @@
$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 @@
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(true)
bool(true)
bool(true)
+archive
+bool(true)
+bool(true)
+bool(false)
+bool(true)
+bool(false)
+bool(false)
===DONE===