Index: third_party/libxslt/libxslt/security.c |
diff --git a/third_party/libxslt/libxslt/security.c b/third_party/libxslt/libxslt/security.c |
deleted file mode 100644 |
index 89de90bd3f1ebdb09310f562a35bcd599824b379..0000000000000000000000000000000000000000 |
--- a/third_party/libxslt/libxslt/security.c |
+++ /dev/null |
@@ -1,480 +0,0 @@ |
-/* |
- * security.c: Implementation of the XSLT security framework |
- * |
- * See Copyright for the status of this software. |
- * |
- * daniel@veillard.com |
- */ |
- |
-#define IN_LIBXSLT |
-#include "libxslt.h" |
- |
-#include <string.h> |
- |
-#ifdef HAVE_SYS_TYPES_H |
-#include <sys/types.h> |
-#endif |
-#ifdef HAVE_SYS_STAT_H |
-#include <sys/stat.h> |
-#endif |
- |
-#ifdef HAVE_MATH_H |
-#include <math.h> |
-#endif |
-#ifdef HAVE_FLOAT_H |
-#include <float.h> |
-#endif |
-#ifdef HAVE_IEEEFP_H |
-#include <ieeefp.h> |
-#endif |
-#ifdef HAVE_NAN_H |
-#include <nan.h> |
-#endif |
-#ifdef HAVE_CTYPE_H |
-#include <ctype.h> |
-#endif |
- |
-#if defined(WIN32) && !defined(__CYGWIN__) |
-#include <windows.h> |
-#ifndef INVALID_FILE_ATTRIBUTES |
-#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) |
-#endif |
-#endif |
- |
-#ifndef HAVE_STAT |
-# ifdef HAVE__STAT |
- /* MS C library seems to define stat and _stat. The definition |
- * is identical. Still, mapping them to each other causes a warning. */ |
-# ifndef _MSC_VER |
-# define stat(x,y) _stat(x,y) |
-# endif |
-# define HAVE_STAT |
-# endif |
-#endif |
- |
-#include <libxml/xmlmemory.h> |
-#include <libxml/tree.h> |
-#include <libxml/uri.h> |
-#include "xslt.h" |
-#include "xsltInternals.h" |
-#include "xsltutils.h" |
-#include "extensions.h" |
-#include "security.h" |
- |
- |
-struct _xsltSecurityPrefs { |
- xsltSecurityCheck readFile; |
- xsltSecurityCheck createFile; |
- xsltSecurityCheck createDir; |
- xsltSecurityCheck readNet; |
- xsltSecurityCheck writeNet; |
-}; |
- |
-static xsltSecurityPrefsPtr xsltDefaultSecurityPrefs = NULL; |
- |
-/************************************************************************ |
- * * |
- * Module interfaces * |
- * * |
- ************************************************************************/ |
- |
-/** |
- * xsltNewSecurityPrefs: |
- * |
- * Create a new security preference block |
- * |
- * Returns a pointer to the new block or NULL in case of error |
- */ |
-xsltSecurityPrefsPtr |
-xsltNewSecurityPrefs(void) { |
- xsltSecurityPrefsPtr ret; |
- |
- xsltInitGlobals(); |
- |
- ret = (xsltSecurityPrefsPtr) xmlMalloc(sizeof(xsltSecurityPrefs)); |
- if (ret == NULL) { |
- xsltTransformError(NULL, NULL, NULL, |
- "xsltNewSecurityPrefs : malloc failed\n"); |
- return(NULL); |
- } |
- memset(ret, 0, sizeof(xsltSecurityPrefs)); |
- return(ret); |
-} |
- |
-/** |
- * xsltFreeSecurityPrefs: |
- * @sec: the security block to free |
- * |
- * Free up a security preference block |
- */ |
-void |
-xsltFreeSecurityPrefs(xsltSecurityPrefsPtr sec) { |
- if (sec == NULL) |
- return; |
- xmlFree(sec); |
-} |
- |
-/** |
- * xsltSetSecurityPrefs: |
- * @sec: the security block to update |
- * @option: the option to update |
- * @func: the user callback to use for this option |
- * |
- * Update the security option to use the new callback checking function |
- * |
- * Returns -1 in case of error, 0 otherwise |
- */ |
-int |
-xsltSetSecurityPrefs(xsltSecurityPrefsPtr sec, xsltSecurityOption option, |
- xsltSecurityCheck func) { |
- xsltInitGlobals(); |
- if (sec == NULL) |
- return(-1); |
- switch (option) { |
- case XSLT_SECPREF_READ_FILE: |
- sec->readFile = func; return(0); |
- case XSLT_SECPREF_WRITE_FILE: |
- sec->createFile = func; return(0); |
- case XSLT_SECPREF_CREATE_DIRECTORY: |
- sec->createDir = func; return(0); |
- case XSLT_SECPREF_READ_NETWORK: |
- sec->readNet = func; return(0); |
- case XSLT_SECPREF_WRITE_NETWORK: |
- sec->writeNet = func; return(0); |
- } |
- return(-1); |
-} |
- |
-/** |
- * xsltGetSecurityPrefs: |
- * @sec: the security block to update |
- * @option: the option to lookup |
- * |
- * Lookup the security option to get the callback checking function |
- * |
- * Returns NULL if not found, the function otherwise |
- */ |
-xsltSecurityCheck |
-xsltGetSecurityPrefs(xsltSecurityPrefsPtr sec, xsltSecurityOption option) { |
- if (sec == NULL) |
- return(NULL); |
- switch (option) { |
- case XSLT_SECPREF_READ_FILE: |
- return(sec->readFile); |
- case XSLT_SECPREF_WRITE_FILE: |
- return(sec->createFile); |
- case XSLT_SECPREF_CREATE_DIRECTORY: |
- return(sec->createDir); |
- case XSLT_SECPREF_READ_NETWORK: |
- return(sec->readNet); |
- case XSLT_SECPREF_WRITE_NETWORK: |
- return(sec->writeNet); |
- } |
- return(NULL); |
-} |
- |
-/** |
- * xsltSetDefaultSecurityPrefs: |
- * @sec: the security block to use |
- * |
- * Set the default security preference application-wide |
- */ |
-void |
-xsltSetDefaultSecurityPrefs(xsltSecurityPrefsPtr sec) { |
- |
- xsltDefaultSecurityPrefs = sec; |
-} |
- |
-/** |
- * xsltGetDefaultSecurityPrefs: |
- * |
- * Get the default security preference application-wide |
- * |
- * Returns the current xsltSecurityPrefsPtr in use or NULL if none |
- */ |
-xsltSecurityPrefsPtr |
-xsltGetDefaultSecurityPrefs(void) { |
- return(xsltDefaultSecurityPrefs); |
-} |
- |
-/** |
- * xsltSetCtxtSecurityPrefs: |
- * @sec: the security block to use |
- * @ctxt: an XSLT transformation context |
- * |
- * Set the security preference for a specific transformation |
- * |
- * Returns -1 in case of error, 0 otherwise |
- */ |
-int |
-xsltSetCtxtSecurityPrefs(xsltSecurityPrefsPtr sec, |
- xsltTransformContextPtr ctxt) { |
- if (ctxt == NULL) |
- return(-1); |
- ctxt->sec = (void *) sec; |
- return(0); |
-} |
- |
- |
-/** |
- * xsltSecurityAllow: |
- * @sec: the security block to use |
- * @ctxt: an XSLT transformation context |
- * @value: unused |
- * |
- * Function used to always allow an operation |
- * |
- * Returns 1 always |
- */ |
-int |
-xsltSecurityAllow(xsltSecurityPrefsPtr sec ATTRIBUTE_UNUSED, |
- xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, |
- const char *value ATTRIBUTE_UNUSED) { |
- return(1); |
-} |
- |
-/** |
- * xsltSecurityForbid: |
- * @sec: the security block to use |
- * @ctxt: an XSLT transformation context |
- * @value: unused |
- * |
- * Function used to always forbid an operation |
- * |
- * Returns 0 always |
- */ |
-int |
-xsltSecurityForbid(xsltSecurityPrefsPtr sec ATTRIBUTE_UNUSED, |
- xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED, |
- const char *value ATTRIBUTE_UNUSED) { |
- return(0); |
-} |
- |
-/************************************************************************ |
- * * |
- * Internal interfaces * |
- * * |
- ************************************************************************/ |
- |
-/** |
- * xsltCheckFilename |
- * @path: the path to check |
- * |
- * function checks to see if @path is a valid source |
- * (file, socket...) for XML. |
- * |
- * TODO: remove at some point !!! |
- * Local copy of xmlCheckFilename to avoid a hard dependency on |
- * a new version of libxml2 |
- * |
- * if stat is not available on the target machine, |
- * returns 1. if stat fails, returns 0 (if calling |
- * stat on the filename fails, it can't be right). |
- * if stat succeeds and the file is a directory, |
- * returns 2. otherwise returns 1. |
- */ |
- |
-static int |
-xsltCheckFilename (const char *path) |
-{ |
-#ifdef HAVE_STAT |
- struct stat stat_buffer; |
-#if defined(WIN32) && !defined(__CYGWIN__) |
- DWORD dwAttrs; |
- |
- dwAttrs = GetFileAttributesA(path); |
- if (dwAttrs != INVALID_FILE_ATTRIBUTES) { |
- if (dwAttrs & FILE_ATTRIBUTE_DIRECTORY) { |
- return 2; |
- } |
- } |
-#endif |
- |
- if (stat(path, &stat_buffer) == -1) |
- return 0; |
- |
-#ifdef S_ISDIR |
- if (S_ISDIR(stat_buffer.st_mode)) { |
- return 2; |
- } |
-#endif |
-#endif |
- return 1; |
-} |
- |
-static int |
-xsltCheckWritePath(xsltSecurityPrefsPtr sec, |
- xsltTransformContextPtr ctxt, |
- const char *path) |
-{ |
- int ret; |
- xsltSecurityCheck check; |
- char *directory; |
- |
- check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_WRITE_FILE); |
- if (check != NULL) { |
- ret = check(sec, ctxt, path); |
- if (ret == 0) { |
- xsltTransformError(ctxt, NULL, NULL, |
- "File write for %s refused\n", path); |
- return(0); |
- } |
- } |
- |
- directory = xmlParserGetDirectory (path); |
- |
- if (directory != NULL) { |
- ret = xsltCheckFilename(directory); |
- if (ret == 0) { |
- /* |
- * The directory doesn't exist check for creation |
- */ |
- check = xsltGetSecurityPrefs(sec, |
- XSLT_SECPREF_CREATE_DIRECTORY); |
- if (check != NULL) { |
- ret = check(sec, ctxt, directory); |
- if (ret == 0) { |
- xsltTransformError(ctxt, NULL, NULL, |
- "Directory creation for %s refused\n", |
- path); |
- xmlFree(directory); |
- return(0); |
- } |
- } |
- ret = xsltCheckWritePath(sec, ctxt, directory); |
- if (ret == 1) |
- ret = mkdir(directory, 0755); |
- } |
- xmlFree(directory); |
- if (ret < 0) |
- return(ret); |
- } |
- |
- return(1); |
-} |
- |
-/** |
- * xsltCheckWrite: |
- * @sec: the security options |
- * @ctxt: an XSLT transformation context |
- * @URL: the resource to be written |
- * |
- * Check if the resource is allowed to be written, if necessary makes |
- * some preliminary work like creating directories |
- * |
- * Return 1 if write is allowed, 0 if not and -1 in case or error. |
- */ |
-int |
-xsltCheckWrite(xsltSecurityPrefsPtr sec, |
- xsltTransformContextPtr ctxt, const xmlChar *URL) { |
- int ret; |
- xmlURIPtr uri; |
- xsltSecurityCheck check; |
- |
- uri = xmlParseURI((const char *)URL); |
- if (uri == NULL) { |
- uri = xmlCreateURI(); |
- if (uri == NULL) { |
- xsltTransformError(ctxt, NULL, NULL, |
- "xsltCheckWrite: out of memory for %s\n", URL); |
- return(-1); |
- } |
- uri->path = (char *)xmlStrdup(URL); |
- } |
- if ((uri->scheme == NULL) || |
- (xmlStrEqual(BAD_CAST uri->scheme, BAD_CAST "file"))) { |
- |
-#if defined(WIN32) && !defined(__CYGWIN__) |
- if ((uri->path)&&(uri->path[0]=='/')&& |
- (uri->path[1]!='\0')&&(uri->path[2]==':')) |
- ret = xsltCheckWritePath(sec, ctxt, uri->path+1); |
- else |
-#endif |
- |
- /* |
- * Check if we are allowed to write this file |
- */ |
- ret = xsltCheckWritePath(sec, ctxt, uri->path); |
- if (ret <= 0) { |
- xmlFreeURI(uri); |
- return(ret); |
- } |
- } else { |
- /* |
- * Check if we are allowed to write this network resource |
- */ |
- check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_WRITE_NETWORK); |
- if (check != NULL) { |
- ret = check(sec, ctxt, (const char *)URL); |
- if (ret == 0) { |
- xsltTransformError(ctxt, NULL, NULL, |
- "File write for %s refused\n", URL); |
- xmlFreeURI(uri); |
- return(0); |
- } |
- } |
- } |
- xmlFreeURI(uri); |
- return(1); |
-} |
- |
- |
-/** |
- * xsltCheckRead: |
- * @sec: the security options |
- * @ctxt: an XSLT transformation context |
- * @URL: the resource to be read |
- * |
- * Check if the resource is allowed to be read |
- * |
- * Return 1 if read is allowed, 0 if not and -1 in case or error. |
- */ |
-int |
-xsltCheckRead(xsltSecurityPrefsPtr sec, |
- xsltTransformContextPtr ctxt, const xmlChar *URL) { |
- int ret; |
- xmlURIPtr uri; |
- xsltSecurityCheck check; |
- |
- uri = xmlParseURI((const char *)URL); |
- if (uri == NULL) { |
- xsltTransformError(ctxt, NULL, NULL, |
- "xsltCheckRead: URL parsing failed for %s\n", |
- URL); |
- return(-1); |
- } |
- if ((uri->scheme == NULL) || |
- (xmlStrEqual(BAD_CAST uri->scheme, BAD_CAST "file"))) { |
- |
- /* |
- * Check if we are allowed to read this file |
- */ |
- check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_READ_FILE); |
- if (check != NULL) { |
- ret = check(sec, ctxt, uri->path); |
- if (ret == 0) { |
- xsltTransformError(ctxt, NULL, NULL, |
- "Local file read for %s refused\n", URL); |
- xmlFreeURI(uri); |
- return(0); |
- } |
- } |
- } else { |
- /* |
- * Check if we are allowed to write this network resource |
- */ |
- check = xsltGetSecurityPrefs(sec, XSLT_SECPREF_READ_NETWORK); |
- if (check != NULL) { |
- ret = check(sec, ctxt, (const char *)URL); |
- if (ret == 0) { |
- xsltTransformError(ctxt, NULL, NULL, |
- "Network file read for %s refused\n", URL); |
- xmlFreeURI(uri); |
- return(0); |
- } |
- } |
- } |
- xmlFreeURI(uri); |
- return(1); |
-} |
- |