diff --git a/dom/src/base/nsJSCrypto.cpp b/dom/src/base/nsJSCrypto.cpp new file mode 100644 index 000000000000..559174c9676d --- /dev/null +++ b/dom/src/base/nsJSCrypto.cpp @@ -0,0 +1,633 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * + * The contents of this file are subject to the Netscape Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/NPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): + */ +/* AUTO-GENERATED. DO NOT EDIT!!! */ + +#include "jsapi.h" +#include "nsJSUtils.h" +#include "nsDOMError.h" +#include "nscore.h" +#include "nsIServiceManager.h" +#include "nsIScriptContext.h" +#include "nsIScriptSecurityManager.h" +#include "nsIJSScriptObject.h" +#include "nsIScriptObjectOwner.h" +#include "nsIScriptGlobalObject.h" +#include "nsCOMPtr.h" +#include "nsDOMPropEnums.h" +#include "nsString.h" +#include "nsIDOMCRMFObject.h" +#include "nsIDOMCrypto.h" + + +static NS_DEFINE_IID(kIScriptObjectOwnerIID, NS_ISCRIPTOBJECTOWNER_IID); +static NS_DEFINE_IID(kIJSScriptObjectIID, NS_IJSSCRIPTOBJECT_IID); +static NS_DEFINE_IID(kIScriptGlobalObjectIID, NS_ISCRIPTGLOBALOBJECT_IID); +static NS_DEFINE_IID(kICRMFObjectIID, NS_IDOMCRMFOBJECT_IID); +static NS_DEFINE_IID(kICryptoIID, NS_IDOMCRYPTO_IID); + +// +// Crypto property ids +// +enum Crypto_slots { + CRYPTO_VERSION = -1 +}; + +/***********************************************************************/ +// +// Crypto Properties Getter +// +PR_STATIC_CALLBACK(JSBool) +GetCryptoProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) +{ + nsIDOMCrypto *a = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + + // If there's no private data, this must be the prototype, so ignore + if (nsnull == a) { + return JS_TRUE; + } + + nsresult rv = NS_OK; + if (JSVAL_IS_INT(id)) { + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + switch(JSVAL_TO_INT(id)) { + case CRYPTO_VERSION: + { + rv = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_VERSION, PR_FALSE); + if (NS_SUCCEEDED(rv)) { + nsAutoString prop; + rv = a->GetVersion(prop); + if (NS_SUCCEEDED(rv)) { + nsJSUtils::nsConvertStringToJSVal(prop, cx, vp); + } + } + break; + } + default: + return nsJSUtils::nsCallJSScriptObjectGetProperty(a, cx, obj, id, vp); + } + } + else { + return nsJSUtils::nsCallJSScriptObjectGetProperty(a, cx, obj, id, vp); + } + + if (NS_FAILED(rv)) + return nsJSUtils::nsReportError(cx, obj, rv); + return PR_TRUE; +} + +/***********************************************************************/ +// +// Crypto Properties Setter +// +PR_STATIC_CALLBACK(JSBool) +SetCryptoProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) +{ + nsIDOMCrypto *a = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + + // If there's no private data, this must be the prototype, so ignore + if (nsnull == a) { + return JS_TRUE; + } + + nsresult rv = NS_OK; + if (JSVAL_IS_INT(id)) { + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + switch(JSVAL_TO_INT(id)) { + case 0: + default: + return nsJSUtils::nsCallJSScriptObjectSetProperty(a, cx, obj, id, vp); + } + } + else { + return nsJSUtils::nsCallJSScriptObjectSetProperty(a, cx, obj, id, vp); + } + + if (NS_FAILED(rv)) + return nsJSUtils::nsReportError(cx, obj, rv); + return PR_TRUE; +} + + +// +// Crypto finalizer +// +PR_STATIC_CALLBACK(void) +FinalizeCrypto(JSContext *cx, JSObject *obj) +{ + nsJSUtils::nsGenericFinalize(cx, obj); +} + + +// +// Crypto enumerate +// +PR_STATIC_CALLBACK(JSBool) +EnumerateCrypto(JSContext *cx, JSObject *obj) +{ + return nsJSUtils::nsGenericEnumerate(cx, obj); +} + + +// +// Crypto resolve +// +PR_STATIC_CALLBACK(JSBool) +ResolveCrypto(JSContext *cx, JSObject *obj, jsval id) +{ + return nsJSUtils::nsGenericResolve(cx, obj, id); +} + + +// +// Native method GenerateCRMFRequest +// +PR_STATIC_CALLBACK(JSBool) +CryptoGenerateCRMFRequest(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + nsIDOMCRMFObject* nativeRet; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_GENERATECRMFREQUEST, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + result = nativeThis->GenerateCRMFRequest(cx, argv+0, argc-0, &nativeRet); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + nsJSUtils::nsConvertObjectToJSVal(nativeRet, cx, obj, rval); + } + + return JS_TRUE; +} + + +// +// Native method ImportUserCertificates +// +PR_STATIC_CALLBACK(JSBool) +CryptoImportUserCertificates(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + nsAutoString nativeRet; + nsAutoString b0; + nsAutoString b1; + PRBool b2; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_IMPORTUSERCERTIFICATES, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + if (argc < 3) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR); + } + + nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); + nsJSUtils::nsConvertJSValToString(b1, cx, argv[1]); + if (!nsJSUtils::nsConvertJSValToBool(&b2, cx, argv[2])) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_NOT_BOOLEAN_ERR); + } + + result = nativeThis->ImportUserCertificates(b0, b1, b2, nativeRet); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + nsJSUtils::nsConvertStringToJSVal(nativeRet, cx, rval); + } + + return JS_TRUE; +} + + +// +// Native method PopChallengeResponse +// +PR_STATIC_CALLBACK(JSBool) +CryptoPopChallengeResponse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + nsAutoString nativeRet; + nsAutoString b0; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_POPCHALLENGERESPONSE, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + if (argc < 1) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR); + } + + nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); + + result = nativeThis->PopChallengeResponse(b0, nativeRet); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + nsJSUtils::nsConvertStringToJSVal(nativeRet, cx, rval); + } + + return JS_TRUE; +} + + +// +// Native method Random +// +PR_STATIC_CALLBACK(JSBool) +CryptoRandom(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + nsAutoString nativeRet; + PRInt32 b0; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_RANDOM, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + if (argc < 1) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR); + } + + if (!JS_ValueToInt32(cx, argv[0], (int32 *)&b0)) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_NOT_NUMBER_ERR); + } + + result = nativeThis->Random(b0, nativeRet); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + nsJSUtils::nsConvertStringToJSVal(nativeRet, cx, rval); + } + + return JS_TRUE; +} + + +// +// Native method SignText +// +PR_STATIC_CALLBACK(JSBool) +CryptoSignText(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + nsAutoString nativeRet; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_SIGNTEXT, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + result = nativeThis->SignText(cx, argv+0, argc-0, nativeRet); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + nsJSUtils::nsConvertStringToJSVal(nativeRet, cx, rval); + } + + return JS_TRUE; +} + + +// +// Native method Alert +// +PR_STATIC_CALLBACK(JSBool) +CryptoAlert(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + nsAutoString b0; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_ALERT, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + if (argc < 1) { + return nsJSUtils::nsReportError(cx, obj, NS_ERROR_DOM_TOO_FEW_PARAMETERS_ERR); + } + + nsJSUtils::nsConvertJSValToString(b0, cx, argv[0]); + + result = nativeThis->Alert(b0); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + *rval = JSVAL_VOID; + } + + return JS_TRUE; +} + + +// +// Native method Logout +// +PR_STATIC_CALLBACK(JSBool) +CryptoLogout(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_LOGOUT, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + result = nativeThis->Logout(); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + *rval = JSVAL_VOID; + } + + return JS_TRUE; +} + + +// +// Native method DisableRightClick +// +PR_STATIC_CALLBACK(JSBool) +CryptoDisableRightClick(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + nsIDOMCrypto *nativeThis = (nsIDOMCrypto*)nsJSUtils::nsGetNativeThis(cx, obj); + nsresult result = NS_OK; + // If there's no private data, this must be the prototype, so ignore + if (nsnull == nativeThis) { + return JS_TRUE; + } + + { + *rval = JSVAL_NULL; + nsIScriptSecurityManager *secMan = nsJSUtils::nsGetSecurityManager(cx, obj); + if (!secMan) + return PR_FALSE; + result = secMan->CheckScriptAccess(cx, obj, NS_DOM_PROP_CRYPTO_DISABLERIGHTCLICK, PR_FALSE); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + result = nativeThis->DisableRightClick(); + if (NS_FAILED(result)) { + return nsJSUtils::nsReportError(cx, obj, result); + } + + *rval = JSVAL_VOID; + } + + return JS_TRUE; +} + + +/***********************************************************************/ +// +// class for Crypto +// +JSClass CryptoClass = { + "Crypto", + JSCLASS_HAS_PRIVATE | JSCLASS_PRIVATE_IS_NSISUPPORTS, + JS_PropertyStub, + JS_PropertyStub, + GetCryptoProperty, + SetCryptoProperty, + EnumerateCrypto, + ResolveCrypto, + JS_ConvertStub, + FinalizeCrypto, + nsnull, + nsJSUtils::nsCheckAccess +}; + + +// +// Crypto class properties +// +static JSPropertySpec CryptoProperties[] = +{ + {"version", CRYPTO_VERSION, JSPROP_ENUMERATE | JSPROP_READONLY}, + {0} +}; + + +// +// Crypto class methods +// +static JSFunctionSpec CryptoMethods[] = +{ + {"generateCRMFRequest", CryptoGenerateCRMFRequest, 0}, + {"importUserCertificates", CryptoImportUserCertificates, 3}, + {"popChallengeResponse", CryptoPopChallengeResponse, 1}, + {"random", CryptoRandom, 1}, + {"signText", CryptoSignText, 0}, + {"alert", CryptoAlert, 1}, + {"logout", CryptoLogout, 0}, + {"disableRightClick", CryptoDisableRightClick, 0}, + {0} +}; + + +// +// Crypto constructor +// +PR_STATIC_CALLBACK(JSBool) +Crypto(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) +{ + return JS_FALSE; +} + + +// +// Crypto class initialization +// +extern "C" NS_DOM nsresult NS_InitCryptoClass(nsIScriptContext *aContext, void **aPrototype) +{ + JSContext *jscontext = (JSContext *)aContext->GetNativeContext(); + JSObject *proto = nsnull; + JSObject *constructor = nsnull; + JSObject *parent_proto = nsnull; + JSObject *global = JS_GetGlobalObject(jscontext); + jsval vp; + + if ((PR_TRUE != JS_LookupProperty(jscontext, global, "Crypto", &vp)) || + !JSVAL_IS_OBJECT(vp) || + ((constructor = JSVAL_TO_OBJECT(vp)) == nsnull) || + (PR_TRUE != JS_LookupProperty(jscontext, JSVAL_TO_OBJECT(vp), "prototype", &vp)) || + !JSVAL_IS_OBJECT(vp)) { + + proto = JS_InitClass(jscontext, // context + global, // global object + parent_proto, // parent proto + &CryptoClass, // JSClass + Crypto, // JSNative ctor + 0, // ctor args + CryptoProperties, // proto props + CryptoMethods, // proto funcs + nsnull, // ctor props (static) + nsnull); // ctor funcs (static) + if (nsnull == proto) { + return NS_ERROR_FAILURE; + } + + } + else if ((nsnull != constructor) && JSVAL_IS_OBJECT(vp)) { + proto = JSVAL_TO_OBJECT(vp); + } + else { + return NS_ERROR_FAILURE; + } + + if (aPrototype) { + *aPrototype = proto; + } + return NS_OK; +} + + +// +// Method for creating a new Crypto JavaScript object +// +extern "C" NS_DOM nsresult NS_NewScriptCrypto(nsIScriptContext *aContext, nsISupports *aSupports, nsISupports *aParent, void **aReturn) +{ + NS_PRECONDITION(nsnull != aContext && nsnull != aSupports && nsnull != aReturn, "null argument to NS_NewScriptCrypto"); + JSObject *proto; + JSObject *parent; + nsIScriptObjectOwner *owner; + JSContext *jscontext = (JSContext *)aContext->GetNativeContext(); + nsresult result = NS_OK; + nsIDOMCrypto *aCrypto; + + if (nsnull == aParent) { + parent = nsnull; + } + else if (NS_OK == aParent->QueryInterface(kIScriptObjectOwnerIID, (void**)&owner)) { + if (NS_OK != owner->GetScriptObject(aContext, (void **)&parent)) { + NS_RELEASE(owner); + return NS_ERROR_FAILURE; + } + NS_RELEASE(owner); + } + else { + return NS_ERROR_FAILURE; + } + + if (NS_OK != NS_InitCryptoClass(aContext, (void **)&proto)) { + return NS_ERROR_FAILURE; + } + + result = aSupports->QueryInterface(kICryptoIID, (void **)&aCrypto); + if (NS_OK != result) { + return result; + } + + // create a js object for this class + *aReturn = JS_NewObject(jscontext, &CryptoClass, proto, parent); + if (nsnull != *aReturn) { + // connect the native object to the js object + JS_SetPrivate(jscontext, (JSObject *)*aReturn, aCrypto); + } + else { + NS_RELEASE(aCrypto); + return NS_ERROR_FAILURE; + } + + return NS_OK; +}