diff options
Diffstat (limited to 'libproxy/modules/pacrunner_webkit.cpp')
-rw-r--r-- | libproxy/modules/pacrunner_webkit.cpp | 182 |
1 files changed, 0 insertions, 182 deletions
diff --git a/libproxy/modules/pacrunner_webkit.cpp b/libproxy/modules/pacrunner_webkit.cpp deleted file mode 100644 index d907806..0000000 --- a/libproxy/modules/pacrunner_webkit.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/******************************************************************************* - * libproxy - A library for proxy configuration - * Copyright (C) 2006 Nathaniel McCallum <nathaniel@natemccallum.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - ******************************************************************************/ - -#include "../extension_pacrunner.hpp" -#include <unistd.h> // gethostname -using namespace libproxy; - -#ifdef __APPLE__ -// JavaScriptCore.h requires CoreFoundation -// This is only found on Mac OS X -#include <JavaScriptCore/JavaScriptCore.h> -#else -#include <JavaScriptCore/JavaScript.h> -#endif -#include "pacutils.h" - -#ifndef INET_ADDRSTRLEN -#define INET_ADDRSTRLEN 16 -#endif - -#ifndef INET6_ADDRSTRLEN -#define INET6_ADDRSTRLEN 46 -#endif - -static char *jstr2str(JSStringRef str, bool release) -{ - char *tmp = new char[JSStringGetMaximumUTF8CStringSize(str)+1]; - JSStringGetUTF8CString(str, tmp, JSStringGetMaximumUTF8CStringSize(str)+1); - if (release) JSStringRelease(str); - return tmp; -} - -static JSValueRef dnsResolve(JSContextRef ctx, JSObjectRef /*func*/, JSObjectRef /*self*/, size_t argc, const JSValueRef argv[], JSValueRef* /*exception*/) -{ - if (argc != 1) return NULL; - if (!JSValueIsString(ctx, argv[0])) return NULL; - - // Get hostname argument - char *tmp = jstr2str(JSValueToStringCopy(ctx, argv[0], NULL), true); - - // Look it up - struct addrinfo *info; - if (getaddrinfo(tmp, NULL, NULL, &info)) { - if (tmp) delete[] tmp; - return NULL; - } - delete[] tmp; - - // Try for IPv4 - tmp = new char[INET6_ADDRSTRLEN+1]; - if (getnameinfo(info->ai_addr, info->ai_addrlen, - tmp, INET6_ADDRSTRLEN+1, - NULL, 0, - NI_NUMERICHOST)) { - freeaddrinfo(info); - delete[] tmp; - return NULL; - } - freeaddrinfo(info); - - // Create the return value - JSStringRef str = JSStringCreateWithUTF8CString(tmp); - JSValueRef ret = JSValueMakeString(ctx, str); - JSStringRelease(str); - delete[] tmp; - - return ret; -} - -static JSValueRef myIpAddress(JSContextRef ctx, JSObjectRef func, JSObjectRef self, size_t /*argc*/, const JSValueRef[] /*argv*/, JSValueRef* /*exception*/) -{ - char hostname[1024]; - hostname[sizeof(hostname) - 1] = '\0'; - - if (!gethostname(hostname, sizeof(hostname) - 1)) { - JSStringRef str = JSStringCreateWithUTF8CString(hostname); - JSValueRef val = JSValueMakeString(ctx, str); - JSStringRelease(str); - JSValueRef ip = dnsResolve(ctx, func, self, 1, &val, NULL); - return ip; - } - return NULL; -} - -class webkit_pacrunner : public pacrunner { -public: - ~webkit_pacrunner() { - JSGarbageCollect(this->jsctx); - JSGlobalContextRelease(this->jsctx); - } - - webkit_pacrunner(string pac, const url& pacurl) : pacrunner(pac, pacurl) { - JSStringRef str = NULL; - JSObjectRef func = NULL; - - // Create the basic context - if (!(this->jsctx = JSGlobalContextCreate(NULL))) goto error; - - // Add dnsResolve into the context - str = JSStringCreateWithUTF8CString("dnsResolve"); - func = JSObjectMakeFunctionWithCallback(this->jsctx, str, dnsResolve); - JSObjectSetProperty(this->jsctx, JSContextGetGlobalObject(this->jsctx), str, func, kJSPropertyAttributeNone, NULL); - JSStringRelease(str); - - // Add myIpAddress into the context - str = JSStringCreateWithUTF8CString("myIpAddress"); - func = JSObjectMakeFunctionWithCallback(this->jsctx, str, myIpAddress); - JSObjectSetProperty(this->jsctx, JSContextGetGlobalObject(this->jsctx), str, func, kJSPropertyAttributeNone, NULL); - JSStringRelease(str); - - // Add all other routines into the context - str = JSStringCreateWithUTF8CString(JAVASCRIPT_ROUTINES); - if (!JSCheckScriptSyntax(this->jsctx, str, NULL, 0, NULL)) goto error; - JSEvaluateScript(this->jsctx, str, NULL, NULL, 1, NULL); - JSStringRelease(str); - - // Add the PAC into the context - str = JSStringCreateWithUTF8CString(pac.c_str()); - if (!JSCheckScriptSyntax(this->jsctx, str, NULL, 0, NULL)) goto error; - JSEvaluateScript(this->jsctx, str, NULL, NULL, 1, NULL); - JSStringRelease(str); - return; - - error: - if (str) JSStringRelease(str); - if (this->jsctx) { - JSGarbageCollect(this->jsctx); - JSGlobalContextRelease(this->jsctx); - } - throw bad_alloc(); - } - - string run(const url& url_) { - JSStringRef str = NULL; - JSValueRef val = NULL; - string tmp; - char *retChar = NULL; - string retStr = ""; - - // Run the PAC - tmp = string("FindProxyForURL(\"") + url_.to_string() + string("\", \"") + url_.get_host() + "\");"; - str = JSStringCreateWithUTF8CString(tmp.c_str()); - if (!str) throw bad_alloc(); - if (!JSCheckScriptSyntax(this->jsctx, str, NULL, 0, NULL)) goto error; - if (!(val = JSEvaluateScript(this->jsctx, str, NULL, NULL, 1, NULL))) goto error; - if (!JSValueIsString(this->jsctx, val)) goto error; - JSStringRelease(str); - - // Convert the return value to a string - retChar = jstr2str(JSValueToStringCopy(this->jsctx, val, NULL), true); - if (retChar) { - retStr = retChar; - delete[] retChar; - } - return retStr; - - error: - JSStringRelease(str); - return ""; - } - -private: - JSGlobalContextRef jsctx; -}; - -PX_PACRUNNER_MODULE_EZ(webkit, "JSObjectMakeFunctionWithCallback", "webkit"); |