feat: v1.1.0

This commit is contained in:
Sergey Shehovcov 2025-08-14 13:10:42 +03:00
parent abad92c50e
commit b450007dc4
36 changed files with 9169 additions and 7528 deletions

View File

@ -1,4 +1,4 @@
// Type definitions for crypto-pro-js-m 1.0.1 // Type definitions for crypto-pro-js-m 1.1.0
// Project: crypto-pro-js-m // Project: crypto-pro-js-m
// Definitions by: Serge Schekhovtsov https://github.com/schekhovtsov // Definitions by: Serge Schekhovtsov https://github.com/schekhovtsov

View File

@ -5383,11 +5383,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
/*! no static exports found */ /*! no static exports found */
/***/ (function(module, exports) { /***/ (function(module, exports) {
;(function () { ; (function () {
//already loaded //already loaded
if(window.cadesplugin) if (window.cadesplugin && window.cadesplugin.LOG_LEVEL_DEBUG) {
return; return;
}
var pluginObject; var pluginObject;
var plugin_resolved = 0; var plugin_resolved = 0;
var plugin_reject; var plugin_reject;
@ -5399,80 +5399,111 @@ Object.defineProperty(exports, "__esModule", { value: true });
var canPromise = !!window.Promise; var canPromise = !!window.Promise;
var cadesplugin_loaded_event_recieved = false; var cadesplugin_loaded_event_recieved = false;
var isFireFoxExtensionLoaded = false; var isFireFoxExtensionLoaded = false;
var cadesplugin; var cadesplugin = {};
if(canPromise) if (canPromise) {
{ cadesplugin = new window.Promise(function (resolve, reject) {
cadesplugin = new Promise(function(resolve, reject)
{
plugin_resolve = resolve; plugin_resolve = resolve;
plugin_reject = reject; plugin_reject = reject;
}); });
} else
{
cadesplugin = {};
} }
function check_browser() { function check_browser() {
var ua= navigator.userAgent, tem, M= ua.match(/(opera|yabrowser|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; var ua = window.navigator.userAgent,
if(/trident/i.test(M[1])){ tem,
M = ua.match(/(opera|yabrowser|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || []; tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return { name:'IE', version:(tem[1] || '')}; return { name: 'IE', version: (tem[1] || '') };
} }
if(M[1] === 'Chrome'){ if (M[1] === "Chrome") {
tem = ua.match(/\b(OPR|Edg|YaBrowser)\/(\d+)/); tem = ua.match(/\b(OPR|Edg|YaBrowser)\/(\d+)/);
if (tem != null) if (tem != null && (tem.length > 2)) {
return { name: tem[1].replace('OPR', 'Opera'), version: tem[2] }; return { name: tem[1].replace('OPR', 'Opera'), version: tem[2] };
} }
M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null)
M.splice(1, 1, tem[1]);
return {name:M[0],version:M[1]};
} }
M = M[2] ? [M[1], M[2]] : [window.navigator.appName, window.navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) {
M.splice(1, 1, tem[1]);
}
return { name: M[0], version: M[1] };
}
var browserSpecs = check_browser(); var browserSpecs = check_browser();
function cpcsp_console_log(level, msg){ function cpcsp_console_log(level, msg) {
//IE9 не может писать в консоль если не открыта вкладка developer tools //IE9 не может писать в консоль если не открыта вкладка developer tools
if(typeof(console) === 'undefined') if (typeof console === 'undefined') {
return; return;
if (level <= cadesplugin.current_log_level ){ }
if (level === cadesplugin.LOG_LEVEL_DEBUG) if (level <= cadesplugin.current_log_level) {
if (level === cadesplugin.LOG_LEVEL_DEBUG) {
console.log("DEBUG: %s", msg); console.log("DEBUG: %s", msg);
if (level === cadesplugin.LOG_LEVEL_INFO) }
if (level === cadesplugin.LOG_LEVEL_INFO) {
console.info("INFO: %s", msg); console.info("INFO: %s", msg);
if (level === cadesplugin.LOG_LEVEL_ERROR) }
if (level === cadesplugin.LOG_LEVEL_ERROR) {
console.error("ERROR: %s", msg); console.error("ERROR: %s", msg);
return; }
} }
} }
function set_log_level(level){ function get_extension_version(callback) {
window.postMessage("cadesplugin_extension_version_request", "*");
window.addEventListener("message", function (event) {
var resp_prefix = "cadesplugin_extension_version_response:";
if (typeof (event.data) !== "string" || event.data.indexOf(resp_prefix) !== 0) {
return;
}
var ext_version = event.data.substring(resp_prefix.length);
callback(ext_version);
}, false);
}
function get_extension_id(callback) {
window.postMessage("cadesplugin_extension_id_request", "*");
window.addEventListener("message", function (event) {
var resp_prefix = "cadesplugin_extension_id_response:";
if (typeof (event.data) !== "string" || event.data.indexOf(resp_prefix) !== 0) {
return;
}
var ext_id = event.data.substring(resp_prefix.length);
callback(ext_id);
}, false);
}
function set_log_level(level) {
if (!((level === cadesplugin.LOG_LEVEL_DEBUG) || if (!((level === cadesplugin.LOG_LEVEL_DEBUG) ||
(level === cadesplugin.LOG_LEVEL_INFO) || (level === cadesplugin.LOG_LEVEL_INFO) ||
(level === cadesplugin.LOG_LEVEL_ERROR))){ (level === cadesplugin.LOG_LEVEL_ERROR))) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level); cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level);
return; return;
} }
cadesplugin.current_log_level = level; cadesplugin.current_log_level = level;
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR");
if(isNativeMessageSupported()) }
{ if (isNativeMessageSupported()) {
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) {
window.postMessage("set_log_level=debug", "*"); window.postMessage("set_log_level=debug", "*");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) {
window.postMessage("set_log_level=info", "*"); window.postMessage("set_log_level=info", "*");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) {
window.postMessage("set_log_level=error", "*"); window.postMessage("set_log_level=error", "*");
} }
} }
}
function set_constantValues() function set_constantValues() {
{
cadesplugin.CAPICOM_MEMORY_STORE = 0; cadesplugin.CAPICOM_MEMORY_STORE = 0;
cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1; cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1;
cadesplugin.CAPICOM_CURRENT_USER_STORE = 2; cadesplugin.CAPICOM_CURRENT_USER_STORE = 2;
@ -5483,9 +5514,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_SMART_CARD_USER_STORE = 4; cadesplugin.CADESCOM_SMART_CARD_USER_STORE = 4;
cadesplugin.CADESCOM_CONTAINER_STORE = 100; cadesplugin.CADESCOM_CONTAINER_STORE = 100;
cadesplugin.CAPICOM_ROOT_STORE = "Root";
cadesplugin.CAPICOM_CA_STORE = "CA";
cadesplugin.CAPICOM_MY_STORE = "My"; cadesplugin.CAPICOM_MY_STORE = "My";
cadesplugin.CAPICOM_ADDRESSBOOK_STORE = "AddressBook";
cadesplugin.CAPICOM_STORE_OPEN_READ_WRITE = 1;
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2; cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
cadesplugin.CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED = 256;
cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1; cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
@ -5513,6 +5549,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_CADES_BES = 1; cadesplugin.CADESCOM_CADES_BES = 1;
cadesplugin.CADESCOM_CADES_T = 0x5; cadesplugin.CADESCOM_CADES_T = 0x5;
cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d; cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d;
cadesplugin.CADESCOM_CADES_A = 0xdd;
cadesplugin.CADESCOM_PKCS7_TYPE = 0xffff; cadesplugin.CADESCOM_PKCS7_TYPE = 0xffff;
cadesplugin.CADESCOM_ENCODE_BASE64 = 0; cadesplugin.CADESCOM_ENCODE_BASE64 = 0;
@ -5522,6 +5559,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_NONE = 0x100;
cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0; cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1; cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1;
@ -5573,6 +5611,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_MAGMA = 35;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_MAGMA_OMAC = 36;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_KUZNYECHIK = 45;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_KUZNYECHIK_OMAC = 46;
cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0; cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0;
cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1; cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1;
@ -5588,6 +5630,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111; cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111;
cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112; cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112;
cadesplugin.CADESCOM_CERT_INFO_ROLE = 100;
cadesplugin.CADESCOM_ROLE_ROOT = "ROOT";
cadesplugin.CADESCOM_ROLE_CA = "CA";
cadesplugin.CADESCOM_ROLE_LEAF = "LEAF";
cadesplugin.LOG_LEVEL_DEBUG = 4; cadesplugin.LOG_LEVEL_DEBUG = 4;
cadesplugin.LOG_LEVEL_INFO = 2; cadesplugin.LOG_LEVEL_INFO = 2;
cadesplugin.LOG_LEVEL_ERROR = 1; cadesplugin.LOG_LEVEL_ERROR = 1;
@ -5600,6 +5647,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_InstallCertChainToContainer = 0x20000000; cadesplugin.CADESCOM_InstallCertChainToContainer = 0x20000000;
cadesplugin.CADESCOM_UseContainerStore = 0x40000000; cadesplugin.CADESCOM_UseContainerStore = 0x40000000;
cadesplugin.ContextNone = 0;
cadesplugin.ContextUser = 0x1;
cadesplugin.ContextMachine = 0x2;
cadesplugin.ContextAdministratorForceMachine = 0x3;
cadesplugin.ENABLE_CARRIER_TYPE_CSP = 0x01; cadesplugin.ENABLE_CARRIER_TYPE_CSP = 0x01;
cadesplugin.ENABLE_CARRIER_TYPE_FKC_NO_SM = 0x02; cadesplugin.ENABLE_CARRIER_TYPE_FKC_NO_SM = 0x02;
cadesplugin.ENABLE_CARRIER_TYPE_FKC_SM = 0x04; cadesplugin.ENABLE_CARRIER_TYPE_FKC_SM = 0x04;
@ -5614,12 +5666,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_PRODUCT_OCSP = 1; cadesplugin.CADESCOM_PRODUCT_OCSP = 1;
cadesplugin.CADESCOM_PRODUCT_TSP = 2; cadesplugin.CADESCOM_PRODUCT_TSP = 2;
cadesplugin.MEDIA_TYPE_DEFAULT = 0x00000000;
cadesplugin.MEDIA_TYPE_REGISTRY = 0x00000001; cadesplugin.MEDIA_TYPE_REGISTRY = 0x00000001;
cadesplugin.MEDIA_TYPE_HDIMAGE = 0x00000002; cadesplugin.MEDIA_TYPE_HDIMAGE = 0x00000002;
cadesplugin.MEDIA_TYPE_CLOUD = 0x00000004; cadesplugin.MEDIA_TYPE_CLOUD = 0x00000004;
cadesplugin.MEDIA_TYPE_SCARD = 0x00000008; cadesplugin.MEDIA_TYPE_SCARD = 0x00000008;
cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0; cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0;
cadesplugin.XCN_CRYPT_STRING_BASE64 = 0x1;
cadesplugin.XCN_CRYPT_STRING_BINARY = 0x2;
cadesplugin.XCN_CRYPT_STRING_BASE64REQUESTHEADER = 0x3;
cadesplugin.XCN_CRYPT_STRING_HEX = 0x4;
cadesplugin.XCN_CRYPT_STRING_HEXASCII = 0x5;
cadesplugin.XCN_CRYPT_STRING_BASE64_ANY = 0x6;
cadesplugin.XCN_CRYPT_STRING_ANY = 0x7;
cadesplugin.XCN_CRYPT_STRING_HEX_ANY = 0x8;
cadesplugin.XCN_CRYPT_STRING_BASE64X509CRLHEADER = 0x9;
cadesplugin.XCN_CRYPT_STRING_HEXADDR = 0xa;
cadesplugin.XCN_CRYPT_STRING_HEXASCIIADDR = 0xb;
cadesplugin.XCN_CRYPT_STRING_HEXRAW = 0xc;
cadesplugin.XCN_CRYPT_STRING_BASE64URI = 0xd;
cadesplugin.XCN_CRYPT_STRING_ENCODEMASK = 0xff;
cadesplugin.XCN_CRYPT_STRING_CHAIN = 0x100;
cadesplugin.XCN_CRYPT_STRING_TEXT = 0x200;
cadesplugin.XCN_CRYPT_STRING_PERCENTESCAPE = 0x8000000;
cadesplugin.XCN_CRYPT_STRING_HASHDATA = 0x10000000;
cadesplugin.XCN_CRYPT_STRING_STRICT = 0x20000000;
cadesplugin.XCN_CRYPT_STRING_NOCRLF = 0x40000000;
cadesplugin.XCN_CRYPT_STRING_NOCR = 0x80000000;
cadesplugin.XCN_CERT_NAME_STR_NONE = 0;
cadesplugin.XCN_AT_NONE = 0;
cadesplugin.XCN_AT_KEYEXCHANGE = 1;
cadesplugin.XCN_AT_SIGNATURE = 2;
cadesplugin.AT_KEYEXCHANGE = 1; cadesplugin.AT_KEYEXCHANGE = 1;
cadesplugin.AT_SIGNATURE = 2; cadesplugin.AT_SIGNATURE = 2;
@ -5628,8 +5708,97 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CARRIER_FLAG_PROTECTED = 4; cadesplugin.CARRIER_FLAG_PROTECTED = 4;
cadesplugin.CARRIER_FLAG_FUNCTIONAL_CARRIER = 8; cadesplugin.CARRIER_FLAG_FUNCTIONAL_CARRIER = 8;
cadesplugin.CARRIER_FLAG_SECURE_MESSAGING = 16; cadesplugin.CARRIER_FLAG_SECURE_MESSAGING = 16;
cadesplugin.CARRIER_FLAG_ABLE_SET_KEY = 32;
cadesplugin.CARRIER_FLAG_ABLE_VISUALISE_SIGNATURE = 64; cadesplugin.CARRIER_FLAG_ABLE_VISUALISE_SIGNATURE = 64;
cadesplugin.CARRIER_FLAG_VIRTUAL = 128; cadesplugin.CARRIER_FLAG_VIRTUAL = 128;
cadesplugin.CRYPT_MODE_CBCSTRICT = 1;
cadesplugin.CRYPT_MODE_CNT = 3;
cadesplugin.CRYPT_MODE_CBCRFC4357 = 31;
cadesplugin.CRYPT_MODE_CTR = 32;
cadesplugin.CRYPT_MODE_MGM = 33;
cadesplugin.CRYPT_MODE_GCM = 34;
cadesplugin.CRYPT_MODE_OMAC_CTR = 35;
cadesplugin.CRYPT_MODE_WRAP = 36;
cadesplugin.CRYPT_MODE_WRAP_PAD = 37;
cadesplugin.PKCS5_PADDING = 1;
cadesplugin.RANDOM_PADDING = 2;
cadesplugin.ZERO_PADDING = 3;
cadesplugin.ISO10126_PADDING = 4;
cadesplugin.ANSI_X923_PADDING = 5;
cadesplugin.TLS_1_0_PADDING = 6;
cadesplugin.ISO_IEC_7816_4_PADDING = 7;
cadesplugin.CAPICOM_STORE_SAVE_AS_SERIALIZED = 0;
cadesplugin.CAPICOM_STORE_SAVE_AS_PKCS7 = 1;
cadesplugin.CERT_TRUST_NO_ERROR = 0x00000000;
cadesplugin.CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001;
cadesplugin.CERT_TRUST_IS_REVOKED = 0x00000004;
cadesplugin.CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008;
cadesplugin.CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010;
cadesplugin.CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020;
cadesplugin.CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040;
cadesplugin.CERT_TRUST_IS_CYCLIC = 0x00000080;
cadesplugin.CERT_TRUST_INVALID_EXTENSION = 0x00000100;
cadesplugin.CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200;
cadesplugin.CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400;
cadesplugin.CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800;
cadesplugin.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000;
cadesplugin.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000;
cadesplugin.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000;
cadesplugin.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000;
cadesplugin.CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000;
cadesplugin.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000;
cadesplugin.CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000;
cadesplugin.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000;
cadesplugin.CERT_TRUST_HAS_WEAK_SIGNATURE = 0x00100000;
cadesplugin.XCN_CERT_NO_KEY_USAGE = 0;
cadesplugin.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE = 0x80;
cadesplugin.XCN_CERT_NON_REPUDIATION_KEY_USAGE = 0x40;
cadesplugin.XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE = 0x20;
cadesplugin.XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE = 0x10;
cadesplugin.XCN_CERT_KEY_AGREEMENT_KEY_USAGE = 0x8;
cadesplugin.XCN_CERT_KEY_CERT_SIGN_KEY_USAGE = 0x4;
cadesplugin.XCN_CERT_OFFLINE_CRL_SIGN_KEY_USAGE = 0x2;
cadesplugin.XCN_CERT_CRL_SIGN_KEY_USAGE = 0x2;
cadesplugin.XCN_CERT_ENCIPHER_ONLY_KEY_USAGE = 0x1;
cadesplugin.XCN_CERT_DECIPHER_ONLY_KEY_USAGE = 0x8000;
cadesplugin.CADESCOM_XADES_ACCEPT_ANY_ID_ATTR_NAMESPACE = 1;
cadesplugin.CADES_USE_OCSP_AUTHORIZED_POLICY = 0x00020000;
cadesplugin.XCN_NCRYPT_NO_OPERATION = 0;
cadesplugin.XCN_NCRYPT_CIPHER_OPERATION = 0x1;
cadesplugin.XCN_NCRYPT_HASH_OPERATION = 0x2;
cadesplugin.XCN_NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION = 0x4;
cadesplugin.XCN_NCRYPT_SECRET_AGREEMENT_OPERATION = 0x8;
cadesplugin.XCN_NCRYPT_SIGNATURE_OPERATION = 0x10;
cadesplugin.XCN_NCRYPT_RNG_OPERATION = 0x20;
cadesplugin.XCN_CRYPT_ANY_GROUP_ID = 0;
cadesplugin.XCN_CRYPT_HASH_ALG_OID_GROUP_ID = 1;
cadesplugin.XCN_CRYPT_ENCRYPT_ALG_OID_GROUP_ID = 2;
cadesplugin.XCN_CRYPT_PUBKEY_ALG_OID_GROUP_ID = 3;
cadesplugin.XCN_CRYPT_SIGN_ALG_OID_GROUP_ID = 4;
cadesplugin.XCN_CRYPT_RDN_ATTR_OID_GROUP_ID = 5;
cadesplugin.XCN_CRYPT_EXT_OR_ATTR_OID_GROUP_ID = 6;
cadesplugin.XCN_CRYPT_ENHKEY_USAGE_OID_GROUP_ID = 7;
cadesplugin.XCN_CRYPT_POLICY_OID_GROUP_ID = 8;
cadesplugin.XCN_CRYPT_TEMPLATE_OID_GROUP_ID = 9;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_ANY = 0;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG = 0x80000000;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG = 0x40000000;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_DISABLED = 0;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_ENABLED = 1;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_STRICT = 2;
cadesplugin.AlgorithmFlagsNone = 0;
cadesplugin.AlgorithmFlagsWrap = 0x1;
} }
function async_spawn(generatorFunc) { function async_spawn(generatorFunc) {
@ -5638,12 +5807,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
try { try {
result = generator[verb](arg); result = generator[verb](arg);
} catch (err) { } catch (err) {
return Promise.reject(err); return window.Promise.reject(err);
} }
if (result.done) { if (result.done) {
return result.value; return result.value;
} else { } else {
return Promise.resolve(result.value).then(onFulfilled, onRejected); return window.Promise.resolve(result.value).then(onFulfilled, onRejected);
} }
} }
var generator = generatorFunc(Array.prototype.slice.call(arguments, 1)); var generator = generatorFunc(Array.prototype.slice.call(arguments, 1));
@ -5659,16 +5828,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function isIOS() { function isIOS() {
return (navigator.userAgent.match(/ipod/i) || return (window.navigator.userAgent.match(/ipod/i) ||
navigator.userAgent.match(/ipad/i) || window.navigator.userAgent.match(/ipad/i) ||
navigator.userAgent.match(/iphone/i)); window.navigator.userAgent.match(/iphone/i));
} }
function isNativeMessageSupported() function isNativeMessageSupported() {
{
// В IE работаем через NPAPI // В IE работаем через NPAPI
if(isIE()) if (isIE()) {
return false; return false;
}
// В Edge работаем через NativeMessage // В Edge работаем через NativeMessage
if (browserSpecs.name === 'Edg') { if (browserSpecs.name === 'Edg') {
return true; return true;
@ -5678,40 +5847,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
return true; return true;
} }
// В Chrome, Firefox, Safari и Opera работаем через асинхронную версию в зависимости от версии // В Chrome, Firefox, Safari и Opera работаем через асинхронную версию в зависимости от версии
if(browserSpecs.name === 'Opera') { if (browserSpecs.name === 'Opera') {
isOpera = true; isOpera = true;
if(browserSpecs.version >= 33){ return (browserSpecs.version >= 33);
return true;
} }
else{ if (browserSpecs.name === 'Firefox') {
return false;
}
}
if(browserSpecs.name === 'Firefox') {
isFireFox = true; isFireFox = true;
if(browserSpecs.version >= 52){ return (browserSpecs.version >= 52);
return true;
}
else{
return false;
}
}
if(browserSpecs.name === 'Chrome') {
if(browserSpecs.version >= 42){
return true;
}
else{
return false;
} }
if (browserSpecs.name === 'Chrome') {
return (browserSpecs.version >= 42);
} }
//В Сафари начиная с 12 версии нет NPAPI //В Сафари начиная с 12 версии нет NPAPI
if(browserSpecs.name === 'Safari') { if (browserSpecs.name === 'Safari') {
isSafari = true; isSafari = true;
if(browserSpecs.version >= 12) { return (browserSpecs.version >= 12);
return true;
} else {
return false;
}
} }
} }
@ -5722,19 +5872,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
// call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js // call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js
return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]); return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
} }
var objWebClassFactory;
if (isIE()) { if (isIE()) {
// В Internet Explorer создаются COM-объекты // В Internet Explorer создаются COM-объекты
if (name.match(/X509Enrollment/i)) { if (name.match(/X509Enrollment/i)) {
try { try {
// Объекты CertEnroll пробуем создавать через нашу фабрику, // Объекты CertEnroll пробуем создавать через нашу фабрику,
// если не получилось то через CX509EnrollmentWebClassFactory // если не получилось то через CX509EnrollmentWebClassFactory
var objCertEnrollClassFactory = document.getElementById("webClassFactory"); objWebClassFactory = document.getElementById("webClassFactory");
return objCertEnrollClassFactory.CreateObject(name); return objWebClassFactory.CreateObject(name);
} }
catch (e) { catch (e) {
try { try {
var objWebClassFactory = document.getElementById("certEnrollClassFactory"); var objCertEnrollClassFactory = document.getElementById("certEnrollClassFactory");
return objWebClassFactory.CreateObject(name); return objCertEnrollClassFactory.CreateObject(name);
} }
catch (err) { catch (err) {
throw ("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS"); throw ("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS");
@ -5743,12 +5894,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
// Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory // Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory
try { try {
var objWebClassFactory = document.getElementById("webClassFactory"); objWebClassFactory = document.getElementById("webClassFactory");
return objWebClassFactory.CreateObject(name); return objWebClassFactory.CreateObject(name);
} } catch (e) {
catch (e) {
// Для версий плагина ниже 2.0.12538 // Для версий плагина ниже 2.0.12538
return new ActiveXObject(name); return new window.ActiveXObject(name);
} }
} }
// создаются объекты NPAPI // создаются объекты NPAPI
@ -5774,19 +5924,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function getLastError(exception) { function getLastError(exception) {
if(isNativeMessageSupported() || isIE() || isIOS() ) { if (isNativeMessageSupported() || isIE() || isIOS()) {
return GetMessageFromException(exception); return GetMessageFromException(exception);
} }
try { try {
return pluginObject.getLastError(); return pluginObject.getLastError();
} catch(e) { } catch (e) {
return GetMessageFromException(exception); return GetMessageFromException(exception);
} }
} }
// Функция для удаления созданных объектов // Функция для удаления созданных объектов
function ReleasePluginObjects() { function ReleasePluginObjects() {
// noinspection JSUnresolvedVariable
return cpcsp_chrome_nmcades.ReleasePluginObjects(); return cpcsp_chrome_nmcades.ReleasePluginObjects();
} }
@ -5795,35 +5946,39 @@ Object.defineProperty(exports, "__esModule", { value: true });
return pluginObject.CreateObjectAsync(name); return pluginObject.CreateObjectAsync(name);
} }
//Функции для IOS // Функции для IOS
// noinspection JSUnusedGlobalSymbols
var ru_cryptopro_npcades_10_native_bridge = { var ru_cryptopro_npcades_10_native_bridge = {
callbacksCount : 1, callbacksCount: 1,
callbacks : {}, callbacks: {},
// Automatically called by native layer when a result is available // Automatically called by native layer when a result is available
resultForCallback : function resultForCallback(callbackId, resultArray) { resultForCallback: function resultForCallback(callbackId, resultArray) {
var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId]; var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId];
if (!callback) return; if (!callback) {
callback.apply(null,resultArray); return;
}
callback.apply(null, resultArray);
}, },
// Use this in javascript to request native objective-c code // Use this in javascript to request native objective-c code
// functionName : string (I think the name is explicit :p) // functionName : string (I think the name is explicit :p)
// args : array of arguments // args : array of arguments
// callback : function with n-arguments that is going to be called when the native code returned // callback : function with n-arguments that is going to be called when the native code returned
call : function call(functionName, args, callback) { call: function call(functionName, args, callback) {
var hasCallback = callback && typeof callback === "function"; var hasCallback = callback && typeof callback === "function";
var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0; var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0;
if (hasCallback) if (hasCallback) {
ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback; ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback;
}
var iframe = document.createElement("IFRAME"); var iframe = document.createElement("IFRAME");
var arrObjs = new Array("_CPNP_handle"); var arrObjs = new Array("_CPNP_handle");
try{ try {
iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId+ ":" + encodeURIComponent(JSON.stringify(args, arrObjs))); iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId + ":" + encodeURIComponent(window.JSON.stringify(args, arrObjs)));
} catch(e){ } catch (e) {
alert(e); window.alert(e);
} }
document.documentElement.appendChild(iframe); document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe); iframe.parentNode.removeChild(iframe);
@ -5831,130 +5986,138 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}; };
function call_ru_cryptopro_npcades_10_native_bridge(functionName, array){ function call_ru_cryptopro_npcades_10_native_bridge(functionName, array) {
var tmpobj; var tmpobj;
var ex; var ex;
ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function(e, response){ ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function (e, response) {
ex = e; ex = e;
var str='tmpobj='+response; var tmpobj = "";
eval(str); try {
if (typeof (tmpobj) === "string"){ tmpobj = window.JSON.parse(response);
}
catch (err) {
tmpobj = response;
}
if (typeof tmpobj === "string") {
tmpobj = tmpobj.replace(/\\\n/gm, "\n"); tmpobj = tmpobj.replace(/\\\n/gm, "\n");
tmpobj = tmpobj.replace(/\\\r/gm, "\r"); tmpobj = tmpobj.replace(/\\\r/gm, "\r");
} }
}); });
if(ex) if (ex) {
throw ex; throw ex;
}
return tmpobj; return tmpobj;
} }
function show_firefox_missing_extension_dialog() function show_firefox_missing_extension_dialog() {
{ if (!window.cadesplugin_skip_extension_install) {
if (!window.cadesplugin_skip_extension_install)
{
var ovr = document.createElement('div'); var ovr = document.createElement('div');
ovr.id = "cadesplugin_ovr"; ovr.id = "cadesplugin_ovr";
ovr.style = "visibility: hidden; position: fixed; left: 0px; top: 0px; width:100%; height:100%; background-color: rgba(0,0,0,0.7)"; ovr.style = "visibility: hidden; position: fixed; left: 0; top: 0; width:100%; height:100%; background-color: rgba(0,0,0,0.7)";
ovr.innerHTML = "<div id='cadesplugin_ovr_item' style='position:relative; width:400px; margin:100px auto; background-color:#fff; border:2px solid #000; padding:10px; text-align:center; opacity: 1; z-index: 1500'>" + ovr.innerHTML = "<div id='cadesplugin_ovr_item' style='position:relative; max-width:400px; margin:100px auto; background-color:#fff; border:2px solid #000; padding:10px; text-align:center; opacity: 1; z-index: 1500'>" +
"<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" + "<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" +
"<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." + "<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." +
"<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" + "<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" +
"</div>"; "</div>";
document.getElementsByTagName("Body")[0].appendChild(ovr); document.getElementsByTagName("Body")[0].appendChild(ovr);
document.getElementById("cadesplugin_close_install").addEventListener('click',function() document.getElementById("cadesplugin_close_install").addEventListener('click', function () {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
document.getElementById("cadesplugin_ovr").style.visibility = 'hidden'; document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
}); });
ovr.addEventListener('click',function() ovr.addEventListener('click', function () {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
document.getElementById("cadesplugin_ovr").style.visibility = 'hidden'; document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
}); });
ovr.style.visibility="visible"; ovr.style.visibility = "visible";
} }
} }
function firefox_or_safari_nmcades_onload() { function firefox_or_safari_nmcades_onload() {
if (window.cadesplugin_extension_loaded_callback) // noinspection JSUnresolvedVariable
if (window.cadesplugin_extension_loaded_callback) {
window.cadesplugin_extension_loaded_callback(); window.cadesplugin_extension_loaded_callback();
}
isFireFoxExtensionLoaded = true; isFireFoxExtensionLoaded = true;
// noinspection JSUnresolvedVariable,JSUnresolvedFunction
cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error); cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
} }
function load_js_script(url, successFunc, errorFunc) {
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", url);
script.onerror = errorFunc;
script.onload = successFunc;
document.getElementsByTagName("head")[0].appendChild(script);
}
function nmcades_api_onload() { function nmcades_api_onload() {
if (!isIE() && !isFireFox && !isSafari) { if (!isIE() && !isFireFox && !isSafari) {
if (window.cadesplugin_extension_loaded_callback) // noinspection JSUnresolvedVariable
if (window.cadesplugin_extension_loaded_callback) {
window.cadesplugin_extension_loaded_callback(); window.cadesplugin_extension_loaded_callback();
} }
}
window.postMessage("cadesplugin_echo_request", "*"); window.postMessage("cadesplugin_echo_request", "*");
window.addEventListener("message", function (event){ window.addEventListener("message", function (event) {
if (typeof(event.data) !== "string" || !event.data.match("cadesplugin_loaded")) if (typeof (event.data) !== "string" || !event.data.match("cadesplugin_loaded")) {
return; return;
if (cadesplugin_loaded_event_recieved) }
if (cadesplugin_loaded_event_recieved) {
return; return;
if(isFireFox || isSafari) }
{ if (isFireFox || isSafari) {
// Для Firefox, Сафари вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js // Для Firefox, Сафари вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js
var url = event.data.substring(event.data.indexOf("url:") + 4); var url = event.data.substring(event.data.indexOf("url:") + 4);
if (!url.match("^moz-extension://[a-zA-Z0-9-]+/nmcades_plugin_api.js$") if (!url.match("^(moz|safari)-extension://[a-zA-Z0-9/_-]+/nmcades_plugin_api.js$")) {
&& !url.match("^safari-extension://[a-zA-Z0-9-]+/[a-zA-Z0-9]+/nmcades_plugin_api.js$"))
{
cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "Bad url \"" + url + "\" for load CryptoPro Extension for CAdES Browser plug-in"); cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "Bad url \"" + url + "\" for load CryptoPro Extension for CAdES Browser plug-in");
plugin_loaded_error(); plugin_loaded_error();
return; return;
} }
var fileref = document.createElement('script'); load_js_script(url, firefox_or_safari_nmcades_onload, plugin_loaded_error);
fileref.setAttribute("type", "text/javascript"); } else {
fileref.setAttribute("src", url); // noinspection JSUnresolvedVariable,JSUnresolvedFunction
fileref.onerror = plugin_loaded_error;
fileref.onload = firefox_or_safari_nmcades_onload;
document.getElementsByTagName("head")[0].appendChild(fileref);
}else {
cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error); cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
} }
cadesplugin_loaded_event_recieved = true; cadesplugin_loaded_event_recieved = true;
}, false); }, false);
} }
//Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge, Safari // Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge, Safari
function load_extension() function load_extension() {
{ if (isFireFox || isSafari) {
if(isFireFox || isSafari){
// вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера. // вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера.
nmcades_api_onload(); nmcades_api_onload();
} else { return;
// в асинхронном варианте для Yandex и Opera подключаем расширение из Opera store. }
if (isOpera || isYandex) { var operaUrl = "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js";
var fileref = document.createElement('script'); var manifestv2Url = "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js";
fileref.setAttribute("type", "text/javascript"); var manifestv3Url = "chrome-extension://pfhgbfnnjiafkhfdkmpiflachepdcjod/nmcades_plugin_api.js";
fileref.setAttribute("src", "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js"); if (isYandex || isOpera) {
fileref.onerror = plugin_loaded_error; // в асинхронном варианте для Yandex пробуем подключить расширения по очереди
fileref.onload = nmcades_api_onload; load_js_script(operaUrl, nmcades_api_onload, function () {
document.getElementsByTagName("head")[0].appendChild(fileref); load_js_script(manifestv2Url, nmcades_api_onload, function () {
} else { load_js_script(manifestv3Url, nmcades_api_onload, plugin_loaded_error);
});
});
return;
}
// для Chrome, Chromium, Chromium Edge расширение из Chrome store // для Chrome, Chromium, Chromium Edge расширение из Chrome store
var fileref = document.createElement('script'); load_js_script(manifestv2Url, nmcades_api_onload, function () {
fileref.setAttribute("type", "text/javascript"); load_js_script(manifestv3Url, nmcades_api_onload, plugin_loaded_error);
fileref.setAttribute("src", "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js"); });
fileref.onerror = plugin_loaded_error;
fileref.onload = nmcades_api_onload;
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
} }
//Загружаем плагин для NPAPI //Загружаем плагин для NPAPI
function load_npapi_plugin() function load_npapi_plugin() {
{
var elem = document.createElement('object'); var elem = document.createElement('object');
elem.setAttribute("id", "cadesplugin_object"); elem.setAttribute("id", "cadesplugin_object");
elem.setAttribute("type", "application/x-cades"); elem.setAttribute("type", "application/x-cades");
elem.setAttribute("style", "visibility: hidden"); elem.setAttribute("style", "visibility: hidden");
document.getElementsByTagName("body")[0].appendChild(elem); document.getElementsByTagName("body")[0].appendChild(elem);
pluginObject = document.getElementById("cadesplugin_object"); pluginObject = document.getElementById("cadesplugin_object");
if(isIE()) if (isIE()) {
{
var elem1 = document.createElement('object'); var elem1 = document.createElement('object');
elem1.setAttribute("id", "certEnrollClassFactory"); elem1.setAttribute("id", "certEnrollClassFactory");
elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"); elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09");
@ -5969,25 +6132,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
//Отправляем событие что все ок. //Отправляем событие что все ок.
function plugin_loaded() function plugin_loaded() {
{
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_resolve(); plugin_resolve();
}else { } else {
window.postMessage("cadesplugin_loaded", "*"); window.postMessage("cadesplugin_loaded", "*");
} }
} }
//Отправляем событие что сломались. //Отправляем событие что сломались.
function plugin_loaded_error(msg) function plugin_loaded_error(msg) {
{ if (typeof (msg) === 'undefined' || typeof (msg) === 'object') {
if(typeof(msg) === 'undefined' || typeof(msg) === 'object')
msg = "Плагин недоступен"; msg = "Плагин недоступен";
}
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_reject(msg); plugin_reject(msg);
} else { } else {
window.postMessage("cadesplugin_load_error", "*"); window.postMessage("cadesplugin_load_error", "*");
@ -5995,59 +6155,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
//проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку //проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку
function check_load_timeout() function check_load_timeout() {
{ if (plugin_resolved === 1) {
if(plugin_resolved === 1)
return; return;
if(isFireFox) }
{ if (isFireFox && !isFireFoxExtensionLoaded) {
if (!isFireFoxExtensionLoaded)
show_firefox_missing_extension_dialog(); show_firefox_missing_extension_dialog();
} }
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_reject("Истекло время ожидания загрузки плагина"); plugin_reject("Истекло время ожидания загрузки плагина");
} else { } else {
window.postMessage("cadesplugin_load_error", "*"); window.postMessage("cadesplugin_load_error", "*");
} }
} }
//Вспомогательная функция для NPAPI function check_npapi_plugin() {
function createPromise(arg)
{
return new Promise(arg);
}
function check_npapi_plugin (){
try { try {
var oAbout = CreateObject("CAdESCOM.About"); CreateObject("CAdESCOM.About");
plugin_loaded(); plugin_loaded();
} } catch (err) {
catch (err) {
document.getElementById("cadesplugin_object").style.display = 'none'; document.getElementById("cadesplugin_object").style.display = 'none';
// Объект создать не удалось, проверим, установлен ли // Объект создать не удалось, проверим, установлен ли
// вообще плагин. Такая возможность есть не во всех браузерах // вообще плагин. Такая возможность есть не во всех браузерах
var mimetype = navigator.mimeTypes["application/x-cades"]; // noinspection JSDeprecatedSymbols
var mimetype = window.navigator.mimeTypes["application/x-cades"];
if (mimetype) { if (mimetype) {
// noinspection JSDeprecatedSymbols
var plugin = mimetype.enabledPlugin; var plugin = mimetype.enabledPlugin;
if (plugin) { if (plugin) {
plugin_loaded_error("Плагин загружен, но не создаются обьекты"); plugin_loaded_error("Плагин загружен, но не создаются обьекты");
}else } else {
{
plugin_loaded_error("Ошибка при загрузке плагина"); plugin_loaded_error("Ошибка при загрузке плагина");
} }
}else } else {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
} }
} }
} }
//Проверяем работает ли плагин // Проверяем работает ли плагин
function check_plugin_working() function check_plugin_working() {
{
var div = document.createElement("div"); var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->"; div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length === 1); var isIeLessThan9 = (div.getElementsByTagName("i").length === 1);
@ -6056,20 +6204,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
return; return;
} }
if(isNativeMessageSupported()) if (isNativeMessageSupported()) {
{
load_extension(); load_extension();
}else if(!canPromise) { } else if (!canPromise) {
window.addEventListener("message", function (event){ window.addEventListener("message", function (event) {
if (event.data !== "cadesplugin_echo_request") if (event.data !== "cadesplugin_echo_request") {
return; return;
}
load_npapi_plugin(); load_npapi_plugin();
check_npapi_plugin(); check_npapi_plugin();
}, }, false);
false); } else {
}else if (document.readyState === "complete") {
{
if(document.readyState === "complete"){
load_npapi_plugin(); load_npapi_plugin();
check_npapi_plugin(); check_npapi_plugin();
} else { } else {
@ -6081,50 +6227,61 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
} }
function set_pluginObject(obj) function set_pluginObject(obj) {
{
pluginObject = obj; pluginObject = obj;
} }
function is_capilite_enabled() function is_capilite_enabled() {
{ // noinspection JSUnresolvedVariable
if ((typeof (cadesplugin.EnableInternalCSP) !== 'undefined') && cadesplugin.EnableInternalCSP) return ((typeof (cadesplugin.EnableInternalCSP) !== 'undefined') && cadesplugin.EnableInternalCSP);
return true; }
return false;
function set_load_timeout() {
// noinspection JSUnresolvedVariable
if (window.cadesplugin_load_timeout) {
window.setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
} else {
window.setTimeout(check_load_timeout, 20000);
}
}
// noinspection JSUnusedLocalSymbols
var onVisibilityChange = function (event) {
if (document.hidden === false) {
document.removeEventListener("visibilitychange", onVisibilityChange);
set_load_timeout();
check_plugin_working();
}
}; };
//Export //Export
cadesplugin.JSModuleVersion = "2.3.2"; cadesplugin.JSModuleVersion = "2.4.2";
cadesplugin.async_spawn = async_spawn; cadesplugin.async_spawn = async_spawn;
cadesplugin.set = set_pluginObject; cadesplugin.set = set_pluginObject;
cadesplugin.set_log_level = set_log_level; cadesplugin.set_log_level = set_log_level;
cadesplugin.get_extension_version = get_extension_version;
cadesplugin.get_extension_id = get_extension_id;
cadesplugin.getLastError = getLastError; cadesplugin.getLastError = getLastError;
cadesplugin.is_capilite_enabled = is_capilite_enabled; cadesplugin.is_capilite_enabled = is_capilite_enabled;
if(isNativeMessageSupported()) if (isNativeMessageSupported()) {
{
cadesplugin.CreateObjectAsync = CreateObjectAsync; cadesplugin.CreateObjectAsync = CreateObjectAsync;
cadesplugin.ReleasePluginObjects = ReleasePluginObjects; cadesplugin.ReleasePluginObjects = ReleasePluginObjects;
} }
if(!isNativeMessageSupported()) if (!isNativeMessageSupported()) {
{
cadesplugin.CreateObject = CreateObject; cadesplugin.CreateObject = CreateObject;
} }
if(window.cadesplugin_load_timeout)
{
setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
}
else
{
setTimeout(check_load_timeout, 20000);
}
set_constantValues(); set_constantValues();
cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR; cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR;
window.cadesplugin = cadesplugin; window.cadesplugin = cadesplugin;
if (isSafari && document.hidden) {
document.addEventListener("visibilitychange", onVisibilityChange);
return;
}
set_load_timeout();
check_plugin_working(); check_plugin_working();
}()); }());

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
// Type definitions for crypto-pro-js-m 1.0.1 // Type definitions for crypto-pro-js-m 1.1.0
// Project: crypto-pro-js-m // Project: crypto-pro-js-m
// Definitions by: Serge Schekhovtsov https://github.com/schekhovtsov // Definitions by: Serge Schekhovtsov https://github.com/schekhovtsov

