]> granicus.if.org Git - php/commitdiff
Fixed bug #49144 (import of schema from different host transmits original authenticat...
authorDmitry Stogov <dmitry@php.net>
Mon, 17 Aug 2009 18:23:48 +0000 (18:23 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 17 Aug 2009 18:23:48 +0000 (18:23 +0000)
ext/soap/php_schema.c
ext/soap/php_sdl.c
ext/soap/php_sdl.h

index a4d2680c88402ca3067e2eeefae5aca56c202eaa..64e1ea66272587813559bc5388af2f07e30413d7 100644 (file)
@@ -102,7 +102,10 @@ static void schema_load_file(sdlCtx *ctx, xmlAttrPtr ns, xmlChar *location, xmlA
                xmlNodePtr schema;
                xmlAttrPtr new_tns;
 
+               sdl_set_uri_credentials(ctx, (char*)location TSRMLS_CC);
                doc = soap_xmlParseFile((char*)location TSRMLS_CC);
+               sdl_restore_uri_credentials(ctx TSRMLS_CC);
+
                if (doc == NULL) {
                        soap_error1(E_ERROR, "Parsing Schema: can't import schema from '%s'", location);
                }
index fb0d8b84268d70a7f4adff36d933f31da3c9c23c..d1d25e8900deb1388f386a888935498af63efdf2 100644 (file)
@@ -226,6 +226,64 @@ static int is_wsdl_element(xmlNodePtr node)
        return 1;
 }
 
+void sdl_set_uri_credentials(sdlCtx *ctx, char *uri TSRMLS_DC)
+{
+       char *s;
+       int l1, l2;
+       zval *context = NULL;
+       zval **header = NULL;
+
+       /* check if we load xsd from the same server */
+       s = strstr(ctx->sdl->source, "://");
+       if (!s) return;
+       s = strchr(s+3, '/');
+       l1 = s - ctx->sdl->source;
+       s = strstr((char*)uri, "://");
+       if (!s) return;
+       s = strchr(s+3, '/');
+       l2 = s - (char*)uri;
+       if (l1 != l2 || memcmp(ctx->sdl->source, uri, l1) != 0) {
+               /* another server. clear authentication credentals */
+               context = php_libxml_switch_context(NULL TSRMLS_CC);
+               php_libxml_switch_context(context TSRMLS_CC);
+               if (context) {
+                       ctx->context = php_stream_context_from_zval(context, 1);
+
+                       if (ctx->context &&
+                           php_stream_context_get_option(ctx->context, "http", "header", &header) == SUCCESS) {
+                               s = strstr(Z_STRVAL_PP(header), "Authorization: Basic");
+                               if (s && (s == Z_STRVAL_PP(header) || *(s-1) == '\n' || *(s-1) == '\r')) {
+                                       char *rest = strstr(s, "\r\n");
+                                       if (rest) {
+                                               zval new_header;
+                                       
+                                               rest += 2;
+                                               Z_TYPE(new_header) = IS_STRING;
+                                               Z_STRLEN(new_header) = Z_STRLEN_PP(header) - (rest - s);
+                                               Z_STRVAL(new_header) = emalloc(Z_STRLEN_PP(header) + 1);
+                                               memcpy(Z_STRVAL(new_header), Z_STRVAL_PP(header), s - Z_STRVAL_PP(header));
+                                               memcpy(Z_STRVAL(new_header) + (s - Z_STRVAL_PP(header)), rest, Z_STRLEN_PP(header) - (rest - Z_STRVAL_PP(header)) + 1);
+                                               ctx->old_header = *header;
+                                               Z_ADDREF_P(ctx->old_header);
+                                               php_stream_context_set_option(ctx->context, "http", "header", &new_header);
+                                               zval_dtor(&new_header);
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+void sdl_restore_uri_credentials(sdlCtx *ctx TSRMLS_DC)
+{
+       if (ctx->old_header) {
+           php_stream_context_set_option(ctx->context, "http", "header", ctx->old_header);
+           zval_ptr_dtor(&ctx->old_header);
+               ctx->old_header = NULL;
+       }
+       ctx->context = NULL;
+}
+
 static void load_wsdl_ex(char *struri, sdlCtx *ctx, int include TSRMLS_DC)
 {
        sdlPtr tmpsdl = ctx->sdl;
@@ -237,7 +295,9 @@ static void load_wsdl_ex(char *struri, sdlCtx *ctx, int include TSRMLS_DC)
                return;
        }
        
+       sdl_set_uri_credentials(ctx, struri TSRMLS_CC);
        wsdl = soap_xmlParseFile(struri TSRMLS_CC);
+       sdl_restore_uri_credentials(ctx TSRMLS_CC);
        
        if (!wsdl) {
                xmlErrorPtr xmlErrorPtr = xmlGetLastError();
index 53f6fb088e438944673f7dfec30d0d7e4d665e29..e9554812dc8c8e61168dcdac4af8d889a74b10b7 100644 (file)
@@ -76,6 +76,8 @@ typedef struct sdlCtx {
 
        HashTable *attributes;       /* array of sdlAttributePtr */
        HashTable *attributeGroups;  /* array of sdlTypesPtr */
+       php_stream_context *context;
+       zval               *old_header;
 } sdlCtx;
 
 struct _sdlBinding {
@@ -264,4 +266,7 @@ sdlBindingPtr get_binding_from_name(sdlPtr sdl, char *name, char *ns);
 void delete_sdl(void *handle);
 void delete_sdl_impl(void *handle);
 
+void sdl_set_uri_credentials(sdlCtx *ctx, char *uri TSRMLS_DC);
+void sdl_restore_uri_credentials(sdlCtx *ctx TSRMLS_DC);
+
 #endif