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===


Reply via email to