View File

@ -4797,11 +4797,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
/*! no static exports found */ /*! no static exports found */
/***/ (function(module, exports) { /***/ (function(module, exports) {
;(function () { ; (function () {
//already loaded //already loaded
if(window.cadesplugin) if (window.cadesplugin && window.cadesplugin.LOG_LEVEL_DEBUG) {
return; return;
}
var pluginObject; var pluginObject;
var plugin_resolved = 0; var plugin_resolved = 0;
var plugin_reject; var plugin_reject;
@ -4813,80 +4813,111 @@ Object.defineProperty(exports, "__esModule", { value: true });
var canPromise = !!window.Promise; var canPromise = !!window.Promise;
var cadesplugin_loaded_event_recieved = false; var cadesplugin_loaded_event_recieved = false;
var isFireFoxExtensionLoaded = false; var isFireFoxExtensionLoaded = false;
var cadesplugin; var cadesplugin = {};
if(canPromise) if (canPromise) {
{ cadesplugin = new window.Promise(function (resolve, reject) {
cadesplugin = new Promise(function(resolve, reject)
{
plugin_resolve = resolve; plugin_resolve = resolve;
plugin_reject = reject; plugin_reject = reject;
}); });
} else
{
cadesplugin = {};
} }
function check_browser() { function check_browser() {
var ua= navigator.userAgent, tem, M= ua.match(/(opera|yabrowser|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; var ua = window.navigator.userAgent,
if(/trident/i.test(M[1])){ tem,
M = ua.match(/(opera|yabrowser|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || []; tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return { name:'IE', version:(tem[1] || '')}; return { name: 'IE', version: (tem[1] || '') };
} }
if(M[1] === 'Chrome'){ if (M[1] === "Chrome") {
tem = ua.match(/\b(OPR|Edg|YaBrowser)\/(\d+)/); tem = ua.match(/\b(OPR|Edg|YaBrowser)\/(\d+)/);
if (tem != null) if (tem != null && (tem.length > 2)) {
return { name: tem[1].replace('OPR', 'Opera'), version: tem[2] }; return { name: tem[1].replace('OPR', 'Opera'), version: tem[2] };
} }
M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null)
M.splice(1, 1, tem[1]);
return {name:M[0],version:M[1]};
} }
M = M[2] ? [M[1], M[2]] : [window.navigator.appName, window.navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) {
M.splice(1, 1, tem[1]);
}
return { name: M[0], version: M[1] };
}
var browserSpecs = check_browser(); var browserSpecs = check_browser();
function cpcsp_console_log(level, msg){ function cpcsp_console_log(level, msg) {
//IE9 не может писать в консоль если не открыта вкладка developer tools //IE9 не может писать в консоль если не открыта вкладка developer tools
if(typeof(console) === 'undefined') if (typeof console === 'undefined') {
return; return;
if (level <= cadesplugin.current_log_level ){ }
if (level === cadesplugin.LOG_LEVEL_DEBUG) if (level <= cadesplugin.current_log_level) {
if (level === cadesplugin.LOG_LEVEL_DEBUG) {
console.log("DEBUG: %s", msg); console.log("DEBUG: %s", msg);
if (level === cadesplugin.LOG_LEVEL_INFO) }
if (level === cadesplugin.LOG_LEVEL_INFO) {
console.info("INFO: %s", msg); console.info("INFO: %s", msg);
if (level === cadesplugin.LOG_LEVEL_ERROR) }
if (level === cadesplugin.LOG_LEVEL_ERROR) {
console.error("ERROR: %s", msg); console.error("ERROR: %s", msg);
return; }
} }
} }
function set_log_level(level){ function get_extension_version(callback) {
window.postMessage("cadesplugin_extension_version_request", "*");
window.addEventListener("message", function (event) {
var resp_prefix = "cadesplugin_extension_version_response:";
if (typeof (event.data) !== "string" || event.data.indexOf(resp_prefix) !== 0) {
return;
}
var ext_version = event.data.substring(resp_prefix.length);
callback(ext_version);
}, false);
}
function get_extension_id(callback) {
window.postMessage("cadesplugin_extension_id_request", "*");
window.addEventListener("message", function (event) {
var resp_prefix = "cadesplugin_extension_id_response:";
if (typeof (event.data) !== "string" || event.data.indexOf(resp_prefix) !== 0) {
return;
}
var ext_id = event.data.substring(resp_prefix.length);
callback(ext_id);
}, false);
}
function set_log_level(level) {
if (!((level === cadesplugin.LOG_LEVEL_DEBUG) || if (!((level === cadesplugin.LOG_LEVEL_DEBUG) ||
(level === cadesplugin.LOG_LEVEL_INFO) || (level === cadesplugin.LOG_LEVEL_INFO) ||
(level === cadesplugin.LOG_LEVEL_ERROR))){ (level === cadesplugin.LOG_LEVEL_ERROR))) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level); cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level);
return; return;
} }
cadesplugin.current_log_level = level; cadesplugin.current_log_level = level;
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR");
if(isNativeMessageSupported()) }
{ if (isNativeMessageSupported()) {
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) {
window.postMessage("set_log_level=debug", "*"); window.postMessage("set_log_level=debug", "*");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) {
window.postMessage("set_log_level=info", "*"); window.postMessage("set_log_level=info", "*");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) {
window.postMessage("set_log_level=error", "*"); window.postMessage("set_log_level=error", "*");
} }
} }
}
function set_constantValues() function set_constantValues() {
{
cadesplugin.CAPICOM_MEMORY_STORE = 0; cadesplugin.CAPICOM_MEMORY_STORE = 0;
cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1; cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1;
cadesplugin.CAPICOM_CURRENT_USER_STORE = 2; cadesplugin.CAPICOM_CURRENT_USER_STORE = 2;
@ -4897,9 +4928,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_SMART_CARD_USER_STORE = 4; cadesplugin.CADESCOM_SMART_CARD_USER_STORE = 4;
cadesplugin.CADESCOM_CONTAINER_STORE = 100; cadesplugin.CADESCOM_CONTAINER_STORE = 100;
cadesplugin.CAPICOM_ROOT_STORE = "Root";
cadesplugin.CAPICOM_CA_STORE = "CA";
cadesplugin.CAPICOM_MY_STORE = "My"; cadesplugin.CAPICOM_MY_STORE = "My";
cadesplugin.CAPICOM_ADDRESSBOOK_STORE = "AddressBook";
cadesplugin.CAPICOM_STORE_OPEN_READ_WRITE = 1;
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2; cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
cadesplugin.CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED = 256;
cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1; cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
@ -4927,6 +4963,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_CADES_BES = 1; cadesplugin.CADESCOM_CADES_BES = 1;
cadesplugin.CADESCOM_CADES_T = 0x5; cadesplugin.CADESCOM_CADES_T = 0x5;
cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d; cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d;
cadesplugin.CADESCOM_CADES_A = 0xdd;
cadesplugin.CADESCOM_PKCS7_TYPE = 0xffff; cadesplugin.CADESCOM_PKCS7_TYPE = 0xffff;
cadesplugin.CADESCOM_ENCODE_BASE64 = 0; cadesplugin.CADESCOM_ENCODE_BASE64 = 0;
@ -4936,6 +4973,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_NONE = 0x100;
cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0; cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1; cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1;
@ -4987,6 +5025,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_MAGMA = 35;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_MAGMA_OMAC = 36;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_KUZNYECHIK = 45;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_KUZNYECHIK_OMAC = 46;
cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0; cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0;
cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1; cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1;
@ -5002,6 +5044,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111; cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111;
cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112; cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112;
cadesplugin.CADESCOM_CERT_INFO_ROLE = 100;
cadesplugin.CADESCOM_ROLE_ROOT = "ROOT";
cadesplugin.CADESCOM_ROLE_CA = "CA";
cadesplugin.CADESCOM_ROLE_LEAF = "LEAF";
cadesplugin.LOG_LEVEL_DEBUG = 4; cadesplugin.LOG_LEVEL_DEBUG = 4;
cadesplugin.LOG_LEVEL_INFO = 2; cadesplugin.LOG_LEVEL_INFO = 2;
cadesplugin.LOG_LEVEL_ERROR = 1; cadesplugin.LOG_LEVEL_ERROR = 1;
@ -5014,6 +5061,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_InstallCertChainToContainer = 0x20000000; cadesplugin.CADESCOM_InstallCertChainToContainer = 0x20000000;
cadesplugin.CADESCOM_UseContainerStore = 0x40000000; cadesplugin.CADESCOM_UseContainerStore = 0x40000000;
cadesplugin.ContextNone = 0;
cadesplugin.ContextUser = 0x1;
cadesplugin.ContextMachine = 0x2;
cadesplugin.ContextAdministratorForceMachine = 0x3;
cadesplugin.ENABLE_CARRIER_TYPE_CSP = 0x01; cadesplugin.ENABLE_CARRIER_TYPE_CSP = 0x01;
cadesplugin.ENABLE_CARRIER_TYPE_FKC_NO_SM = 0x02; cadesplugin.ENABLE_CARRIER_TYPE_FKC_NO_SM = 0x02;
cadesplugin.ENABLE_CARRIER_TYPE_FKC_SM = 0x04; cadesplugin.ENABLE_CARRIER_TYPE_FKC_SM = 0x04;
@ -5028,12 +5080,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CADESCOM_PRODUCT_OCSP = 1; cadesplugin.CADESCOM_PRODUCT_OCSP = 1;
cadesplugin.CADESCOM_PRODUCT_TSP = 2; cadesplugin.CADESCOM_PRODUCT_TSP = 2;
cadesplugin.MEDIA_TYPE_DEFAULT = 0x00000000;
cadesplugin.MEDIA_TYPE_REGISTRY = 0x00000001; cadesplugin.MEDIA_TYPE_REGISTRY = 0x00000001;
cadesplugin.MEDIA_TYPE_HDIMAGE = 0x00000002; cadesplugin.MEDIA_TYPE_HDIMAGE = 0x00000002;
cadesplugin.MEDIA_TYPE_CLOUD = 0x00000004; cadesplugin.MEDIA_TYPE_CLOUD = 0x00000004;
cadesplugin.MEDIA_TYPE_SCARD = 0x00000008; cadesplugin.MEDIA_TYPE_SCARD = 0x00000008;
cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0; cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0;
cadesplugin.XCN_CRYPT_STRING_BASE64 = 0x1;
cadesplugin.XCN_CRYPT_STRING_BINARY = 0x2;
cadesplugin.XCN_CRYPT_STRING_BASE64REQUESTHEADER = 0x3;
cadesplugin.XCN_CRYPT_STRING_HEX = 0x4;
cadesplugin.XCN_CRYPT_STRING_HEXASCII = 0x5;
cadesplugin.XCN_CRYPT_STRING_BASE64_ANY = 0x6;
cadesplugin.XCN_CRYPT_STRING_ANY = 0x7;
cadesplugin.XCN_CRYPT_STRING_HEX_ANY = 0x8;
cadesplugin.XCN_CRYPT_STRING_BASE64X509CRLHEADER = 0x9;
cadesplugin.XCN_CRYPT_STRING_HEXADDR = 0xa;
cadesplugin.XCN_CRYPT_STRING_HEXASCIIADDR = 0xb;
cadesplugin.XCN_CRYPT_STRING_HEXRAW = 0xc;
cadesplugin.XCN_CRYPT_STRING_BASE64URI = 0xd;
cadesplugin.XCN_CRYPT_STRING_ENCODEMASK = 0xff;
cadesplugin.XCN_CRYPT_STRING_CHAIN = 0x100;
cadesplugin.XCN_CRYPT_STRING_TEXT = 0x200;
cadesplugin.XCN_CRYPT_STRING_PERCENTESCAPE = 0x8000000;
cadesplugin.XCN_CRYPT_STRING_HASHDATA = 0x10000000;
cadesplugin.XCN_CRYPT_STRING_STRICT = 0x20000000;
cadesplugin.XCN_CRYPT_STRING_NOCRLF = 0x40000000;
cadesplugin.XCN_CRYPT_STRING_NOCR = 0x80000000;
cadesplugin.XCN_CERT_NAME_STR_NONE = 0;
cadesplugin.XCN_AT_NONE = 0;
cadesplugin.XCN_AT_KEYEXCHANGE = 1;
cadesplugin.XCN_AT_SIGNATURE = 2;
cadesplugin.AT_KEYEXCHANGE = 1; cadesplugin.AT_KEYEXCHANGE = 1;
cadesplugin.AT_SIGNATURE = 2; cadesplugin.AT_SIGNATURE = 2;
@ -5042,8 +5122,97 @@ Object.defineProperty(exports, "__esModule", { value: true });
cadesplugin.CARRIER_FLAG_PROTECTED = 4; cadesplugin.CARRIER_FLAG_PROTECTED = 4;
cadesplugin.CARRIER_FLAG_FUNCTIONAL_CARRIER = 8; cadesplugin.CARRIER_FLAG_FUNCTIONAL_CARRIER = 8;
cadesplugin.CARRIER_FLAG_SECURE_MESSAGING = 16; cadesplugin.CARRIER_FLAG_SECURE_MESSAGING = 16;
cadesplugin.CARRIER_FLAG_ABLE_SET_KEY = 32;
cadesplugin.CARRIER_FLAG_ABLE_VISUALISE_SIGNATURE = 64; cadesplugin.CARRIER_FLAG_ABLE_VISUALISE_SIGNATURE = 64;
cadesplugin.CARRIER_FLAG_VIRTUAL = 128; cadesplugin.CARRIER_FLAG_VIRTUAL = 128;
cadesplugin.CRYPT_MODE_CBCSTRICT = 1;
cadesplugin.CRYPT_MODE_CNT = 3;
cadesplugin.CRYPT_MODE_CBCRFC4357 = 31;
cadesplugin.CRYPT_MODE_CTR = 32;
cadesplugin.CRYPT_MODE_MGM = 33;
cadesplugin.CRYPT_MODE_GCM = 34;
cadesplugin.CRYPT_MODE_OMAC_CTR = 35;
cadesplugin.CRYPT_MODE_WRAP = 36;
cadesplugin.CRYPT_MODE_WRAP_PAD = 37;
cadesplugin.PKCS5_PADDING = 1;
cadesplugin.RANDOM_PADDING = 2;
cadesplugin.ZERO_PADDING = 3;
cadesplugin.ISO10126_PADDING = 4;
cadesplugin.ANSI_X923_PADDING = 5;
cadesplugin.TLS_1_0_PADDING = 6;
cadesplugin.ISO_IEC_7816_4_PADDING = 7;
cadesplugin.CAPICOM_STORE_SAVE_AS_SERIALIZED = 0;
cadesplugin.CAPICOM_STORE_SAVE_AS_PKCS7 = 1;
cadesplugin.CERT_TRUST_NO_ERROR = 0x00000000;
cadesplugin.CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001;
cadesplugin.CERT_TRUST_IS_REVOKED = 0x00000004;
cadesplugin.CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008;
cadesplugin.CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010;
cadesplugin.CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020;
cadesplugin.CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040;
cadesplugin.CERT_TRUST_IS_CYCLIC = 0x00000080;
cadesplugin.CERT_TRUST_INVALID_EXTENSION = 0x00000100;
cadesplugin.CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200;
cadesplugin.CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400;
cadesplugin.CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800;
cadesplugin.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000;
cadesplugin.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000;
cadesplugin.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000;
cadesplugin.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000;
cadesplugin.CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000;
cadesplugin.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000;
cadesplugin.CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000;
cadesplugin.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000;
cadesplugin.CERT_TRUST_HAS_WEAK_SIGNATURE = 0x00100000;
cadesplugin.XCN_CERT_NO_KEY_USAGE = 0;
cadesplugin.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE = 0x80;
cadesplugin.XCN_CERT_NON_REPUDIATION_KEY_USAGE = 0x40;
cadesplugin.XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE = 0x20;
cadesplugin.XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE = 0x10;
cadesplugin.XCN_CERT_KEY_AGREEMENT_KEY_USAGE = 0x8;
cadesplugin.XCN_CERT_KEY_CERT_SIGN_KEY_USAGE = 0x4;
cadesplugin.XCN_CERT_OFFLINE_CRL_SIGN_KEY_USAGE = 0x2;
cadesplugin.XCN_CERT_CRL_SIGN_KEY_USAGE = 0x2;
cadesplugin.XCN_CERT_ENCIPHER_ONLY_KEY_USAGE = 0x1;
cadesplugin.XCN_CERT_DECIPHER_ONLY_KEY_USAGE = 0x8000;
cadesplugin.CADESCOM_XADES_ACCEPT_ANY_ID_ATTR_NAMESPACE = 1;
cadesplugin.CADES_USE_OCSP_AUTHORIZED_POLICY = 0x00020000;
cadesplugin.XCN_NCRYPT_NO_OPERATION = 0;
cadesplugin.XCN_NCRYPT_CIPHER_OPERATION = 0x1;
cadesplugin.XCN_NCRYPT_HASH_OPERATION = 0x2;
cadesplugin.XCN_NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION = 0x4;
cadesplugin.XCN_NCRYPT_SECRET_AGREEMENT_OPERATION = 0x8;
cadesplugin.XCN_NCRYPT_SIGNATURE_OPERATION = 0x10;
cadesplugin.XCN_NCRYPT_RNG_OPERATION = 0x20;
cadesplugin.XCN_CRYPT_ANY_GROUP_ID = 0;
cadesplugin.XCN_CRYPT_HASH_ALG_OID_GROUP_ID = 1;
cadesplugin.XCN_CRYPT_ENCRYPT_ALG_OID_GROUP_ID = 2;
cadesplugin.XCN_CRYPT_PUBKEY_ALG_OID_GROUP_ID = 3;
cadesplugin.XCN_CRYPT_SIGN_ALG_OID_GROUP_ID = 4;
cadesplugin.XCN_CRYPT_RDN_ATTR_OID_GROUP_ID = 5;
cadesplugin.XCN_CRYPT_EXT_OR_ATTR_OID_GROUP_ID = 6;
cadesplugin.XCN_CRYPT_ENHKEY_USAGE_OID_GROUP_ID = 7;
cadesplugin.XCN_CRYPT_POLICY_OID_GROUP_ID = 8;
cadesplugin.XCN_CRYPT_TEMPLATE_OID_GROUP_ID = 9;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_ANY = 0;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG = 0x80000000;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG = 0x40000000;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_DISABLED = 0;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_ENABLED = 1;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_STRICT = 2;
cadesplugin.AlgorithmFlagsNone = 0;
cadesplugin.AlgorithmFlagsWrap = 0x1;
} }
function async_spawn(generatorFunc) { function async_spawn(generatorFunc) {
@ -5052,12 +5221,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
try { try {
result = generator[verb](arg); result = generator[verb](arg);
} catch (err) { } catch (err) {
return Promise.reject(err); return window.Promise.reject(err);
} }
if (result.done) { if (result.done) {
return result.value; return result.value;
} else { } else {
return Promise.resolve(result.value).then(onFulfilled, onRejected); return window.Promise.resolve(result.value).then(onFulfilled, onRejected);
} }
} }
var generator = generatorFunc(Array.prototype.slice.call(arguments, 1)); var generator = generatorFunc(Array.prototype.slice.call(arguments, 1));
@ -5073,16 +5242,16 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function isIOS() { function isIOS() {
return (navigator.userAgent.match(/ipod/i) || return (window.navigator.userAgent.match(/ipod/i) ||
navigator.userAgent.match(/ipad/i) || window.navigator.userAgent.match(/ipad/i) ||
navigator.userAgent.match(/iphone/i)); window.navigator.userAgent.match(/iphone/i));
} }
function isNativeMessageSupported() function isNativeMessageSupported() {
{
// В IE работаем через NPAPI // В IE работаем через NPAPI
if(isIE()) if (isIE()) {
return false; return false;
}
// В Edge работаем через NativeMessage // В Edge работаем через NativeMessage
if (browserSpecs.name === 'Edg') { if (browserSpecs.name === 'Edg') {
return true; return true;
@ -5092,40 +5261,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
return true; return true;
} }
// В Chrome, Firefox, Safari и Opera работаем через асинхронную версию в зависимости от версии // В Chrome, Firefox, Safari и Opera работаем через асинхронную версию в зависимости от версии
if(browserSpecs.name === 'Opera') { if (browserSpecs.name === 'Opera') {
isOpera = true; isOpera = true;
if(browserSpecs.version >= 33){ return (browserSpecs.version >= 33);
return true;
} }
else{ if (browserSpecs.name === 'Firefox') {
return false;
}
}
if(browserSpecs.name === 'Firefox') {
isFireFox = true; isFireFox = true;
if(browserSpecs.version >= 52){ return (browserSpecs.version >= 52);
return true;
}
else{
return false;
}
}
if(browserSpecs.name === 'Chrome') {
if(browserSpecs.version >= 42){
return true;
}
else{
return false;
} }
if (browserSpecs.name === 'Chrome') {
return (browserSpecs.version >= 42);
} }
//В Сафари начиная с 12 версии нет NPAPI //В Сафари начиная с 12 версии нет NPAPI
if(browserSpecs.name === 'Safari') { if (browserSpecs.name === 'Safari') {
isSafari = true; isSafari = true;
if(browserSpecs.version >= 12) { return (browserSpecs.version >= 12);
return true;
} else {
return false;
}
} }
} }
@ -5136,19 +5286,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
// call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js // call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js
return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]); return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
} }
var objWebClassFactory;
if (isIE()) { if (isIE()) {
// В Internet Explorer создаются COM-объекты // В Internet Explorer создаются COM-объекты
if (name.match(/X509Enrollment/i)) { if (name.match(/X509Enrollment/i)) {
try { try {
// Объекты CertEnroll пробуем создавать через нашу фабрику, // Объекты CertEnroll пробуем создавать через нашу фабрику,
// если не получилось то через CX509EnrollmentWebClassFactory // если не получилось то через CX509EnrollmentWebClassFactory
var objCertEnrollClassFactory = document.getElementById("webClassFactory"); objWebClassFactory = document.getElementById("webClassFactory");
return objCertEnrollClassFactory.CreateObject(name); return objWebClassFactory.CreateObject(name);
} }
catch (e) { catch (e) {
try { try {
var objWebClassFactory = document.getElementById("certEnrollClassFactory"); var objCertEnrollClassFactory = document.getElementById("certEnrollClassFactory");
return objWebClassFactory.CreateObject(name); return objCertEnrollClassFactory.CreateObject(name);
} }
catch (err) { catch (err) {
throw ("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS"); throw ("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS");
@ -5157,12 +5308,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
// Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory // Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory
try { try {
var objWebClassFactory = document.getElementById("webClassFactory"); objWebClassFactory = document.getElementById("webClassFactory");
return objWebClassFactory.CreateObject(name); return objWebClassFactory.CreateObject(name);
} } catch (e) {
catch (e) {
// Для версий плагина ниже 2.0.12538 // Для версий плагина ниже 2.0.12538
return new ActiveXObject(name); return new window.ActiveXObject(name);
} }
} }
// создаются объекты NPAPI // создаются объекты NPAPI
@ -5188,19 +5338,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
function getLastError(exception) { function getLastError(exception) {
if(isNativeMessageSupported() || isIE() || isIOS() ) { if (isNativeMessageSupported() || isIE() || isIOS()) {
return GetMessageFromException(exception); return GetMessageFromException(exception);
} }
try { try {
return pluginObject.getLastError(); return pluginObject.getLastError();
} catch(e) { } catch (e) {
return GetMessageFromException(exception); return GetMessageFromException(exception);
} }
} }
// Функция для удаления созданных объектов // Функция для удаления созданных объектов
function ReleasePluginObjects() { function ReleasePluginObjects() {
// noinspection JSUnresolvedVariable
return cpcsp_chrome_nmcades.ReleasePluginObjects(); return cpcsp_chrome_nmcades.ReleasePluginObjects();
} }
@ -5209,35 +5360,39 @@ Object.defineProperty(exports, "__esModule", { value: true });
return pluginObject.CreateObjectAsync(name); return pluginObject.CreateObjectAsync(name);
} }
//Функции для IOS // Функции для IOS
// noinspection JSUnusedGlobalSymbols
var ru_cryptopro_npcades_10_native_bridge = { var ru_cryptopro_npcades_10_native_bridge = {
callbacksCount : 1, callbacksCount: 1,
callbacks : {}, callbacks: {},
// Automatically called by native layer when a result is available // Automatically called by native layer when a result is available
resultForCallback : function resultForCallback(callbackId, resultArray) { resultForCallback: function resultForCallback(callbackId, resultArray) {
var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId]; var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId];
if (!callback) return; if (!callback) {
callback.apply(null,resultArray); return;
}
callback.apply(null, resultArray);
}, },
// Use this in javascript to request native objective-c code // Use this in javascript to request native objective-c code
// functionName : string (I think the name is explicit :p) // functionName : string (I think the name is explicit :p)
// args : array of arguments // args : array of arguments
// callback : function with n-arguments that is going to be called when the native code returned // callback : function with n-arguments that is going to be called when the native code returned
call : function call(functionName, args, callback) { call: function call(functionName, args, callback) {
var hasCallback = callback && typeof callback === "function"; var hasCallback = callback && typeof callback === "function";
var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0; var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0;
if (hasCallback) if (hasCallback) {
ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback; ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback;
}
var iframe = document.createElement("IFRAME"); var iframe = document.createElement("IFRAME");
var arrObjs = new Array("_CPNP_handle"); var arrObjs = new Array("_CPNP_handle");
try{ try {
iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId+ ":" + encodeURIComponent(JSON.stringify(args, arrObjs))); iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId + ":" + encodeURIComponent(window.JSON.stringify(args, arrObjs)));
} catch(e){ } catch (e) {
alert(e); window.alert(e);
} }
document.documentElement.appendChild(iframe); document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe); iframe.parentNode.removeChild(iframe);
@ -5245,130 +5400,138 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
}; };
function call_ru_cryptopro_npcades_10_native_bridge(functionName, array){ function call_ru_cryptopro_npcades_10_native_bridge(functionName, array) {
var tmpobj; var tmpobj;
var ex; var ex;
ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function(e, response){ ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function (e, response) {
ex = e; ex = e;
var str='tmpobj='+response; var tmpobj = "";
eval(str); try {
if (typeof (tmpobj) === "string"){ tmpobj = window.JSON.parse(response);
}
catch (err) {
tmpobj = response;
}
if (typeof tmpobj === "string") {
tmpobj = tmpobj.replace(/\\\n/gm, "\n"); tmpobj = tmpobj.replace(/\\\n/gm, "\n");
tmpobj = tmpobj.replace(/\\\r/gm, "\r"); tmpobj = tmpobj.replace(/\\\r/gm, "\r");
} }
}); });
if(ex) if (ex) {
throw ex; throw ex;
}
return tmpobj; return tmpobj;
} }
function show_firefox_missing_extension_dialog() function show_firefox_missing_extension_dialog() {
{ if (!window.cadesplugin_skip_extension_install) {
if (!window.cadesplugin_skip_extension_install)
{
var ovr = document.createElement('div'); var ovr = document.createElement('div');
ovr.id = "cadesplugin_ovr"; ovr.id = "cadesplugin_ovr";
ovr.style = "visibility: hidden; position: fixed; left: 0px; top: 0px; width:100%; height:100%; background-color: rgba(0,0,0,0.7)"; ovr.style = "visibility: hidden; position: fixed; left: 0; top: 0; width:100%; height:100%; background-color: rgba(0,0,0,0.7)";
ovr.innerHTML = "<div id='cadesplugin_ovr_item' style='position:relative; width:400px; margin:100px auto; background-color:#fff; border:2px solid #000; padding:10px; text-align:center; opacity: 1; z-index: 1500'>" + ovr.innerHTML = "<div id='cadesplugin_ovr_item' style='position:relative; max-width:400px; margin:100px auto; background-color:#fff; border:2px solid #000; padding:10px; text-align:center; opacity: 1; z-index: 1500'>" +
"<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" + "<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" +
"<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." + "<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." +
"<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" + "<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" +
"</div>"; "</div>";
document.getElementsByTagName("Body")[0].appendChild(ovr); document.getElementsByTagName("Body")[0].appendChild(ovr);
document.getElementById("cadesplugin_close_install").addEventListener('click',function() document.getElementById("cadesplugin_close_install").addEventListener('click', function () {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
document.getElementById("cadesplugin_ovr").style.visibility = 'hidden'; document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
}); });
ovr.addEventListener('click',function() ovr.addEventListener('click', function () {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
document.getElementById("cadesplugin_ovr").style.visibility = 'hidden'; document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
}); });
ovr.style.visibility="visible"; ovr.style.visibility = "visible";
} }
} }
function firefox_or_safari_nmcades_onload() { function firefox_or_safari_nmcades_onload() {
if (window.cadesplugin_extension_loaded_callback) // noinspection JSUnresolvedVariable
if (window.cadesplugin_extension_loaded_callback) {
window.cadesplugin_extension_loaded_callback(); window.cadesplugin_extension_loaded_callback();
}
isFireFoxExtensionLoaded = true; isFireFoxExtensionLoaded = true;
// noinspection JSUnresolvedVariable,JSUnresolvedFunction
cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error); cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
} }
function load_js_script(url, successFunc, errorFunc) {
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", url);
script.onerror = errorFunc;
script.onload = successFunc;
document.getElementsByTagName("head")[0].appendChild(script);
}
function nmcades_api_onload() { function nmcades_api_onload() {
if (!isIE() && !isFireFox && !isSafari) { if (!isIE() && !isFireFox && !isSafari) {
if (window.cadesplugin_extension_loaded_callback) // noinspection JSUnresolvedVariable
if (window.cadesplugin_extension_loaded_callback) {
window.cadesplugin_extension_loaded_callback(); window.cadesplugin_extension_loaded_callback();
} }
}
window.postMessage("cadesplugin_echo_request", "*"); window.postMessage("cadesplugin_echo_request", "*");
window.addEventListener("message", function (event){ window.addEventListener("message", function (event) {
if (typeof(event.data) !== "string" || !event.data.match("cadesplugin_loaded")) if (typeof (event.data) !== "string" || !event.data.match("cadesplugin_loaded")) {
return; return;
if (cadesplugin_loaded_event_recieved) }
if (cadesplugin_loaded_event_recieved) {
return; return;
if(isFireFox || isSafari) }
{ if (isFireFox || isSafari) {
// Для Firefox, Сафари вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js // Для Firefox, Сафари вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js
var url = event.data.substring(event.data.indexOf("url:") + 4); var url = event.data.substring(event.data.indexOf("url:") + 4);
if (!url.match("^moz-extension://[a-zA-Z0-9-]+/nmcades_plugin_api.js$") if (!url.match("^(moz|safari)-extension://[a-zA-Z0-9/_-]+/nmcades_plugin_api.js$")) {
&& !url.match("^safari-extension://[a-zA-Z0-9-]+/[a-zA-Z0-9]+/nmcades_plugin_api.js$"))
{
cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "Bad url \"" + url + "\" for load CryptoPro Extension for CAdES Browser plug-in"); cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "Bad url \"" + url + "\" for load CryptoPro Extension for CAdES Browser plug-in");
plugin_loaded_error(); plugin_loaded_error();
return; return;
} }
var fileref = document.createElement('script'); load_js_script(url, firefox_or_safari_nmcades_onload, plugin_loaded_error);
fileref.setAttribute("type", "text/javascript"); } else {
fileref.setAttribute("src", url); // noinspection JSUnresolvedVariable,JSUnresolvedFunction
fileref.onerror = plugin_loaded_error;
fileref.onload = firefox_or_safari_nmcades_onload;
document.getElementsByTagName("head")[0].appendChild(fileref);
}else {
cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error); cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
} }
cadesplugin_loaded_event_recieved = true; cadesplugin_loaded_event_recieved = true;
}, false); }, false);
} }
//Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge, Safari // Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge, Safari
function load_extension() function load_extension() {
{ if (isFireFox || isSafari) {
if(isFireFox || isSafari){
// вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера. // вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера.
nmcades_api_onload(); nmcades_api_onload();
} else { return;
// в асинхронном варианте для Yandex и Opera подключаем расширение из Opera store. }
if (isOpera || isYandex) { var operaUrl = "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js";
var fileref = document.createElement('script'); var manifestv2Url = "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js";
fileref.setAttribute("type", "text/javascript"); var manifestv3Url = "chrome-extension://pfhgbfnnjiafkhfdkmpiflachepdcjod/nmcades_plugin_api.js";
fileref.setAttribute("src", "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js"); if (isYandex || isOpera) {
fileref.onerror = plugin_loaded_error; // в асинхронном варианте для Yandex пробуем подключить расширения по очереди
fileref.onload = nmcades_api_onload; load_js_script(operaUrl, nmcades_api_onload, function () {
document.getElementsByTagName("head")[0].appendChild(fileref); load_js_script(manifestv2Url, nmcades_api_onload, function () {
} else { load_js_script(manifestv3Url, nmcades_api_onload, plugin_loaded_error);
});
});
return;
}
// для Chrome, Chromium, Chromium Edge расширение из Chrome store // для Chrome, Chromium, Chromium Edge расширение из Chrome store
var fileref = document.createElement('script'); load_js_script(manifestv2Url, nmcades_api_onload, function () {
fileref.setAttribute("type", "text/javascript"); load_js_script(manifestv3Url, nmcades_api_onload, plugin_loaded_error);
fileref.setAttribute("src", "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js"); });
fileref.onerror = plugin_loaded_error;
fileref.onload = nmcades_api_onload;
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
} }
//Загружаем плагин для NPAPI //Загружаем плагин для NPAPI
function load_npapi_plugin() function load_npapi_plugin() {
{
var elem = document.createElement('object'); var elem = document.createElement('object');
elem.setAttribute("id", "cadesplugin_object"); elem.setAttribute("id", "cadesplugin_object");
elem.setAttribute("type", "application/x-cades"); elem.setAttribute("type", "application/x-cades");
elem.setAttribute("style", "visibility: hidden"); elem.setAttribute("style", "visibility: hidden");
document.getElementsByTagName("body")[0].appendChild(elem); document.getElementsByTagName("body")[0].appendChild(elem);
pluginObject = document.getElementById("cadesplugin_object"); pluginObject = document.getElementById("cadesplugin_object");
if(isIE()) if (isIE()) {
{
var elem1 = document.createElement('object'); var elem1 = document.createElement('object');
elem1.setAttribute("id", "certEnrollClassFactory"); elem1.setAttribute("id", "certEnrollClassFactory");
elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"); elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09");
@ -5383,25 +5546,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
//Отправляем событие что все ок. //Отправляем событие что все ок.
function plugin_loaded() function plugin_loaded() {
{
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_resolve(); plugin_resolve();
}else { } else {
window.postMessage("cadesplugin_loaded", "*"); window.postMessage("cadesplugin_loaded", "*");
} }
} }
//Отправляем событие что сломались. //Отправляем событие что сломались.
function plugin_loaded_error(msg) function plugin_loaded_error(msg) {
{ if (typeof (msg) === 'undefined' || typeof (msg) === 'object') {
if(typeof(msg) === 'undefined' || typeof(msg) === 'object')
msg = "Плагин недоступен"; msg = "Плагин недоступен";
}
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_reject(msg); plugin_reject(msg);
} else { } else {
window.postMessage("cadesplugin_load_error", "*"); window.postMessage("cadesplugin_load_error", "*");
@ -5409,59 +5569,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
//проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку //проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку
function check_load_timeout() function check_load_timeout() {
{ if (plugin_resolved === 1) {
if(plugin_resolved === 1)
return; return;
if(isFireFox) }
{ if (isFireFox && !isFireFoxExtensionLoaded) {
if (!isFireFoxExtensionLoaded)
show_firefox_missing_extension_dialog(); show_firefox_missing_extension_dialog();
} }
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_reject("Истекло время ожидания загрузки плагина"); plugin_reject("Истекло время ожидания загрузки плагина");
} else { } else {
window.postMessage("cadesplugin_load_error", "*"); window.postMessage("cadesplugin_load_error", "*");
} }
} }
//Вспомогательная функция для NPAPI function check_npapi_plugin() {
function createPromise(arg)
{
return new Promise(arg);
}
function check_npapi_plugin (){
try { try {
var oAbout = CreateObject("CAdESCOM.About"); CreateObject("CAdESCOM.About");
plugin_loaded(); plugin_loaded();
} } catch (err) {
catch (err) {
document.getElementById("cadesplugin_object").style.display = 'none'; document.getElementById("cadesplugin_object").style.display = 'none';
// Объект создать не удалось, проверим, установлен ли // Объект создать не удалось, проверим, установлен ли
// вообще плагин. Такая возможность есть не во всех браузерах // вообще плагин. Такая возможность есть не во всех браузерах
var mimetype = navigator.mimeTypes["application/x-cades"]; // noinspection JSDeprecatedSymbols
var mimetype = window.navigator.mimeTypes["application/x-cades"];
if (mimetype) { if (mimetype) {
// noinspection JSDeprecatedSymbols
var plugin = mimetype.enabledPlugin; var plugin = mimetype.enabledPlugin;
if (plugin) { if (plugin) {
plugin_loaded_error("Плагин загружен, но не создаются обьекты"); plugin_loaded_error("Плагин загружен, но не создаются обьекты");
}else } else {
{
plugin_loaded_error("Ошибка при загрузке плагина"); plugin_loaded_error("Ошибка при загрузке плагина");
} }
}else } else {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
} }
} }
} }
//Проверяем работает ли плагин // Проверяем работает ли плагин
function check_plugin_working() function check_plugin_working() {
{
var div = document.createElement("div"); var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->"; div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length === 1); var isIeLessThan9 = (div.getElementsByTagName("i").length === 1);
@ -5470,20 +5618,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
return; return;
} }
if(isNativeMessageSupported()) if (isNativeMessageSupported()) {
{
load_extension(); load_extension();
}else if(!canPromise) { } else if (!canPromise) {
window.addEventListener("message", function (event){ window.addEventListener("message", function (event) {
if (event.data !== "cadesplugin_echo_request") if (event.data !== "cadesplugin_echo_request") {
return; return;
}
load_npapi_plugin(); load_npapi_plugin();
check_npapi_plugin(); check_npapi_plugin();
}, }, false);
false); } else {
}else if (document.readyState === "complete") {
{
if(document.readyState === "complete"){
load_npapi_plugin(); load_npapi_plugin();
check_npapi_plugin(); check_npapi_plugin();
} else { } else {
@ -5495,50 +5641,61 @@ Object.defineProperty(exports, "__esModule", { value: true });
} }
} }
function set_pluginObject(obj) function set_pluginObject(obj) {
{
pluginObject = obj; pluginObject = obj;
} }
function is_capilite_enabled() function is_capilite_enabled() {
{ // noinspection JSUnresolvedVariable
if ((typeof (cadesplugin.EnableInternalCSP) !== 'undefined') && cadesplugin.EnableInternalCSP) return ((typeof (cadesplugin.EnableInternalCSP) !== 'undefined') && cadesplugin.EnableInternalCSP);
return true; }
return false;
function set_load_timeout() {
// noinspection JSUnresolvedVariable
if (window.cadesplugin_load_timeout) {
window.setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
} else {
window.setTimeout(check_load_timeout, 20000);
}
}
// noinspection JSUnusedLocalSymbols
var onVisibilityChange = function (event) {
if (document.hidden === false) {
document.removeEventListener("visibilitychange", onVisibilityChange);
set_load_timeout();
check_plugin_working();
}
}; };
//Export //Export
cadesplugin.JSModuleVersion = "2.3.2"; cadesplugin.JSModuleVersion = "2.4.2";
cadesplugin.async_spawn = async_spawn; cadesplugin.async_spawn = async_spawn;
cadesplugin.set = set_pluginObject; cadesplugin.set = set_pluginObject;
cadesplugin.set_log_level = set_log_level; cadesplugin.set_log_level = set_log_level;
cadesplugin.get_extension_version = get_extension_version;
cadesplugin.get_extension_id = get_extension_id;
cadesplugin.getLastError = getLastError; cadesplugin.getLastError = getLastError;
cadesplugin.is_capilite_enabled = is_capilite_enabled; cadesplugin.is_capilite_enabled = is_capilite_enabled;
if(isNativeMessageSupported()) if (isNativeMessageSupported()) {
{
cadesplugin.CreateObjectAsync = CreateObjectAsync; cadesplugin.CreateObjectAsync = CreateObjectAsync;
cadesplugin.ReleasePluginObjects = ReleasePluginObjects; cadesplugin.ReleasePluginObjects = ReleasePluginObjects;
} }
if(!isNativeMessageSupported()) if (!isNativeMessageSupported()) {
{
cadesplugin.CreateObject = CreateObject; cadesplugin.CreateObject = CreateObject;
} }
if(window.cadesplugin_load_timeout)
{
setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
}
else
{
setTimeout(check_load_timeout, 20000);
}
set_constantValues(); set_constantValues();
cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR; cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR;
window.cadesplugin = cadesplugin; window.cadesplugin = cadesplugin;
if (isSafari && document.hidden) {
document.addEventListener("visibilitychange", onVisibilityChange);
return;
}
set_load_timeout();
check_plugin_working(); check_plugin_working();
}()); }());

