diff --git a/src/sbbs3/js_cryptcert.c b/src/sbbs3/js_cryptcert.c index 886ec130b90eb6cf5a1ace4fd847cef477f35e2e..3dc140fa8650db7c4e3f8b8240fac88715f56b77 100644 --- a/src/sbbs3/js_cryptcert.c +++ b/src/sbbs3/js_cryptcert.c @@ -125,8 +125,10 @@ js_export(JSContext *cx, uintN argc, jsval *arglist) JS_ReportError(cx, "Incorrect number of arguments. Got %d, expected 1.", argc); return JS_FALSE; } - if (!JS_ValueToInt32(cx,argv[0],&format)) + if (!JS_ValueToInt32(cx,argv[0],&format)) { + JS_ReportError(cx, "Invalid format."); return JS_FALSE; + } if ((p=(struct js_cryptcert_private_data *)JS_GetPrivate(cx,obj))==NULL) { JS_ReportError(cx, getprivate_failure, WHERE); @@ -155,11 +157,13 @@ js_export(JSContext *cx, uintN argc, jsval *arglist) } ret = JS_NewStringCopyN(cx, buf, len); free(buf); - if (ret == NULL) + if (ret == NULL) { + JS_ReportError(cx, "Unable to allocate return string\n"); return JS_FALSE; + } JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(ret)); - return JS_FALSE; + return JS_TRUE; } static JSBool @@ -1471,6 +1475,32 @@ js_cryptcert_attr_set(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_AT return JS_TRUE; } +static JSBool +js_cryptcert_attrkey_set(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) +{ + int status; + struct js_cryptcon_private_data* ctx; + JSObject *key; + + key = JSVAL_TO_OBJECT(*vp); + if (!JS_InstanceOf(cx, key, &js_cryptcon_class, NULL)) { + JS_ReportError(cx, "Invalid CryptContext"); + return JS_FALSE; + } + + if ((ctx=(struct js_cryptcon_private_data *)JS_GetPrivate(cx,key))==NULL) { + JS_ReportError(cx, getprivate_failure, WHERE); + return JS_FALSE; + } + + status = cryptSetAttribute(cert, type, ctx->ctx); + if (cryptStatusError(status)) { + js_cryptcert_error(cx, cert, status); + return JS_FALSE; + } + return JS_TRUE; +} + static JSBool js_cryptcert_attrstr_set(JSContext *cx, jsval *vp, CRYPT_CERTIFICATE cert, CRYPT_ATTRIBUTE_TYPE type) { @@ -1534,7 +1564,7 @@ js_cryptcert_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp case CRYPTCERT_PROP_SERIALNUMBER: return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SERIALNUMBER); case CRYPTCERT_PROP_SUBJECTPUBLICKEYINFO: - return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO); + return js_cryptcert_attrkey_set(cx, vp, p->cert, CRYPT_CERTINFO_SUBJECTPUBLICKEYINFO); case CRYPTCERT_PROP_CERTIFICATE: return js_cryptcert_attrstr_set(cx, vp, p->cert, CRYPT_CERTINFO_CERTIFICATE); case CRYPTCERT_PROP_CACERTIFICATE: @@ -2693,21 +2723,21 @@ JSObject* DLLCALL js_CreateCryptCertClass(JSContext* cx, JSObject* parent) , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); JS_DeepFreezeObject(cx, type); } - format = JS_DefineObject(cx, constructor, "CERTFORMAT", NULL, NULL, JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); + format = JS_DefineObject(cx, constructor, "FORMAT", NULL, NULL, JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); if(format != NULL) { - JS_DefineProperty(cx, type, "NONE", INT_TO_JSVAL(CRYPT_CERTFORMAT_NONE), NULL, NULL + JS_DefineProperty(cx, format, "NONE", INT_TO_JSVAL(CRYPT_CERTFORMAT_NONE), NULL, NULL , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); - JS_DefineProperty(cx, type, "CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_CERTIFICATE), NULL, NULL + JS_DefineProperty(cx, format, "CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_CERTIFICATE), NULL, NULL , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); - JS_DefineProperty(cx, type, "CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_CERTCHAIN), NULL, NULL + JS_DefineProperty(cx, format, "CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_CERTCHAIN), NULL, NULL , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); - JS_DefineProperty(cx, type, "TEXT_CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_TEXT_CERTIFICATE), NULL, NULL + JS_DefineProperty(cx, format, "TEXT_CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_TEXT_CERTIFICATE), NULL, NULL , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); - JS_DefineProperty(cx, type, "TEXT_CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_TEXT_CERTCHAIN), NULL, NULL + JS_DefineProperty(cx, format, "TEXT_CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_TEXT_CERTCHAIN), NULL, NULL , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); - JS_DefineProperty(cx, type, "XML_CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_XML_CERTIFICATE), NULL, NULL + JS_DefineProperty(cx, format, "XML_CERTIFICATE", INT_TO_JSVAL(CRYPT_CERTFORMAT_XML_CERTIFICATE), NULL, NULL , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); - JS_DefineProperty(cx, type, "XML_CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_XML_CERTCHAIN), NULL, NULL + JS_DefineProperty(cx, format, "XML_CERTCHAIN", INT_TO_JSVAL(CRYPT_CERTFORMAT_XML_CERTCHAIN), NULL, NULL , JSPROP_PERMANENT|JSPROP_ENUMERATE|JSPROP_READONLY); JS_DeepFreezeObject(cx, format); }