diff options
author | Hartmut Holzgraefe <hholzgra@php.net> | 2000-10-13 00:09:31 +0000 |
---|---|---|
committer | Hartmut Holzgraefe <hholzgra@php.net> | 2000-10-13 00:09:31 +0000 |
commit | cae27179ce1f84d47de87c4efbbcbd814f3c7bc6 (patch) | |
tree | ec1b0d87eb57dacc359cef6fe1fc616d9af88e80 | |
parent | e07e515a1b28dd04911ac9d2f1a099efc2d69160 (diff) | |
download | php-git-cae27179ce1f84d47de87c4efbbcbd814f3c7bc6.tar.gz |
fopen wrappers cleanup
- comfiguration is now done by an ini parameter
instead of a compile time option
- the implementations of the three standard wrappers
now live in seperate files in ext/standard
- the compiler is happy again, no more warnings
-rw-r--r-- | configure.in | 10 | ||||
-rw-r--r-- | ext/standard/Makefile.in | 3 | ||||
-rw-r--r-- | ext/standard/basic_functions.c | 22 | ||||
-rw-r--r-- | ext/standard/ftp_fopen_wrapper.c | 310 | ||||
-rw-r--r-- | ext/standard/http_fopen_wrapper.c | 221 | ||||
-rw-r--r-- | ext/standard/php_fopen_wrapper.c | 47 | ||||
-rw-r--r-- | ext/standard/php_fopen_wrappers.h | 30 | ||||
-rw-r--r-- | ext/zlib/zlib.c | 41 | ||||
-rw-r--r-- | main/fopen_wrappers.c | 494 | ||||
-rw-r--r-- | main/fopen_wrappers.h | 3 | ||||
-rw-r--r-- | main/main.c | 13 | ||||
-rw-r--r-- | main/php_globals.h | 2 | ||||
-rw-r--r-- | php.ini-dist | 6 | ||||
-rw-r--r-- | php.ini-optimized | 6 | ||||
-rw-r--r-- | php.ini-recommended | 6 |
15 files changed, 718 insertions, 496 deletions
diff --git a/configure.in b/configure.in index 87b696a999..d38112bda9 100644 --- a/configure.in +++ b/configure.in @@ -543,16 +543,6 @@ else AC_DEFINE(DEFAULT_SHORT_OPEN_TAG,0,[ ]) fi -PHP_ARG_ENABLE(url-fopen-wrapper,whether to enable the URL-aware fopen wrapper, -[ --disable-url-fopen-wrapper - Disable the URL-aware fopen wrapper that allows - accessing files via http or ftp.], yes) - -if test "$PHP_URL_FOPEN_WRAPPER" = "yes"; then - AC_DEFINE(PHP_URL_FOPEN, 1, [ ]) -else - AC_DEFINE(PHP_URL_FOPEN, 0, [ ]) -fi PHP_ARG_ENABLE(pic,whether to enable PIC for shared objects, [ --disable-pic Disable PIC for shared objects], yes) diff --git a/ext/standard/Makefile.in b/ext/standard/Makefile.in index 9a3ea42634..e8446a4737 100644 --- a/ext/standard/Makefile.in +++ b/ext/standard/Makefile.in @@ -7,7 +7,8 @@ LTLIBRARY_SOURCES=\ link.c mail.c math.c md5.c metaphone.c microtime.c pack.c pageinfo.c \ parsedate.c quot_print.c rand.c reg.c soundex.c string.c scanf.c \ syslog.c type.c uniqid.c url.c url_scanner.c var.c output.c assert.c \ - strnatcmp.c levenshtein.c incomplete_class.c url_scanner_ex.c + strnatcmp.c levenshtein.c incomplete_class.c url_scanner_ex.c \ + ftp_fopen_wrapper.c http_fopen_wrapper.c php_fopen_wrapper.c include $(top_srcdir)/build/dynlib.mk diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 5338180e88..2459d06173 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -62,6 +62,8 @@ int basic_globals_id; php_basic_globals basic_globals; #endif +#include "php_fopen_wrappers.h" + static unsigned char second_and_third_args_force_ref[] = { 3, BYREF_NONE, BYREF_FORCE, BYREF_FORCE }; static unsigned char second_args_force_ref[] = { 2, BYREF_NONE, BYREF_FORCE }; static unsigned char third_argument_force_ref[] = { 3, BYREF_NONE, BYREF_NONE, BYREF_FORCE }; @@ -669,6 +671,8 @@ static void basic_globals_dtor(BLS_D) PHP_MINIT_FUNCTION(basic) { + PLS_FETCH(); + #ifdef ZTS basic_globals_id = ts_allocate_id(sizeof(php_basic_globals), (ts_allocate_ctor) basic_globals_ctor, (ts_allocate_dtor) basic_globals_dtor); #else @@ -714,6 +718,18 @@ PHP_MINIT_FUNCTION(basic) PHP_MINIT(array)(INIT_FUNC_ARGS_PASSTHRU); PHP_MINIT(assert)(INIT_FUNC_ARGS_PASSTHRU); + if(PG(allow_url_fopen)) { + if(FAILURE==php_register_url_wrapper("http",php_fopen_url_wrap_http)) { + return FAILURE; + } + if(FAILURE==php_register_url_wrapper("ftp",php_fopen_url_wrap_ftp)) { + return FAILURE; + } + if(FAILURE==php_register_url_wrapper("php",php_fopen_url_wrap_ftp)) { + return FAILURE; + } + } + return SUCCESS; } @@ -736,6 +752,12 @@ PHP_MSHUTDOWN_FUNCTION(basic) PHP_MSHUTDOWN(array)(SHUTDOWN_FUNC_ARGS_PASSTHRU); PHP_MSHUTDOWN(assert)(SHUTDOWN_FUNC_ARGS_PASSTHRU); + if(PG(allow_url_fopen)) { + php_unregister_url_wrapper("http"); + php_unregister_url_wrapper("ftp"); + php_unregister_url_wrapper("php"); + } + return SUCCESS; } diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c new file mode 100644 index 0000000000..f8f4f4413f --- /dev/null +++ b/ext/standard/ftp_fopen_wrapper.c @@ -0,0 +1,310 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | + | Jim Winstead <jimw@php.net> | + | Hartmut Holzgraefe <hholzgra@php.net> | + +----------------------------------------------------------------------+ + */ +/* $Id$ */ + +#include "php.h" +#include "php_globals.h" + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#ifdef PHP_WIN32 +#include <windows.h> +#include <winsock.h> +#define O_RDONLY _O_RDONLY +#include "win32/param.h" +#else +#include <sys/param.h> +#endif + +#include "php_standard.h" + +#include <sys/types.h> +#if HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif + +#ifdef PHP_WIN32 +#include <winsock.h> +#else +#include <netinet/in.h> +#include <netdb.h> +#include <arpa/inet.h> +#endif + +#ifdef PHP_WIN32 +#undef AF_UNIX +#endif + +#if defined(AF_UNIX) +#include <sys/un.h> +#endif + +#include "php_fopen_wrappers.h" + +static int php_get_ftp_result(int socketd) +{ + char tmp_line[513]; + + while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, socketd) && + !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && + isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); + + return strtol(tmp_line, NULL, 10); +} + + +FILE *php_fopen_url_wrap_ftp(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) +{ + FILE *fp=NULL; + php_url *resource=NULL; + char tmp_line[512]; + unsigned short portno; + char *scratch; + int result; + int i; + char *tpath, *ttpath; + + resource = url_parse((char *) path); + if (resource == NULL) { + php_error(E_WARNING, "Invalid URL specified, %s", path); + *issock = BAD_URL; + return NULL; + } else if (resource->path == NULL) { + php_error(E_WARNING, "No file-path specified"); + free_url(resource); + *issock = BAD_URL; + return NULL; + } + /* use port 21 if one wasn't specified */ + if (resource->port == 0) + resource->port = 21; + + *socketd = php_hostconnect(resource->host, resource->port, SOCK_STREAM, 0); + if (*socketd == -1) + goto errexit; +#if 0 + if ((fpc = fdopen(*socketd, "r+")) == NULL) { + free_url(resource); + return NULL; + } +#ifdef HAVE_SETVBUF + if ((setvbuf(fpc, NULL, _IONBF, 0)) != 0) { + free_url(resource); + fclose(fpc); + return NULL; + } +#endif +#endif + + /* Start talking to ftp server */ + result = php_get_ftp_result(*socketd); + if (result > 299 || result < 200) + goto errexit; + + /* send the user name */ + SOCK_WRITE("USER ", *socketd); + if (resource->user != NULL) { + php_raw_url_decode(resource->user, strlen(resource->user)); + SOCK_WRITE(resource->user, *socketd); + } else { + SOCK_WRITE("anonymous", *socketd); + } + SOCK_WRITE("\r\n", *socketd); + + /* get the response */ + result = php_get_ftp_result(*socketd); + + /* if a password is required, send it */ + if (result >= 300 && result <= 399) { + SOCK_WRITE("PASS ", *socketd); + if (resource->pass != NULL) { + php_raw_url_decode(resource->pass, strlen(resource->pass)); + SOCK_WRITE(resource->pass, *socketd); + } else { + /* if the user has configured who they are, + send that as the password */ + if (cfg_get_string("from", &scratch) == SUCCESS) { + SOCK_WRITE(scratch, *socketd); + } else { + SOCK_WRITE("anonymous", *socketd); + } + } + SOCK_WRITE("\r\n", *socketd); + + /* read the response */ + result = php_get_ftp_result(*socketd); + } + if (result > 299 || result < 200) + goto errexit; + + /* set the connection to be binary */ + SOCK_WRITE("TYPE I\r\n", *socketd); + result = php_get_ftp_result(*socketd); + if (result > 299 || result < 200) + goto errexit; + + /* find out the size of the file (verifying it exists) */ + SOCK_WRITE("SIZE ", *socketd); + SOCK_WRITE(resource->path, *socketd); + SOCK_WRITE("\r\n", *socketd); + + /* read the response */ + result = php_get_ftp_result(*socketd); + if (mode[0] == 'r') { + /* when reading file, it must exist */ + if (result > 299 || result < 200) { + php_error(E_WARNING, "File not found"); + free_url(resource); + SOCK_FCLOSE(*socketd); + *socketd = 0; + errno = ENOENT; + return NULL; + } + } else { + /* when writing file, it must NOT exist */ + if (result <= 299 && result >= 200) { + php_error(E_WARNING, "File already exists"); + free_url(resource); + SOCK_FCLOSE(*socketd); + *socketd = 0; + errno = EEXIST; + return NULL; + } + } + + /* set up the passive connection */ + + /* We try EPSV first, needed for IPv6 and works on some IPv4 servers */ + SOCK_WRITE("EPSV\r\n", *socketd); + while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) && + !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && + isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); + + /* check if we got a 229 response */ + if (strncmp(tmp_line, "229", 3)) { + /* EPSV failed, let's try PASV */ + SOCK_WRITE("PASV\r\n", *socketd); + while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) && + !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && + isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); + /* make sure we got a 227 response */ + if (strncmp(tmp_line, "227", 3)) + goto errexit; + /* parse pasv command (129,80,95,25,13,221) */ + tpath = tmp_line; + /* skip over the "227 Some message " part */ + for (tpath += 4; *tpath && !isdigit((int) *tpath); tpath++); + if (!*tpath) + goto errexit; + /* skip over the host ip, we just assume it's the same */ + for (i = 0; i < 4; i++) { + for (; isdigit((int) *tpath); tpath++); + if (*tpath != ',') + goto errexit; + tpath++; + } + /* pull out the MSB of the port */ + portno = (unsigned short) strtol(tpath, &ttpath, 10) * 256; + if (ttpath == NULL) { + /* didn't get correct response from PASV */ + goto errexit; + } + tpath = ttpath; + if (*tpath != ',') + goto errexit; + tpath++; + /* pull out the LSB of the port */ + portno += (unsigned short) strtol(tpath, &ttpath, 10); + } else { + /* parse epsv command (|||6446|) */ + for (i = 0, tpath = tmp_line + 4; *tpath; tpath++) { + if (*tpath == '|') { + i++; + if (i == 3) + break; + } + } + if (i < 3) + goto errexit; + /* pull out the port */ + portno = (unsigned short) strtol(tpath + 1, &ttpath, 10); + } + + if (ttpath == NULL) { + /* didn't get correct response from EPSV/PASV */ + goto errexit; + } + + if (mode[0] == 'r') { + /* retrieve file */ + SOCK_WRITE("RETR ", *socketd); + } else { + /* store file */ + SOCK_WRITE("STOR ", *socketd); + } + if (resource->path != NULL) { + SOCK_WRITE(resource->path, *socketd); + } else { + SOCK_WRITE("/", *socketd); + } + + /* close control connection */ + SOCK_WRITE("\r\nQUIT\r\n", *socketd); + SOCK_FCLOSE(*socketd); + + /* open the data channel */ + *socketd = php_hostconnect(resource->host, portno, SOCK_STREAM, 0); + if (*socketd == -1) + goto errexit; +#if 0 + if (mode[0] == 'r') { + if ((fp = fdopen(*socketd, "r+")) == NULL) { + free_url(resource); + return NULL; + } + } else { + if ((fp = fdopen(*socketd, "w+")) == NULL) { + free_url(resource); + return NULL; + } + } +#ifdef HAVE_SETVBUF + if ((setvbuf(fp, NULL, _IONBF, 0)) != 0) { + free_url(resource); + fclose(fp); + return NULL; + } +#endif +#endif + free_url(resource); + *issock = 1; + return (fp); + + errexit: + free_url(resource); + SOCK_FCLOSE(*socketd); + *socketd = 0; + return NULL; +} diff --git a/ext/standard/http_fopen_wrapper.c b/ext/standard/http_fopen_wrapper.c new file mode 100644 index 0000000000..e22866649c --- /dev/null +++ b/ext/standard/http_fopen_wrapper.c @@ -0,0 +1,221 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | + | Jim Winstead <jimw@php.net> | + | Hartmut Holzgraefe <hholzgra@php.net> | + +----------------------------------------------------------------------+ + */ +/* $Id$ */ + +#include "php.h" +#include "php_globals.h" + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#ifdef PHP_WIN32 +#include <windows.h> +#include <winsock.h> +#define O_RDONLY _O_RDONLY +#include "win32/param.h" +#else +#include <sys/param.h> +#endif + +#include "php_standard.h" + +#include <sys/types.h> +#if HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif + +#ifdef PHP_WIN32 +#include <winsock.h> +#else +#include <netinet/in.h> +#include <netdb.h> +#include <arpa/inet.h> +#endif + +#ifdef PHP_WIN32 +#undef AF_UNIX +#endif + +#if defined(AF_UNIX) +#include <sys/un.h> +#endif + +#include "php_fopen_wrappers.h" + +FILE *php_fopen_url_wrap_http(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) +{ + FILE *fp=NULL; + php_url *resource=NULL; + char tmp_line[512]; + char location[512]; + char hdr_line[8192]; + int body = 0; + char *scratch; + unsigned char *tmp; + int len; + int reqok = 0; + + resource = url_parse((char *) path); + if (resource == NULL) { + php_error(E_WARNING, "Invalid URL specified, %s", path); + *issock = BAD_URL; + return NULL; + } + /* use port 80 if one wasn't specified */ + if (resource->port == 0) + resource->port = 80; + + *socketd = php_hostconnect(resource->host, resource->port, SOCK_STREAM, 0); + if (*socketd == -1) { + SOCK_FCLOSE(*socketd); + *socketd = 0; + free_url(resource); + return NULL; + } +#if 0 + if ((fp = fdopen(*socketd, "r+")) == NULL) { + free_url(resource); + return NULL; + } +#ifdef HAVE_SETVBUF + if ((setvbuf(fp, NULL, _IONBF, 0)) != 0) { + free_url(resource); + return NULL; + } +#endif +#endif /*win32 */ + + strcpy(hdr_line, "GET "); + + /* tell remote http which file to get */ + if (resource->path != NULL) { + strlcat(hdr_line, resource->path, sizeof(hdr_line)); + } else { + strlcat(hdr_line, "/", sizeof(hdr_line)); + } + /* append the query string, if any */ + if (resource->query != NULL) { + strlcat(hdr_line, "?", sizeof(hdr_line)); + strlcat(hdr_line, resource->query, sizeof(hdr_line)); + } + strlcat(hdr_line, " HTTP/1.0\r\n", sizeof(hdr_line)); + SOCK_WRITE(hdr_line, *socketd); + + /* send authorization header if we have user/pass */ + if (resource->user != NULL && resource->pass != NULL) { + scratch = (char *) emalloc(strlen(resource->user) + strlen(resource->pass) + 2); + if (!scratch) { + free_url(resource); + return NULL; + } + strcpy(scratch, resource->user); + strcat(scratch, ":"); + strcat(scratch, resource->pass); + tmp = php_base64_encode((unsigned char *)scratch, strlen(scratch), NULL); + + if (snprintf(hdr_line, sizeof(hdr_line), + "Authorization: Basic %s\r\n", tmp) > 0) { + SOCK_WRITE(hdr_line, *socketd); + } + + efree(scratch); + efree(tmp); + } + /* if the user has configured who they are, send a From: line */ + if (cfg_get_string("from", &scratch) == SUCCESS) { + if (snprintf(hdr_line, sizeof(hdr_line), + "From: %s\r\n", scratch) > 0) { + SOCK_WRITE(hdr_line, *socketd); + } + + } + /* send a Host: header so name-based virtual hosts work */ + if (resource->port != 80) { + len = snprintf(hdr_line, sizeof(hdr_line), + "Host: %s:%i\r\n", resource->host, resource->port); + } else { + len = snprintf(hdr_line, sizeof(hdr_line), + "Host: %s\r\n", resource->host); + } + if(len > sizeof(hdr_line) - 1) { + len = sizeof(hdr_line) - 1; + } + if (len > 0) { + SOCK_WRITE(hdr_line, *socketd); + } + + /* identify ourselves and end the headers */ + SOCK_WRITE("User-Agent: PHP/" PHP_VERSION "\r\n\r\n", *socketd); + + body = 0; + location[0] = '\0'; + if (!SOCK_FEOF(*socketd)) { + /* get response header */ + if (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) != NULL) { + if (strncmp(tmp_line + 8, " 200 ", 5) == 0) { + reqok = 1; + } + } + } + /* Read past HTTP headers */ + while (!body && !SOCK_FEOF(*socketd)) { + if (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) != NULL) { + char *p = tmp_line; + + tmp_line[sizeof(tmp_line)-1] = '\0'; + + while (*p) { + if (*p == '\n' || *p == '\r') { + *p = '\0'; + } + p++; + } + + if (!strncasecmp(tmp_line, "Location: ", 10)) { + strlcpy(location, tmp_line + 10, sizeof(location)); + } + + if (tmp_line[0] == '\0') { + body = 1; + } + } + } + if (!reqok) { + SOCK_FCLOSE(*socketd); + *socketd = 0; + free_url(resource); +#if 0 + if (location[0] != '\0') { + return php_fopen_url_wrapper(location, mode, options, issock, socketd, opened_path); + } else { + return NULL; + } +#else + return NULL; +#endif + } + free_url(resource); + *issock = 1; + return (fp); +} diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c new file mode 100644 index 0000000000..2108808c84 --- /dev/null +++ b/ext/standard/php_fopen_wrapper.c @@ -0,0 +1,47 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | + | Jim Winstead <jimw@php.net> | + | Hartmut Holzgraefe <hholzgra@php.net> | + +----------------------------------------------------------------------+ + */ +/* $Id$ */ + +#include <stdio.h> +#include <stdlib.h> + +#include "php.h" +#include "php_globals.h" +#include "php_standard.h" +#include "php_fopen_wrappers.h" + + + +FILE *php_fopen_url_wrap_php(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) +{ + const char *res = path + 6; + + *issock = 0; + + if (!strcasecmp(res, "stdin")) { + return fdopen(STDIN_FILENO, mode); + } else if (!strcasecmp(res, "stdout")) { + return fdopen(STDOUT_FILENO, mode); + } else if (!strcasecmp(res, "stderr")) { + return fdopen(STDERR_FILENO, mode); + } + + return NULL; +} diff --git a/ext/standard/php_fopen_wrappers.h b/ext/standard/php_fopen_wrappers.h new file mode 100644 index 0000000000..0cd10e7215 --- /dev/null +++ b/ext/standard/php_fopen_wrappers.h @@ -0,0 +1,30 @@ +/* + +----------------------------------------------------------------------+ + | PHP version 4.0 | + +----------------------------------------------------------------------+ + | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.02 of the PHP license, | + | that is bundled with this package in the file LICENSE, and is | + | available at through the world-wide-web at | + | http://www.php.net/license/2_02.txt. | + | If you did not receive a copy of the PHP license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | license@php.net so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> | + | Jim Winstead <jimw@php.net> | + | Hartmut Holzgraefe <hholzgra@php.net> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#ifndef PHP_FOPEN_WRAPPERS_H +#define PHP_FOPEN_WRAPPERS_H + +extern FILE *php_fopen_url_wrap_http(char *, char *, int, int *, int *, char **); +extern FILE *php_fopen_url_wrap_ftp(char *, char *, int, int *, int *, char **); +extern FILE *php_fopen_url_wrap_php(char *, char *, int, int *, int *, char **); + +#endif diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c index 4e160f506d..5c34a0ed37 100644 --- a/ext/zlib/zlib.c +++ b/ext/zlib/zlib.c @@ -23,6 +23,7 @@ #if HAVE_FOPENCOOKIE #define _GNU_SOURCE +#define __USE_GNU #include "libio.h" #endif @@ -84,7 +85,7 @@ static php_zlib_globals zlib_globals; #endif #if HAVE_FOPENCOOKIE -static FILE *zlib_fopen_wrapper(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path); +static FILE *zlib_fopen_wrapper(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path); #endif /* True globals, no need for thread safety */ @@ -139,6 +140,8 @@ static void php_zlib_init_globals(ZLIBLS_D) PHP_MINIT_FUNCTION(zlib) { + PLS_FETCH(); + #ifdef ZTS zlib_globals_id = ts_allocate_id(sizeof(php_zlib_globals), (ts_allocate_ctor) php_zlib_init_globals, NULL); #else @@ -147,7 +150,10 @@ PHP_MINIT_FUNCTION(zlib) le_zp = register_list_destructors(phpi_destructor_gzclose,NULL); #if HAVE_FOPENCOOKIE - php_register_url_wrapper("zlib",zlib_fopen_wrapper); + + if(PG(allow_url_fopen)) { + php_register_url_wrapper("zlib",zlib_fopen_wrapper); + } #endif return SUCCESS; @@ -156,7 +162,11 @@ PHP_MINIT_FUNCTION(zlib) PHP_MSHUTDOWN_FUNCTION(zlib) { #if HAVE_FOPENCOOKIE - php_unregister_url_wrapper("zlib"); + PLS_FETCH(); + + if(PG(allow_url_fopen)) { + php_unregister_url_wrapper("zlib"); + } #endif return SUCCESS; @@ -769,15 +779,15 @@ static ssize_t gz_reader(void *cookie, char *buffer, size_t size) return gzread(((struct gz_cookie *)cookie)->gz_file,buffer,size); } -static ssize_t gz_writer(void *cookie, char *buffer, size_t size) { - return gzwrite(((struct gz_cookie *)cookie)->gz_file,buffer,size); +static ssize_t gz_writer(void *cookie, const char *buffer, size_t size) { + return gzwrite(((struct gz_cookie *)cookie)->gz_file,(char *)buffer,size); } -static int gz_seeker(void *cookie,fpos_t *position, int whence) { - return (*position=gzseek(((struct gz_cookie *)cookie)->gz_file,*position,whence)); +static int gz_seeker(void *cookie,fpos_t position, int whence) { + return gzseek(((struct gz_cookie *)cookie)->gz_file,position,whence); } -static int gz_cleaner(void *cookie) { +static int gz_closer(void *cookie) { gzclose(((struct gz_cookie *)cookie)->gz_file); efree(cookie); cookie=NULL; @@ -788,12 +798,14 @@ static cookie_io_functions_t gz_cookie_functions = { gz_reader , gz_writer , gz_seeker -, gz_cleaner +, gz_closer }; -static FILE *zlib_fopen_wrapper(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) +static FILE *zlib_fopen_wrapper(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) { struct gz_cookie *gc = NULL; + FILE *fp; + int fissock=0, fsocketd=0; gc = (struct gz_cookie *)emalloc(sizeof(struct gz_cookie)); @@ -805,8 +817,15 @@ static FILE *zlib_fopen_wrapper(const char *path, char *mode, int options, int * path++; - gc->gz_file = gzopen(path,mode); + fp = php_fopen_wrapper(path, mode, options|IGNORE_URL, &fissock, &fsocketd, NULL); + + if (!fp) { + efree(gc); + return NULL; + } + gc->gz_file = gzdopen(fileno(fp), mode); + if(gc->gz_file) { return fopencookie(gc,mode,gz_cookie_functions); } else { diff --git a/main/fopen_wrappers.c b/main/fopen_wrappers.c index 40aa8d2f2c..4133f426a8 100644 --- a/main/fopen_wrappers.c +++ b/main/fopen_wrappers.c @@ -80,64 +80,52 @@ typedef FILE * (*php_fopen_url_wrapper_t) (const char *, char *, int, int *, int *, char **) ; static FILE *php_fopen_url_wrapper(const char *, char *, int, int *, int *, char **); -static FILE *php_fopen_url_wrap_http(const char *, char *, int, int *, int *, char **); -static FILE *php_fopen_url_wrap_ftp(const char *, char *, int, int *, int *, char **); -static FILE *php_fopen_url_wrap_php(const char *, char *, int, int *, int *, char **); - -int php_get_ftp_result(int socketd); +PHPAPI char *expand_filepath(const char *filepath, char *real_path); HashTable fopen_url_wrappers_hash; -PHPAPI int php_register_url_wrapper(char *protocol, FILE * (*wrapper)(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path)) +PHPAPI int php_register_url_wrapper(char *protocol, FILE * (*wrapper)(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path)) { -#if PHP_URL_FOPEN - return zend_hash_add(&fopen_url_wrappers_hash, protocol, strlen(protocol)+1, &wrapper, sizeof(wrapper), NULL); -#else - return FAILURE; -#endif + PLS_FETCH(); + + if(PG(allow_url_fopen)) { + return zend_hash_add(&fopen_url_wrappers_hash, protocol, strlen(protocol)+1, &wrapper, sizeof(wrapper), NULL); + } else { + return FAILURE; + } } PHPAPI int php_unregister_url_wrapper(char *protocol) { -#if PHP_URL_FOPEN - return zend_hash_del(&fopen_url_wrappers_hash, protocol, strlen(protocol)+1); -#else - return SUCCESS; -#endif + PLS_FETCH(); + + if(PG(allow_url_fopen)) { + return zend_hash_del(&fopen_url_wrappers_hash, protocol, strlen(protocol)+1); + } else { + return SUCCESS; + } } int php_init_fopen_wrappers(void) { int status = SUCCESS; -#if PHP_URL_FOPEN - if (zend_hash_init(&fopen_url_wrappers_hash, 0, NULL, NULL, 1)==FAILURE) { - return FAILURE; - } - if(FAILURE==php_register_url_wrapper("http",php_fopen_url_wrap_http)) { - status = FAILURE; - } else - if(FAILURE==php_register_url_wrapper("ftp",php_fopen_url_wrap_ftp)) { - status = FAILURE; - } else - if(FAILURE==php_register_url_wrapper("php",php_fopen_url_wrap_php)) { - status = FAILURE; + if(PG(allow_url_fopen)) { + if (zend_hash_init(&fopen_url_wrappers_hash, 0, NULL, NULL, 1)==FAILURE) { + return FAILURE; + } } - if(FAILURE==status) { - zend_hash_destroy(&fopen_url_wrappers_hash); - } -#endif return status; } int php_shutdown_fopen_wrappers(void) { -#if PHP_URL_FOPEN + if(PG(allow_url_fopen)) { zend_hash_destroy(&fopen_url_wrappers_hash); -#endif + } return SUCCESS; } @@ -260,11 +248,11 @@ PHPAPI FILE *php_fopen_wrapper(char *path, char *mode, int options, int *issock, /* FIXME Lets not get in the habit of doing stuff like this. This should be runtime enabled, NOT compile time. */ -#if PHP_URL_FOPEN - if (!(options & IGNORE_URL)) { - return php_fopen_url_wrapper(path, mode, options, issock, socketd, opened_path); + if(PG(allow_url_fopen)) { + if (!(options & IGNORE_URL)) { + return php_fopen_url_wrapper(path, mode, options, issock, socketd, opened_path); + } } -#endif if (options & USE_PATH && PG(include_path) != NULL) { return php_fopen_with_path(path, mode, PG(include_path), opened_path); @@ -430,425 +418,7 @@ PHPAPI FILE *php_fopen_with_path(char *filename, char *mode, char *path, char ** return NULL; } -/* - * If the specified path starts with "http://" (insensitive to case), - * a socket is opened to the specified web server and a file pointer is - * position at the start of the body of the response (past any headers). - * This makes a HTTP/1.0 request, and knows how to pass on the username - * and password for basic authentication. - * - * If the specified path starts with "ftp://" (insensitive to case), - * a pair of sockets are used to request the specified file and a file - * pointer to the requested file is returned. Passive mode ftp is used, - * so if the server doesn't support this, it will fail! - * - * Otherwise, fopen is called as usual and the file pointer is returned. - */ - - -static FILE *php_fopen_url_wrap_http(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) -{ - FILE *fp=NULL; - php_url *resource=NULL; - char tmp_line[512]; - char location[512]; - char hdr_line[8192]; - int body = 0; - char *scratch; - unsigned char *tmp; - int len; - int reqok = 0; - - resource = url_parse((char *) path); - if (resource == NULL) { - php_error(E_WARNING, "Invalid URL specified, %s", path); - *issock = BAD_URL; - return NULL; - } - /* use port 80 if one wasn't specified */ - if (resource->port == 0) - resource->port = 80; - - *socketd = php_hostconnect(resource->host, resource->port, SOCK_STREAM, 0); - if (*socketd == -1) { - SOCK_FCLOSE(*socketd); - *socketd = 0; - free_url(resource); - return NULL; - } -#if 0 - if ((fp = fdopen(*socketd, "r+")) == NULL) { - free_url(resource); - return NULL; - } -#ifdef HAVE_SETVBUF - if ((setvbuf(fp, NULL, _IONBF, 0)) != 0) { - free_url(resource); - return NULL; - } -#endif -#endif /*win32 */ - - strcpy(hdr_line, "GET "); - - /* tell remote http which file to get */ - if (resource->path != NULL) { - strlcat(hdr_line, resource->path, sizeof(hdr_line)); - } else { - strlcat(hdr_line, "/", sizeof(hdr_line)); - } - /* append the query string, if any */ - if (resource->query != NULL) { - strlcat(hdr_line, "?", sizeof(hdr_line)); - strlcat(hdr_line, resource->query, sizeof(hdr_line)); - } - strlcat(hdr_line, " HTTP/1.0\r\n", sizeof(hdr_line)); - SOCK_WRITE(hdr_line, *socketd); - - /* send authorization header if we have user/pass */ - if (resource->user != NULL && resource->pass != NULL) { - scratch = (char *) emalloc(strlen(resource->user) + strlen(resource->pass) + 2); - if (!scratch) { - free_url(resource); - return NULL; - } - strcpy(scratch, resource->user); - strcat(scratch, ":"); - strcat(scratch, resource->pass); - tmp = php_base64_encode((unsigned char *)scratch, strlen(scratch), NULL); - - if (snprintf(hdr_line, sizeof(hdr_line), - "Authorization: Basic %s\r\n", tmp) > 0) { - SOCK_WRITE(hdr_line, *socketd); - } - - efree(scratch); - efree(tmp); - } - /* if the user has configured who they are, send a From: line */ - if (cfg_get_string("from", &scratch) == SUCCESS) { - if (snprintf(hdr_line, sizeof(hdr_line), - "From: %s\r\n", scratch) > 0) { - SOCK_WRITE(hdr_line, *socketd); - } - - } - /* send a Host: header so name-based virtual hosts work */ - if (resource->port != 80) { - len = snprintf(hdr_line, sizeof(hdr_line), - "Host: %s:%i\r\n", resource->host, resource->port); - } else { - len = snprintf(hdr_line, sizeof(hdr_line), - "Host: %s\r\n", resource->host); - } - if(len > sizeof(hdr_line) - 1) { - len = sizeof(hdr_line) - 1; - } - if (len > 0) { - SOCK_WRITE(hdr_line, *socketd); - } - - /* identify ourselves and end the headers */ - SOCK_WRITE("User-Agent: PHP/" PHP_VERSION "\r\n\r\n", *socketd); - - body = 0; - location[0] = '\0'; - if (!SOCK_FEOF(*socketd)) { - /* get response header */ - if (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) != NULL) { - if (strncmp(tmp_line + 8, " 200 ", 5) == 0) { - reqok = 1; - } - } - } - /* Read past HTTP headers */ - while (!body && !SOCK_FEOF(*socketd)) { - if (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) != NULL) { - char *p = tmp_line; - - tmp_line[sizeof(tmp_line)-1] = '\0'; - - while (*p) { - if (*p == '\n' || *p == '\r') { - *p = '\0'; - } - p++; - } - - if (!strncasecmp(tmp_line, "Location: ", 10)) { - strlcpy(location, tmp_line + 10, sizeof(location)); - } - - if (tmp_line[0] == '\0') { - body = 1; - } - } - } - if (!reqok) { - SOCK_FCLOSE(*socketd); - *socketd = 0; - free_url(resource); - if (location[0] != '\0') { - return php_fopen_url_wrapper(location, mode, options, issock, socketd, opened_path); - } else { - return NULL; - } - } - free_url(resource); - *issock = 1; - return (fp); -} - static FILE *php_fopen_url_wrap_ftp(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) -{ - FILE *fp=NULL; - php_url *resource=NULL; - char tmp_line[512]; - unsigned short portno; - char *scratch; - int result; - int i; - char *tpath, *ttpath; - - resource = url_parse((char *) path); - if (resource == NULL) { - php_error(E_WARNING, "Invalid URL specified, %s", path); - *issock = BAD_URL; - return NULL; - } else if (resource->path == NULL) { - php_error(E_WARNING, "No file-path specified"); - free_url(resource); - *issock = BAD_URL; - return NULL; - } - /* use port 21 if one wasn't specified */ - if (resource->port == 0) - resource->port = 21; - - *socketd = php_hostconnect(resource->host, resource->port, SOCK_STREAM, 0); - if (*socketd == -1) - goto errexit; -#if 0 - if ((fpc = fdopen(*socketd, "r+")) == NULL) { - free_url(resource); - return NULL; - } -#ifdef HAVE_SETVBUF - if ((setvbuf(fpc, NULL, _IONBF, 0)) != 0) { - free_url(resource); - fclose(fpc); - return NULL; - } -#endif -#endif - - /* Start talking to ftp server */ - result = php_get_ftp_result(*socketd); - if (result > 299 || result < 200) - goto errexit; - - /* send the user name */ - SOCK_WRITE("USER ", *socketd); - if (resource->user != NULL) { - php_raw_url_decode(resource->user, strlen(resource->user)); - SOCK_WRITE(resource->user, *socketd); - } else { - SOCK_WRITE("anonymous", *socketd); - } - SOCK_WRITE("\r\n", *socketd); - - /* get the response */ - result = php_get_ftp_result(*socketd); - - /* if a password is required, send it */ - if (result >= 300 && result <= 399) { - SOCK_WRITE("PASS ", *socketd); - if (resource->pass != NULL) { - php_raw_url_decode(resource->pass, strlen(resource->pass)); - SOCK_WRITE(resource->pass, *socketd); - } else { - /* if the user has configured who they are, - send that as the password */ - if (cfg_get_string("from", &scratch) == SUCCESS) { - SOCK_WRITE(scratch, *socketd); - } else { - SOCK_WRITE("anonymous", *socketd); - } - } - SOCK_WRITE("\r\n", *socketd); - - /* read the response */ - result = php_get_ftp_result(*socketd); - } - if (result > 299 || result < 200) - goto errexit; - - /* set the connection to be binary */ - SOCK_WRITE("TYPE I\r\n", *socketd); - result = php_get_ftp_result(*socketd); - if (result > 299 || result < 200) - goto errexit; - - /* find out the size of the file (verifying it exists) */ - SOCK_WRITE("SIZE ", *socketd); - SOCK_WRITE(resource->path, *socketd); - SOCK_WRITE("\r\n", *socketd); - - /* read the response */ - result = php_get_ftp_result(*socketd); - if (mode[0] == 'r') { - /* when reading file, it must exist */ - if (result > 299 || result < 200) { - php_error(E_WARNING, "File not found"); - free_url(resource); - SOCK_FCLOSE(*socketd); - *socketd = 0; - errno = ENOENT; - return NULL; - } - } else { - /* when writing file, it must NOT exist */ - if (result <= 299 && result >= 200) { - php_error(E_WARNING, "File already exists"); - free_url(resource); - SOCK_FCLOSE(*socketd); - *socketd = 0; - errno = EEXIST; - return NULL; - } - } - - /* set up the passive connection */ - - /* We try EPSV first, needed for IPv6 and works on some IPv4 servers */ - SOCK_WRITE("EPSV\r\n", *socketd); - while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) && - !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && - isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); - - /* check if we got a 229 response */ - if (strncmp(tmp_line, "229", 3)) { - /* EPSV failed, let's try PASV */ - SOCK_WRITE("PASV\r\n", *socketd); - while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, *socketd) && - !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && - isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); - /* make sure we got a 227 response */ - if (strncmp(tmp_line, "227", 3)) - goto errexit; - /* parse pasv command (129,80,95,25,13,221) */ - tpath = tmp_line; - /* skip over the "227 Some message " part */ - for (tpath += 4; *tpath && !isdigit((int) *tpath); tpath++); - if (!*tpath) - goto errexit; - /* skip over the host ip, we just assume it's the same */ - for (i = 0; i < 4; i++) { - for (; isdigit((int) *tpath); tpath++); - if (*tpath != ',') - goto errexit; - tpath++; - } - /* pull out the MSB of the port */ - portno = (unsigned short) strtol(tpath, &ttpath, 10) * 256; - if (ttpath == NULL) { - /* didn't get correct response from PASV */ - goto errexit; - } - tpath = ttpath; - if (*tpath != ',') - goto errexit; - tpath++; - /* pull out the LSB of the port */ - portno += (unsigned short) strtol(tpath, &ttpath, 10); - } else { - /* parse epsv command (|||6446|) */ - for (i = 0, tpath = tmp_line + 4; *tpath; tpath++) { - if (*tpath == '|') { - i++; - if (i == 3) - break; - } - } - if (i < 3) - goto errexit; - /* pull out the port */ - portno = (unsigned short) strtol(tpath + 1, &ttpath, 10); - } - - if (ttpath == NULL) { - /* didn't get correct response from EPSV/PASV */ - goto errexit; - } - - if (mode[0] == 'r') { - /* retrieve file */ - SOCK_WRITE("RETR ", *socketd); - } else { - /* store file */ - SOCK_WRITE("STOR ", *socketd); - } - if (resource->path != NULL) { - SOCK_WRITE(resource->path, *socketd); - } else { - SOCK_WRITE("/", *socketd); - } - - /* close control connection */ - SOCK_WRITE("\r\nQUIT\r\n", *socketd); - SOCK_FCLOSE(*socketd); - - /* open the data channel */ - *socketd = php_hostconnect(resource->host, portno, SOCK_STREAM, 0); - if (*socketd == -1) - goto errexit; -#if 0 - if (mode[0] == 'r') { - if ((fp = fdopen(*socketd, "r+")) == NULL) { - free_url(resource); - return NULL; - } - } else { - if ((fp = fdopen(*socketd, "w+")) == NULL) { - free_url(resource); - return NULL; - } - } -#ifdef HAVE_SETVBUF - if ((setvbuf(fp, NULL, _IONBF, 0)) != 0) { - free_url(resource); - fclose(fp); - return NULL; - } -#endif -#endif - free_url(resource); - *issock = 1; - return (fp); - - errexit: - free_url(resource); - SOCK_FCLOSE(*socketd); - *socketd = 0; - return NULL; -} - -static FILE *php_fopen_url_wrap_php(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) -{ - const char *res = path + 6; - - *issock = 0; - - if (!strcasecmp(res, "stdin")) { - return fdopen(STDIN_FILENO, mode); - } else if (!strcasecmp(res, "stdout")) { - return fdopen(STDOUT_FILENO, mode); - } else if (!strcasecmp(res, "stderr")) { - return fdopen(STDERR_FILENO, mode); - } - - return NULL; -} static FILE *php_fopen_url_wrapper(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path) { @@ -857,6 +427,7 @@ static FILE *php_fopen_url_wrapper(const char *path, char *mode, int options, in const char *protocol=NULL; int n=0; + for(p=path;isalnum((int)*p);p++) n++; if((*p==':')&&(n>1)) { @@ -911,17 +482,6 @@ static FILE *php_fopen_url_wrapper(const char *path, char *mode, int options, in return NULL; } -int php_get_ftp_result(int socketd) -{ - char tmp_line[513]; - - while (SOCK_FGETS(tmp_line, sizeof(tmp_line)-1, socketd) && - !(isdigit((int) tmp_line[0]) && isdigit((int) tmp_line[1]) && - isdigit((int) tmp_line[2]) && tmp_line[3] == ' ')); - - return strtol(tmp_line, NULL, 10); -} - PHPAPI int php_is_url(char *path) { return (!strncasecmp(path, "http://", 7) || !strncasecmp(path, "ftp://", 6)); diff --git a/main/fopen_wrappers.h b/main/fopen_wrappers.h index 7d119bd35a..2e131aaf1b 100644 --- a/main/fopen_wrappers.h +++ b/main/fopen_wrappers.h @@ -76,11 +76,10 @@ PHPAPI FILE *php_fopen_with_path(char *filename, char *mode, char *path, char ** PHPAPI int php_is_url(char *path); PHPAPI char *php_strip_url_passwd(char *path); -PHPAPI char *expand_filepath(const char *filepath,char *real_path); int php_init_fopen_wrappers(void); int php_shutdown_fopen_wrappers(void); -PHPAPI int php_register_url_wrapper(char *protocol, FILE * (*wrapper)(const char *path, char *mode, int options, int *issock, int *socketd, char **opened_path)); +PHPAPI int php_register_url_wrapper(char *protocol, FILE * (*wrapper)(char *path, char *mode, int options, int *issock, int *socketd, char **opened_path)); PHPAPI int php_unregister_url_wrapper(char *protocol); #endif diff --git a/main/main.c b/main/main.c index 992e4a1f5f..f32789ba90 100644 --- a/main/main.c +++ b/main/main.c @@ -260,6 +260,9 @@ PHP_INI_BEGIN() PHP_INI_ENTRY("sendmail_path", DEFAULT_SENDMAIL_PATH, PHP_INI_SYSTEM, NULL) PHP_INI_ENTRY("disable_functions", "", PHP_INI_SYSTEM, NULL) + + STD_PHP_INI_ENTRY("allow_url_fopen", "1", PHP_INI_ALL, OnUpdateBool, allow_url_fopen, php_core_globals, core_globals) + PHP_INI_END() @@ -855,17 +858,17 @@ int php_module_startup(sapi_module_struct *sf) php_ini_mstartup(); - if (php_init_fopen_wrappers() == FAILURE) { - php_printf("PHP: Unable to initialize fopen url wrappers.\n"); - return FAILURE; - } - if (php_config_ini_startup() == FAILURE) { return FAILURE; } REGISTER_INI_ENTRIES(); + if (php_init_fopen_wrappers() == FAILURE) { + php_printf("PHP: Unable to initialize fopen url wrappers.\n"); + return FAILURE; + } + zuv.import_use_extension = ".php"; zend_set_utility_values(&zuv); php_startup_sapi_content_types(); diff --git a/main/php_globals.h b/main/php_globals.h index 39e9d16200..97461c1e0a 100644 --- a/main/php_globals.h +++ b/main/php_globals.h @@ -119,6 +119,8 @@ struct _php_core_globals { zend_bool file_uploads; zend_bool during_request_startup; + + zend_bool allow_url_fopen; }; diff --git a/php.ini-dist b/php.ini-dist index 402ac10328..81b82e9561 100644 --- a/php.ini-dist +++ b/php.ini-dist @@ -245,6 +245,12 @@ file_uploads = On ; Whether to allow HTTP file uploads upload_max_filesize = 2M ; Maximum allowed size for uploaded files +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; +allow_url_fopen = On ; Wheter to allow trating URLs like http:... or ftp:... like files + + ;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; diff --git a/php.ini-optimized b/php.ini-optimized index e882372cca..01f35ca718 100644 --- a/php.ini-optimized +++ b/php.ini-optimized @@ -228,6 +228,12 @@ file_uploads = On ; Whether to allow HTTP file uploads upload_max_filesize = 2M ; Maximum allowed size for uploaded files +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; +allow_url_fopen = On ; Wheter to allow trating URLs like http:... or ftp:... like files + + ;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; diff --git a/php.ini-recommended b/php.ini-recommended index e882372cca..01f35ca718 100644 --- a/php.ini-recommended +++ b/php.ini-recommended @@ -228,6 +228,12 @@ file_uploads = On ; Whether to allow HTTP file uploads upload_max_filesize = 2M ; Maximum allowed size for uploaded files +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; +allow_url_fopen = On ; Wheter to allow trating URLs like http:... or ftp:... like files + + ;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; |