File diff suppressed because one or more lines are too long

7490
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"name": "crypto-pro-js-m", "name": "crypto-pro-js-m",
"version": "1.0.2", "version": "1.1.0",
"description": "Асинхронный JavaScript API для работы с КриптоПРО ЭЦП Browser Plug-In. Forked from https://github.com/crypto-pro-web/crypto-pro-js", "description": "Асинхронный JavaScript API для работы с КриптоПРО ЭЦП Browser Plug-In. Forked from https://github.com/crypto-pro-web/crypto-pro-js",
"main": "./lib/crypto-pro-js-m.js", "main": "./lib/crypto-pro-js-m.js",
"types": "./lib/crypto-pro-js-m.d.ts", "types": "./lib/crypto-pro-js-m.d.ts",

View File

@ -1,89 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { createAttachedSignature } from './createAttachedSignature';
import { _getCadesCert } from '../helpers/_getCadesCert';
import { addAttachedSignature } from './addAttachedSignature';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
jest.mock('../helpers/_getCadesCert', () => ({ _getCadesCert: jest.fn(() => rawCertificateMock) }));
beforeEach(() => {
(_getCadesCert as jest.Mock).mockClear();
});
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
];
const executionFlow = {
[executionSteps[0]]: {
propset_Name: jest.fn(),
propset_Value: jest.fn(),
},
[executionSteps[1]]: {
propset_ContentEncoding: jest.fn(),
propset_Content: jest.fn(),
SignCades: jest.fn(() => executionSteps[4]),
VerifyCades: jest.fn(),
CoSignCades: jest.fn(() => executionSteps[5]),
},
[executionSteps[2]]: {
propset_Certificate: jest.fn(),
AuthenticatedAttributes2: executionSteps[3],
propset_Options: jest.fn(),
},
[executionSteps[3]]: {
Add: jest.fn(),
},
[executionSteps[4]]: 'signature',
[executionSteps[5]]: 'newSignature',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation((object) => {
switch (object) {
case 'CADESCOM.CPAttribute':
return executionSteps[0];
case 'CAdESCOM.CadesSignedData':
return executionSteps[1];
case 'CAdESCOM.CPSigner':
return executionSteps[2];
}
});
describe('addAttachedSignature', () => {
test('uses Buffer to encrypt the message', async () => {
const originalBufferFrom = global.Buffer.from;
(global.Buffer.from as jest.Mock) = jest.fn(() => ({
toString: jest.fn(),
}));
await createAttachedSignature(parsedCertificateMock.thumbprint, 'message');
await addAttachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(global.Buffer.from).toHaveBeenCalledTimes(2);
global.Buffer.from = originalBufferFrom;
});
test('uses specified certificate', async () => {
await addAttachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(_getCadesCert).toHaveBeenCalledWith(parsedCertificateMock.thumbprint);
});
test('returns new signature', async () => {
await createAttachedSignature(parsedCertificateMock.thumbprint, 'message');
const signature = await addAttachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(signature).toEqual('newSignature');
});
});

View File

@ -1,112 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { createDetachedSignature } from './createDetachedSignature';
import { _getCadesCert } from '../helpers/_getCadesCert';
import { addDetachedSignature } from './addDetachedSignature';
import { createHash } from './createHash';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
jest.mock('../helpers/_getCadesCert', () => ({ _getCadesCert: jest.fn(() => rawCertificateMock) }));
beforeEach(() => {
(_getCadesCert as jest.Mock).mockClear();
});
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
Symbol('step 6'),
Symbol('step 7'),
];
const executionFlow = {
[executionSteps[0]]: {
propset_Name: jest.fn(),
propset_Value: jest.fn(),
},
[executionSteps[1]]: {
propset_ContentEncoding: jest.fn(),
propset_Content: jest.fn(),
SignHash: jest.fn(() => executionSteps[4]),
VerifyHash: jest.fn(),
CoSignHash: jest.fn(() => executionSteps[6]),
},
[executionSteps[2]]: {
propset_Certificate: jest.fn(),
AuthenticatedAttributes2: executionSteps[3],
propset_Options: jest.fn(),
},
[executionSteps[3]]: {
Add: jest.fn(),
},
[executionSteps[4]]: 'signature',
[executionSteps[5]]: {
propset_Algorithm: jest.fn(),
propset_DataEncoding: jest.fn(),
Hash: jest.fn(),
Value: executionSteps[7],
SetHashValue: jest.fn(),
},
[executionSteps[6]]: 'newSignature',
[executionSteps[7]]: 'hash',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation((object) => {
switch (object) {
case 'CADESCOM.CPAttribute':
return executionSteps[0];
case 'CAdESCOM.CadesSignedData':
return executionSteps[1];
case 'CAdESCOM.CPSigner':
return executionSteps[2];
case 'CAdESCOM.HashedData':
return executionSteps[5];
}
});
describe('addDetachedSignature', () => {
test('uses specified certificate', async () => {
const originalBufferFrom = global.Buffer.from;
(global.Buffer.from as jest.Mock) = jest.fn(() => ({
toString: jest.fn(),
}));
const signature = await createDetachedSignature(parsedCertificateMock.thumbprint, 'message');
const signatureHash = await createHash(signature);
await addDetachedSignature(parsedCertificateMock.thumbprint, signature, signatureHash);
expect(_getCadesCert).toHaveBeenCalledWith(parsedCertificateMock.thumbprint);
expect(global.Buffer.from).toHaveBeenCalledTimes(1);
global.Buffer.from = originalBufferFrom;
});
test('returns new signature', async () => {
const originalBufferFrom = global.Buffer.from;
(global.Buffer.from as jest.Mock) = jest.fn(() => ({
toString: jest.fn(),
}));
let signature = await createDetachedSignature(parsedCertificateMock.thumbprint, 'message');
const signatureHash = await createHash(signature);
signature = await addDetachedSignature(parsedCertificateMock.thumbprint, signature, signatureHash);
expect(_getCadesCert).toHaveBeenCalledWith(parsedCertificateMock.thumbprint);
expect(global.Buffer.from).toHaveBeenCalledTimes(1);
expect(signature).toEqual('newSignature');
global.Buffer.from = originalBufferFrom;
});
});

View File

@ -1,70 +0,0 @@
import 'cadesplugin';
import { parsedCertificates } from '../../__mocks__/certificates';
import { ISSUER_TAGS_TRANSLATIONS, SUBJECT_TAGS_TRANSLATIONS } from '../../constants';
import { exportBase64 } from './exportBase64';
import { getAlgorithm } from './getAlgorithm';
import { getCadesProp } from './getCadesProp';
import { getDecodedExtendedKeyUsage } from './getDecodedExtendedKeyUsage';
import { getExtendedKeyUsage } from './getExtendedKeyUsage';
import { getInfo } from './getInfo';
import { hasExtendedKeyUsage } from './hasExtendedKeyUsage';
import { isValid } from './isValid';
import { Certificate } from './certificate';
const [parsedCertificateMock] = parsedCertificates;
const oidsMock = ['oid 1', 'oid 2'];
jest.mock('./isValid', () => ({ isValid: jest.fn(() => 'isValid') }));
jest.mock('./getCadesProp', () => ({ getCadesProp: jest.fn(() => 'getCadesProp') }));
jest.mock('./exportBase64', () => ({ exportBase64: jest.fn(() => 'exportBase64') }));
jest.mock('./getAlgorithm', () => ({ getAlgorithm: jest.fn(() => 'getAlgorithm') }));
jest.mock('./getInfo', () => ({ getInfo: jest.fn(() => 'getInfo') }));
jest.mock('./getExtendedKeyUsage', () => ({ getExtendedKeyUsage: jest.fn(() => 'getExtendedKeyUsage') }));
jest.mock('./getDecodedExtendedKeyUsage', () => ({
getDecodedExtendedKeyUsage: jest.fn(() => 'getDecodedExtendedKeyUsage'),
}));
jest.mock('./hasExtendedKeyUsage', () => ({ hasExtendedKeyUsage: jest.fn(() => 'hasExtendedKeyUsage') }));
beforeEach(() => {
(isValid as jest.Mock).mockClear();
(getCadesProp as jest.Mock).mockClear();
(exportBase64 as jest.Mock).mockClear();
(getAlgorithm as jest.Mock).mockClear();
(getInfo as jest.Mock).mockClear();
(getExtendedKeyUsage as jest.Mock).mockClear();
(getDecodedExtendedKeyUsage as jest.Mock).mockClear();
(hasExtendedKeyUsage as jest.Mock).mockClear();
});
const certificate = new Certificate(
null,
parsedCertificateMock.name,
parsedCertificateMock.issuerName,
parsedCertificateMock.subjectName,
parsedCertificateMock.thumbprint,
parsedCertificateMock.validFrom,
parsedCertificateMock.validTo,
);
describe('getInfo', () => {
test("calls external APIs for each method and passes it's results outside", async () => {
expect(certificate.isValid()).toEqual('isValid');
expect(isValid).toHaveBeenCalledTimes(1);
expect(certificate.getCadesProp('property name')).toEqual('getCadesProp');
expect(getCadesProp).toHaveBeenCalledWith('property name');
expect(certificate.exportBase64()).toEqual('exportBase64');
expect(exportBase64).toHaveBeenCalledTimes(1);
expect(certificate.getAlgorithm()).toEqual('getAlgorithm');
expect(getAlgorithm).toHaveBeenCalledTimes(1);
expect(certificate.getOwnerInfo()).toEqual('getInfo');
expect(getInfo).toHaveBeenCalledWith(SUBJECT_TAGS_TRANSLATIONS, 'SubjectName');
expect(certificate.getIssuerInfo()).toEqual('getInfo');
expect(getInfo).toHaveBeenCalledWith(ISSUER_TAGS_TRANSLATIONS, 'IssuerName');
expect(certificate.getExtendedKeyUsage()).toEqual('getExtendedKeyUsage');
expect(getExtendedKeyUsage).toHaveBeenCalledTimes(1);
expect(certificate.getDecodedExtendedKeyUsage()).toEqual('getDecodedExtendedKeyUsage');
expect(getDecodedExtendedKeyUsage).toHaveBeenCalledTimes(1);
expect(certificate.hasExtendedKeyUsage(oidsMock)).toEqual('hasExtendedKeyUsage');
expect(hasExtendedKeyUsage).toHaveBeenCalledWith(oidsMock);
});
});

View File

@ -1,24 +0,0 @@
import 'cadesplugin';
import { exportBase64 } from './exportBase64';
const exportedCertificateMock = 'certificate as base64';
const executionSteps = [Symbol('step 0')];
const executionFlow = {
[executionSteps[0]]: exportedCertificateMock,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
describe('exportBase64', () => {
test('returns exported certificate', async () => {
const certificateAsBase64 = await exportBase64.call({
_cadesCertificate: {
Export: jest.fn(() => executionSteps[0]),
},
});
expect(certificateAsBase64).toEqual(exportedCertificateMock);
});
});

View File

@ -1,33 +0,0 @@
import 'cadesplugin';
import { getAlgorithm } from './getAlgorithm';
const executionSteps = [Symbol('step 0'), Symbol('step 1'), Symbol('step 2'), Symbol('step 3')];
const executionFlow = {
[executionSteps[0]]: {
Algorithm: executionSteps[1],
},
[executionSteps[1]]: {
FriendlyName: executionSteps[2],
Value: executionSteps[3],
},
[executionSteps[2]]: 'algorithm',
[executionSteps[3]]: 'oid',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
describe('getAlgorithm', () => {
test('returns information about algorithm', async () => {
const algorithmInfo = await getAlgorithm.call({
_cadesCertificate: {
PublicKey: jest.fn(() => executionSteps[0]),
},
});
expect(algorithmInfo).toStrictEqual({
algorithm: 'algorithm',
oid: 'oid',
});
});
});

View File

@ -1,27 +0,0 @@
import 'cadesplugin';
import { getCadesProp } from './getCadesProp';
const cadesPropertyContentMock = 'content of a cades property';
const executionSteps = [Symbol('step 0')];
const executionFlow = {
[executionSteps[0]]: cadesPropertyContentMock,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
describe('getCadesProp', () => {
test('returns contents of a cades prop', async () => {
const cadesPropertyContent = await getCadesProp.call(
{
_cadesCertificate: {
cadesProperty: executionSteps[0],
},
},
'cadesProperty',
);
expect(cadesPropertyContent).toEqual(cadesPropertyContentMock);
});
});

View File

@ -1,18 +0,0 @@
import 'cadesplugin';
import { getDecodedExtendedKeyUsage } from './getDecodedExtendedKeyUsage';
const oidsMock = ['1.2.643.3.131.1.1', '1.2.643.6.3.1.3.1', '1.2.643.3.141.1.1'];
describe('getDecodedExtendedKeyUsage', () => {
test('returns translated info about existing oids of a certificate', async () => {
const getExtendedKeyUsageStub = jest.fn(() => oidsMock);
const certificateStub = { getExtendedKeyUsage: getExtendedKeyUsageStub };
expect(await getDecodedExtendedKeyUsage.call(certificateStub)).toEqual({
'1.2.643.3.131.1.1': 'ИНН',
'1.2.643.3.141.1.1': 'РНС ФСС',
'1.2.643.6.3.1.3.1': 'Участник размещения заказа',
});
expect(getExtendedKeyUsageStub).toBeCalledTimes(1);
});
});

View File

@ -1,35 +0,0 @@
import 'cadesplugin';
import { getExtendedKeyUsage } from './getExtendedKeyUsage';
const oidsMock = ['1.3.6.1.4.1.311.80.1'];
const executionSteps = [Symbol('step 0'), Symbol('step 1'), Symbol('step 2'), Symbol('step 3'), Symbol('step 4')];
const executionFlow = {
[executionSteps[0]]: {
EKUs: executionSteps[1],
},
[executionSteps[1]]: {
Count: executionSteps[2],
Item: jest.fn(() => executionSteps[3]),
},
[executionSteps[2]]: 1,
[executionSteps[3]]: {
OID: executionSteps[4],
},
[executionSteps[4]]: oidsMock[0],
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
describe('getExtendedKeyUsage', () => {
test('returns info about oids', async () => {
const oids = await getExtendedKeyUsage.call({
_cadesCertificate: {
ExtendedKeyUsage: jest.fn(() => executionSteps[0]),
},
});
expect(oids).toStrictEqual(oidsMock);
});
});

View File

@ -1,35 +0,0 @@
import 'cadesplugin';
import { ISSUER_TAGS_TRANSLATIONS } from '../../constants';
import { getInfo } from './getInfo';
import { getCadesProp } from './getCadesProp';
import { _parseCertInfo } from '../../helpers/_parseCertInfo';
const entitiesPathMock = 'path to entities';
const entitiesMock = 'info about the entities';
const certificateInfoMock = [
{
description: 'description',
title: 'title',
isTranslated: true,
},
];
jest.mock('./getCadesProp', () => ({ getCadesProp: jest.fn(() => entitiesMock) }));
jest.mock('../../helpers/_parseCertInfo', () => ({ _parseCertInfo: jest.fn(() => certificateInfoMock) }));
beforeEach(() => {
(getCadesProp as jest.Mock).mockClear();
(_parseCertInfo as jest.Mock).mockClear();
});
describe('getInfo', () => {
test('calls external APIs to get information about the certificate', async () => {
const certificateInfo = await getInfo(ISSUER_TAGS_TRANSLATIONS, entitiesPathMock);
expect(getCadesProp).toHaveBeenCalledTimes(1);
expect(getCadesProp).toHaveBeenCalledWith(entitiesPathMock);
expect(_parseCertInfo).toHaveBeenCalledTimes(1);
expect(_parseCertInfo).toHaveBeenCalledWith(ISSUER_TAGS_TRANSLATIONS, entitiesMock);
expect(certificateInfo).toStrictEqual(certificateInfoMock);
});
});

View File

@ -1,18 +0,0 @@
import 'cadesplugin';
import { hasExtendedKeyUsage } from './hasExtendedKeyUsage';
const oidsMock = ['1.3.6.1.4.1.311.80.1', '1.3.6.1.5.5.7.3.2', '1.3.6.1.4.1.311.10.3.12'];
describe('hasExtendedKeyUsage', () => {
test('returns info about existing oids of a certificate', async () => {
const getExtendedKeyUsageStub = jest.fn(() => oidsMock);
const certificateStub = { getExtendedKeyUsage: getExtendedKeyUsageStub };
expect(await hasExtendedKeyUsage.call(certificateStub, '1.3.6.1.4.1.311.80.1')).toEqual(true);
expect(await hasExtendedKeyUsage.call(certificateStub, ['1.3.6.1.5.5.7.3.2', '1.3.6.1.4.1.311.10.3.12'])).toEqual(
true,
);
expect(await hasExtendedKeyUsage.call(certificateStub, 'non-existing oid')).toEqual(false);
expect(getExtendedKeyUsageStub).toBeCalledTimes(3);
});
});

View File

@ -1,25 +0,0 @@
import 'cadesplugin';
import { isValid } from './isValid';
const executionSteps = [Symbol('step 0'), Symbol('step 1')];
const executionFlow = {
[executionSteps[0]]: {
Result: executionSteps[1],
},
[executionSteps[1]]: true,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
describe('isValid', () => {
test('returns validity state of certificate', async () => {
const valid = await isValid.call({
_cadesCertificate: {
IsValid: jest.fn(() => executionSteps[0]),
},
});
expect(valid).toEqual(true);
});
});

View File

@ -1,76 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { createAttachedSignature } from './createAttachedSignature';
import { _getCadesCert } from '../helpers/_getCadesCert';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
jest.mock('../helpers/_getCadesCert', () => ({ _getCadesCert: jest.fn(() => rawCertificateMock) }));
beforeEach(() => {
(_getCadesCert as jest.Mock).mockClear();
});
const executionSteps = [Symbol('step 0'), Symbol('step 1'), Symbol('step 2'), Symbol('step 3'), Symbol('step 4')];
const executionFlow = {
[executionSteps[0]]: {
propset_Name: jest.fn(),
propset_Value: jest.fn(),
},
[executionSteps[1]]: {
propset_ContentEncoding: jest.fn(),
propset_Content: jest.fn(),
SignCades: jest.fn(() => executionSteps[4]),
},
[executionSteps[2]]: {
propset_Certificate: jest.fn(),
AuthenticatedAttributes2: executionSteps[3],
propset_Options: jest.fn(),
},
[executionSteps[3]]: {
Add: jest.fn(),
},
[executionSteps[4]]: 'signature',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation((object) => {
switch (object) {
case 'CADESCOM.CPAttribute':
return executionSteps[0];
case 'CAdESCOM.CadesSignedData':
return executionSteps[1];
case 'CAdESCOM.CPSigner':
return executionSteps[2];
}
});
describe('createAttachedSignature', () => {
test('uses Buffer to encrypt the message', async () => {
const originalBufferFrom = global.Buffer.from;
(global.Buffer.from as jest.Mock) = jest.fn(() => ({
toString: jest.fn(),
}));
await createAttachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(global.Buffer.from).toHaveBeenCalledTimes(1);
global.Buffer.from = originalBufferFrom;
});
test('uses specified certificate', async () => {
await createAttachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(_getCadesCert).toHaveBeenCalledWith(parsedCertificateMock.thumbprint);
});
test('returns signature', async () => {
const signature = await createAttachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(signature).toEqual('signature');
});
});

View File

@ -1,75 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { createDetachedSignature } from './createDetachedSignature';
import { _getCadesCert } from '../helpers/_getCadesCert';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
jest.mock('../helpers/_getCadesCert', () => ({ _getCadesCert: jest.fn(() => rawCertificateMock) }));
beforeEach(() => {
(_getCadesCert as jest.Mock).mockClear();
});
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
];
const executionFlow = {
[executionSteps[0]]: {
propset_Name: jest.fn(),
propset_Value: jest.fn(),
},
[executionSteps[1]]: {
propset_ContentEncoding: jest.fn(),
propset_Content: jest.fn(),
SignHash: jest.fn(() => executionSteps[4]),
},
[executionSteps[2]]: {
propset_Certificate: jest.fn(),
AuthenticatedAttributes2: executionSteps[3],
propset_Options: jest.fn(),
},
[executionSteps[3]]: {
Add: jest.fn(),
},
[executionSteps[4]]: 'signature',
[executionSteps[5]]: {
propset_Algorithm: jest.fn(),
SetHashValue: jest.fn(),
},
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation((object) => {
switch (object) {
case 'CADESCOM.CPAttribute':
return executionSteps[0];
case 'CAdESCOM.CadesSignedData':
return executionSteps[1];
case 'CAdESCOM.CPSigner':
return executionSteps[2];
case 'CAdESCOM.HashedData':
return executionSteps[5];
}
});
describe('createDetachedSignature', () => {
test('uses specified certificate', async () => {
await createDetachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(_getCadesCert).toHaveBeenCalledWith(parsedCertificateMock.thumbprint);
});
test('returns signature', async () => {
const signature = await createDetachedSignature(parsedCertificateMock.thumbprint, 'message');
expect(signature).toEqual('signature');
});
});

View File

@ -1,44 +0,0 @@
import 'cadesplugin';
import { createHash } from './createHash';
const executionSteps = [Symbol('step 0'), Symbol('step 1')];
const executionFlow = {
[executionSteps[0]]: {
propset_Algorithm: jest.fn(),
propset_DataEncoding: jest.fn(),
Hash: jest.fn(),
Value: executionSteps[1],
},
[executionSteps[1]]: 'hash',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation((object) => {
switch (object) {
case 'CAdESCOM.HashedData':
return executionSteps[0];
}
});
describe('createHash', () => {
test('uses Buffer to encrypt the message', async () => {
const originalBufferFrom = global.Buffer.from;
(global.Buffer.from as jest.Mock) = jest.fn(() => ({
toString: jest.fn(),
}));
await createHash('message');
expect(global.Buffer.from).toHaveBeenCalledTimes(1);
global.Buffer.from = originalBufferFrom;
});
test('returns created hash', async () => {
const hash = await createHash('message');
expect(hash).toEqual('hash');
});
});

View File

@ -1,71 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { createXMLSignature } from './createXMLSignature';
import { _getCadesCert } from '../helpers/_getCadesCert';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
jest.mock('../helpers/_getCadesCert', () => ({ _getCadesCert: jest.fn(() => rawCertificateMock) }));
beforeEach(() => {
(_getCadesCert as jest.Mock).mockClear();
});
const executionSteps = [Symbol('step 0'), Symbol('step 1'), Symbol('step 2')];
const executionFlow = {
[executionSteps[0]]: {
propset_Certificate: jest.fn(),
propset_CheckCertificate: jest.fn(),
},
[executionSteps[1]]: {
propset_Content: jest.fn(),
propset_SignatureType: jest.fn(),
propset_SignatureMethod: jest.fn(),
propset_DigestMethod: jest.fn(),
Sign: jest.fn(() => executionSteps[2]),
},
[executionSteps[2]]: 'signature',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation((object) => {
switch (object) {
case 'CAdESCOM.CPSigner':
return executionSteps[0];
case 'CAdESCOM.SignedXML':
return executionSteps[1];
}
});
describe('createXMLSignature', () => {
test('uses specified certificate', async () => {
await createXMLSignature(parsedCertificateMock.thumbprint, 'message');
expect(_getCadesCert).toHaveBeenCalledWith(parsedCertificateMock.thumbprint);
});
test('returns signature', async () => {
const signature = await createXMLSignature(
parsedCertificateMock.thumbprint,
`
<?xml version="1.0" encoding="UTF-8"?>
<!--
Original XML doc file for sign example.
-->
<Envelope xmlns="urn:envelope">
<Data>
Hello, World!
</Data>
<Node xml:id="nodeID">
Hello, Node!
</Node>
</Envelope>
`,
);
expect(signature).toEqual('signature');
});
});

View File

@ -1,60 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { getAllContainerCertificates } from './getAllContainerCertificates';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
Symbol('step 6'),
Symbol('step 7'),
Symbol('step 8'),
];
const executionFlow = {
[executionSteps[0]]: {
Certificates: executionSteps[1],
Close: jest.fn(),
Open: jest.fn(),
},
[executionSteps[1]]: {
Count: executionSteps[2],
Item: jest.fn(() => executionSteps[3]),
},
[executionSteps[2]]: 1,
[executionSteps[3]]: {
IssuerName: executionSteps[6],
SubjectName: executionSteps[5],
Thumbprint: executionSteps[4],
ValidFromDate: executionSteps[7],
ValidToDate: executionSteps[8],
},
[executionSteps[6]]: rawCertificateMock.IssuerName,
[executionSteps[5]]: rawCertificateMock.SubjectName,
[executionSteps[4]]: rawCertificateMock.Thumbprint,
[executionSteps[7]]: rawCertificateMock.ValidFromDate,
[executionSteps[8]]: rawCertificateMock.ValidToDate,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getUserCertificates', () => {
test('returns certificates list', async () => {
const certificates = await getAllContainerCertificates();
expect(certificates.length).toBeGreaterThan(0);
});
test('returns certificates with correct fields', async () => {
const [certificate] = await getAllContainerCertificates();
expect(certificate).toMatchObject(parsedCertificateMock);
});
});

View File

@ -1,60 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { getAllUserCertificates } from './getAllUserCertificates';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
Symbol('step 6'),
Symbol('step 7'),
Symbol('step 8'),
];
const executionFlow = {
[executionSteps[0]]: {
Certificates: executionSteps[1],
Close: jest.fn(),
Open: jest.fn(),
},
[executionSteps[1]]: {
Count: executionSteps[2],
Item: jest.fn(() => executionSteps[3]),
},
[executionSteps[2]]: 1,
[executionSteps[3]]: {
IssuerName: executionSteps[6],
SubjectName: executionSteps[5],
Thumbprint: executionSteps[4],
ValidFromDate: executionSteps[7],
ValidToDate: executionSteps[8],
},
[executionSteps[6]]: rawCertificateMock.IssuerName,
[executionSteps[5]]: rawCertificateMock.SubjectName,
[executionSteps[4]]: rawCertificateMock.Thumbprint,
[executionSteps[7]]: rawCertificateMock.ValidFromDate,
[executionSteps[8]]: rawCertificateMock.ValidToDate,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getUserCertificates', () => {
test('returns certificates list', async () => {
const certificates = await getAllUserCertificates();
expect(certificates.length).toBeGreaterThan(0);
});
test('returns certificates with correct fields', async () => {
const [certificate] = await getAllUserCertificates();
expect(certificate).toMatchObject(parsedCertificateMock);
});
});

View File

@ -1,28 +0,0 @@
import 'cadesplugin';
import { parsedCertificates } from '../__mocks__/certificates';
import { getCertificate } from './getCertificate';
import { getUserCertificates } from './getUserCertificates';
jest.mock('./getUserCertificates', () => ({ getUserCertificates: jest.fn(() => parsedCertificates) }));
beforeEach(() => {
(getUserCertificates as jest.Mock).mockClear();
});
describe('getCertificate', () => {
const [sampleCertificate] = parsedCertificates;
test('calls getUserCertificates internally', async () => {
await getCertificate(sampleCertificate.thumbprint);
expect(getUserCertificates).toHaveBeenCalledTimes(1);
});
test('returns requested certificate', async () => {
expect(await getCertificate(sampleCertificate.thumbprint)).toStrictEqual(sampleCertificate);
});
test("throws error if certificate wasn't found", async () => {
await expect(getCertificate('some non-existing thumbprint')).rejects.toThrowError('не найден');
});
});

View File

@ -1,68 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { getContainerCertificates } from './getContainerCertificates';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
Symbol('step 6'),
Symbol('step 7'),
Symbol('step 8'),
Symbol('step 9'),
Symbol('step 10'),
];
const executionFlow = {
[executionSteps[0]]: {
Certificates: executionSteps[1],
Close: jest.fn(),
Open: jest.fn(),
},
[executionSteps[1]]: {
Find: jest.fn(() => executionSteps[2]),
},
[executionSteps[2]]: {
Find: jest.fn(() => executionSteps[3]),
},
[executionSteps[3]]: {
Count: executionSteps[4],
Item: jest.fn(() => executionSteps[5]),
},
[executionSteps[4]]: 1,
[executionSteps[5]]: {
IssuerName: executionSteps[8],
SubjectName: executionSteps[7],
Thumbprint: executionSteps[6],
ValidFromDate: executionSteps[9],
ValidToDate: executionSteps[10],
},
[executionSteps[8]]: rawCertificateMock.IssuerName,
[executionSteps[7]]: rawCertificateMock.SubjectName,
[executionSteps[6]]: rawCertificateMock.Thumbprint,
[executionSteps[9]]: rawCertificateMock.ValidFromDate,
[executionSteps[10]]: rawCertificateMock.ValidToDate,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getContainerCertificates', () => {
test('returns certificates list', async () => {
const certificates = await getContainerCertificates();
expect(certificates.length).toBeGreaterThan(0);
});
test('returns certificates with correct fields', async () => {
const [certificate] = await getContainerCertificates();
expect(certificate).toMatchObject(parsedCertificateMock);
});
});

View File

@ -1,26 +0,0 @@
import 'cadesplugin';
import { getCspVersion } from './getCspVersion';
const executionSteps = [Symbol('step 0'), Symbol('step 1'), Symbol('step 2')];
// "any" because of using toString on the literal
const executionFlow: any = {
[executionSteps[0]]: {
CSPVersion: jest.fn(() => executionSteps[1]),
},
[executionSteps[1]]: {
toString: jest.fn(() => executionSteps[2]),
},
[executionSteps[2]]: '4.0.9971',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getCspVersion', () => {
test('returns information about CSP', async () => {
const cspVersion = await getCspVersion();
expect(cspVersion).toStrictEqual('4.0.9971');
});
});

View File

@ -1,28 +0,0 @@
import 'cadesplugin';
import { getPluginVersion } from './getPluginVersion';
const executionSteps = [Symbol('step 0'), Symbol('step 1'), Symbol('step 2'), Symbol('step 3')];
// "any" because of using toString on the literal
const executionFlow: any = {
[executionSteps[0]]: {
PluginVersion: executionSteps[1],
Version: executionSteps[2],
},
[executionSteps[1]]: undefined,
[executionSteps[2]]: {
toString: jest.fn(() => executionSteps[3]),
},
[executionSteps[3]]: '2.0.13771',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getPluginVersion', () => {
test('returns information about plugin', async () => {
const pluginVersion = await getPluginVersion();
expect(pluginVersion).toStrictEqual('2.0.13771');
});
});

View File

@ -1,43 +0,0 @@
import 'cadesplugin';
import { getSystemInfo } from './getSystemInfo';
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
];
// "any" because of using toString on the literal
const executionFlow: any = {
[executionSteps[0]]: {
PluginVersion: executionSteps[1],
Version: executionSteps[2],
CSPVersion: jest.fn(() => executionSteps[3]),
},
[executionSteps[1]]: undefined,
[executionSteps[2]]: {
toString: jest.fn(() => executionSteps[4]),
},
[executionSteps[3]]: {
toString: jest.fn(() => executionSteps[5]),
},
[executionSteps[4]]: '2.0.13771',
[executionSteps[5]]: '4.0.9971',
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getSystemInfo', () => {
test('returns information about environment', async () => {
const systemInfo = await getSystemInfo();
expect(systemInfo).toStrictEqual({
cadesVersion: '2.0.13771',
cspVersion: '4.0.9971',
});
});
});

