]> granicus.if.org Git - php/commitdiff
complete set of new tests for zip-based phars (need to test compression for zip-based...
authorGreg Beaver <cellog@php.net>
Tue, 8 Jan 2008 07:08:46 +0000 (07:08 +0000)
committerGreg Beaver <cellog@php.net>
Tue, 8 Jan 2008 07:08:46 +0000 (07:08 +0000)
fix a whole bunch of zip-related bugs
tar tests need some naming
add phar information to error messages, fix existing tests to reflect this

90 files changed:
ext/phar/phar.c
ext/phar/phar_object.c
ext/phar/tar.c
ext/phar/tests/033a.phpt
ext/phar/tests/create_path_error.phpt
ext/phar/tests/tar/033a.phpt
ext/phar/tests/tar/open_for_write_newfile.phpt
ext/phar/tests/tar/phar_buildfromiterator5.phpt
ext/phar/tests/tar/phar_buildfromiterator6.phpt
ext/phar/tests/tar/phar_buildfromiterator7.phpt
ext/phar/tests/tar/phar_buildfromiterator9.phpt
ext/phar/tests/tar/phar_stub_error.phpt
ext/phar/tests/tar/rename.phpt
ext/phar/tests/zip/033.phpt [new file with mode: 0644]
ext/phar/tests/zip/033a.phpt [new file with mode: 0644]
ext/phar/tests/zip/create_new_and_modify.phpt [new file with mode: 0644]
ext/phar/tests/zip/create_new_phar_b.phpt [new file with mode: 0644]
ext/phar/tests/zip/delete.phpt [new file with mode: 0644]
ext/phar/tests/zip/delete_in_phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/delete_in_phar_b.phpt [new file with mode: 0644]
ext/phar/tests/zip/delete_in_phar_confirm.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller1.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller10.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller10.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller10.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller11.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller11.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller11.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller12.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller12.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller12.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller13.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller14.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller15.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller16.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller17.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller18.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller19.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller2.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller2.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller2.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller20.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller21.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller3.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller3.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller3.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller4.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller4.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller4.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller5.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller5.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller5.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller6.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller6.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller6.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller7.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller7.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller7.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller8.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller8.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller8.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller9.phar.inc [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller9.phar.phpt [new file with mode: 0644]
ext/phar/tests/zip/frontcontroller9.phar.zip [new file with mode: 0644]
ext/phar/tests/zip/make_invalid_tar.php.inc [new file with mode: 0644]
ext/phar/tests/zip/open_for_write_existing.phpt [new file with mode: 0644]
ext/phar/tests/zip/open_for_write_existing_b.phpt [new file with mode: 0755]
ext/phar/tests/zip/open_for_write_existing_c.phpt [new file with mode: 0755]
ext/phar/tests/zip/open_for_write_newfile.phpt [new file with mode: 0644]
ext/phar/tests/zip/open_for_write_newfile_b.phpt [new file with mode: 0755]
ext/phar/tests/zip/open_for_write_newfile_c.phpt [new file with mode: 0755]
ext/phar/tests/zip/phar_begin_setstub_commit.phpt [new file with mode: 0755]
ext/phar/tests/zip/phar_buildfromiterator4.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_buildfromiterator5.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_buildfromiterator6.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_buildfromiterator7.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_buildfromiterator8.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_buildfromiterator9.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_commitwrite.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_copy.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_magic.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_setalias.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_setalias2.phpt [new file with mode: 0644]
ext/phar/tests/zip/phar_stub_error.phpt [new file with mode: 0755]
ext/phar/tests/zip/refcount1.phpt [new file with mode: 0644]
ext/phar/tests/zip/refcount1_5_2.phpt [new file with mode: 0755]
ext/phar/tests/zip/rename.phpt [new file with mode: 0644]
ext/phar/tests/zip/tarmaker.php.inc [new file with mode: 0644]

index 0a0568f3125dbc0ae7f984823a14842186fc3b19..f828cb65b55a1301c41a2a5610b3fe36133e642e 100644 (file)
@@ -445,25 +445,16 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, in
                return NULL;
        }
        if (SUCCESS == zend_hash_find(&phar->manifest, path, path_len, (void**)&entry)) {
-#if HAVE_PHAR_ZIP
-               if (phar->is_zip) {
-                       /* construct phar_entry_info JIT */
-                       if (path[path_len - 1] == '/') {
-                               if (!dir) {
-                                       if (error) {
-                                               spprintf(error, 4096, "phar error: path \"%s\" is a directory", path);
-                                       }
-                                       return NULL;
-                               }
-               
-                               entry->is_dir = 1;
-                       }
-               }
-#endif
                if (entry->is_deleted) {
                        /* entry is deleted, but has not been flushed to disk yet */
                        return NULL;
                }
+               if (entry->is_dir && !dir) {
+                       if (error) {
+                               spprintf(error, 4096, "phar error: path \"%s\" is a directory", path);
+                       }
+                       return NULL;
+               }
                return entry;
        }
        if (dir) {
@@ -521,7 +512,7 @@ typedef struct {
 } php_stream_memory_data;
 #endif
 
-/* this is only called for non-zip-based phars */
+/* this is only called for non-zip/tar-based phars */
 static int phar_open_entry_file(phar_archive_data *phar, phar_entry_info *entry, char **error TSRMLS_DC) /* {{{ */
 {
        if (error) {
@@ -573,7 +564,7 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
        }
        if (for_write && PHAR_G(readonly)) {
                if (error) {
-                       spprintf(error, 0, "phar error: file \"%s\" cannot opened for writing, disabled by ini setting", fname);
+                       spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, disabled by ini setting", path, fname);
                }
                return FAILURE;
        }
@@ -582,7 +573,7 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
        }
        if (!path_len) {
                if (error) {
-                       spprintf(error, 0, "phar error: file \"\" cannot be empty");
+                       spprintf(error, 4096, "phar error: file \"\" in phar \"%s\" cannot be empty", fname);
                }
                return FAILURE;
        }
@@ -594,13 +585,13 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
        }
        if (entry->is_modified && !for_write) {
                if (error) {
-                       spprintf(error, 4096, "phar error: file \"%s\" cannot opened for reading, writable file pointers are open", fname);
+                       spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for reading, writable file pointers are open", path, fname);
                }
                return FAILURE;
        }
        if (entry->fp_refcount && for_write) {
                if (error) {
-                       spprintf(error, 4096, "phar error: file \"%s\" cannot opened for writing, readable file pointers are open", fname);
+                       spprintf(error, 4096, "phar error: file \"%s\" in phar \"%s\" cannot be opened for writing, readable file pointers are open", path, fname);
                }
                return FAILURE;
        }
@@ -608,19 +599,6 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
                if (!for_create) {
                        return FAILURE;
                }
-#if HAVE_PHAR_ZIP
-               if (entry->is_zip) {
-                       /* for new files, start with an empty string */
-                       struct zip_source *s = zip_source_buffer(entry->phar->zip, (void *)"", 0, 0);
-                       if (-1 == zip_replace(entry->phar->zip, entry->index, s)) {
-                               if (error) {
-                                       spprintf(error, 4096, "phar error: zip-based phar \"%s\" entry \"%s\" error \"%s\"", entry->phar->fname, fname, zip_strerror(phar->zip));
-                               }
-                               zip_error_clear(phar->zip);
-                               return FAILURE;
-                       }
-               }
-#endif
                entry->is_deleted = 0;
        }
        *ret = (phar_entry_data *) emalloc(sizeof(phar_entry_data));
@@ -656,7 +634,7 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
                                        efree(*ret);
                                        *ret = NULL;
                                        if (error) {
-                                               spprintf(error, 0, "phar error: file \"%s\" cannot opened for writing, no truncate support", fname);
+                                               spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", fname);
                                        }
                                        return FAILURE;
                                }
@@ -666,7 +644,7 @@ int phar_get_entry_data(phar_entry_data **ret, char *fname, int fname_len, char
                                efree(*ret);
                                *ret = NULL;
                                if (error) {
-                                       spprintf(error, 0, "phar error: file \"%s\" cannot opened for writing, no truncate support", fname);
+                                       spprintf(error, 0, "phar error: file \"%s\" cannot be opened for writing, no truncate support", fname);
                                }
                                return FAILURE;
                        }
