15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * security.c: Implementation of the XSLT security framework 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXSLT 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxslt.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TYPES_H 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_STAT_H 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_MATH_H 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <math.h> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FLOAT_H 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <float.h> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_IEEEFP_H 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ieeefp.h> 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_NAN_H 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <nan.h> 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CTYPE_H 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) && !defined(__CYGWIN__) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef INVALID_FILE_ATTRIBUTES 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HAVE_STAT 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifdef HAVE__STAT 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* MS C library seems to define stat and _stat. The definition 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * is identical. Still, mapping them to each other causes a warning. */ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# ifndef _MSC_VER 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define stat(x,y) _stat(x,y) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_STAT 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# endif 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h> 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h> 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h> 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xslt.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xsltInternals.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xsltutils.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "extensions.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "security.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct _xsltSecurityPrefs { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck readFile; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck createFile; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck createDir; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck readNet; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck writeNet; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static xsltSecurityPrefsPtr xsltDefaultSecurityPrefs = NULL; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Module interfaces * 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltNewSecurityPrefs: 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new security preference block 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns a pointer to the new block or NULL in case of error 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSecurityPrefsPtr 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltNewSecurityPrefs(void) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityPrefsPtr ret; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltInitGlobals(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = (xsltSecurityPrefsPtr) xmlMalloc(sizeof(xsltSecurityPrefs)); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == NULL) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, NULL, NULL, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltNewSecurityPrefs : malloc failed\n"); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(ret, 0, sizeof(xsltSecurityPrefs)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltFreeSecurityPrefs: 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security block to free 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Free up a security preference block 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltFreeSecurityPrefs(xsltSecurityPrefsPtr sec) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sec == NULL) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(sec); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltSetSecurityPrefs: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security block to update 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @option: the option to update 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @func: the user callback to use for this option 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Update the security option to use the new callback checking function 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 otherwise 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSetSecurityPrefs(xsltSecurityPrefsPtr sec, xsltSecurityOption option, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck func) { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltInitGlobals(); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sec == NULL) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (option) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_READ_FILE: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sec->readFile = func; return(0); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_WRITE_FILE: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sec->createFile = func; return(0); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_CREATE_DIRECTORY: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sec->createDir = func; return(0); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_READ_NETWORK: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sec->readNet = func; return(0); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_WRITE_NETWORK: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sec->writeNet = func; return(0); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltGetSecurityPrefs: 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security block to update 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @option: the option to lookup 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Lookup the security option to get the callback checking function 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns NULL if not found, the function otherwise 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSecurityCheck 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltGetSecurityPrefs(xsltSecurityPrefsPtr sec, xsltSecurityOption option) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sec == NULL) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (option) { 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_READ_FILE: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(sec->readFile); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_WRITE_FILE: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(sec->createFile); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_CREATE_DIRECTORY: 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(sec->createDir); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_READ_NETWORK: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(sec->readNet); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case XSLT_SECPREF_WRITE_NETWORK: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(sec->writeNet); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltSetDefaultSecurityPrefs: 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security block to use 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the default security preference application-wide 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSetDefaultSecurityPrefs(xsltSecurityPrefsPtr sec) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDefaultSecurityPrefs = sec; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltGetDefaultSecurityPrefs: 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Get the default security preference application-wide 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the current xsltSecurityPrefsPtr in use or NULL if none 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSecurityPrefsPtr 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltGetDefaultSecurityPrefs(void) { 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(xsltDefaultSecurityPrefs); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltSetCtxtSecurityPrefs: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security block to use 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set the security preference for a specific transformation 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns -1 in case of error, 0 otherwise 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSetCtxtSecurityPrefs(xsltSecurityPrefsPtr sec, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr ctxt) { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctxt->sec = (void *) sec; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltSecurityAllow: 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security block to use 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: unused 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function used to always allow an operation 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 always 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSecurityAllow(xsltSecurityPrefsPtr sec ATTRIBUTE_UNUSED, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *value ATTRIBUTE_UNUSED) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltSecurityForbid: 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security block to use 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @value: unused 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Function used to always forbid an operation 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 always 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltSecurityForbid(xsltSecurityPrefsPtr sec ATTRIBUTE_UNUSED, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *value ATTRIBUTE_UNUSED) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Internal interfaces * 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCheckFilename 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @path: the path to check 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function checks to see if @path is a valid source 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (file, socket...) for XML. 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: remove at some point !!! 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Local copy of xmlCheckFilename to avoid a hard dependency on 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * a new version of libxml2 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if stat is not available on the target machine, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 1. if stat fails, returns 0 (if calling 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stat on the filename fails, it can't be right). 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * if stat succeeds and the file is a directory, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * returns 2. otherwise returns 1. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCheckFilename (const char *path) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STAT 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct stat stat_buffer; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) && !defined(__CYGWIN__) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DWORD dwAttrs; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dwAttrs = GetFileAttributesA(path); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dwAttrs != INVALID_FILE_ATTRIBUTES) { 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dwAttrs & FILE_ATTRIBUTE_DIRECTORY) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (stat(path, &stat_buffer) == -1) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef S_ISDIR 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (S_ISDIR(stat_buffer.st_mode)) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCheckWritePath(xsltSecurityPrefsPtr sec, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr ctxt, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *path) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck check; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *directory; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_WRITE_FILE); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check != NULL) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = check(sec, ctxt, path); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "File write for %s refused\n", path); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) directory = xmlParserGetDirectory (path); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (directory != NULL) { 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltCheckFilename(directory); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The directory doesn't exist check for creation 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check = xsltGetSecurityPrefs(sec, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSLT_SECPREF_CREATE_DIRECTORY); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check != NULL) { 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = check(sec, ctxt, directory); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Directory creation for %s refused\n", 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(directory); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltCheckWritePath(sec, ctxt, directory); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 1) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = mkdir(directory, 0755); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(directory); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret < 0) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCheckWrite: 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security options 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the resource to be written 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the resource is allowed to be written, if necessary makes 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * some preliminary work like creating directories 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return 1 if write is allowed, 0 if not and -1 in case or error. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCheckWrite(xsltSecurityPrefsPtr sec, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr ctxt, const xmlChar *URL) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURIPtr uri; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck check; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlParseURI((const char *)URL); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlCreateURI(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCheckWrite: out of memory for %s\n", URL); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri->path = (char *)xmlStrdup(URL); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((uri->scheme == NULL) || 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(BAD_CAST uri->scheme, BAD_CAST "file"))) { 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32) && !defined(__CYGWIN__) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((uri->path)&&(uri->path[0]=='/')&& 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (uri->path[1]!='\0')&&(uri->path[2]==':')) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltCheckWritePath(sec, ctxt, uri->path+1); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if we are allowed to write this file 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = xsltCheckWritePath(sec, ctxt, uri->path); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret <= 0) { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(ret); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if we are allowed to write this network resource 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_WRITE_NETWORK); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check != NULL) { 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = check(sec, ctxt, (const char *)URL); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "File write for %s refused\n", URL); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltCheckRead: 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @sec: the security options 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @URL: the resource to be read 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if the resource is allowed to be read 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return 1 if read is allowed, 0 if not and -1 in case or error. 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltCheckRead(xsltSecurityPrefsPtr sec, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformContextPtr ctxt, const xmlChar *URL) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlURIPtr uri; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityCheck check; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uri = xmlParseURI((const char *)URL); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uri == NULL) { 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsltCheckRead: URL parsing failed for %s\n", 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URL); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(-1); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((uri->scheme == NULL) || 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(BAD_CAST uri->scheme, BAD_CAST "file"))) { 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if we are allowed to read this file 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_READ_FILE); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check != NULL) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = check(sec, ctxt, uri->path); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Local file read for %s refused\n", URL); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Check if we are allowed to write this network resource 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_READ_NETWORK); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (check != NULL) { 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = check(sec, ctxt, (const char *)URL); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ret == 0) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(ctxt, NULL, NULL, 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Network file read for %s refused\n", URL); 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeURI(uri); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 481