View File

@ -1,68 +0,0 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { getUserCertificates } from './getUserCertificates';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
Symbol('step 6'),
Symbol('step 7'),
Symbol('step 8'),
Symbol('step 9'),
Symbol('step 10'),
];
const executionFlow = {
[executionSteps[0]]: {
Certificates: executionSteps[1],
Close: jest.fn(),
Open: jest.fn(),
},
[executionSteps[1]]: {
Find: jest.fn(() => executionSteps[2]),
},
[executionSteps[2]]: {
Find: jest.fn(() => executionSteps[3]),
},
[executionSteps[3]]: {
Count: executionSteps[4],
Item: jest.fn(() => executionSteps[5]),
},
[executionSteps[4]]: 1,
[executionSteps[5]]: {
IssuerName: executionSteps[8],
SubjectName: executionSteps[7],
Thumbprint: executionSteps[6],
ValidFromDate: executionSteps[9],
ValidToDate: executionSteps[10],
},
[executionSteps[8]]: rawCertificateMock.IssuerName,
[executionSteps[7]]: rawCertificateMock.SubjectName,
[executionSteps[6]]: rawCertificateMock.Thumbprint,
[executionSteps[9]]: rawCertificateMock.ValidFromDate,
[executionSteps[10]]: rawCertificateMock.ValidToDate,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getUserCertificates', () => {
test('returns certificates list', async () => {
const certificates = await getUserCertificates();
expect(certificates.length).toBeGreaterThan(0);
});
test('returns certificates with correct fields', async () => {
const [certificate] = await getUserCertificates();
expect(certificate).toMatchObject(parsedCertificateMock);
});
});