@@ -802,29 +780,11 @@ phar_entry_data *phar_get_or_create_entry_data(char *fname, int fname_len, char
        etemp.phar = phar;
 #if HAVE_PHAR_ZIP
        if (phar->is_zip) {
-               int zindex;
                etemp.is_zip = 1;
                /* prevent attempts to check the CRC */
                etemp.is_crc_checked = 1;
-               /* for new files, start with an empty string */
-               struct zip_source *s = zip_source_buffer(phar->zip, (void *)"", 0, 0);
-               if (-1 == (zindex = zip_add(phar->zip, path, s))) {
-                       if (error) {
-                               spprintf(error, 4096, "phar error: zip-based phar \"%s\" entry \"%s\" error \"%s\"", path, phar->fname, zip_strerror(phar->zip));
-                       }
-                       zip_error_clear(phar->zip);
-                       return NULL;
-               }
-               etemp.index = zindex;
-               etemp.filename = (char *) zip_get_name(phar->zip, zindex, 0);
-               if (NULL == etemp.filename) {
-                       if (error) {
-                               spprintf(error, 4096, "phar error: zip-based phar \"%s\" entry \"%s\" error \"%s\"", path, phar->fname, zip_strerror(phar->zip));
-                       }
-                       zip_error_clear(phar->zip);
-                       return NULL;
-               }
-               etemp.filename = estrndup(etemp.filename, strlen(etemp.filename));
+               etemp.index = -1;
+               etemp.filename = estrndup(path, path_len);
        } else {
                etemp.is_tar = phar->is_tar;
                etemp.tar_type = '0';
@@ -833,9 +793,7 @@ phar_entry_data *phar_get_or_create_entry_data(char *fname, int fname_len, char
 #else
        etemp.filename = estrndup(path, path_len);
 #endif
-       zend_hash_add(&phar->manifest, etemp.filename, path_len, (void*)&etemp, sizeof(phar_entry_info), NULL);
-       /* retrieve the phar manifest copy */
-       entry = phar_get_entry_info(phar, path, path_len, error TSRMLS_CC);
+       zend_hash_add(&phar->manifest, etemp.filename, path_len, (void*)&etemp, sizeof(phar_entry_info), (void **) &entry);
        
        if (!entry) {
                return NULL;
@@ -1048,7 +1006,7 @@ int phar_open_zipfile(char *fname, int fname_len, char *alias, int alias_len, ph
        phar_unixify_path_separators(mydata->fname, fname_len);
 #endif
        mydata->fname_len = fname_len;
-       if (-1 != (phar_alias_index = zip_name_locate(zip, "./phar/alias.txt", 0))) {
+       if (-1 != (phar_alias_index = zip_name_locate(zip, ".phar/alias.txt", 0))) {
                struct zip_file *zf = zip_fopen_index(zip, phar_alias_index, 0);
                int tmp_len;
 
@@ -1108,7 +1066,7 @@ int phar_open_zipfile(char *fname, int fname_len, char *alias, int alias_len, ph
                                entry.uncompressed_filesize = zs.size;
                                entry.crc32 = zs.crc;
                                entry.timestamp = (php_uint32) zs.mtime;
-                               entry.flags = 0;
+                               entry.flags = PHAR_ENT_PERM_DEF_FILE;
                                switch (zs.comp_method) {
                                        case ZIP_CM_DEFLATE :
                                                /* if we have zip, we have zlib decompression */
@@ -1145,7 +1103,7 @@ int phar_open_zipfile(char *fname, int fname_len, char *alias, int alias_len, ph
                                                        mydata->manifest.arBuckets = NULL;
                                                        efree(mydata);
                                                        if (error) {
-                                                               spprintf(error, 0, "bz2 extension is required for gz compressed zip-based .phar file \"%s\"", fname);
+                                                               spprintf(error, 0, "bz2 extension is required for Bzip2 compressed zip-based .phar file \"%s\"", fname);
                                                        }
                                                        return FAILURE;
                                                }
@@ -1156,6 +1114,13 @@ int phar_open_zipfile(char *fname, int fname_len, char *alias, int alias_len, ph
                        }
                        entry.index = i;
                        entry.filename_len = strlen(name);
+                       if (name[entry.filename_len - 1] == '/') {
+                               entry.is_dir = 1;
+                               entry.filename_len--;
+                               entry.flags |= PHAR_ENT_PERM_DEF_DIR;
+                       } else {
+                               entry.is_dir = 0;
+                       }
                        entry.filename = estrndup(name, entry.filename_len);
                        /* get file metadata */
                        metadata = (char *) zip_get_file_comment(zip, i, &metadata_len, 0);
@@ -1170,7 +1135,7 @@ int phar_open_zipfile(char *fname, int fname_len, char *alias, int alias_len, ph
                        } else {
                                entry.metadata = NULL;
                        }
-                       zend_hash_add(&mydata->manifest, name, strlen(name), (void *)&entry,sizeof(phar_entry_info), NULL);
+                       zend_hash_add(&mydata->manifest, name, entry.filename_len, (void *)&entry,sizeof(phar_entry_info), NULL);
                } 
        }
        /* ignore all errors in loading up manifest */
@@ -1666,17 +1631,19 @@ int phar_open_or_create_zip(char *fname, int fname_len, char *alias, int alias_l
 {
 #if HAVE_PHAR_ZIP
        phar_archive_data *phar;
-       int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, pphar, error TSRMLS_CC);
+       int ret = phar_create_or_parse_filename(fname, fname_len, alias, alias_len, options, &phar, error TSRMLS_CC);
        int register_alias;
 
+       if (pphar) {
+               *pphar = phar;
+       }
        if (FAILURE == ret) {
                return FAILURE;
        }
-       if ((*pphar)->is_zip) {
+       if (phar->is_zip) {
                return ret;
        }
 
-       phar = *pphar;
        if (phar->is_brandnew) {
                int *errorp;
                phar->is_zip = 1;
@@ -1766,7 +1733,6 @@ int phar_open_or_create_filename(char *fname, int fname_len, char *alias, int al
 int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int alias_len, int options, phar_archive_data** pphar, char **error TSRMLS_DC) /* {{{ */
 {
        phar_archive_data *mydata;
-       char *my_realpath;
        int register_alias;
        php_stream *fp;
 
@@ -1809,31 +1775,30 @@ int phar_create_or_parse_filename(char *fname, int fname_len, char *alias, int a
                }
                return FAILURE;
        }
-       /* re-open for writing */
-       fp = php_stream_open_wrapper(fname, "r+b", IGNORE_URL|STREAM_MUST_SEEK|0, NULL);
 
        /* set up our manifest */
        mydata = ecalloc(sizeof(phar_archive_data), 1);
-       if (pphar) {
-               *pphar = mydata;
-       }
-       zend_hash_init(&mydata->manifest, sizeof(phar_entry_info),
-               zend_get_hash_value, destroy_phar_manifest, 0);
-       my_realpath = NULL;
-       my_realpath = expand_filepath(fname, my_realpath TSRMLS_CC);
-       if (my_realpath) {
-               fname_len = strlen(my_realpath);
+
+       /* re-open for writing */
+       fp = php_stream_open_wrapper(fname, "r+b", IGNORE_URL|STREAM_MUST_SEEK|0, &mydata->fname);
+       if (mydata->fname) {
+               fname = mydata->fname;
 #ifdef PHP_WIN32
-               phar_unixify_path_separators(my_realpath, fname_len);
+               phar_unixify_path_separators(fname, fname_len);
 #endif
-               fname = my_realpath;
-               mydata->fname = my_realpath;
+               fname_len = strlen(mydata->fname);
        } else {
                mydata->fname = estrndup(fname, fname_len);
 #ifdef PHP_WIN32
                phar_unixify_path_separators(mydata->fname, fname_len);
 #endif
        }
+       
+       if (pphar) {
+               *pphar = mydata;
+       }
+       zend_hash_init(&mydata->manifest, sizeof(phar_entry_info),
+               zend_get_hash_value, destroy_phar_manifest, 0);
        mydata->fname_len = fname_len;
        mydata->alias = alias ? estrndup(alias, alias_len) : estrndup(mydata->fname, fname_len);
        mydata->alias_len = alias ? alias_len : fname_len;
@@ -2517,6 +2482,7 @@ phar_entry_info * phar_open_jit(phar_archive_data *phar, phar_entry_info *entry,
                                        }
                                } while (got == 8192);
                                zip_fclose(entry->zip);
+                               entry->zip = NULL;
                                php_stream_seek(fp, 0, SEEK_SET);
 
                                /* now use a decompression filter to inflate into our temp file */
@@ -2783,8 +2749,7 @@ static php_stream * phar_wrapper_open_url(php_stream_wrapper *wrapper, char *pat
                return NULL;
        }
 
-       idata->internal_file = phar_open_jit(idata->phar, idata->internal_file, fp, &error, idata->for_write TSRMLS_CC);
-       if (!idata->internal_file) {
+       if (!phar_open_jit(idata->phar, idata->internal_file, fp, &error, idata->for_write TSRMLS_CC)) {
                php_stream_wrapper_log_error(wrapper, options TSRMLS_CC, error);
                efree(error);
                phar_entry_delref(idata TSRMLS_CC);
@@ -3074,6 +3039,12 @@ static ssize_t phar_zip_source(void *state, void *data, size_t len, enum zip_sou
                        sb->mtime = time(NULL);
                        sb->size = entry->uncompressed_filesize;
                        return sizeof(struct zip_stat);
+               case ZIP_SOURCE_FREE:
+                       entry->is_modified = 0;
+                       if (entry->fp && entry->fp_refcount == 0) {
+                               php_stream_close(entry->fp);
+                               entry->fp = NULL;
+                       }
                default:
                        return len;
        }
@@ -3092,7 +3063,15 @@ static int phar_zip_reconstruct_apply(void *data TSRMLS_DC) /* {{{ */
                        return ZEND_HASH_APPLY_KEEP;
                }
        }
-       entry->index = zip_name_locate(entry->phar->zip, entry->filename, 0);
+       if (entry->is_dir) {
+               char *myname = estrndup(entry->filename, entry->filename_len+2);
+               myname[entry->filename_len] = '/';
+               myname[entry->filename_len+1] = '\0';
+               entry->index = zip_name_locate(entry->phar->zip, entry->filename, ZIP_FL_UNCHANGED);
+               efree(myname);
+       } else {
+               entry->index = zip_name_locate(entry->phar->zip, entry->filename, ZIP_FL_UNCHANGED);
+       }
        return ZEND_HASH_APPLY_KEEP;
 }
 
@@ -3112,11 +3091,18 @@ static int phar_zip_changed_apply(void *data TSRMLS_DC) /* {{{ */
        if (entry->is_modified) {
                ssize_t (*cb)(void *state, void *data, size_t len, enum zip_source_cmd cmd) = phar_zip_source;
                if (entry->fp) {
+                       php_stream *fp = entry->fp;
                        struct zip_source *s = zip_source_function(entry->phar->zip, cb, entry);
-                       if (-1 == zip_replace(entry->phar->zip, entry->index, s)) {
+
+                       /* we have to prevent free of this fp by mistake */
+                       entry->fp = NULL;
+                       if (-1 == (entry->index = _zip_replace(entry->phar->zip, entry->index, (const char *) entry->filename, s))) {
                                zip_error_clear(entry->phar->zip);
                                return ZEND_HASH_APPLY_REMOVE;
                        }
+                       /* now restore fp and is_modified */
+                       entry->fp = fp;
+                       entry->is_modified = 1;
                }
 
                /* set file metadata */
@@ -3151,15 +3137,14 @@ int phar_zip_flush(phar_archive_data *archive, char *user_stub, long len, char *
        php_serialize_data_t metadata_hash;
        int free_user_stub;
        int phar_stub_index, phar_alias_index;
+       phar_entry_info entry = {0};
 
-       /* save modified files to the zip */
-       zend_hash_apply(&archive->manifest, phar_zip_changed_apply TSRMLS_CC);
-       if (archive->zip->error.str) {
-               if (error) {
-                       spprintf(error, 4096, "phar zip flush of \"%s\" failed: %s", archive->fname, zip_strerror(archive->zip));
-               }
-               return EOF;
-       }
+       entry.flags = PHAR_ENT_PERM_DEF_FILE;
+       entry.timestamp = time(NULL);
+       entry.is_modified = 1;
+       entry.is_crc_checked = 1;
+       entry.is_zip = 1;
+       entry.phar = archive;
 
        /* set phar metadata */
        main_metadata_str.c = 0;
@@ -3175,28 +3160,40 @@ int phar_zip_flush(phar_archive_data *archive, char *user_stub, long len, char *
 
        /* set alias */
        if (archive->is_explicit_alias) {
-               struct zip_source *source;
                phar_alias_index = zip_name_locate(archive->zip, ".phar/alias.txt", 0);
-               if (NULL == (source = zip_source_buffer(archive->zip, archive->alias, archive->alias_len, 0)) ||
-                               (-1 == phar_alias_index && -1 == zip_add(archive->zip, ".phar/alias.txt", source)) ||
-                                (-1 != phar_alias_index && -1 == zip_replace(archive->zip, phar_alias_index, source))) {
+               entry.fp = php_stream_fopen_tmpfile();
+               if (archive->alias_len != php_stream_write(entry.fp, archive->alias, archive->alias_len)) {
                        if (error) {
-                               spprintf(error, 0, "unable to set alias in new zip-based phar \"%s\": %s", archive->fname, zip_strerror(archive->zip));
+                               spprintf(error, 0, "unable to set alias in new zip-based phar \"%s\"", archive->fname);
+                       }
+                       return EOF;
+               }
+               entry.uncompressed_filesize = sizeof(newstub) - 1;
+               entry.filename = estrndup(".phar/alias.txt", sizeof(".phar/alias.txt")-1);
+               entry.filename_len = sizeof(".phar/alias.txt")-1;
+               entry.is_modified = 1;
+               entry.index = phar_alias_index;
+               if (SUCCESS != zend_hash_update(&archive->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL)) {
+                       if (error) {
+                               spprintf(error, 0, "unable to set alias in new zip-based phar \"%s\"", archive->fname);
                        }
-                       zip_error_clear(archive->zip);
                        return EOF;
                }
        }
+       /* register alias */
+       if (archive->alias_len) {
+               phar_get_archive(&archive, archive->fname, archive->fname_len, archive->alias, archive->alias_len, NULL TSRMLS_CC);
+       }
+
        /* set stub */
        phar_stub_index = zip_name_locate(archive->zip, ".phar/stub.php", 0);
        zip_error_clear(archive->zip);
        if (user_stub) {
-               struct zip_source *source;
                if (len < 0) {
                        /* resource passed in */
                        if (!(php_stream_from_zval_no_verify(stubfile, (zval **)user_stub))) {
                                if (error) {
-                                       spprintf(error, 0, "unable to access resource to copy stub to new phar \"%s\"", archive->fname);
+                                       spprintf(error, 0, "unable to access resource to copy stub to new zip-based phar \"%s\"", archive->fname);
                                }
                                return EOF;
                        }
@@ -3208,7 +3205,7 @@ int phar_zip_flush(phar_archive_data *archive, char *user_stub, long len, char *
                        user_stub = 0;
                        if (!(len = php_stream_copy_to_mem(stubfile, &user_stub, len, 0)) || !user_stub) {
                                if (error) {
-                                       spprintf(error, 0, "unable to read resource to copy stub to new phar \"%s\"", archive->fname);
+                                       spprintf(error, 0, "unable to read resource to copy stub to new zip-based phar \"%s\"", archive->fname);
                                }
                                return EOF;
                        }
@@ -3219,7 +3216,7 @@ int phar_zip_flush(phar_archive_data *archive, char *user_stub, long len, char *
                if ((pos = strstr(user_stub, "__HALT_COMPILER();")) == NULL)
                {
                        if (error) {
-                               spprintf(error, 0, "illegal stub for phar \"%s\"", archive->fname);
+                               spprintf(error, 0, "illegal stub for zip-based phar \"%s\"", archive->fname);
                        }
                        if (free_user_stub) {
                                efree(user_stub);
@@ -3227,35 +3224,71 @@ int phar_zip_flush(phar_archive_data *archive, char *user_stub, long len, char *
                        return EOF;
                }
                len = pos - user_stub + 18;
-               if (NULL == (source = zip_source_buffer(archive->zip, user_stub, len, 0)) ||
-                               (-1 == phar_stub_index && -1 == zip_add(archive->zip, ".phar/stub.php", source)) ||
-                               (-1 != phar_stub_index && -1 == zip_replace(archive->zip, phar_stub_index, source))) {
+               entry.fp = php_stream_fopen_tmpfile();
+               entry.uncompressed_filesize = len + 5;
+
+               if ((size_t)len != php_stream_write(entry.fp, user_stub, len)
+               ||            5 != php_stream_write(entry.fp, " ?>\r\n", 5)) {
                        if (error) {
-                               spprintf(error, 0, "unable to create stub from string in new zip-based phar \"%s\": %s", archive->fname, zip_strerror(archive->zip));
+                               spprintf(error, 0, "unable to create stub from string in new zip-based phar \"%s\"", archive->fname);
                        }
                        if (free_user_stub) {
                                efree(user_stub);
                        }
-                       zip_error_clear(archive->zip);
+                       php_stream_close(entry.fp);
+                       return EOF;
+               }
+               entry.filename = estrndup(".phar/stub.php", sizeof(".phar/stub.php")-1);
+               entry.filename_len = sizeof(".phar/stub.php")-1;
+               entry.is_modified = 1;
+               entry.index = phar_stub_index;
+               if (SUCCESS != zend_hash_update(&archive->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL)) {
+                       if (free_user_stub) {
+                               efree(user_stub);
+                       }
+                       if (error) {
+                               spprintf(error, 0, "unable to set stub in zip-based phar \"%s\"", archive->fname);
+                       }
                        return EOF;
                }
                if (free_user_stub) {
                        efree(user_stub);
                }
        } else {
-               if (-1 != phar_stub_index) {
-                       struct zip_source *source;
+               if (-1 == phar_stub_index) {
                        /* this is a brand new phar, add the stub */
-                       if (NULL == (source = zip_source_buffer(archive->zip, newstub, sizeof(newstub) - 1, 0)) || -1 == zip_add(archive->zip, ".phar/stub.php", source)) {
+                       entry.fp = php_stream_fopen_tmpfile();
+                       if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) {
+                               if (error) {
+                                       spprintf(error, 0, "unable to create stub in new zip-based phar \"%s\"", archive->fname);
+                               }
+                               return EOF;
+                       }
+                       entry.uncompressed_filesize = sizeof(newstub) - 1;
+                       entry.filename = estrndup(".phar/stub.php", sizeof(".phar/stub.php")-1);
+                       entry.filename_len = sizeof(".phar/stub.php")-1;
+                       entry.is_modified = 1;
+                       entry.index = -1;
+                       if (SUCCESS != zend_hash_add(&archive->manifest, entry.filename, entry.filename_len, (void*)&entry, sizeof(phar_entry_info), NULL)) {
+                               php_stream_close(entry.fp);
+                               efree(entry.filename);
                                if (error) {
                                        spprintf(error, 0, "unable to create stub in new zip-based phar \"%s\": %s", archive->fname, zip_strerror(archive->zip));
                                }
-                               zip_error_clear(archive->zip);
                                return EOF;
                        }
                }
        }
 
+       /* save modified files to the zip */
+       zend_hash_apply(&archive->manifest, phar_zip_changed_apply TSRMLS_CC);
+       if (archive->zip->error.str) {
+               if (error) {
+                       spprintf(error, 4096, "phar zip flush of \"%s\" failed: %s", archive->fname, zip_strerror(archive->zip));
+               }
+               return EOF;
+       }
+
        /* save zip */
        if (-1 == zip_close(archive->zip)) {
                if (error) {
@@ -3953,7 +3986,7 @@ static int phar_stream_flush(php_stream *stream TSRMLS_DC) /* {{{ */
        char *error;
        int ret;
        if (stream->mode[0] == 'w' || (stream->mode[0] == 'r' && stream->mode[1] == '+')) {
-               ret = phar_flush(((phar_entry_data *)stream->abstract)->internal_file->phar, 0, 0, &error TSRMLS_CC);
+               ret = phar_flush(((phar_entry_data *)stream->abstract)->phar, 0, 0, &error TSRMLS_CC);
                if (error) {
                        php_stream_wrapper_log_error(stream->wrapper, REPORT_ERRORS TSRMLS_CC, error);
                        efree(error);
@@ -4506,7 +4539,7 @@ static int phar_wrapper_rename(php_stream_wrapper *wrapper, char *url_from, char
                entry->fp = NULL;
                entry->metadata = 0;
                entry->link = NULL;
-#if HAVE_ZIP
+#if HAVE_PHAR_ZIP
                entry->zip = NULL;
 #endif
 
@@ -4677,7 +4710,7 @@ static zend_op_array *phar_compile_file(zend_file_handle *file_handle, int type
 
        fname = zend_get_executed_filename(TSRMLS_C);
        fname_len = strlen(fname);
-       if (strstr(file_handle->filename, ".phar") && !strstr(file_handle->filename, ":\\")) {
+       if (strstr(file_handle->filename, ".phar") && !strstr(file_handle->filename, "://")) {
                if (SUCCESS == phar_open_filename(file_handle->filename, strlen(file_handle->filename), NULL, 0, 0, &phar, NULL TSRMLS_CC)) {
                        if (phar->is_zip || phar->is_tar) {
                                zend_file_handle f = *file_handle;
index 7e9229130c101348dbdc3854e220fbba00dc6129..df3d25024e3f30181610c90767cf9c0f8955c148 100755 (executable)
@@ -1763,12 +1763,15 @@ PHP_METHOD(Phar, copy)
                /* new file */
                newentry.fp = php_stream_temp_new();
                fp = newentry.fp;
-               php_stream_seek(fp, 0, SEEK_SET);
-               if (oldentry->compressed_filesize != php_stream_copy_to_stream(oldentry->fp, fp, oldentry->compressed_filesize)) {
+               php_stream_seek(oldentry->fp, 0, SEEK_SET);
+               if (oldentry->uncompressed_filesize != php_stream_copy_to_stream(oldentry->fp, fp, oldentry->uncompressed_filesize)) {
                        php_stream_close(fp);
                        zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
                                "file \"%s\" could not be copied to file \"%s\" in %s, copy failed", oldfile, newfile, phar_obj->arc.archive->fname);
+                       return;
                }
+       } else {
+               newentry.fp = NULL;
        }
 
        memcpy((void *) &newentry, oldentry, sizeof(phar_entry_info));
@@ -1779,15 +1782,41 @@ PHP_METHOD(Phar, copy)
        }
 #if HAVE_PHAR_ZIP
        if (oldentry->is_zip) {
-               newentry.index = -1;
+               int zindex;
+               /* for new files, start with an empty string */
+               struct zip_source *s;
+               if (!newentry.fp) {
+                       if (!phar_open_jit(phar_obj->arc.archive, oldentry, NULL, &error, 0 TSRMLS_CC)) {
+                               php_stream_close(fp);
+                               if (error) {
+                                       zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
+                                               "file \"%s\" could not be copied to file \"%s\" in %s, open of source file failed: %s", oldfile, newfile, phar_obj->arc.archive->fname, error);
+                                       efree(error);
+                               } else {
+                                       zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
+                                               "file \"%s\" could not be copied to file \"%s\" in %s, open of source file failed", oldfile, newfile, phar_obj->arc.archive->fname);
+                               }
+                               return;
+                       }
+                       fp = oldentry->fp;
+                       oldentry->fp = NULL;
+               }
+               s = zip_source_buffer(phar_obj->arc.archive->zip, (void *)"", 0, 0);
+               if (-1 == (zindex = zip_add(phar_obj->arc.archive->zip, newfile, s))) {
+                       zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC,
+                               "file \"%s\" could not be copied to file \"%s\" in %s, creation of destination file failed: %s", oldfile, newfile, phar_obj->arc.archive->fname, zip_strerror(phar_obj->arc.archive->zip));
+                       zip_error_clear(phar_obj->arc.archive->zip);
+                       return;
+               }
+               newentry.index = zindex;
+               newentry.zip = NULL;
        }
 #endif
        newentry.fp = fp;
        newentry.filename = estrndup(newfile, newfile_len);
        newentry.filename_len = newfile_len;
-       if (oldentry->is_tar) {
-               newentry.tar_type = oldentry->tar_type;
-       }
+       newentry.is_modified = 1;
+       newentry.fp_refcount = 0;
        phar_obj->arc.archive->is_modified = 1;
        zend_hash_add(&phar_obj->arc.archive->manifest, newfile, newfile_len, (void*)&newentry, sizeof(phar_entry_info), NULL);
 
@@ -1842,7 +1871,7 @@ PHP_METHOD(Phar, offsetGet)
                return;
        }
        
-       if (!phar_get_entry_info(phar_obj->arc.archive, fname, fname_len, &error TSRMLS_CC)) {
+       if (!phar_get_entry_info_dir(phar_obj->arc.archive, fname, fname_len, 1, &error TSRMLS_CC)) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Entry %s does not exist%s%s", fname, error?", ":"", error?error:"");
        } else {
                fname_len = spprintf(&fname, 0, "phar://%s/%s", phar_obj->arc.archive->fname, fname);
@@ -2332,10 +2361,18 @@ PHP_METHOD(PharFileInfo, chmod)
        if (entry_obj->ent.entry->is_dir && (!entry_obj->ent.entry->is_tar && !entry_obj->ent.entry->is_zip)) {
                zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, \
                        "Phar entry is a directory, cannot chmod"); \
+               return;
        }
        if (PHAR_G(readonly)) {
-               zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Cannot modify permissions for file \"%s\" write operations are prohibited", entry_obj->ent.entry->filename, entry_obj->ent.entry->phar->fname);
+               zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Cannot modify permissions for file \"%s\" in phar \"%s\", write operations are prohibited", entry_obj->ent.entry->filename, entry_obj->ent.entry->phar->fname);
+               return;
        }
+#if HAVE_ZIP
+       if (entry_obj->ent.entry->is_zip) {
+               zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Cannot modify permissions for file \"%s\" in phar \"%s\", not supported for zip-based phars", entry_obj->ent.entry->filename, entry_obj->ent.entry->phar->fname);
+               return;
+       }
+#endif
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &perms) == FAILURE) {
                return;
        }       
index 3a5b6cbf971a9a771728690c510e660d689fe173..23ba450c41cdfd038e196db3fd585ae4e3bb8e1e 100644 (file)
@@ -156,7 +156,7 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i
        size_t pos = 0, read;
        tar_header *hdr;
        php_uint32 sum1, sum2, size, old;
-       phar_archive_data *myphar, **retdata;
+       phar_archive_data *myphar;
 
        if (error) {
                *error = NULL;
@@ -235,6 +235,8 @@ int phar_open_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, i
                }
                if (entry.tar_type == TAR_DIR) {
                        entry.is_dir = 1;
+               } else {
+                       entry.is_dir = 0;
                }
 
                entry.link = NULL;
@@ -491,12 +493,12 @@ int phar_tar_flush(phar_archive_data *archive, char *user_stub, long len, char *
                        efree(user_stub);
                }
        } else {
-               if (archive->is_brandnew) {
+               if (!zend_hash_exists(&archive->manifest, ".phar/stub.php", sizeof(".phar/stub.php")-1)) {
                        /* this is a brand new phar */
                        entry.fp = php_stream_fopen_tmpfile();
                        if (sizeof(newstub)-1 != php_stream_write(entry.fp, newstub, sizeof(newstub)-1)) {
                                if (error) {
-                                       spprintf(error, 0, "unable to create stub in new phar \"%s\"", archive->fname);
+                                       spprintf(error, 0, "unable to create stub in new tar-based phar \"%s\"", archive->fname);
                                }
                                return EOF;
                        }
index 1df67f5a16b6fc6d66852fe027683d4213bd94cb..6fbc0db365aaf0ce9ea8a36c38a71f9bd617fb6d 100644 (file)
@@ -32,5 +32,5 @@ unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.phar.php
 ?>
 --EXPECTF--
 bool(false)
-Cannot modify permissions for file "a.php" write operations are prohibited
+Cannot modify permissions for file "a.php" in phar "%s033a.1.phar.php", write operations are prohibited
 ===DONE===
index 1ba89d759b384e42afa663aa6731ae77a7c4da7a..d3fc03586065fb1aebeffa6d7ac2f7618c6eea4e 100755 (executable)
@@ -54,9 +54,9 @@ foreach($checks as $check)
 --EXPECTF--
 string(5) "query"
 string(5) "query"
-Error: file_put_contents(phar://%s//): failed to open stream: phar error: file "" cannot be empty
-Error: file_put_contents(phar://%s/.): failed to open stream: phar error: file "" cannot be empty
-Error: file_put_contents(phar://%s/../): failed to open stream: phar error: file "" cannot be empty
-Error: file_put_contents(phar://%s/a/..): failed to open stream: phar error: file "" cannot be empty
+Error: file_put_contents(phar://%s//): failed to open stream: phar error: file "" in phar "%s" cannot be empty
+Error: file_put_contents(phar://%s/.): failed to open stream: phar error: file "" in phar "%s" cannot be empty
+Error: file_put_contents(phar://%s/../): failed to open stream: phar error: file "" in phar "%s" cannot be empty
+Error: file_put_contents(phar://%s/a/..): failed to open stream: phar error: file "" in phar "%s" cannot be empty
 Exception: Entry a does not exist and cannot be created: phar error: invalid path "a" contains illegal character
 ===DONE===
index 69bf684bbf6cd6e13ede93fb71886322e2db16fa..469dbfb94c47e560c3f7b429e429fcf130cb2dbb 100644 (file)
@@ -42,5 +42,5 @@ unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.phar.php
 ?>
 --EXPECTF--
 bool(false)
-Cannot modify permissions for file "a.php" write operations are prohibited
+Cannot modify permissions for file "a.php" in phar "%s033a.1.phar.php", write operations are prohibited
 ===DONE===
index dafbab8ac7c04d06661a3508dfba1397d700c21c..904f245b058e708349b254eaf3cdbf916142bbc7 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Phar: fopen a .phar for writing (new file)
+Phar: fopen a .phar for writing (new file) tar-based
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
index 3bd2cec78c1b201f556da3c16fd3b728688dfa3d..600bd2ee5c67adb70d39d9cfacc574b46a433c6c 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Phar::buildFromIterator() iterator, iterator returns non-string
+Phar::buildFromIterator() iterator, iterator returns non-string tar-based
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
@@ -37,7 +37,7 @@ class myIterator implements Iterator
 }
 try {
        chdir(dirname(__FILE__));
-       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar');
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.tar');
        var_dump($phar->buildFromIterator(new myIterator(array('a' => new stdClass))));
 } catch (Exception $e) {
        var_dump(get_class($e));
@@ -47,7 +47,7 @@ try {
 ===DONE===
 --CLEAN--
 <?php 
-unlink(dirname(__FILE__) . '/buildfromiterator.phar');
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.tar');
 __HALT_COMPILER();
 ?>
 --EXPECTF--
index ae73bbd4794390dc51028a4cbdf8a12e0eb7f863..e891a5d065af5c3f2f226a3cf78f4771e84f6f65 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Phar::buildFromIterator() iterator, key is int
+Phar::buildFromIterator() iterator, key is int tar-based
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
@@ -37,7 +37,7 @@ class myIterator implements Iterator
 }
 try {
        chdir(dirname(__FILE__));
-       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar');
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.tar');
        var_dump($phar->buildFromIterator(new myIterator(array(basename(__FILE__, 'php') . 'phpt'))));
 } catch (Exception $e) {
        var_dump(get_class($e));
@@ -47,7 +47,7 @@ try {
 ===DONE===
 --CLEAN--
 <?php 
-unlink(dirname(__FILE__) . '/buildfromiterator.phar');
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.tar');
 __HALT_COMPILER();
 ?>
 --EXPECTF--
index 38d2e1a5f23c7f09dad0efadf785cc80fe005abd..d64c032d714f202782f0337825fb3ac20d313164 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Phar::buildFromIterator() iterator, file can't be opened
+Phar::buildFromIterator() iterator, file can't be opened tar-based
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
@@ -37,7 +37,7 @@ class myIterator implements Iterator
 }
 try {
        chdir(dirname(__FILE__));
-       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar');
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.tar');
        var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . '/oopsie/there.phpt'))));
 } catch (Exception $e) {
        var_dump(get_class($e));
@@ -47,7 +47,7 @@ try {
 ===DONE===
 --CLEAN--
 <?php 
-unlink(dirname(__FILE__) . '/buildfromiterator.phar');
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.tar');
 __HALT_COMPILER();
 ?>
 --EXPECT--
index 0b5630754567722c81f8adc8a36781e4c777cb97..f9deef4d9fd01dd70df6f4405b7b524c3cb18e84 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Phar::buildFromIterator() iterator, 1 file resource passed in
+Phar::buildFromIterator() iterator, 1 file resource passed in tar-based
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
@@ -37,7 +37,7 @@ class myIterator implements Iterator
 }
 try {
        chdir(dirname(__FILE__));
-       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar');
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.tar');
        var_dump($phar->buildFromIterator(new myIterator(array('a' => $a = fopen(basename(__FILE__, 'php') . 'phpt', 'r')))));
        fclose($a);
 } catch (Exception $e) {
@@ -48,7 +48,7 @@ try {
 ===DONE===
 --CLEAN--
 <?php 
-unlink(dirname(__FILE__) . '/buildfromiterator.phar');
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.tar');
 __HALT_COMPILER();
 ?>
 --EXPECTF--
index c4cee768e8b379163521137b0b3c4011fb640c42..0c4de9657a3cfa369c1ecda4f4e5f49bb3a14791 100755 (executable)
@@ -1,5 +1,5 @@
 --TEST--
-Phar::setStub()/getStub()
+Phar::setStub()/getStub() tar-based
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
index ed410a863a34f6e6f57c33554d9efb31741ed151..e3e3dfa984bbee0b6f08dc7cac12aaa5f55efae2 100644 (file)
@@ -1,5 +1,5 @@
 --TEST--
-Phar: rename test
+Phar: rename test tar-based
 --SKIPIF--
 <?php if (!extension_loaded("phar")) die("skip"); ?>
 --INI--
diff --git a/ext/phar/tests/zip/033.phpt b/ext/phar/tests/zip/033.phpt
new file mode 100644 (file)
index 0000000..3d0e584
--- /dev/null
@@ -0,0 +1,48 @@
+--TEST--
+Phar::chmod zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.1.phar.php';
+$pname = 'phar://hio';
+
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('a.php', '<?php echo "This is a\n"; include "'.$pname.'/b.php"; ?>');
+$a->addFile('.phar/alias.txt', 'hio');
+$a->mkDir('test');
+$a->close();
+
+try {
+       $a = new Phar($fname);
+       var_dump($a['a.php']->isExecutable());
+       $a['a.php']->chmod(0777);
+       var_dump($a['a.php']->isExecutable());
+       $a['a.php']->chmod(0666);
+       var_dump($a['a.php']->isExecutable());
+       echo "test dir\n";
+       var_dump($a['test']->isDir());
+       var_dump($a['test']->isReadable());
+       $a['test']->chmod(0000);
+       var_dump($a['test']->isReadable());
+       $a['test']->chmod(0666);
+       var_dump($a['test']->isReadable());
+} catch (Exception $e) {
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.phar.php');
+?>
+--EXPECTF--
+bool(false)
+Cannot modify permissions for file "a.php" in phar "%s033.1.phar.php", not supported for zip-based phars
+===DONE===
diff --git a/ext/phar/tests/zip/033a.phpt b/ext/phar/tests/zip/033a.phpt
new file mode 100644 (file)
index 0000000..77f1925
--- /dev/null
@@ -0,0 +1,47 @@
+--TEST--
+Phar::chmod zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=1
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.1.phar.php';
+$pname = 'phar://hio';
+
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('a.php', '<?php echo "This is a\n"; include "'.$pname.'/b.php"; ?>');
+$a->addFile('.phar/alias.txt', 'hio');
+$a->mkDir('test');
+$a->close();
+
+try {
+       $a = new Phar($fname);
+       var_dump($a['a.php']->isExecutable());
+       $a['a.php']->chmod(0777);
+       var_dump($a['a.php']->isExecutable());
+       $a['a.php']->chmod(0666);
+       var_dump($a['a.php']->isExecutable());
+       echo "test dir\n";
+       var_dump($a['test']->isExecutable());
+       $a['test']->chmod(0777);
+       var_dump($a['test']->isExecutable());
+       $a['test']->chmod(0666);
+       var_dump($a['test']->isExecutable());
+} catch (Exception $e) {
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.1.phar.php');
+?>
+--EXPECTF--
+bool(false)
+Cannot modify permissions for file "a.php" in phar "%sa.1.phar.php", write operations are prohibited
+===DONE===
diff --git a/ext/phar/tests/zip/create_new_and_modify.phpt b/ext/phar/tests/zip/create_new_and_modify.phpt
new file mode 100644 (file)
index 0000000..b81e5a7
--- /dev/null
@@ -0,0 +1,45 @@
+--TEST--
+Phar: create and modify zip-based phar
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
+--INI--
+phar.readonly=0
+--FILE--
+<?php
+
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$pname = 'phar://' . $fname;
+
+@unlink($fname);
+
+file_put_contents($pname . '/a.php', "brand new!\n");
+
+$phar = new Phar($fname);
+var_dump($phar->isZip());
+$sig1 = md5_file($fname);
+
+include $pname . '/a.php';
+
+file_put_contents($pname .'/a.php', "modified!\n");
+file_put_contents($pname .'/b.php', "another!\n");
+
+$phar = new Phar($fname);
+$sig2 = md5_file($fname);
+
+var_dump($sig1 != $sig2);
+
+include $pname . '/a.php';
+include $pname . '/b.php';
+
+?>
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+--EXPECTF--
+bool(true)
+brand new!
+bool(true)
+modified!
+another!
+===DONE===
diff --git a/ext/phar/tests/zip/create_new_phar_b.phpt b/ext/phar/tests/zip/create_new_phar_b.phpt
new file mode 100644 (file)
index 0000000..5aec78d
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Phar: create a completely new zip-based phar
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.readonly=1
+phar.require_hash=1
+--FILE--
+<?php
+
+file_put_contents('phar://' . dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip/a.php',
+       'brand new!');
+include 'phar://' . dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip/a.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip'); ?>
+--EXPECTF--
+
+Warning: file_put_contents(phar://%screate_new_phar_b.phar.zip/a.php): failed to open stream: phar error: write operations disabled by INI setting in %screate_new_phar_b.php on line %d
+
+Warning: include(phar://%screate_new_phar_b.phar.zip/a.php): failed to open stream: No such file or directory in %screate_new_phar_b.php on line %d
+
+Warning: include(): Failed opening 'phar://%screate_new_phar_b.phar.zip/a.php' for inclusion (include_path='%s') in %screate_new_phar_b.php on line %d
+
+===DONE===
diff --git a/ext/phar/tests/zip/delete.phpt b/ext/phar/tests/zip/delete.phpt
new file mode 100644 (file)
index 0000000..77ae85f
--- /dev/null
@@ -0,0 +1,35 @@
+--TEST--
+Phar: delete test, zip-based phar
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+$file = "<?php
+Phar::mapPhar('hio');
+__HALT_COMPILER(); ?>";
+
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('a', 'a');
+$a->addFile('.phar/stub.php', $file);
+$a->close();
+
+$phar = new Phar($fname);
+
+echo file_get_contents($pname . '/a') . "\n";
+$phar->delete('a');
+echo file_get_contents($pname . '/a') . "\n";
+?>
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECTF--
+a
+
+Warning: file_get_contents(phar://%sdelete.phar.php/a): failed to open stream: phar error: "a" is not a file in phar "%sdelete.phar.php" in %sdelete.php on line %d
\ No newline at end of file
diff --git a/ext/phar/tests/zip/delete_in_phar.phpt b/ext/phar/tests/zip/delete_in_phar.phpt
new file mode 100644 (file)
index 0000000..ec743b5
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Phar: delete a file within a zip-based .phar
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('a.php', '<?php echo "This is a\n"; ?>');
+$a->addFile('b.php', '<?php echo "This is b\n"; ?>');
+$a->addFile('b/c.php', '<?php echo "This is b/c\n"; ?>');
+$a->addFile('.phar/stub.php', '<?php __HALT_COMPILER(); ?>');
+$a->close();
+
+include $pname . '/a.php';
+include $pname . '/b.php';
+include $pname . '/b/c.php';
+unlink($pname . '/b/c.php');
+?>
+===AFTER===
+<?php
+include $pname . '/a.php';
+include $pname . '/b.php';
+include $pname . '/b/c.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECTF--
+This is a
+This is b
+This is b/c
+===AFTER===
+This is a
+This is b
+
+Warning: include(%sdelete_in_phar.phar.php/b/c.php): failed to open stream: phar error: "b/c.php" is not a file in phar "%sdelete_in_phar.phar.php" in %sdelete_in_phar.php on line %d
+
+Warning: include(): Failed opening 'phar://%sdelete_in_phar.phar.php/b/c.php' for inclusion (include_path='%s') in %sdelete_in_phar.php on line %d
+
+===DONE===
+               
\ No newline at end of file
diff --git a/ext/phar/tests/zip/delete_in_phar_b.phpt b/ext/phar/tests/zip/delete_in_phar_b.phpt
new file mode 100644 (file)
index 0000000..2816b10
--- /dev/null
@@ -0,0 +1,49 @@
+--TEST--
+Phar: delete a file within a zip-based .phar
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=1
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('a.php', '<?php echo "This is a\n"; ?>');
+$a->addFile('b.php', '<?php echo "This is b\n"; ?>');
+$a->addFile('b/c.php', '<?php echo "This is b/c\n"; ?>');
+$a->addFile('.phar/stub.php', '<?php __HALT_COMPILER(); ?>');
+$a->close();
+
+include $pname . '/a.php';
+include $pname . '/b.php';
+include $pname . '/b/c.php';
+unlink($pname . '/b/c.php');
+?>
+===AFTER===
+<?php
+include $pname . '/a.php';
+include $pname . '/b.php';
+include $pname . '/b/c.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECTF--
+This is a
+This is b
+This is b/c
+
+Warning: unlink(): phar error: write operations disabled by INI setting in %sdelete_in_phar_b.php on line %d
+===AFTER===
+This is a
+This is b
+This is b/c
+
+===DONE===
diff --git a/ext/phar/tests/zip/delete_in_phar_confirm.phpt b/ext/phar/tests/zip/delete_in_phar_confirm.phpt
new file mode 100644 (file)
index 0000000..9ffe718
--- /dev/null
@@ -0,0 +1,53 @@
+--TEST--
+Phar: delete a file within a zip-based .phar (confirm disk file is changed)
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('a.php', '<?php echo "This is a\n"; ?>');
+$a->addFile('b.php', '<?php echo "This is b\n"; ?>');
+$a->addFile('b/c.php', '<?php echo "This is b/c\n"; ?>');
+$a->addFile('.phar/stub.php', '<?php __HALT_COMPILER(); ?>');
+$a->close();
+include $pname . '/a.php';
+include $pname . '/b.php';
+include $pname . '/b/c.php';
+$md5 = md5_file($fname);
+unlink($pname . '/b/c.php');
+clearstatcache();
+$md52 = md5_file($fname);
+if ($md5 == $md52) echo 'file was not modified';
+?>
+===AFTER===
+<?php
+include 'phar://' . dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php/a.php';
+include 'phar://' . dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php/b.php';
+include 'phar://' . dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php/b/c.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECTF--
+This is a
+This is b
+This is b/c
+===AFTER===
+This is a
+This is b
+
+Warning: include(%sdelete_in_phar_confirm.phar.php/b/c.php): failed to open stream: phar error: "b/c.php" is not a file in phar "%sdelete_in_phar_confirm.phar.php" in %sdelete_in_phar_confirm.php on line %d
+
+Warning: include(): Failed opening 'phar://%sdelete_in_phar_confirm.phar.php/b/c.php' for inclusion (include_path='%s') in %sdelete_in_phar_confirm.php on line %d
+
+===DONE===
diff --git a/ext/phar/tests/zip/frontcontroller.phar.inc b/ext/phar/tests/zip/frontcontroller.phar.inc
new file mode 100644 (file)
index 0000000..241dceb
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller.phar.zip');
+$a['a.php'] = 'hio';
+$a['a.jpg'] = 'hio';
+$a['a.phps'] = '<?php function hio(){}';
+$a['index.php'] = 'here is my index';
+$a->setStub('<?php
+Phar::webPhar();
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller.phar.zip b/ext/phar/tests/zip/frontcontroller.phar.zip
new file mode 100644 (file)
index 0000000..4ee905d
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller1.phar.phpt b/ext/phar/tests/zip/frontcontroller1.phar.phpt
new file mode 100644 (file)
index 0000000..2be7ab4
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Phar front controller other zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller1.phar.php/a.jpg
+REQUEST_URI=/frontcontroller1.phar.php/a.jpg
+--FILE_EXTERNAL--
+frontcontroller.phar.zip
+--EXPECTHEADERS--
+Content-type: image/jpeg
+Content-length: 3
+--EXPECT--
+hio
diff --git a/ext/phar/tests/zip/frontcontroller10.phar.inc b/ext/phar/tests/zip/frontcontroller10.phar.inc
new file mode 100644 (file)
index 0000000..c973cc1
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller10.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller10.phar.zip');
+$a['index.php'] = '<?php
+var_dump($_SERVER["PHP_SELF"]);
+var_dump($_SERVER["SCRIPT_NAME"]);
+var_dump($_SERVER["SCRIPT_FILENAME"]);
+var_dump($_SERVER["REQUEST_URI"]);
+var_dump($_SERVER["PHAR_PHP_SELF"]);
+var_dump($_SERVER["PHAR_SCRIPT_NAME"]);
+var_dump($_SERVER["PHAR_SCRIPT_FILENAME"]);
+var_dump($_SERVER["PHAR_REQUEST_URI"]);
+';
+$a->setStub('<?php
+Phar::mungServer(array("PHP_SELF", "SCRIPT_NAME", "SCRIPT_FILENAME", "REQUEST_URI", "OOPSIE"));
+Phar::webPhar();
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller10.phar.phpt b/ext/phar/tests/zip/frontcontroller10.phar.phpt
new file mode 100644 (file)
index 0000000..025becd
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Phar front controller rewrite array invalid zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller10.phar.php/hi
+REQUEST_URI=/frontcontroller10.phar.php/hi
+--FILE_EXTERNAL--
+frontcontroller4.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECTF--
+Fatal error: Uncaught exception 'UnexpectedValueException' with message 'phar rewrite value for "/hi" was not a string' in %sfrontcontroller10.phar.php:2
+Stack trace:
+#0 %sfrontcontroller10.phar.php(2): Phar::webPhar('whatever', 'index.php', '', Array, Array)
+#1 {main}
+  thrown in %sfrontcontroller10.phar.php on line 2
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller10.phar.zip b/ext/phar/tests/zip/frontcontroller10.phar.zip
new file mode 100644 (file)
index 0000000..c37cb38
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller10.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller11.phar.inc b/ext/phar/tests/zip/frontcontroller11.phar.inc
new file mode 100644 (file)
index 0000000..c24a6f1
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller11.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller11.phar.zip');
+$a['index.php'] = '<?php
+var_dump($_SERVER["PHP_SELF"]);
+var_dump($_SERVER["SCRIPT_NAME"]);
+var_dump($_SERVER["SCRIPT_FILENAME"]);
+var_dump($_SERVER["REQUEST_URI"]);
+var_dump($_SERVER["PHAR_PHP_SELF"]);
+var_dump($_SERVER["PHAR_SCRIPT_NAME"]);
+var_dump($_SERVER["PHAR_SCRIPT_FILENAME"]);
+var_dump($_SERVER["PHAR_REQUEST_URI"]);
+';
+$a->setStub('<?php
+Phar::mungServer(array(array(), "SCRIPT_NAME", "SCRIPT_FILENAME", "REQUEST_URI"));
+Phar::webPhar();
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller11.phar.phpt b/ext/phar/tests/zip/frontcontroller11.phar.phpt
new file mode 100644 (file)
index 0000000..789138f
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Phar front controller mime type extension is not a string zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller11.phar.php/a.php
+REQUEST_URI=/frontcontroller11.phar.php/a.php
+--FILE_EXTERNAL--
+frontcontroller5.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECTF--
+Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Key of MIME type overrides array must be a file extension, was "0"' in %sfrontcontroller11.phar.php:2
+Stack trace:
+#0 %sfrontcontroller11.phar.php(2): Phar::webPhar('whatever', 'index.php', '', Array)
+#1 {main}
+  thrown in %sfrontcontroller11.phar.php on line 2
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller11.phar.zip b/ext/phar/tests/zip/frontcontroller11.phar.zip
new file mode 100644 (file)
index 0000000..48e5fc6
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller11.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller12.phar.inc b/ext/phar/tests/zip/frontcontroller12.phar.inc
new file mode 100644 (file)
index 0000000..77c4a1d
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller12.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller12.phar.zip');
+$a['index.php'] = '<?php
+var_dump($_SERVER["PHP_SELF"]);
+var_dump($_SERVER["SCRIPT_NAME"]);
+var_dump($_SERVER["SCRIPT_FILENAME"]);
+var_dump($_SERVER["REQUEST_URI"]);
+var_dump($_SERVER["PHAR_PHP_SELF"]);
+var_dump($_SERVER["PHAR_SCRIPT_NAME"]);
+var_dump($_SERVER["PHAR_SCRIPT_FILENAME"]);
+var_dump($_SERVER["PHAR_REQUEST_URI"]);
+';
+$a->setStub('<?php
+Phar::mungServer(array("PHP_SELF", "SCRIPT_NAME", "SCRIPT_FILENAME", "REQUEST_URI"));
+Phar::webPhar();
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller12.phar.phpt b/ext/phar/tests/zip/frontcontroller12.phar.phpt
new file mode 100644 (file)
index 0000000..1b5102a
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Phar front controller mime type unknown int zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller12.phar.php/a.php
+REQUEST_URI=/frontcontroller12.phar.php/a.php
+--FILE_EXTERNAL--
+frontcontroller6.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECTF--
+Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Unknown mime type specifier used, only Phar::PHP, Phar::PHPS and a mime type string are allowed' in %sfrontcontroller12.phar.php:2
+Stack trace:
+#0 %sfrontcontroller12.phar.php(2): Phar::webPhar('whatever', 'index.php', '', Array)
+#1 {main}
+  thrown in %sfrontcontroller12.phar.php on line 2
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller12.phar.zip b/ext/phar/tests/zip/frontcontroller12.phar.zip
new file mode 100644 (file)
index 0000000..c086c4d
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller12.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller13.phar.phpt b/ext/phar/tests/zip/frontcontroller13.phar.phpt
new file mode 100644 (file)
index 0000000..5fc4b83
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Phar front controller mime type not string/int zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller13.phar.php/a.php
+REQUEST_URI=/frontcontroller13.phar.php/a.php
+--FILE_EXTERNAL--
+frontcontroller7.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECTF--
+Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Unknown mime type specifier used (not a string or int), only Phar::PHP, Phar::PHPS and a mime type string are allowed' in %sfrontcontroller13.phar.php:2
+Stack trace:
+#0 %sfrontcontroller13.phar.php(2): Phar::webPhar('whatever', 'index.php', '', Array)
+#1 {main}
+  thrown in %sfrontcontroller13.phar.php on line 2
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller14.phar.phpt b/ext/phar/tests/zip/frontcontroller14.phar.phpt
new file mode 100644 (file)
index 0000000..7a3aaa5
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Phar front controller mime type override, other zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller14.phar.php/a.jpg
+REQUEST_URI=/frontcontroller14.phar.php/a.jpg
+--FILE_EXTERNAL--
+frontcontroller8.phar.zip
+--EXPECTHEADERS--
+Content-type: foo/bar
+Content-length: 4
+--EXPECT--
+hio2
diff --git a/ext/phar/tests/zip/frontcontroller15.phar.phpt b/ext/phar/tests/zip/frontcontroller15.phar.phpt
new file mode 100644 (file)
index 0000000..33ac673
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Phar front controller mime type override, Phar::PHPS zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller15.phar.php/a.php
+REQUEST_URI=/frontcontroller15.phar.php/a.php
+--FILE_EXTERNAL--
+frontcontroller8.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECT--
+<code><span style="color: #000000">
+<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">hio</span><span style="color: #007700">(){}</span>
+</span>
+</code>
+
diff --git a/ext/phar/tests/zip/frontcontroller16.phar.phpt b/ext/phar/tests/zip/frontcontroller16.phar.phpt
new file mode 100644 (file)
index 0000000..924996b
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+Phar front controller mime type override, Phar::PHP zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller16.phar.php/a.phps
+REQUEST_URI=/frontcontroller16.phar.php/a.phps
+--FILE_EXTERNAL--
+frontcontroller8.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECT--
+hio1
+
diff --git a/ext/phar/tests/zip/frontcontroller17.phar.phpt b/ext/phar/tests/zip/frontcontroller17.phar.phpt
new file mode 100644 (file)
index 0000000..36054b8
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Phar front controller mime type unknown zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller17.phar.php/fronk.gronk
+REQUEST_URI=/frontcontroller17.phar.php/fronk.gronk
+--FILE_EXTERNAL--
+frontcontroller8.phar.zip
+--EXPECTHEADERS--
+Content-type: application/octet-stream
+Content-length: 4
+--EXPECT--
+hio3
+
diff --git a/ext/phar/tests/zip/frontcontroller18.phar.phpt b/ext/phar/tests/zip/frontcontroller18.phar.phpt
new file mode 100644 (file)
index 0000000..8d91398
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Phar front controller $_SERVER munging failure zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller18.phar.php/fronk.gronk
+REQUEST_URI=/frontcontroller18.phar.php/fronk.gronk
+--FILE_EXTERNAL--
+frontcontroller9.phar.zip
+--EXPECTF--
+Fatal error: Uncaught exception 'UnexpectedValueException' with message 'No values passed to Phar::mungServer(), expecting an array of any of these strings: PHP_SELF, REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME' in %sfrontcontroller18.phar.php:2
+Stack trace:
+#0 %sfrontcontroller18.phar.php(2): Phar::mungServer(Array)
+#1 {main}
+  thrown in %sfrontcontroller18.phar.php on line 2
diff --git a/ext/phar/tests/zip/frontcontroller19.phar.phpt b/ext/phar/tests/zip/frontcontroller19.phar.phpt
new file mode 100644 (file)
index 0000000..8057448
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Phar front controller $_SERVER munging failure 2 zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller19.phar.php/
+REQUEST_URI=/frontcontroller19.phar.php/
+--FILE_EXTERNAL--
+frontcontroller10.phar.zip
+--EXPECTF--
+Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Too many values passed to Phar::mungServer(), expecting an array of any of these strings: PHP_SELF, REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME' in %sfrontcontroller19.phar.php:2
+Stack trace:
+#0 %sfrontcontroller19.phar.php(2): Phar::mungServer(Array)
+#1 {main}
+  thrown in %sfrontcontroller19.phar.php on line 2
diff --git a/ext/phar/tests/zip/frontcontroller2.phar.inc b/ext/phar/tests/zip/frontcontroller2.phar.inc
new file mode 100644 (file)
index 0000000..6cfa052
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller2.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller2.phar.zip');
+$a['a.php'] = 'hio';
+$a['a.jpg'] = 'hio';
+$a['a.phps'] = '<?php function hio(){}';
+$a->setStub('<?php
+Phar::webPhar("whatever", "a.php");
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller2.phar.phpt b/ext/phar/tests/zip/frontcontroller2.phar.phpt
new file mode 100644 (file)
index 0000000..ac64424
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Phar front controller PHP test zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller2.phar.php/a.php
+REQUEST_URI=/frontcontroller2.phar.php/a.php
+--FILE_EXTERNAL--
+frontcontroller.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECT--
+hio
diff --git a/ext/phar/tests/zip/frontcontroller2.phar.zip b/ext/phar/tests/zip/frontcontroller2.phar.zip
new file mode 100644 (file)
index 0000000..7ef43dc
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller2.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller20.phar.phpt b/ext/phar/tests/zip/frontcontroller20.phar.phpt
new file mode 100644 (file)
index 0000000..4b5859b
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+Phar front controller $_SERVER munging failure 3 zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller20.phar.php/
+REQUEST_URI=/frontcontroller20.phar.php/
+--FILE_EXTERNAL--
+frontcontroller11.phar.zip
+--EXPECTF--
+Fatal error: Uncaught exception 'UnexpectedValueException' with message 'Non-string value passed to Phar::mungServer(), expecting an array of any of these strings: PHP_SELF, REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME' in %sfrontcontroller20.phar.php:2
+Stack trace:
+#0 %sfrontcontroller20.phar.php(2): Phar::mungServer(Array)
+#1 {main}
+  thrown in %sfrontcontroller20.phar.php on line 2
diff --git a/ext/phar/tests/zip/frontcontroller21.phar.phpt b/ext/phar/tests/zip/frontcontroller21.phar.phpt
new file mode 100644 (file)
index 0000000..cd55d9c
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Phar front controller $_SERVER munging success zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller21.phar.php/index.php
+REQUEST_URI=/frontcontroller21.phar.php/index.php?test=hi
+--FILE_EXTERNAL--
+frontcontroller12.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECTF--
+string(10) "/index.php"
+string(%d) "phar://%sfrontcontroller21.phar.php/index.php"
+string(%d) "phar://%sfrontcontroller21.phar.php/index.php"
+string(18) "/index.php?test=hi"
+string(37) "/frontcontroller21.phar.php/index.php"
+string(37) "/frontcontroller21.phar.php/index.php"
+string(%d) "%s/frontcontroller21.phar.php"
+string(45) "/frontcontroller21.phar.php/index.php?test=hi"
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller3.phar.inc b/ext/phar/tests/zip/frontcontroller3.phar.inc
new file mode 100644 (file)
index 0000000..a622b81
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller3.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller3.phar.zip');
+$a['a.php'] = 'hio';
+$a['a.jpg'] = 'hio';
+$a['a.phps'] = '<?php function hio(){}';
+$a->setStub('<?php
+Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => "a.phps"));
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller3.phar.phpt b/ext/phar/tests/zip/frontcontroller3.phar.phpt
new file mode 100644 (file)
index 0000000..c34f4de
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Phar front controller phps zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller3.phar.php/a.phps
+REQUEST_URI=/frontcontroller3.phar.php/a.phps
+--FILE_EXTERNAL--
+frontcontroller.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECT--
+<code><span style="color: #000000">
+<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">hio</span><span style="color: #007700">(){}</span>
+</span>
+</code>
diff --git a/ext/phar/tests/zip/frontcontroller3.phar.zip b/ext/phar/tests/zip/frontcontroller3.phar.zip
new file mode 100644 (file)
index 0000000..0ca3681
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller3.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller4.phar.inc b/ext/phar/tests/zip/frontcontroller4.phar.inc
new file mode 100644 (file)
index 0000000..62956ba
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller4.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller4.phar.zip');
+$a['a.php'] = 'hio';
+$a['a.jpg'] = 'hio';
+$a['a.phps'] = '<?php function hio(){}';
+$a->setStub('<?php
+Phar::webPhar("whatever", "index.php", null, array(), array("/hi" => true));
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller4.phar.phpt b/ext/phar/tests/zip/frontcontroller4.phar.phpt
new file mode 100644 (file)
index 0000000..0a6e39e
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Phar front controller index.php relocate (no /) zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller4.phar.php
+REQUEST_URI=/frontcontroller4.phar.php
+--FILE_EXTERNAL--
+frontcontroller.phar.zip
+--EXPECTHEADERS--
+Status: 301 Moved Permanently
+Location: /frontcontroller4.phar.php/index.php
+--EXPECT--
diff --git a/ext/phar/tests/zip/frontcontroller4.phar.zip b/ext/phar/tests/zip/frontcontroller4.phar.zip
new file mode 100644 (file)
index 0000000..08208a5
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller4.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller5.phar.inc b/ext/phar/tests/zip/frontcontroller5.phar.inc
new file mode 100644 (file)
index 0000000..931fa97
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller5.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller5.phar.zip');
+$a['a.php'] = 'hio';
+$a['a.jpg'] = 'hio';
+$a['a.phps'] = '<?php function hio(){}';
+$a->setStub('<?php
+Phar::webPhar("whatever", "index.php", null, array(0 => "oops"));
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller5.phar.phpt b/ext/phar/tests/zip/frontcontroller5.phar.phpt
new file mode 100644 (file)
index 0000000..1e69240
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Phar front controller index.php relocate zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller5.phar.php/
+REQUEST_URI=/frontcontroller5.phar.php/
+--FILE_EXTERNAL--
+frontcontroller.phar.zip
+--EXPECTHEADERS--
+Status: 301 Moved Permanently
+Location: /frontcontroller5.phar.php/index.php
+--EXPECT--
diff --git a/ext/phar/tests/zip/frontcontroller5.phar.zip b/ext/phar/tests/zip/frontcontroller5.phar.zip
new file mode 100644 (file)
index 0000000..0ab0472
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller5.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller6.phar.inc b/ext/phar/tests/zip/frontcontroller6.phar.inc
new file mode 100644 (file)
index 0000000..3b551f2
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller6.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller6.phar.zip');
+$a['a.php'] = 'hio';
+$a['a.jpg'] = 'hio';
+$a['a.phps'] = '<?php function hio(){}';
+$a->setStub('<?php
+Phar::webPhar("whatever", "index.php", null, array("blah" => 100));
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller6.phar.phpt b/ext/phar/tests/zip/frontcontroller6.phar.phpt
new file mode 100644 (file)
index 0000000..4f3435b
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Phar front controller 404 zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller6.phar.php/notfound.php
+REQUEST_URI=/frontcontroller6.phar.php/notfound.php
+--FILE_EXTERNAL--
+frontcontroller.phar.zip
+--EXPECTHEADERS--
+Status: 404 Not Found
+--EXPECT--
+<html>
+ <head>
+  <title>File Not Found<title>
+ </head>
+ <body>
+  <h1>404 - File /notfound.php Not Found</h1>
+ </body>
+</html>
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller6.phar.zip b/ext/phar/tests/zip/frontcontroller6.phar.zip
new file mode 100644 (file)
index 0000000..bf98255
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller6.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller7.phar.inc b/ext/phar/tests/zip/frontcontroller7.phar.inc
new file mode 100644 (file)
index 0000000..42c10bc
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller7.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller7.phar.zip');
+$a['a.php'] = 'hio';
+$a['a.jpg'] = 'hio';
+$a['a.phps'] = '<?php function hio(){}';
+$a->setStub('<?php
+Phar::webPhar("whatever", "index.php", null, array("blah" => null));
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller7.phar.phpt b/ext/phar/tests/zip/frontcontroller7.phar.phpt
new file mode 100644 (file)
index 0000000..2ce206f
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+Phar front controller alternate index file zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller7.phar.php/
+REQUEST_URI=/frontcontroller7.phar.php/
+--FILE_EXTERNAL--
+frontcontroller2.phar.zip
+--EXPECTHEADERS--
+Status: 301 Moved Permanently
+Location: /frontcontroller7.phar.php/a.php
+--EXPECT--
diff --git a/ext/phar/tests/zip/frontcontroller7.phar.zip b/ext/phar/tests/zip/frontcontroller7.phar.zip
new file mode 100644 (file)
index 0000000..02fc3e2
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller7.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller8.phar.inc b/ext/phar/tests/zip/frontcontroller8.phar.inc
new file mode 100644 (file)
index 0000000..e04ac41
--- /dev/null
@@ -0,0 +1,13 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller8.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller8.phar.zip');
+$a['a.phps'] = 'hio1';
+$a['a.jpg'] = 'hio2';
+$a['a.php'] = '<?php function hio(){}';
+$a['fronk.gronk'] = 'hio3';
+$a->setStub('<?php
+Phar::webPhar("whatever", "index.php", null, array("jpg" => "foo/bar", "phps" => Phar::PHP, "php" => Phar::PHPS));
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller8.phar.phpt b/ext/phar/tests/zip/frontcontroller8.phar.phpt
new file mode 100644 (file)
index 0000000..dd806b6
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+Phar front controller no index file 404 zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller8.phar.php/
+REQUEST_URI=/frontcontroller8.phar.php/
+--FILE_EXTERNAL--
+frontcontroller3.phar.zip
+--EXPECTHEADERS--
+Status: 404 Not Found
+--EXPECT--
+<html>
+ <head>
+  <title>File Not Found<title>
+ </head>
+ <body>
+  <h1>404 - File index.php Not Found</h1>
+ </body>
+</html>
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller8.phar.zip b/ext/phar/tests/zip/frontcontroller8.phar.zip
new file mode 100644 (file)
index 0000000..41952ce
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller8.phar.zip differ
diff --git a/ext/phar/tests/zip/frontcontroller9.phar.inc b/ext/phar/tests/zip/frontcontroller9.phar.inc
new file mode 100644 (file)
index 0000000..5044045
--- /dev/null
@@ -0,0 +1,14 @@
+<?php
+@unlink(dirname(__FILE__) . '/frontcontroller9.phar.zip');
+$a = new Phar(dirname(__FILE__) . '/frontcontroller9.phar.zip');
+$a['a.phps'] = 'hio1';
+$a['a.jpg'] = 'hio2';
+$a['a.php'] = '<?php function hio(){}';
+$a['fronk.gronk'] = 'hio3';
+$a->setStub('<?php
+Phar::mungServer(array());
+Phar::webPhar("whatever", "index.php", null, array("jpg" => "foo/bar", "phps" => Phar::PHP, "php" => Phar::PHPS));
+echo "oops did not run\n";
+var_dump($_ENV, $_SERVER);
+__HALT_COMPILER();');
+?>
diff --git a/ext/phar/tests/zip/frontcontroller9.phar.phpt b/ext/phar/tests/zip/frontcontroller9.phar.phpt
new file mode 100644 (file)
index 0000000..70dbaa0
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Phar front controller rewrite array zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--ENV--
+SCRIPT_NAME=/frontcontroller9.phar.php/hi
+REQUEST_URI=/frontcontroller9.phar.php/hi
+--FILE_EXTERNAL--
+frontcontroller3.phar.zip
+--EXPECTHEADERS--
+Content-type: text/html
+--EXPECT--
+<code><span style="color: #000000">
+<span style="color: #0000BB">&lt;?php&nbsp;</span><span style="color: #007700">function&nbsp;</span><span style="color: #0000BB">hio</span><span style="color: #007700">(){}</span>
+</span>
+</code>
\ No newline at end of file
diff --git a/ext/phar/tests/zip/frontcontroller9.phar.zip b/ext/phar/tests/zip/frontcontroller9.phar.zip
new file mode 100644 (file)
index 0000000..d3f4ff8
Binary files /dev/null and b/ext/phar/tests/zip/frontcontroller9.phar.zip differ
diff --git a/ext/phar/tests/zip/make_invalid_tar.php.inc b/ext/phar/tests/zip/make_invalid_tar.php.inc
new file mode 100644 (file)
index 0000000..cec8ef7
--- /dev/null
@@ -0,0 +1,12 @@
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+class corrupter extends tarmaker {
+function close()
+{
+       parent::close();
+       $fp = fopen($this->path, 'r+b');
+       fseek($fp, 20);
+       fwrite($fp, 'oopsie');
+       fclose($fp);
+}
+}
\ No newline at end of file
diff --git a/ext/phar/tests/zip/open_for_write_existing.phpt b/ext/phar/tests/zip/open_for_write_existing.phpt
new file mode 100644 (file)
index 0000000..6e677e7
--- /dev/null
@@ -0,0 +1,38 @@
+--TEST--
+Phar: fopen a .phar for writing (existing file) zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$fp = fopen($pname . '/b/c.php', 'wb');
+fwrite($fp, 'extra');
+fclose($fp);
+include $pname . '/b/c.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+--EXPECT--
+extra
+===DONE===
diff --git a/ext/phar/tests/zip/open_for_write_existing_b.phpt b/ext/phar/tests/zip/open_for_write_existing_b.phpt
new file mode 100755 (executable)
index 0000000..e3eb75c
--- /dev/null
@@ -0,0 +1,49 @@
+--TEST--
+Phar: fopen a .phar for writing (existing file) zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=1
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+function err_handler($errno, $errstr, $errfile, $errline) {
+  echo "Catchable fatal error: $errstr in $errfile on line $errline\n";
+}
+
+set_error_handler("err_handler", E_RECOVERABLE_ERROR);
+
+$fp = fopen($pname . '/b/c.php', 'wb');
+fwrite($fp, 'extra');
+fclose($fp);
+include $pname . '/b/c.php';
+?>
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+--EXPECTF--
+
+Warning: fopen(phar://%sopen_for_write_existing_b.phar.zip.php/b/c.php): failed to open stream: phar error: write operations disabled by INI setting in %sopen_for_write_existing_b.php on line %d
+
+Warning: fwrite(): supplied argument is not a valid stream resource in %spen_for_write_existing_b.php on line %d
+
+Warning: fclose(): supplied argument is not a valid stream resource in %spen_for_write_existing_b.php on line %d
+This is b/c
+===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/zip/open_for_write_existing_c.phpt b/ext/phar/tests/zip/open_for_write_existing_c.phpt
new file mode 100755 (executable)
index 0000000..308c74d
--- /dev/null
@@ -0,0 +1,43 @@
+--TEST--
+Phar: fopen a .phar for writing (existing file) tar-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=1
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$fp = fopen($pname . '/b/c.php', 'wb');
+fwrite($fp, 'extra');
+fclose($fp);
+include $pname . '/b/c.php';
+?>
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+--EXPECTF--
+
+Warning: fopen(phar://%sopen_for_write_existing_c.phar.zip.php/b/c.php): failed to open stream: phar error: write operations disabled by INI setting in %sopen_for_write_existing_c.php on line %d
+
+Warning: fwrite(): supplied argument is not a valid stream resource in %sopen_for_write_existing_c.php on line %d
+
+Warning: fclose(): supplied argument is not a valid stream resource in %sopen_for_write_existing_c.php on line %d
+This is b/c
+===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/zip/open_for_write_newfile.phpt b/ext/phar/tests/zip/open_for_write_newfile.phpt
new file mode 100644 (file)
index 0000000..e30ae54
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+Phar: fopen a .phar for writing (new file) zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$fp = fopen($pname . '/b/new.php', 'wb');
+fwrite($fp, 'extra');
+fclose($fp);
+include $pname . '/b/c.php';
+include $pname . '/b/new.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+--EXPECT--
+This is b/c
+extra
+===DONE===
diff --git a/ext/phar/tests/zip/open_for_write_newfile_b.phpt b/ext/phar/tests/zip/open_for_write_newfile_b.phpt
new file mode 100755 (executable)
index 0000000..854917e
--- /dev/null
@@ -0,0 +1,56 @@
+--TEST--
+Phar: fopen a .phar for writing (new file) zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=1
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+function err_handler($errno, $errstr, $errfile, $errline) {
+  echo "Catchable fatal error: $errstr in $errfile on line $errline\n";
+}
+
+set_error_handler("err_handler", E_RECOVERABLE_ERROR);
+
+$fp = fopen($pname . '/b/new.php', 'wb');
+fwrite($fp, 'extra');
+fclose($fp);
+include $pname . '/b/c.php';
+include $pname . '/b/new.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+--EXPECTF--
+
+Warning: fopen(phar://%sopen_for_write_newfile_b.phar.zip.php/b/new.php): failed to open stream: phar error: write operations disabled by INI setting in %sopen_for_write_newfile_b.php on line %d
+
+Warning: fwrite(): supplied argument is not a valid stream resource in %sopen_for_write_newfile_b.php on line %d
+
+Warning: fclose(): supplied argument is not a valid stream resource in %sopen_for_write_newfile_b.php on line %d
+This is b/c
+
+Warning: include(phar://%sopen_for_write_newfile_b.phar.zip.php/b/new.php): failed to open stream: phar error: "b/new.php" is not a file in phar "%sopen_for_write_newfile_b.phar.zip.php" in %sopen_for_write_newfile_b.php on line %d
+
+Warning: include(): Failed opening 'phar://%sopen_for_write_newfile_b.phar.zip.php/b/new.php' for inclusion (include_path='%s') in %sopen_for_write_newfile_b.php on line %d
+
+===DONE===
diff --git a/ext/phar/tests/zip/open_for_write_newfile_c.phpt b/ext/phar/tests/zip/open_for_write_newfile_c.phpt
new file mode 100755 (executable)
index 0000000..01b5871
--- /dev/null
@@ -0,0 +1,50 @@
+--TEST--
+Phar: fopen a .phar for writing (new file) zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=1
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$fp = fopen($pname . '/b/new.php', 'wb');
+fwrite($fp, 'extra');
+fclose($fp);
+include $pname . '/b/c.php';
+include $pname . '/b/new.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+--EXPECTF--
+
+Warning: fopen(phar://%sopen_for_write_newfile_c.phar.zip.php/b/new.php): failed to open stream: phar error: write operations disabled by INI setting in %sopen_for_write_newfile_c.php on line %d
+
+Warning: fwrite(): supplied argument is not a valid stream resource in %sopen_for_write_newfile_c.php on line %d
+
+Warning: fclose(): supplied argument is not a valid stream resource in %sopen_for_write_newfile_c.php on line %d
+This is b/c
+
+Warning: include(phar://%sopen_for_write_newfile_c.phar.zip.php/b/new.php): failed to open stream: phar error: "b/new.php" is not a file in phar "%sopen_for_write_newfile_c.phar.zip.php" in %sopen_for_write_newfile_c.php on line %d
+
+Warning: include(): Failed opening 'phar://%sopen_for_write_newfile_c.phar.zip.php/b/new.php' for inclusion (include_path='%s') in %sopen_for_write_newfile_c.php on line %d
+
+===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/zip/phar_begin_setstub_commit.phpt b/ext/phar/tests/zip/phar_begin_setstub_commit.phpt
new file mode 100755 (executable)
index 0000000..66c0134
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Phar::startBuffering()/setStub()/stopBuffering() zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.readonly=0
+--FILE--
+<?php
+$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar.zip', 0, 'brandnewphar.phar');
+var_dump($p->isZip());
+//var_dump($p->getStub());
+var_dump($p->isBuffering());
+$p->startBuffering();
+var_dump($p->isBuffering());
+$p['a.php'] = '<?php var_dump("Hello");';
+$p->setStub('<?php var_dump("First"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>');
+include 'phar://brandnewphar.phar/a.php';
+var_dump($p->getStub());
+$p['b.php'] = '<?php var_dump("World");';
+$p->setStub('<?php var_dump("Second"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER();');
+include 'phar://brandnewphar.phar/b.php';
+var_dump($p->getStub());
+$p->stopBuffering();
+echo "===COMMIT===\n";
+var_dump($p->isBuffering());
+include 'phar://brandnewphar.phar/a.php';
+include 'phar://brandnewphar.phar/b.php';
+var_dump($p->getStub());
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/brandnewphar.phar.zip');
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(false)
+string(5) "Hello"
+string(84) "<?php var_dump("First"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>
+"
+string(5) "World"
+string(85) "<?php var_dump("Second"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>
+"
+===COMMIT===
+bool(true)
+string(5) "Hello"
+string(5) "World"
+string(85) "<?php var_dump("Second"); Phar::mapPhar("brandnewphar.phar"); __HALT_COMPILER(); ?>
+"
+===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/zip/phar_buildfromiterator4.phpt b/ext/phar/tests/zip/phar_buildfromiterator4.phpt
new file mode 100644 (file)
index 0000000..fe402b6
--- /dev/null
@@ -0,0 +1,66 @@
+--TEST--
+Phar::buildFromIterator() iterator, 1 file passed in zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+class myIterator implements Iterator
+{
+    var $a;
+    function __construct(array $a)
+    {
+        $this->a = $a;
+    }
+    function next() {
+        echo "next\n";
+        return next($this->a);
+    }
+    function current() {
+        echo "current\n";
+        return current($this->a);
+    }
+    function key() {
+        echo "key\n";
+        return key($this->a);
+    }
+    function valid() {
+        echo "valid\n";
+        return current($this->a);
+    }
+    function rewind() {
+        echo "rewind\n";
+        return reset($this->a);
+    }
+}
+try {
+       chdir(dirname(__FILE__));
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+       var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . 'phpt'))));
+       var_dump($phar->isZip());
+} catch (Exception $e) {
+       var_dump(get_class($e));
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+rewind
+valid
+current
+key
+next
+valid
+array(1) {
+  ["a"]=>
+  string(%d) "%sphar_buildfromiterator4.phpt"
+}
+bool(true)
+===DONE===
diff --git a/ext/phar/tests/zip/phar_buildfromiterator5.phpt b/ext/phar/tests/zip/phar_buildfromiterator5.phpt
new file mode 100644 (file)
index 0000000..450ada1
--- /dev/null
@@ -0,0 +1,59 @@
+--TEST--
+Phar::buildFromIterator() iterator, iterator returns non-string zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+class myIterator implements Iterator
+{
+    var $a;
+    function __construct(array $a)
+    {
+        $this->a = $a;
+    }
+    function next() {
+        echo "next\n";
+        return next($this->a);
+    }
+    function current() {
+        echo "current\n";
+        return current($this->a);
+    }
+    function key() {
+        echo "key\n";
+        return key($this->a);
+    }
+    function valid() {
+        echo "valid\n";
+        return current($this->a);
+    }
+    function rewind() {
+        echo "rewind\n";
+        return reset($this->a);
+    }
+}
+try {
+       chdir(dirname(__FILE__));
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+       var_dump($phar->buildFromIterator(new myIterator(array('a' => new stdClass))));
+} catch (Exception $e) {
+       var_dump(get_class($e));
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+rewind
+valid
+current
+string(24) "UnexpectedValueException"
+Iterator myIterator returned an invalid value (must return a string)
+===DONE===
diff --git a/ext/phar/tests/zip/phar_buildfromiterator6.phpt b/ext/phar/tests/zip/phar_buildfromiterator6.phpt
new file mode 100644 (file)
index 0000000..2dfb04d
--- /dev/null
@@ -0,0 +1,60 @@
+--TEST--
+Phar::buildFromIterator() iterator, key is int zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+class myIterator implements Iterator
+{
+    var $a;
+    function __construct(array $a)
+    {
+        $this->a = $a;
+    }
+    function next() {
+        echo "next\n";
+        return next($this->a);
+    }
+    function current() {
+        echo "current\n";
+        return current($this->a);
+    }
+    function key() {
+        echo "key\n";
+        return key($this->a);
+    }
+    function valid() {
+        echo "valid\n";
+        return current($this->a);
+    }
+    function rewind() {
+        echo "rewind\n";
+        return reset($this->a);
+    }
+}
+try {
+       chdir(dirname(__FILE__));
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+       var_dump($phar->buildFromIterator(new myIterator(array(basename(__FILE__, 'php') . 'phpt'))));
+} catch (Exception $e) {
+       var_dump(get_class($e));
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+rewind
+valid
+current
+key
+string(24) "UnexpectedValueException"
+Iterator myIterator returned an invalid key (must return a string)
+===DONE===
diff --git a/ext/phar/tests/zip/phar_buildfromiterator7.phpt b/ext/phar/tests/zip/phar_buildfromiterator7.phpt
new file mode 100644 (file)
index 0000000..16ba6d6
--- /dev/null
@@ -0,0 +1,60 @@
+--TEST--
+Phar::buildFromIterator() iterator, file can't be opened zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+class myIterator implements Iterator
+{
+    var $a;
+    function __construct(array $a)
+    {
+        $this->a = $a;
+    }
+    function next() {
+        echo "next\n";
+        return next($this->a);
+    }
+    function current() {
+        echo "current\n";
+        return current($this->a);
+    }
+    function key() {
+        echo "key\n";
+        return key($this->a);
+    }
+    function valid() {
+        echo "valid\n";
+        return current($this->a);
+    }
+    function rewind() {
+        echo "rewind\n";
+        return reset($this->a);
+    }
+}
+try {
+       chdir(dirname(__FILE__));
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+       var_dump($phar->buildFromIterator(new myIterator(array('a' => basename(__FILE__, 'php') . '/oopsie/there.phpt'))));
+} catch (Exception $e) {
+       var_dump(get_class($e));
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+__HALT_COMPILER();
+?>
+--EXPECT--
+rewind
+valid
+current
+key
+string(24) "UnexpectedValueException"
+Iterator myIterator returned a file that could not be opened "phar_buildfromiterator7./oopsie/there.phpt"
+===DONE===
diff --git a/ext/phar/tests/zip/phar_buildfromiterator8.phpt b/ext/phar/tests/zip/phar_buildfromiterator8.phpt
new file mode 100644 (file)
index 0000000..0222dc8
--- /dev/null
@@ -0,0 +1,73 @@
+--TEST--
+Phar::buildFromIterator() iterator, SplFileInfo as current zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.readonly=0
+--FILE--
+<?php
+try {
+       chdir(dirname(__FILE__));
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+       $a = $phar->buildFromIterator(new RegexIterator(new DirectoryIterator('.'), '/^frontcontroller\d{0,2}\.phar\.phpt\\z|^\.\\z|^\.\.\\z/'), dirname(__FILE__) . DIRECTORY_SEPARATOR);
+       asort($a);
+       var_dump($a);
+       var_dump($phar->isZip());
+} catch (Exception $e) {
+       var_dump(get_class($e));
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/buildfromiterator.phar.zip');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+array(21) {
+  ["frontcontroller1.phar.phpt"]=>
+  string(%d) "%sfrontcontroller1.phar.phpt"
+  ["frontcontroller10.phar.phpt"]=>
+  string(%d) "%sfrontcontroller10.phar.phpt"
+  ["frontcontroller11.phar.phpt"]=>
+  string(%d) "%sfrontcontroller11.phar.phpt"
+  ["frontcontroller12.phar.phpt"]=>
+  string(%d) "%sfrontcontroller12.phar.phpt"
+  ["frontcontroller13.phar.phpt"]=>
+  string(%d) "%sfrontcontroller13.phar.phpt"
+  ["frontcontroller14.phar.phpt"]=>
+  string(%d) "%sfrontcontroller14.phar.phpt"
+  ["frontcontroller15.phar.phpt"]=>
+  string(%d) "%sfrontcontroller15.phar.phpt"
+  ["frontcontroller16.phar.phpt"]=>
+  string(%d) "%sfrontcontroller16.phar.phpt"
+  ["frontcontroller17.phar.phpt"]=>
+  string(%d) "%sfrontcontroller17.phar.phpt"
+  ["frontcontroller18.phar.phpt"]=>
+  string(%d) "%sfrontcontroller18.phar.phpt"
+  ["frontcontroller19.phar.phpt"]=>
+  string(%d) "%sfrontcontroller19.phar.phpt"
+  ["frontcontroller2.phar.phpt"]=>
+  string(%d) "%sfrontcontroller2.phar.phpt"
+  ["frontcontroller20.phar.phpt"]=>
+  string(%d) "%sfrontcontroller20.phar.phpt"
+  ["frontcontroller21.phar.phpt"]=>
+  string(%d) "%sfrontcontroller21.phar.phpt"
+  ["frontcontroller3.phar.phpt"]=>
+  string(%d) "%sfrontcontroller3.phar.phpt"
+  ["frontcontroller4.phar.phpt"]=>
+  string(%d) "%sfrontcontroller4.phar.phpt"
+  ["frontcontroller5.phar.phpt"]=>
+  string(%d) "%sfrontcontroller5.phar.phpt"
+  ["frontcontroller6.phar.phpt"]=>
+  string(%d) "%sfrontcontroller6.phar.phpt"
+  ["frontcontroller7.phar.phpt"]=>
+  string(%d) "%sfrontcontroller7.phar.phpt"
+  ["frontcontroller8.phar.phpt"]=>
+  string(%d) "%sfrontcontroller8.phar.phpt"
+  ["frontcontroller9.phar.phpt"]=>
+  string(%d) "%sfrontcontroller9.phar.phpt"
+}
+bool(true)
+===DONE===
diff --git a/ext/phar/tests/zip/phar_buildfromiterator9.phpt b/ext/phar/tests/zip/phar_buildfromiterator9.phpt
new file mode 100644 (file)
index 0000000..0b56307
--- /dev/null
@@ -0,0 +1,65 @@
+--TEST--
+Phar::buildFromIterator() iterator, 1 file resource passed in
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+class myIterator implements Iterator
+{
+    var $a;
+    function __construct(array $a)
+    {
+        $this->a = $a;
+    }
+    function next() {
+        echo "next\n";
+        return next($this->a);
+    }
+    function current() {
+        echo "current\n";
+        return current($this->a);
+    }
+    function key() {
+        echo "key\n";
+        return key($this->a);
+    }
+    function valid() {
+        echo "valid\n";
+        return current($this->a);
+    }
+    function rewind() {
+        echo "rewind\n";
+        return reset($this->a);
+    }
+}
+try {
+       chdir(dirname(__FILE__));
+       $phar = new Phar(dirname(__FILE__) . '/buildfromiterator.phar');
+       var_dump($phar->buildFromIterator(new myIterator(array('a' => $a = fopen(basename(__FILE__, 'php') . 'phpt', 'r')))));
+       fclose($a);
+} catch (Exception $e) {
+       var_dump(get_class($e));
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/buildfromiterator.phar');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+rewind
+valid
+current
+key
+next
+valid
+array(1) {
+  ["a"]=>
+  string(%d) "[stream]"
+}
+===DONE===
diff --git a/ext/phar/tests/zip/phar_commitwrite.phpt b/ext/phar/tests/zip/phar_commitwrite.phpt
new file mode 100644 (file)
index 0000000..b954e60
--- /dev/null
@@ -0,0 +1,44 @@
+--TEST--
+Phar::setStub()/stopBuffering() tar-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar.zip', 0, 'brandnewphar.phar');
+$p['file1.txt'] = 'hi';
+$p->stopBuffering();
+var_dump($p->getStub());
+$p->setStub("<?php
+function __autoload(\$class)
+{
+    include 'phar://' . str_replace('_', '/', \$class);
+}
+Phar::mapPhar('brandnewphar.phar');
+include 'phar://brandnewphar.phar/startup.php';
+__HALT_COMPILER();
+?>");
+var_dump($p->getStub());
+var_dump($p->isZip());
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/brandnewphar.phar.zip');
+?>
+--EXPECT--
+string(60) "<?php // zip-based phar archive stub file
+__HALT_COMPILER();"
+string(200) "<?php
+function __autoload($class)
+{
+    include 'phar://' . str_replace('_', '/', $class);
+}
+Phar::mapPhar('brandnewphar.phar');
+include 'phar://brandnewphar.phar/startup.php';
+__HALT_COMPILER(); ?>
+"
+bool(true)
+===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/zip/phar_copy.phpt b/ext/phar/tests/zip/phar_copy.phpt
new file mode 100644 (file)
index 0000000..d5a234f
--- /dev/null
@@ -0,0 +1,56 @@
+--TEST--
+Phar: copy() zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
+<?php if (!extension_loaded("zlib")) die("skip zlib not available"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=1
+--FILE--
+<?php
+
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$fname2 = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '2.phar.php';
+
+$pname = 'phar://'.$fname;
+$iname = '/file.txt';
+$ename = '/error/';
+
+$p = new Phar($fname);
+
+try
+{
+       $p['a'] = 'hi';
+       $p->startBuffering();
+       $p->copy('a', 'b');
+       echo file_get_contents($p['b']->getPathName());
+       $p->copy('b', 'c');
+       $p->stopBuffering();
+       echo file_get_contents($p['c']->getPathName());
+       copy($fname, $fname2);
+       var_dump($p->isZip());
+       $p->copy('a', $ename);
+}
+catch(Exception $e)
+{
+       echo $e->getMessage() . "\n";
+}
+ini_set('phar.readonly',1);
+$p2 = new Phar($fname2);
+var_dump($p2->isZip());
+echo "\n";
+echo 'a: ' , file_get_contents($p2['a']->getPathName());
+echo 'b: ' ,file_get_contents($p2['b']->getPathName());
+echo 'c: ' ,file_get_contents($p2['c']->getPathName());
+?>
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php'); ?>
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '2.phar.php'); ?>
+--EXPECTF--
+hihibool(true)
+file "/error/" contains invalid characters empty directory, cannot be copied from "a" in phar %s
+bool(true)
+
+a: hib: hic: hi===DONE===
\ No newline at end of file
diff --git a/ext/phar/tests/zip/phar_magic.phpt b/ext/phar/tests/zip/phar_magic.phpt
new file mode 100644 (file)
index 0000000..7afcc3a
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Phar: include/fopen magic zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.zip.php';
+$p = new Phar($fname);
+var_dump($p->isZip());
+$p['a'] = '<?php include "b/c.php";' . "\n";
+$p['b/c.php'] = '<?php echo "in b\n";$a = fopen("a", "r", true);echo stream_get_contents($a);fclose($a);include dirname(__FILE__) . "/../d";';
+$p['d'] = "in d\n";
+$p->setStub('<?php
+include "phar://" . __FILE__ . "/a";
+__HALT_COMPILER();');
+include $fname;
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.zip.php');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+bool(true)
+in b
+<?php include "b/c.php";
+in d
+===DONE===
diff --git a/ext/phar/tests/zip/phar_setalias.phpt b/ext/phar/tests/zip/phar_setalias.phpt
new file mode 100644 (file)
index 0000000..ecd969a
--- /dev/null
@@ -0,0 +1,42 @@
+--TEST--
+Phar::setAlias() zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', '<?php echo "first stub\n"; __HALT_COMPILER(); ?>');
+
+$files = array();
+$files['a'] = 'a';
+$files['b'] = 'b';
+$files['c'] = 'c';
+$files['.phar/alias.txt'] = 'hio';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$phar = new Phar($fname);
+echo $phar->getAlias() . "\n";
+$phar->setAlias('test');
+echo $phar->getAlias() . "\n";
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phartmp.php');
+__HALT_COMPILER();
+?>
+--EXPECT--
+hio
+test
+===DONE===
diff --git a/ext/phar/tests/zip/phar_setalias2.phpt b/ext/phar/tests/zip/phar_setalias2.phpt
new file mode 100644 (file)
index 0000000..0fc6430
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Phar::setAlias() error zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', '<?php echo "first stub\n"; __HALT_COMPILER(); ?>');
+
+$files = array();
+$files['a'] = 'a';
+$files['b'] = 'b';
+$files['c'] = 'c';
+$files['.phar/alias.txt'] = 'hio';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$phar = new Phar($fname);
+echo $phar->getAlias() . "\n";
+$phar->setAlias('test');
+echo $phar->getAlias() . "\n";
+$phar = new Phar(dirname(__FILE__) . '/notphar.phar');
+try {
+       $phar->setAlias('test');
+} catch (Exception $e) {
+       echo $e->getMessage() . "\n";
+}
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
+unlink(dirname(__FILE__) . '/notphar.phar');
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phartmp.php');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+hio
+test
+alias "test" is already used for archive "%sphar_setalias2.phar.php" and cannot be used for other archives
+===DONE===
diff --git a/ext/phar/tests/zip/phar_stub_error.phpt b/ext/phar/tests/zip/phar_stub_error.phpt
new file mode 100755 (executable)
index 0000000..6a1d3fc
--- /dev/null
@@ -0,0 +1,62 @@
+--TEST--
+Phar::setStub()/getStub() zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.require_hash=0
+phar.readonly=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', $stub = '<?php echo "first stub\n"; __HALT_COMPILER(); ?>');
+
+$files = array();
+$files['a'] = 'a';
+$files['.phar/alias.txt'] = 'hio';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$phar = new Phar($fname);
+var_dump($stub);
+var_dump($phar->getStub());
+var_dump($phar->getStub() == $stub);
+
+$newstub = '<?php echo "second stub\n"; _x_HALT_COMPILER(); ?>';
+try
+{
+       $phar->setStub($newstub);
+}
+catch(exception $e)
+{
+       echo 'Exception: ' . $e->getMessage() . "\n";
+}
+var_dump($phar->getStub());
+var_dump($phar->getStub() == $stub);
+$phar->stopBuffering();
+var_dump($phar->getStub());
+var_dump($phar->getStub() == $stub);
+
+?>
+===DONE===
+--CLEAN--
+<?php 
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
+__HALT_COMPILER();
+?>
+--EXPECTF--
+string(48) "<?php echo "first stub\n"; __HALT_COMPILER(); ?>"
+string(48) "<?php echo "first stub\n"; __HALT_COMPILER(); ?>"
+bool(true)
+Exception: illegal stub for zip-based phar "%sphar_stub_error.phar.php"
+string(48) "<?php echo "first stub\n"; __HALT_COMPILER(); ?>"
+bool(true)
+string(48) "<?php echo "first stub\n"; __HALT_COMPILER(); ?>"
+bool(true)
+===DONE===
diff --git a/ext/phar/tests/zip/refcount1.phpt b/ext/phar/tests/zip/refcount1.phpt
new file mode 100644 (file)
index 0000000..b70fb5e
--- /dev/null
@@ -0,0 +1,71 @@
+--TEST--
+Phar: test that refcounting avoids problems with deleting a file zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
+<?php if (version_compare(PHP_VERSION, "5.3", "<")) die("skip requires 5.3 or later"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+$files['.phar/alias.txt'] = 'hio';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$fp = fopen($pname . '/b/c.php', 'wb');
+fwrite($fp, "extra");
+fclose($fp);
+echo "===CLOSE===\n";
+$p = new Phar($fname);
+$b = fopen($pname . '/b/c.php', 'rb');
+$a = $p['b/c.php'];
+var_dump($a);
+var_dump(fread($b, 20));
+rewind($b);
+echo "===UNLINK===\n";
+unlink($pname . '/b/c.php');
+var_dump($a);
+var_dump(fread($b, 20));
+include $pname . '/b/c.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECTF--
+===CLOSE===
+object(PharFileInfo)#%d (2) {
+  ["pathName":"SplFileInfo":private]=>
+  string(%d) "phar://%srefcount1.phar.php/b"
+  ["fileName":"SplFileInfo":private]=>
+  string(%d) "phar://%srefcount1.phar.php/b/c.php"
+}
+string(5) "extra"
+===UNLINK===
+
+Warning: unlink(): phar error: "b/c.php" in phar "%srefcount1.phar.php", has open file pointers, cannot unlink in %srefcount1.php on line %d
+object(PharFileInfo)#%d (2) {
+  ["pathName":"SplFileInfo":private]=>
+  string(%d) "phar://%srefcount1.phar.php/b"
+  ["fileName":"SplFileInfo":private]=>
+  string(%s) "phar://%srefcount1.phar.php/b/c.php"
+}
+string(5) "extra"
+extra
+===DONE===
diff --git a/ext/phar/tests/zip/refcount1_5_2.phpt b/ext/phar/tests/zip/refcount1_5_2.phpt
new file mode 100755 (executable)
index 0000000..5098ccd
--- /dev/null
@@ -0,0 +1,63 @@
+--TEST--
+Phar: test that refcounting avoids problems with deleting a file zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("spl")) die("skip SPL not available"); ?>
+<?php if (version_compare(PHP_VERSION, "5.2", ">")) die("skip requires 5.2 or earlier"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php __HALT_COMPILER(); ?>");
+
+
+$files = array();
+$files['a.php'] = '<?php echo "This is a\n"; ?>';
+$files['b.php'] = '<?php echo "This is b\n"; ?>';
+$files['b/c.php'] = '<?php echo "This is b/c\n"; ?>';
+$files['.phar/alias.txt'] = 'hio';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+$fp = fopen($pname . '/b/c.php', 'wb');
+fwrite($fp, "extra");
+fclose($fp);
+echo "===CLOSE===\n";
+$p = new Phar($fname);
+$b = fopen($pname . '/b/c.php', 'rb');
+$a = $p['b/c.php'];
+var_dump($a);
+var_dump(fread($b, 20));
+rewind($b);
+echo "===UNLINK===\n";
+unlink($pname . '/b/c.php');
+var_dump($a);
+var_dump(fread($b, 20));
+include $pname . '/b/c.php';
+?>
+
+===DONE===
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECTF--
+===CLOSE===
+object(PharFileInfo)#%d (0) {
+}
+string(5) "extra"
+===UNLINK===
+
+Warning: unlink(): phar error: "b/c.php" in phar "%sefcount1.phar.php", has open file pointers, cannot unlink in %sefcount1.php on line %d
+object(PharFileInfo)#%d (0) {
+}
+string(5) "extra"
+extra
+===DONE===
diff --git a/ext/phar/tests/zip/rename.phpt b/ext/phar/tests/zip/rename.phpt
new file mode 100644 (file)
index 0000000..9a97f26
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+Phar: rename test zip-based
+--SKIPIF--
+<?php if (!extension_loaded("phar")) die("skip"); ?>
+<?php if (!extension_loaded("zip")) die("skip"); ?>
+--INI--
+phar.readonly=0
+phar.require_hash=0
+--FILE--
+<?php
+include dirname(__FILE__) . '/tarmaker.php.inc';
+$fname = dirname(__FILE__) . '/' . basename(__FILE__, '.php') . '.phar.php';
+$pname = 'phar://' . $fname;
+$a = new tarmaker($fname, 'none');
+$a->init();
+$a->addFile('.phar/stub.php', "<?php
+Phar::mapPhar('hio');
+__HALT_COMPILER(); ?>");
+
+$files = array();
+$files['a'] = 'a';
+foreach ($files as $n => $file) {
+$a->addFile($n, $file);
+}
+$a->close();
+
+include $fname;
+
+echo file_get_contents($pname . '/a') . "\n";
+rename($pname . '/a', $pname . '/b');
+echo file_get_contents($pname . '/b') . "\n";
+echo file_get_contents($pname . '/a') . "\n";
+?>
+--CLEAN--
+<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+--EXPECTF--
+a
+a
+
+Warning: file_get_contents(phar://%srename.phar.php/a): failed to open stream: phar error: "a" is not a file in phar "%srename.phar.php" in %srename.php on line %d
\ No newline at end of file
diff --git a/ext/phar/tests/zip/tarmaker.php.inc b/ext/phar/tests/zip/tarmaker.php.inc
new file mode 100644 (file)
index 0000000..ad05ae6
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+// stolen from PEAR2_Pyrus_Developer_Creator_Zip by Greg Beaver, the original author, for use in unit tests
+class tarmaker
+{
+    /**
+     * Path to archive file
+     *
+     * @var string
+     */
+    protected $archive;
+    /**
+     * @var ZIPArchive
+     */
+    protected $zip;
+    protected $path;
+    function __construct($path)
+    {
+        if (!class_exists('ZIPArchive')) {
+            throw new Exception(
+                'Zip extension is not available');
+        }
+        $this->path = $path;
+    }
+
+    /**
+     * save a file inside this package
+     * @param string relative path within the package
+     * @param string|resource file contents or open file handle
+     */
+    function addFile($path, $fileOrStream)
+    {
+        if (is_resource($fileOrStream)) {
+            $this->zip->addFromString($path, stream_get_contents($fileOrStream));
+        } else {
+            $this->zip->addFromString($path, $fileOrStream);
+        }
+    }
+
+    /**
+     * Initialize the package creator
+     */
+    function init()
+    {
+        $this->zip = new ZipArchive;
+        if (true !== $this->zip->open($this->path, ZIPARCHIVE::CREATE)) {
+            throw new Exception(
+                'Cannot open ZIP archive ' . $this->path
+            );
+        }
+    }
+
+    /**
+     * Create an internal directory, creating parent directories as needed
+     * 
+     * This is a no-op for the tar creator
+     * @param string $dir
+     */
+    function mkdir($dir)
+    {
+        $this->zip->addEmptyDir($dir);
+    }
+
+    /**
+     * Finish saving the package
+     */
+    function close()
+    {
+        $this->zip->close();
+    }
+}
\ No newline at end of file