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