View File

@ -1,64 +0,0 @@
import 'cadesplugin';
import 'console-mock';
import { isValidSystemSetup } from './isValidSystemSetup';
import { getSystemInfo } from './getSystemInfo';
import { _isSupportedCadesVersion } from '../helpers/_isSupportedCadesVersion';
import { _isSupportedCSPVersion } from '../helpers/_isSupportedCSPVersion';
jest.mock('./getSystemInfo', () => ({ getSystemInfo: jest.fn() }));
jest.mock('../helpers/_isSupportedCadesVersion', () => ({ _isSupportedCadesVersion: jest.fn() }));
jest.mock('../helpers/_isSupportedCSPVersion', () => ({ _isSupportedCSPVersion: jest.fn() }));
beforeEach(() => {
(getSystemInfo as jest.Mock).mockClear();
(_isSupportedCadesVersion as jest.Mock).mockClear();
(_isSupportedCSPVersion as jest.Mock).mockClear();
});
describe('isValidSystemSetup', () => {
(getSystemInfo as jest.Mock).mockImplementation(() => ({
cadesVersion: '2.0.13771',
cspVersion: '4.0.9971',
}));
(_isSupportedCadesVersion as jest.Mock).mockImplementation(() => true);
(_isSupportedCSPVersion as jest.Mock).mockImplementation(() => true);
describe('positive scenario', () => {
test("calls getSystemInfo to verify that it's possible", async () => {
await isValidSystemSetup();
expect(getSystemInfo).toHaveBeenCalledTimes(1);
});
test('checks for validity using separate external helpers', async () => {
await isValidSystemSetup();
expect(_isSupportedCadesVersion).toHaveBeenCalledTimes(1);
expect(_isSupportedCSPVersion).toHaveBeenCalledTimes(1);
});
});
describe('negative scenario', () => {
test('throws error from getSystemInfo', async () => {
const errorMessage = 'Какая-то синтаксическая ошибка';
const vendorErrorMessage = 'Произошла ошибка из-за какой-то проблемы';
(getSystemInfo as jest.Mock).mockImplementationOnce(() => Promise.reject(new Error(errorMessage)));
(window.cadesplugin.getLastError as jest.Mock).mockImplementationOnce(() => new Error(vendorErrorMessage));
await expect(isValidSystemSetup()).rejects.toThrowError(vendorErrorMessage);
});
test('throws error if cades version is unsupported', async () => {
(_isSupportedCadesVersion as jest.Mock).mockImplementationOnce(() => false);
await expect(isValidSystemSetup()).rejects.toThrowError('Не поддерживаемая версия плагина');
});
test('throws error if CSP version is unsupported', async () => {
(_isSupportedCSPVersion as jest.Mock).mockImplementationOnce(() => false);
await expect(isValidSystemSetup()).rejects.toThrowError('Не поддерживаемая версия CSP');
});
});
});

View File

@ -1,45 +0,0 @@
import 'cadesplugin';
import 'console-mock';
import { _afterPluginsLoaded } from './_afterPluginsLoaded';
const cadesPluginMock = window.cadesplugin;
describe('_afterPluginsLoaded', () => {
beforeEach(() => {
window.cadesplugin = cadesPluginMock;
});
test('sets log level on a vendor library', async () => {
const wrappedMethod = _afterPluginsLoaded(jest.fn());
await wrappedMethod();
expect(window.cadesplugin.set_log_level).toBeCalled();
});
test("throws Error when Cades plugin isn't available", async () => {
const wrappedMethod = _afterPluginsLoaded(jest.fn());
window.cadesplugin = Promise.reject();
await expect(wrappedMethod()).rejects.toThrow();
});
test('throws Error from Cades plugin if it occurs', async () => {
const wrappedMethod = _afterPluginsLoaded(jest.fn());
const vendorErrorMessage = 'Что-то пошло не так, и об этом стоит знать пользователю';
window.cadesplugin = Promise.reject(new Error(vendorErrorMessage));
await expect(wrappedMethod()).rejects.toThrowError(vendorErrorMessage);
});
test('calls method body when invoked', async () => {
const methodBody = jest.fn();
const wrappedMethod = _afterPluginsLoaded(methodBody);
await wrappedMethod();
expect(methodBody).toBeCalled();
});
});

View File

@ -1,8 +1,8 @@
;(function () { ; (function () {
//already loaded //already loaded
if(window.cadesplugin) if (window.cadesplugin && window.cadesplugin.LOG_LEVEL_DEBUG) {
return; return;
}
var pluginObject; var pluginObject;
var plugin_resolved = 0; var plugin_resolved = 0;
var plugin_reject; var plugin_reject;
@ -14,80 +14,111 @@
var canPromise = !!window.Promise; var canPromise = !!window.Promise;
var cadesplugin_loaded_event_recieved = false; var cadesplugin_loaded_event_recieved = false;
var isFireFoxExtensionLoaded = false; var isFireFoxExtensionLoaded = false;
var cadesplugin; var cadesplugin = {};
if(canPromise) if (canPromise) {
{ cadesplugin = new window.Promise(function (resolve, reject) {
cadesplugin = new Promise(function(resolve, reject)
{
plugin_resolve = resolve; plugin_resolve = resolve;
plugin_reject = reject; plugin_reject = reject;
}); });
} else
{
cadesplugin = {};
} }
function check_browser() { function check_browser() {
var ua= navigator.userAgent, tem, M= ua.match(/(opera|yabrowser|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; var ua = window.navigator.userAgent,
if(/trident/i.test(M[1])){ tem,
M = ua.match(/(opera|yabrowser|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || []; tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return { name:'IE', version:(tem[1] || '')}; return { name: 'IE', version: (tem[1] || '') };
} }
if(M[1] === 'Chrome'){ if (M[1] === "Chrome") {
tem = ua.match(/\b(OPR|Edg|YaBrowser)\/(\d+)/); tem = ua.match(/\b(OPR|Edg|YaBrowser)\/(\d+)/);
if (tem != null) if (tem != null && (tem.length > 2)) {
return { name: tem[1].replace('OPR', 'Opera'), version: tem[2] }; return { name: tem[1].replace('OPR', 'Opera'), version: tem[2] };
} }
M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null)
M.splice(1, 1, tem[1]);
return {name:M[0],version:M[1]};
} }
M = M[2] ? [M[1], M[2]] : [window.navigator.appName, window.navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) {
M.splice(1, 1, tem[1]);
}
return { name: M[0], version: M[1] };
}
var browserSpecs = check_browser(); var browserSpecs = check_browser();
function cpcsp_console_log(level, msg){ function cpcsp_console_log(level, msg) {
//IE9 не может писать в консоль если не открыта вкладка developer tools //IE9 не может писать в консоль если не открыта вкладка developer tools
if(typeof(console) === 'undefined') if (typeof console === 'undefined') {
return; return;
if (level <= cadesplugin.current_log_level ){ }
if (level === cadesplugin.LOG_LEVEL_DEBUG) if (level <= cadesplugin.current_log_level) {
if (level === cadesplugin.LOG_LEVEL_DEBUG) {
console.log("DEBUG: %s", msg); console.log("DEBUG: %s", msg);
if (level === cadesplugin.LOG_LEVEL_INFO) }
if (level === cadesplugin.LOG_LEVEL_INFO) {
console.info("INFO: %s", msg); console.info("INFO: %s", msg);
if (level === cadesplugin.LOG_LEVEL_ERROR) }
if (level === cadesplugin.LOG_LEVEL_ERROR) {
console.error("ERROR: %s", msg); console.error("ERROR: %s", msg);
return; }
} }
} }
function set_log_level(level){ function get_extension_version(callback) {
window.postMessage("cadesplugin_extension_version_request", "*");
window.addEventListener("message", function (event) {
var resp_prefix = "cadesplugin_extension_version_response:";
if (typeof (event.data) !== "string" || event.data.indexOf(resp_prefix) !== 0) {
return;
}
var ext_version = event.data.substring(resp_prefix.length);
callback(ext_version);
}, false);
}
function get_extension_id(callback) {
window.postMessage("cadesplugin_extension_id_request", "*");
window.addEventListener("message", function (event) {
var resp_prefix = "cadesplugin_extension_id_response:";
if (typeof (event.data) !== "string" || event.data.indexOf(resp_prefix) !== 0) {
return;
}
var ext_id = event.data.substring(resp_prefix.length);
callback(ext_id);
}, false);
}
function set_log_level(level) {
if (!((level === cadesplugin.LOG_LEVEL_DEBUG) || if (!((level === cadesplugin.LOG_LEVEL_DEBUG) ||
(level === cadesplugin.LOG_LEVEL_INFO) || (level === cadesplugin.LOG_LEVEL_INFO) ||
(level === cadesplugin.LOG_LEVEL_ERROR))){ (level === cadesplugin.LOG_LEVEL_ERROR))) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level); cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level);
return; return;
} }
cadesplugin.current_log_level = level; cadesplugin.current_log_level = level;
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) {
cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR"); cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR");
if(isNativeMessageSupported()) }
{ if (isNativeMessageSupported()) {
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_DEBUG) {
window.postMessage("set_log_level=debug", "*"); window.postMessage("set_log_level=debug", "*");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_INFO) {
window.postMessage("set_log_level=info", "*"); window.postMessage("set_log_level=info", "*");
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) }
if (cadesplugin.current_log_level === cadesplugin.LOG_LEVEL_ERROR) {
window.postMessage("set_log_level=error", "*"); window.postMessage("set_log_level=error", "*");
} }
} }
}
function set_constantValues() function set_constantValues() {
{
cadesplugin.CAPICOM_MEMORY_STORE = 0; cadesplugin.CAPICOM_MEMORY_STORE = 0;
cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1; cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1;
cadesplugin.CAPICOM_CURRENT_USER_STORE = 2; cadesplugin.CAPICOM_CURRENT_USER_STORE = 2;
@ -98,9 +129,14 @@
cadesplugin.CADESCOM_SMART_CARD_USER_STORE = 4; cadesplugin.CADESCOM_SMART_CARD_USER_STORE = 4;
cadesplugin.CADESCOM_CONTAINER_STORE = 100; cadesplugin.CADESCOM_CONTAINER_STORE = 100;
cadesplugin.CAPICOM_ROOT_STORE = "Root";
cadesplugin.CAPICOM_CA_STORE = "CA";
cadesplugin.CAPICOM_MY_STORE = "My"; cadesplugin.CAPICOM_MY_STORE = "My";
cadesplugin.CAPICOM_ADDRESSBOOK_STORE = "AddressBook";
cadesplugin.CAPICOM_STORE_OPEN_READ_WRITE = 1;
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2; cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
cadesplugin.CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED = 256;
cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1; cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
@ -128,6 +164,7 @@
cadesplugin.CADESCOM_CADES_BES = 1; cadesplugin.CADESCOM_CADES_BES = 1;
cadesplugin.CADESCOM_CADES_T = 0x5; cadesplugin.CADESCOM_CADES_T = 0x5;
cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d; cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d;
cadesplugin.CADESCOM_CADES_A = 0xdd;
cadesplugin.CADESCOM_PKCS7_TYPE = 0xffff; cadesplugin.CADESCOM_PKCS7_TYPE = 0xffff;
cadesplugin.CADESCOM_ENCODE_BASE64 = 0; cadesplugin.CADESCOM_ENCODE_BASE64 = 0;
@ -137,6 +174,7 @@
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2; cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2;
cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_NONE = 0x100;
cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0; cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1; cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1;
@ -188,6 +226,10 @@
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25; cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_MAGMA = 35;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_MAGMA_OMAC = 36;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_KUZNYECHIK = 45;
cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_KUZNYECHIK_OMAC = 46;
cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0; cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0;
cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1; cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1;
@ -203,6 +245,11 @@
cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111; cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111;
cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112; cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112;
cadesplugin.CADESCOM_CERT_INFO_ROLE = 100;
cadesplugin.CADESCOM_ROLE_ROOT = "ROOT";
cadesplugin.CADESCOM_ROLE_CA = "CA";
cadesplugin.CADESCOM_ROLE_LEAF = "LEAF";
cadesplugin.LOG_LEVEL_DEBUG = 4; cadesplugin.LOG_LEVEL_DEBUG = 4;
cadesplugin.LOG_LEVEL_INFO = 2; cadesplugin.LOG_LEVEL_INFO = 2;
cadesplugin.LOG_LEVEL_ERROR = 1; cadesplugin.LOG_LEVEL_ERROR = 1;
@ -215,6 +262,11 @@
cadesplugin.CADESCOM_InstallCertChainToContainer = 0x20000000; cadesplugin.CADESCOM_InstallCertChainToContainer = 0x20000000;
cadesplugin.CADESCOM_UseContainerStore = 0x40000000; cadesplugin.CADESCOM_UseContainerStore = 0x40000000;
cadesplugin.ContextNone = 0;
cadesplugin.ContextUser = 0x1;
cadesplugin.ContextMachine = 0x2;
cadesplugin.ContextAdministratorForceMachine = 0x3;
cadesplugin.ENABLE_CARRIER_TYPE_CSP = 0x01; cadesplugin.ENABLE_CARRIER_TYPE_CSP = 0x01;
cadesplugin.ENABLE_CARRIER_TYPE_FKC_NO_SM = 0x02; cadesplugin.ENABLE_CARRIER_TYPE_FKC_NO_SM = 0x02;
cadesplugin.ENABLE_CARRIER_TYPE_FKC_SM = 0x04; cadesplugin.ENABLE_CARRIER_TYPE_FKC_SM = 0x04;
@ -229,12 +281,40 @@
cadesplugin.CADESCOM_PRODUCT_OCSP = 1; cadesplugin.CADESCOM_PRODUCT_OCSP = 1;
cadesplugin.CADESCOM_PRODUCT_TSP = 2; cadesplugin.CADESCOM_PRODUCT_TSP = 2;
cadesplugin.MEDIA_TYPE_DEFAULT = 0x00000000;
cadesplugin.MEDIA_TYPE_REGISTRY = 0x00000001; cadesplugin.MEDIA_TYPE_REGISTRY = 0x00000001;
cadesplugin.MEDIA_TYPE_HDIMAGE = 0x00000002; cadesplugin.MEDIA_TYPE_HDIMAGE = 0x00000002;
cadesplugin.MEDIA_TYPE_CLOUD = 0x00000004; cadesplugin.MEDIA_TYPE_CLOUD = 0x00000004;
cadesplugin.MEDIA_TYPE_SCARD = 0x00000008; cadesplugin.MEDIA_TYPE_SCARD = 0x00000008;
cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0; cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0;
cadesplugin.XCN_CRYPT_STRING_BASE64 = 0x1;
cadesplugin.XCN_CRYPT_STRING_BINARY = 0x2;
cadesplugin.XCN_CRYPT_STRING_BASE64REQUESTHEADER = 0x3;
cadesplugin.XCN_CRYPT_STRING_HEX = 0x4;
cadesplugin.XCN_CRYPT_STRING_HEXASCII = 0x5;
cadesplugin.XCN_CRYPT_STRING_BASE64_ANY = 0x6;
cadesplugin.XCN_CRYPT_STRING_ANY = 0x7;
cadesplugin.XCN_CRYPT_STRING_HEX_ANY = 0x8;
cadesplugin.XCN_CRYPT_STRING_BASE64X509CRLHEADER = 0x9;
cadesplugin.XCN_CRYPT_STRING_HEXADDR = 0xa;
cadesplugin.XCN_CRYPT_STRING_HEXASCIIADDR = 0xb;
cadesplugin.XCN_CRYPT_STRING_HEXRAW = 0xc;
cadesplugin.XCN_CRYPT_STRING_BASE64URI = 0xd;
cadesplugin.XCN_CRYPT_STRING_ENCODEMASK = 0xff;
cadesplugin.XCN_CRYPT_STRING_CHAIN = 0x100;
cadesplugin.XCN_CRYPT_STRING_TEXT = 0x200;
cadesplugin.XCN_CRYPT_STRING_PERCENTESCAPE = 0x8000000;
cadesplugin.XCN_CRYPT_STRING_HASHDATA = 0x10000000;
cadesplugin.XCN_CRYPT_STRING_STRICT = 0x20000000;
cadesplugin.XCN_CRYPT_STRING_NOCRLF = 0x40000000;
cadesplugin.XCN_CRYPT_STRING_NOCR = 0x80000000;
cadesplugin.XCN_CERT_NAME_STR_NONE = 0;
cadesplugin.XCN_AT_NONE = 0;
cadesplugin.XCN_AT_KEYEXCHANGE = 1;
cadesplugin.XCN_AT_SIGNATURE = 2;
cadesplugin.AT_KEYEXCHANGE = 1; cadesplugin.AT_KEYEXCHANGE = 1;
cadesplugin.AT_SIGNATURE = 2; cadesplugin.AT_SIGNATURE = 2;
@ -243,8 +323,97 @@
cadesplugin.CARRIER_FLAG_PROTECTED = 4; cadesplugin.CARRIER_FLAG_PROTECTED = 4;
cadesplugin.CARRIER_FLAG_FUNCTIONAL_CARRIER = 8; cadesplugin.CARRIER_FLAG_FUNCTIONAL_CARRIER = 8;
cadesplugin.CARRIER_FLAG_SECURE_MESSAGING = 16; cadesplugin.CARRIER_FLAG_SECURE_MESSAGING = 16;
cadesplugin.CARRIER_FLAG_ABLE_SET_KEY = 32;
cadesplugin.CARRIER_FLAG_ABLE_VISUALISE_SIGNATURE = 64; cadesplugin.CARRIER_FLAG_ABLE_VISUALISE_SIGNATURE = 64;
cadesplugin.CARRIER_FLAG_VIRTUAL = 128; cadesplugin.CARRIER_FLAG_VIRTUAL = 128;
cadesplugin.CRYPT_MODE_CBCSTRICT = 1;
cadesplugin.CRYPT_MODE_CNT = 3;
cadesplugin.CRYPT_MODE_CBCRFC4357 = 31;
cadesplugin.CRYPT_MODE_CTR = 32;
cadesplugin.CRYPT_MODE_MGM = 33;
cadesplugin.CRYPT_MODE_GCM = 34;
cadesplugin.CRYPT_MODE_OMAC_CTR = 35;
cadesplugin.CRYPT_MODE_WRAP = 36;
cadesplugin.CRYPT_MODE_WRAP_PAD = 37;
cadesplugin.PKCS5_PADDING = 1;
cadesplugin.RANDOM_PADDING = 2;
cadesplugin.ZERO_PADDING = 3;
cadesplugin.ISO10126_PADDING = 4;
cadesplugin.ANSI_X923_PADDING = 5;
cadesplugin.TLS_1_0_PADDING = 6;
cadesplugin.ISO_IEC_7816_4_PADDING = 7;
cadesplugin.CAPICOM_STORE_SAVE_AS_SERIALIZED = 0;
cadesplugin.CAPICOM_STORE_SAVE_AS_PKCS7 = 1;
cadesplugin.CERT_TRUST_NO_ERROR = 0x00000000;
cadesplugin.CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001;
cadesplugin.CERT_TRUST_IS_REVOKED = 0x00000004;
cadesplugin.CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008;
cadesplugin.CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010;
cadesplugin.CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020;
cadesplugin.CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040;
cadesplugin.CERT_TRUST_IS_CYCLIC = 0x00000080;
cadesplugin.CERT_TRUST_INVALID_EXTENSION = 0x00000100;
cadesplugin.CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200;
cadesplugin.CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400;
cadesplugin.CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800;
cadesplugin.CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000;
cadesplugin.CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000;
cadesplugin.CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000;
cadesplugin.CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000;
cadesplugin.CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000;
cadesplugin.CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000;
cadesplugin.CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000;
cadesplugin.CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000;
cadesplugin.CERT_TRUST_HAS_WEAK_SIGNATURE = 0x00100000;
cadesplugin.XCN_CERT_NO_KEY_USAGE = 0;
cadesplugin.XCN_CERT_DIGITAL_SIGNATURE_KEY_USAGE = 0x80;
cadesplugin.XCN_CERT_NON_REPUDIATION_KEY_USAGE = 0x40;
cadesplugin.XCN_CERT_KEY_ENCIPHERMENT_KEY_USAGE = 0x20;
cadesplugin.XCN_CERT_DATA_ENCIPHERMENT_KEY_USAGE = 0x10;
cadesplugin.XCN_CERT_KEY_AGREEMENT_KEY_USAGE = 0x8;
cadesplugin.XCN_CERT_KEY_CERT_SIGN_KEY_USAGE = 0x4;
cadesplugin.XCN_CERT_OFFLINE_CRL_SIGN_KEY_USAGE = 0x2;
cadesplugin.XCN_CERT_CRL_SIGN_KEY_USAGE = 0x2;
cadesplugin.XCN_CERT_ENCIPHER_ONLY_KEY_USAGE = 0x1;
cadesplugin.XCN_CERT_DECIPHER_ONLY_KEY_USAGE = 0x8000;
cadesplugin.CADESCOM_XADES_ACCEPT_ANY_ID_ATTR_NAMESPACE = 1;
cadesplugin.CADES_USE_OCSP_AUTHORIZED_POLICY = 0x00020000;
cadesplugin.XCN_NCRYPT_NO_OPERATION = 0;
cadesplugin.XCN_NCRYPT_CIPHER_OPERATION = 0x1;
cadesplugin.XCN_NCRYPT_HASH_OPERATION = 0x2;
cadesplugin.XCN_NCRYPT_ASYMMETRIC_ENCRYPTION_OPERATION = 0x4;
cadesplugin.XCN_NCRYPT_SECRET_AGREEMENT_OPERATION = 0x8;
cadesplugin.XCN_NCRYPT_SIGNATURE_OPERATION = 0x10;
cadesplugin.XCN_NCRYPT_RNG_OPERATION = 0x20;
cadesplugin.XCN_CRYPT_ANY_GROUP_ID = 0;
cadesplugin.XCN_CRYPT_HASH_ALG_OID_GROUP_ID = 1;
cadesplugin.XCN_CRYPT_ENCRYPT_ALG_OID_GROUP_ID = 2;
cadesplugin.XCN_CRYPT_PUBKEY_ALG_OID_GROUP_ID = 3;
cadesplugin.XCN_CRYPT_SIGN_ALG_OID_GROUP_ID = 4;
cadesplugin.XCN_CRYPT_RDN_ATTR_OID_GROUP_ID = 5;
cadesplugin.XCN_CRYPT_EXT_OR_ATTR_OID_GROUP_ID = 6;
cadesplugin.XCN_CRYPT_ENHKEY_USAGE_OID_GROUP_ID = 7;
cadesplugin.XCN_CRYPT_POLICY_OID_GROUP_ID = 8;
cadesplugin.XCN_CRYPT_TEMPLATE_OID_GROUP_ID = 9;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_ANY = 0;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_SIGN_KEY_FLAG = 0x80000000;
cadesplugin.XCN_CRYPT_OID_INFO_PUBKEY_ENCRYPT_KEY_FLAG = 0x40000000;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_DISABLED = 0;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_ENABLED = 1;
cadesplugin.CONTROL_KEY_TIME_VALIDITY_STRICT = 2;
cadesplugin.AlgorithmFlagsNone = 0;
cadesplugin.AlgorithmFlagsWrap = 0x1;
} }
function async_spawn(generatorFunc) { function async_spawn(generatorFunc) {
@ -253,12 +422,12 @@
try { try {
result = generator[verb](arg); result = generator[verb](arg);
} catch (err) { } catch (err) {
return Promise.reject(err); return window.Promise.reject(err);
} }
if (result.done) { if (result.done) {
return result.value; return result.value;
} else { } else {
return Promise.resolve(result.value).then(onFulfilled, onRejected); return window.Promise.resolve(result.value).then(onFulfilled, onRejected);
} }
} }
var generator = generatorFunc(Array.prototype.slice.call(arguments, 1)); var generator = generatorFunc(Array.prototype.slice.call(arguments, 1));
@ -274,16 +443,16 @@
} }
function isIOS() { function isIOS() {
return (navigator.userAgent.match(/ipod/i) || return (window.navigator.userAgent.match(/ipod/i) ||
navigator.userAgent.match(/ipad/i) || window.navigator.userAgent.match(/ipad/i) ||
navigator.userAgent.match(/iphone/i)); window.navigator.userAgent.match(/iphone/i));
} }
function isNativeMessageSupported() function isNativeMessageSupported() {
{
// В IE работаем через NPAPI // В IE работаем через NPAPI
if(isIE()) if (isIE()) {
return false; return false;
}
// В Edge работаем через NativeMessage // В Edge работаем через NativeMessage
if (browserSpecs.name === 'Edg') { if (browserSpecs.name === 'Edg') {
return true; return true;
@ -293,40 +462,21 @@
return true; return true;
} }
// В Chrome, Firefox, Safari и Opera работаем через асинхронную версию в зависимости от версии // В Chrome, Firefox, Safari и Opera работаем через асинхронную версию в зависимости от версии
if(browserSpecs.name === 'Opera') { if (browserSpecs.name === 'Opera') {
isOpera = true; isOpera = true;
if(browserSpecs.version >= 33){ return (browserSpecs.version >= 33);
return true;
} }
else{ if (browserSpecs.name === 'Firefox') {
return false;
}
}
if(browserSpecs.name === 'Firefox') {
isFireFox = true; isFireFox = true;
if(browserSpecs.version >= 52){ return (browserSpecs.version >= 52);
return true;
}
else{
return false;
}
}
if(browserSpecs.name === 'Chrome') {
if(browserSpecs.version >= 42){
return true;
}
else{
return false;
} }
if (browserSpecs.name === 'Chrome') {
return (browserSpecs.version >= 42);
} }
//В Сафари начиная с 12 версии нет NPAPI //В Сафари начиная с 12 версии нет NPAPI
if(browserSpecs.name === 'Safari') { if (browserSpecs.name === 'Safari') {
isSafari = true; isSafari = true;
if(browserSpecs.version >= 12) { return (browserSpecs.version >= 12);
return true;
} else {
return false;
}
} }
} }
@ -337,19 +487,20 @@
// call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js // call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js
return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]); return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
} }
var objWebClassFactory;
if (isIE()) { if (isIE()) {
// В Internet Explorer создаются COM-объекты // В Internet Explorer создаются COM-объекты
if (name.match(/X509Enrollment/i)) { if (name.match(/X509Enrollment/i)) {
try { try {
// Объекты CertEnroll пробуем создавать через нашу фабрику, // Объекты CertEnroll пробуем создавать через нашу фабрику,
// если не получилось то через CX509EnrollmentWebClassFactory // если не получилось то через CX509EnrollmentWebClassFactory
var objCertEnrollClassFactory = document.getElementById("webClassFactory"); objWebClassFactory = document.getElementById("webClassFactory");
return objCertEnrollClassFactory.CreateObject(name); return objWebClassFactory.CreateObject(name);
} }
catch (e) { catch (e) {
try { try {
var objWebClassFactory = document.getElementById("certEnrollClassFactory"); var objCertEnrollClassFactory = document.getElementById("certEnrollClassFactory");
return objWebClassFactory.CreateObject(name); return objCertEnrollClassFactory.CreateObject(name);
} }
catch (err) { catch (err) {
throw ("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS"); throw ("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS");
@ -358,12 +509,11 @@
} }
// Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory // Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory
try { try {
var objWebClassFactory = document.getElementById("webClassFactory"); objWebClassFactory = document.getElementById("webClassFactory");
return objWebClassFactory.CreateObject(name); return objWebClassFactory.CreateObject(name);
} } catch (e) {
catch (e) {
// Для версий плагина ниже 2.0.12538 // Для версий плагина ниже 2.0.12538
return new ActiveXObject(name); return new window.ActiveXObject(name);
} }
} }
// создаются объекты NPAPI // создаются объекты NPAPI
@ -389,19 +539,20 @@
} }
function getLastError(exception) { function getLastError(exception) {
if(isNativeMessageSupported() || isIE() || isIOS() ) { if (isNativeMessageSupported() || isIE() || isIOS()) {
return GetMessageFromException(exception); return GetMessageFromException(exception);
} }
try { try {
return pluginObject.getLastError(); return pluginObject.getLastError();
} catch(e) { } catch (e) {
return GetMessageFromException(exception); return GetMessageFromException(exception);
} }
} }
// Функция для удаления созданных объектов // Функция для удаления созданных объектов
function ReleasePluginObjects() { function ReleasePluginObjects() {
// noinspection JSUnresolvedVariable
return cpcsp_chrome_nmcades.ReleasePluginObjects(); return cpcsp_chrome_nmcades.ReleasePluginObjects();
} }
@ -410,35 +561,39 @@
return pluginObject.CreateObjectAsync(name); return pluginObject.CreateObjectAsync(name);
} }
//Функции для IOS // Функции для IOS
// noinspection JSUnusedGlobalSymbols
var ru_cryptopro_npcades_10_native_bridge = { var ru_cryptopro_npcades_10_native_bridge = {
callbacksCount : 1, callbacksCount: 1,
callbacks : {}, callbacks: {},
// Automatically called by native layer when a result is available // Automatically called by native layer when a result is available
resultForCallback : function resultForCallback(callbackId, resultArray) { resultForCallback: function resultForCallback(callbackId, resultArray) {
var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId]; var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId];
if (!callback) return; if (!callback) {
callback.apply(null,resultArray); return;
}
callback.apply(null, resultArray);
}, },
// Use this in javascript to request native objective-c code // Use this in javascript to request native objective-c code
// functionName : string (I think the name is explicit :p) // functionName : string (I think the name is explicit :p)
// args : array of arguments // args : array of arguments
// callback : function with n-arguments that is going to be called when the native code returned // callback : function with n-arguments that is going to be called when the native code returned
call : function call(functionName, args, callback) { call: function call(functionName, args, callback) {
var hasCallback = callback && typeof callback === "function"; var hasCallback = callback && typeof callback === "function";
var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0; var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0;
if (hasCallback) if (hasCallback) {
ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback; ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback;
}
var iframe = document.createElement("IFRAME"); var iframe = document.createElement("IFRAME");
var arrObjs = new Array("_CPNP_handle"); var arrObjs = new Array("_CPNP_handle");
try{ try {
iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId+ ":" + encodeURIComponent(JSON.stringify(args, arrObjs))); iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId + ":" + encodeURIComponent(window.JSON.stringify(args, arrObjs)));
} catch(e){ } catch (e) {
alert(e); window.alert(e);
} }
document.documentElement.appendChild(iframe); document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe); iframe.parentNode.removeChild(iframe);
@ -446,130 +601,138 @@
} }
}; };
function call_ru_cryptopro_npcades_10_native_bridge(functionName, array){ function call_ru_cryptopro_npcades_10_native_bridge(functionName, array) {
var tmpobj; var tmpobj;
var ex; var ex;
ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function(e, response){ ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function (e, response) {
ex = e; ex = e;
var str='tmpobj='+response; var tmpobj = "";
eval(str); try {
if (typeof (tmpobj) === "string"){ tmpobj = window.JSON.parse(response);
}
catch (err) {
tmpobj = response;
}
if (typeof tmpobj === "string") {
tmpobj = tmpobj.replace(/\\\n/gm, "\n"); tmpobj = tmpobj.replace(/\\\n/gm, "\n");
tmpobj = tmpobj.replace(/\\\r/gm, "\r"); tmpobj = tmpobj.replace(/\\\r/gm, "\r");
} }
}); });
if(ex) if (ex) {
throw ex; throw ex;
}
return tmpobj; return tmpobj;
} }
function show_firefox_missing_extension_dialog() function show_firefox_missing_extension_dialog() {
{ if (!window.cadesplugin_skip_extension_install) {
if (!window.cadesplugin_skip_extension_install)
{
var ovr = document.createElement('div'); var ovr = document.createElement('div');
ovr.id = "cadesplugin_ovr"; ovr.id = "cadesplugin_ovr";
ovr.style = "visibility: hidden; position: fixed; left: 0px; top: 0px; width:100%; height:100%; background-color: rgba(0,0,0,0.7)"; ovr.style = "visibility: hidden; position: fixed; left: 0; top: 0; width:100%; height:100%; background-color: rgba(0,0,0,0.7)";
ovr.innerHTML = "<div id='cadesplugin_ovr_item' style='position:relative; width:400px; margin:100px auto; background-color:#fff; border:2px solid #000; padding:10px; text-align:center; opacity: 1; z-index: 1500'>" + ovr.innerHTML = "<div id='cadesplugin_ovr_item' style='position:relative; max-width:400px; margin:100px auto; background-color:#fff; border:2px solid #000; padding:10px; text-align:center; opacity: 1; z-index: 1500'>" +
"<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" + "<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" +
"<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." + "<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." +
"<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" + "<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" +
"</div>"; "</div>";
document.getElementsByTagName("Body")[0].appendChild(ovr); document.getElementsByTagName("Body")[0].appendChild(ovr);
document.getElementById("cadesplugin_close_install").addEventListener('click',function() document.getElementById("cadesplugin_close_install").addEventListener('click', function () {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
document.getElementById("cadesplugin_ovr").style.visibility = 'hidden'; document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
}); });
ovr.addEventListener('click',function() ovr.addEventListener('click', function () {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
document.getElementById("cadesplugin_ovr").style.visibility = 'hidden'; document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
}); });
ovr.style.visibility="visible"; ovr.style.visibility = "visible";
} }
} }
function firefox_or_safari_nmcades_onload() { function firefox_or_safari_nmcades_onload() {
if (window.cadesplugin_extension_loaded_callback) // noinspection JSUnresolvedVariable
if (window.cadesplugin_extension_loaded_callback) {
window.cadesplugin_extension_loaded_callback(); window.cadesplugin_extension_loaded_callback();
}
isFireFoxExtensionLoaded = true; isFireFoxExtensionLoaded = true;
// noinspection JSUnresolvedVariable,JSUnresolvedFunction
cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error); cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
} }
function load_js_script(url, successFunc, errorFunc) {
var script = document.createElement("script");
script.setAttribute("type", "text/javascript");
script.setAttribute("src", url);
script.onerror = errorFunc;
script.onload = successFunc;
document.getElementsByTagName("head")[0].appendChild(script);
}
function nmcades_api_onload() { function nmcades_api_onload() {
if (!isIE() && !isFireFox && !isSafari) { if (!isIE() && !isFireFox && !isSafari) {
if (window.cadesplugin_extension_loaded_callback) // noinspection JSUnresolvedVariable
if (window.cadesplugin_extension_loaded_callback) {
window.cadesplugin_extension_loaded_callback(); window.cadesplugin_extension_loaded_callback();
} }
}
window.postMessage("cadesplugin_echo_request", "*"); window.postMessage("cadesplugin_echo_request", "*");
window.addEventListener("message", function (event){ window.addEventListener("message", function (event) {
if (typeof(event.data) !== "string" || !event.data.match("cadesplugin_loaded")) if (typeof (event.data) !== "string" || !event.data.match("cadesplugin_loaded")) {
return; return;
if (cadesplugin_loaded_event_recieved) }
if (cadesplugin_loaded_event_recieved) {
return; return;
if(isFireFox || isSafari) }
{ if (isFireFox || isSafari) {
// Для Firefox, Сафари вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js // Для Firefox, Сафари вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js
var url = event.data.substring(event.data.indexOf("url:") + 4); var url = event.data.substring(event.data.indexOf("url:") + 4);
if (!url.match("^moz-extension://[a-zA-Z0-9-]+/nmcades_plugin_api.js$") if (!url.match("^(moz|safari)-extension://[a-zA-Z0-9/_-]+/nmcades_plugin_api.js$")) {
&& !url.match("^safari-extension://[a-zA-Z0-9-]+/[a-zA-Z0-9]+/nmcades_plugin_api.js$"))
{
cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "Bad url \"" + url + "\" for load CryptoPro Extension for CAdES Browser plug-in"); cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "Bad url \"" + url + "\" for load CryptoPro Extension for CAdES Browser plug-in");
plugin_loaded_error(); plugin_loaded_error();
return; return;
} }
var fileref = document.createElement('script'); load_js_script(url, firefox_or_safari_nmcades_onload, plugin_loaded_error);
fileref.setAttribute("type", "text/javascript"); } else {
fileref.setAttribute("src", url); // noinspection JSUnresolvedVariable,JSUnresolvedFunction
fileref.onerror = plugin_loaded_error;
fileref.onload = firefox_or_safari_nmcades_onload;
document.getElementsByTagName("head")[0].appendChild(fileref);
}else {
cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error); cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
} }
cadesplugin_loaded_event_recieved = true; cadesplugin_loaded_event_recieved = true;
}, false); }, false);
} }
//Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge, Safari // Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge, Safari
function load_extension() function load_extension() {
{ if (isFireFox || isSafari) {
if(isFireFox || isSafari){
// вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера. // вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера.
nmcades_api_onload(); nmcades_api_onload();
} else { return;
// в асинхронном варианте для Yandex и Opera подключаем расширение из Opera store. }
if (isOpera || isYandex) { var operaUrl = "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js";
var fileref = document.createElement('script'); var manifestv2Url = "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js";
fileref.setAttribute("type", "text/javascript"); var manifestv3Url = "chrome-extension://pfhgbfnnjiafkhfdkmpiflachepdcjod/nmcades_plugin_api.js";
fileref.setAttribute("src", "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js"); if (isYandex || isOpera) {
fileref.onerror = plugin_loaded_error; // в асинхронном варианте для Yandex пробуем подключить расширения по очереди
fileref.onload = nmcades_api_onload; load_js_script(operaUrl, nmcades_api_onload, function () {
document.getElementsByTagName("head")[0].appendChild(fileref); load_js_script(manifestv2Url, nmcades_api_onload, function () {
} else { load_js_script(manifestv3Url, nmcades_api_onload, plugin_loaded_error);
});
});
return;
}
// для Chrome, Chromium, Chromium Edge расширение из Chrome store // для Chrome, Chromium, Chromium Edge расширение из Chrome store
var fileref = document.createElement('script'); load_js_script(manifestv2Url, nmcades_api_onload, function () {
fileref.setAttribute("type", "text/javascript"); load_js_script(manifestv3Url, nmcades_api_onload, plugin_loaded_error);
fileref.setAttribute("src", "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js"); });
fileref.onerror = plugin_loaded_error;
fileref.onload = nmcades_api_onload;
document.getElementsByTagName("head")[0].appendChild(fileref);
}
}
} }
//Загружаем плагин для NPAPI //Загружаем плагин для NPAPI
function load_npapi_plugin() function load_npapi_plugin() {
{
var elem = document.createElement('object'); var elem = document.createElement('object');
elem.setAttribute("id", "cadesplugin_object"); elem.setAttribute("id", "cadesplugin_object");
elem.setAttribute("type", "application/x-cades"); elem.setAttribute("type", "application/x-cades");
elem.setAttribute("style", "visibility: hidden"); elem.setAttribute("style", "visibility: hidden");
document.getElementsByTagName("body")[0].appendChild(elem); document.getElementsByTagName("body")[0].appendChild(elem);
pluginObject = document.getElementById("cadesplugin_object"); pluginObject = document.getElementById("cadesplugin_object");
if(isIE()) if (isIE()) {
{
var elem1 = document.createElement('object'); var elem1 = document.createElement('object');
elem1.setAttribute("id", "certEnrollClassFactory"); elem1.setAttribute("id", "certEnrollClassFactory");
elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09"); elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09");
@ -584,25 +747,22 @@
} }
//Отправляем событие что все ок. //Отправляем событие что все ок.
function plugin_loaded() function plugin_loaded() {
{
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_resolve(); plugin_resolve();
}else { } else {
window.postMessage("cadesplugin_loaded", "*"); window.postMessage("cadesplugin_loaded", "*");
} }
} }
//Отправляем событие что сломались. //Отправляем событие что сломались.
function plugin_loaded_error(msg) function plugin_loaded_error(msg) {
{ if (typeof (msg) === 'undefined' || typeof (msg) === 'object') {
if(typeof(msg) === 'undefined' || typeof(msg) === 'object')
msg = "Плагин недоступен"; msg = "Плагин недоступен";
}
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_reject(msg); plugin_reject(msg);
} else { } else {
window.postMessage("cadesplugin_load_error", "*"); window.postMessage("cadesplugin_load_error", "*");
@ -610,59 +770,47 @@
} }
//проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку //проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку
function check_load_timeout() function check_load_timeout() {
{ if (plugin_resolved === 1) {
if(plugin_resolved === 1)
return; return;
if(isFireFox) }
{ if (isFireFox && !isFireFoxExtensionLoaded) {
if (!isFireFoxExtensionLoaded)
show_firefox_missing_extension_dialog(); show_firefox_missing_extension_dialog();
} }
plugin_resolved = 1; plugin_resolved = 1;
if(canPromise) if (canPromise) {
{
plugin_reject("Истекло время ожидания загрузки плагина"); plugin_reject("Истекло время ожидания загрузки плагина");
} else { } else {
window.postMessage("cadesplugin_load_error", "*"); window.postMessage("cadesplugin_load_error", "*");
} }
} }
//Вспомогательная функция для NPAPI function check_npapi_plugin() {
function createPromise(arg)
{
return new Promise(arg);
}
function check_npapi_plugin (){
try { try {
var oAbout = CreateObject("CAdESCOM.About"); CreateObject("CAdESCOM.About");
plugin_loaded(); plugin_loaded();
} } catch (err) {
catch (err) {
document.getElementById("cadesplugin_object").style.display = 'none'; document.getElementById("cadesplugin_object").style.display = 'none';
// Объект создать не удалось, проверим, установлен ли // Объект создать не удалось, проверим, установлен ли
// вообще плагин. Такая возможность есть не во всех браузерах // вообще плагин. Такая возможность есть не во всех браузерах
var mimetype = navigator.mimeTypes["application/x-cades"]; // noinspection JSDeprecatedSymbols
var mimetype = window.navigator.mimeTypes["application/x-cades"];
if (mimetype) { if (mimetype) {
// noinspection JSDeprecatedSymbols
var plugin = mimetype.enabledPlugin; var plugin = mimetype.enabledPlugin;
if (plugin) { if (plugin) {
plugin_loaded_error("Плагин загружен, но не создаются обьекты"); plugin_loaded_error("Плагин загружен, но не создаются обьекты");
}else } else {
{
plugin_loaded_error("Ошибка при загрузке плагина"); plugin_loaded_error("Ошибка при загрузке плагина");
} }
}else } else {
{
plugin_loaded_error("Плагин недоступен"); plugin_loaded_error("Плагин недоступен");
} }
} }
} }
//Проверяем работает ли плагин // Проверяем работает ли плагин
function check_plugin_working() function check_plugin_working() {
{
var div = document.createElement("div"); var div = document.createElement("div");
div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->"; div.innerHTML = "<!--[if lt IE 9]><i></i><![endif]-->";
var isIeLessThan9 = (div.getElementsByTagName("i").length === 1); var isIeLessThan9 = (div.getElementsByTagName("i").length === 1);
@ -671,20 +819,18 @@
return; return;
} }
if(isNativeMessageSupported()) if (isNativeMessageSupported()) {
{
load_extension(); load_extension();
}else if(!canPromise) { } else if (!canPromise) {
window.addEventListener("message", function (event){ window.addEventListener("message", function (event) {
if (event.data !== "cadesplugin_echo_request") if (event.data !== "cadesplugin_echo_request") {
return; return;
}
load_npapi_plugin(); load_npapi_plugin();
check_npapi_plugin(); check_npapi_plugin();
}, }, false);
false); } else {
}else if (document.readyState === "complete") {
{
if(document.readyState === "complete"){
load_npapi_plugin(); load_npapi_plugin();
check_npapi_plugin(); check_npapi_plugin();
} else { } else {
@ -696,49 +842,60 @@
} }
} }
function set_pluginObject(obj) function set_pluginObject(obj) {
{
pluginObject = obj; pluginObject = obj;
} }
function is_capilite_enabled() function is_capilite_enabled() {
{ // noinspection JSUnresolvedVariable
if ((typeof (cadesplugin.EnableInternalCSP) !== 'undefined') && cadesplugin.EnableInternalCSP) return ((typeof (cadesplugin.EnableInternalCSP) !== 'undefined') && cadesplugin.EnableInternalCSP);
return true; }
return false;
function set_load_timeout() {
// noinspection JSUnresolvedVariable
if (window.cadesplugin_load_timeout) {
window.setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
} else {
window.setTimeout(check_load_timeout, 20000);
}
}
// noinspection JSUnusedLocalSymbols
var onVisibilityChange = function (event) {
if (document.hidden === false) {
document.removeEventListener("visibilitychange", onVisibilityChange);
set_load_timeout();
check_plugin_working();
}
}; };
//Export //Export
cadesplugin.JSModuleVersion = "2.3.2"; cadesplugin.JSModuleVersion = "2.4.2";
cadesplugin.async_spawn = async_spawn; cadesplugin.async_spawn = async_spawn;
cadesplugin.set = set_pluginObject; cadesplugin.set = set_pluginObject;
cadesplugin.set_log_level = set_log_level; cadesplugin.set_log_level = set_log_level;
cadesplugin.get_extension_version = get_extension_version;
cadesplugin.get_extension_id = get_extension_id;
cadesplugin.getLastError = getLastError; cadesplugin.getLastError = getLastError;
cadesplugin.is_capilite_enabled = is_capilite_enabled; cadesplugin.is_capilite_enabled = is_capilite_enabled;
if(isNativeMessageSupported()) if (isNativeMessageSupported()) {
{
cadesplugin.CreateObjectAsync = CreateObjectAsync; cadesplugin.CreateObjectAsync = CreateObjectAsync;
cadesplugin.ReleasePluginObjects = ReleasePluginObjects; cadesplugin.ReleasePluginObjects = ReleasePluginObjects;
} }
if(!isNativeMessageSupported()) if (!isNativeMessageSupported()) {
{
cadesplugin.CreateObject = CreateObject; cadesplugin.CreateObject = CreateObject;
} }
if(window.cadesplugin_load_timeout)
{
setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
}
else
{
setTimeout(check_load_timeout, 20000);
}
set_constantValues(); set_constantValues();
cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR; cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR;
window.cadesplugin = cadesplugin; window.cadesplugin = cadesplugin;
if (isSafari && document.hidden) {
document.addEventListener("visibilitychange", onVisibilityChange);
return;
}
set_load_timeout();
check_plugin_working(); check_plugin_working();
}()); }());