Advertisement
Guest User

Untitled

a guest
Dec 19th, 2017
1,047
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.94 KB | None | 0 0
  1. ;(function () {
  2. //already loaded
  3. if(window.cadesplugin)
  4. return;
  5.  
  6. var pluginObject;
  7. var plugin_resolved = 0;
  8. var plugin_reject;
  9. var plugin_resolve;
  10. var isOpera = 0;
  11. var isFireFox = 0;
  12. var isEdge = 0;
  13. var failed_extensions = 0;
  14.  
  15. var canPromise = !!window.Promise;
  16. var cadesplugin;
  17.  
  18. if(canPromise)
  19. {
  20. cadesplugin = new Promise(function(resolve, reject)
  21. {
  22. plugin_resolve = resolve;
  23. plugin_reject = reject;
  24. });
  25. } else
  26. {
  27. cadesplugin = {};
  28. }
  29.  
  30. function check_browser() {
  31. var ua= navigator.userAgent, tem, M= ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
  32. if(/trident/i.test(M[1])){
  33. tem= /\brv[ :]+(\d+)/g.exec(ua) || [];
  34. return {name:'IE',version:(tem[1] || '')};
  35. }
  36. if(M[1]=== 'Chrome'){
  37. tem= ua.match(/\b(OPR|Edge)\/(\d+)/);
  38. if(tem!= null) return {name:tem[1].replace('OPR', 'Opera'),version:tem[2]};
  39. }
  40. M= M[2]? [M[1], M[2]]: [navigator.appName, navigator.appVersion, '-?'];
  41. if((tem= ua.match(/version\/(\d+)/i))!= null) M.splice(1, 1, tem[1]);
  42. return {name:M[0],version:M[1]};
  43. }
  44. var browserSpecs = check_browser();
  45.  
  46. function cpcsp_console_log(level, msg){
  47. //IE9 не может писать в консоль если не открыта вкладка developer tools
  48. if(typeof(console) == 'undefined')
  49. return;
  50. if (level <= cadesplugin.current_log_level ){
  51. if (level == cadesplugin.LOG_LEVEL_DEBUG)
  52. console.log("DEBUG: %s", msg);
  53. if (level == cadesplugin.LOG_LEVEL_INFO)
  54. console.info("INFO: %s", msg);
  55. if (level == cadesplugin.LOG_LEVEL_ERROR)
  56. console.error("ERROR: %s", msg);
  57. return;
  58. }
  59. }
  60.  
  61. function set_log_level(level){
  62. if (!((level == cadesplugin.LOG_LEVEL_DEBUG) ||
  63. (level == cadesplugin.LOG_LEVEL_INFO) ||
  64. (level == cadesplugin.LOG_LEVEL_ERROR))){
  65. cpcsp_console_log(cadesplugin.LOG_LEVEL_ERROR, "cadesplugin_api.js: Incorrect log_level: " + level);
  66. return;
  67. }
  68. cadesplugin.current_log_level = level;
  69. if (cadesplugin.current_log_level == cadesplugin.LOG_LEVEL_DEBUG)
  70. cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = DEBUG");
  71. if (cadesplugin.current_log_level == cadesplugin.LOG_LEVEL_INFO)
  72. cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = INFO");
  73. if (cadesplugin.current_log_level == cadesplugin.LOG_LEVEL_ERROR)
  74. cpcsp_console_log(cadesplugin.LOG_LEVEL_INFO, "cadesplugin_api.js: log_level = ERROR");
  75. if(isNativeMessageSupported())
  76. {
  77. if (cadesplugin.current_log_level == cadesplugin.LOG_LEVEL_DEBUG)
  78. window.postMessage("set_log_level=debug", "*");
  79. if (cadesplugin.current_log_level == cadesplugin.LOG_LEVEL_INFO)
  80. window.postMessage("set_log_level=info", "*");
  81. if (cadesplugin.current_log_level == cadesplugin.LOG_LEVEL_ERROR)
  82. window.postMessage("set_log_level=error", "*");
  83. }
  84. }
  85.  
  86. function set_constantValues()
  87. {
  88. cadesplugin.CAPICOM_LOCAL_MACHINE_STORE = 1;
  89. cadesplugin.CAPICOM_CURRENT_USER_STORE = 2;
  90. cadesplugin.CADESCOM_LOCAL_MACHINE_STORE = 1;
  91. cadesplugin.CADESCOM_CURRENT_USER_STORE = 2;
  92. cadesplugin.CADESCOM_CONTAINER_STORE = 100;
  93.  
  94. cadesplugin.CAPICOM_MY_STORE = "My";
  95.  
  96. cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
  97.  
  98. cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
  99.  
  100. cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED = 0;
  101. cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPING = 1;
  102. cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE = 2;
  103.  
  104. cadesplugin.XmlDsigGost3410UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
  105. cadesplugin.XmlDsigGost3411UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
  106. cadesplugin.XmlDsigGost3410Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
  107. cadesplugin.XmlDsigGost3411Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
  108.  
  109. cadesplugin.CADESCOM_CADES_DEFAULT = 0;
  110. cadesplugin.CADESCOM_CADES_BES = 1;
  111. cadesplugin.CADESCOM_CADES_T = 0x5;
  112. cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d;
  113.  
  114. cadesplugin.CADESCOM_ENCODE_BASE64 = 0;
  115. cadesplugin.CADESCOM_ENCODE_BINARY = 1;
  116. cadesplugin.CADESCOM_ENCODE_ANY = -1;
  117.  
  118. cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0;
  119. cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1;
  120. cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2;
  121.  
  122. cadesplugin.CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
  123. cadesplugin.CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1;
  124.  
  125. cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
  126. cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
  127. cadesplugin.CAPICOM_CERTIFICATE_FIND_ISSUER_NAME = 2;
  128. cadesplugin.CAPICOM_CERTIFICATE_FIND_ROOT_NAME = 3;
  129. cadesplugin.CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME = 4;
  130. cadesplugin.CAPICOM_CERTIFICATE_FIND_EXTENSION = 5;
  131. cadesplugin.CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
  132. cadesplugin.CAPICOM_CERTIFICATE_FIND_APPLICATION_POLICY = 7;
  133. cadesplugin.CAPICOM_CERTIFICATE_FIND_CERTIFICATE_POLICY = 8;
  134. cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
  135. cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_NOT_YET_VALID = 10;
  136. cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED = 11;
  137. cadesplugin.CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
  138.  
  139. cadesplugin.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 128;
  140.  
  141. cadesplugin.CAPICOM_PROPID_ENHKEY_USAGE = 9;
  142.  
  143. cadesplugin.CAPICOM_OID_OTHER = 0;
  144. cadesplugin.CAPICOM_OID_KEY_USAGE_EXTENSION = 10;
  145.  
  146. cadesplugin.CAPICOM_EKU_CLIENT_AUTH = 2;
  147. cadesplugin.CAPICOM_EKU_SMARTCARD_LOGON = 5;
  148. cadesplugin.CAPICOM_EKU_OTHER = 0;
  149.  
  150. cadesplugin.CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
  151. cadesplugin.CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME = 1;
  152. cadesplugin.CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_DESCRIPTION = 2;
  153. cadesplugin.CADESCOM_ATTRIBUTE_OTHER = -1;
  154.  
  155. cadesplugin.CADESCOM_STRING_TO_UCS2LE = 0;
  156. cadesplugin.CADESCOM_BASE64_TO_BINARY = 1;
  157.  
  158. cadesplugin.CADESCOM_DISPLAY_DATA_NONE = 0;
  159. cadesplugin.CADESCOM_DISPLAY_DATA_CONTENT = 1;
  160. cadesplugin.CADESCOM_DISPLAY_DATA_ATTRIBUTE = 2;
  161.  
  162. cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_RC2 = 0;
  163. cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_RC4 = 1;
  164. cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_DES = 2;
  165. cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3;
  166. cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_AES = 4;
  167. cadesplugin.CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25;
  168.  
  169. cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1 = 0;
  170. cadesplugin.CADESCOM_HASH_ALGORITHM_MD2 = 1;
  171. cadesplugin.CADESCOM_HASH_ALGORITHM_MD4 = 2;
  172. cadesplugin.CADESCOM_HASH_ALGORITHM_MD5 = 3;
  173. cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_256 = 4;
  174. cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_384 = 5;
  175. cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_512 = 6;
  176. cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100;
  177. cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256 = 101;
  178. cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512 = 102;
  179.  
  180. cadesplugin.LOG_LEVEL_DEBUG = 4;
  181. cadesplugin.LOG_LEVEL_INFO = 2;
  182. cadesplugin.LOG_LEVEL_ERROR = 1;
  183. }
  184.  
  185. function async_spawn(generatorFunc) {
  186. function continuer(verb, arg) {
  187. var result;
  188. try {
  189. result = generator[verb](arg);
  190. } catch (err) {
  191. return Promise.reject(err);
  192. }
  193. if (result.done) {
  194. return result.value;
  195. } else {
  196. return Promise.resolve(result.value).then(onFulfilled, onRejected);
  197. }
  198. }
  199. var generator = generatorFunc(Array.prototype.slice.call(arguments, 1));
  200. var onFulfilled = continuer.bind(continuer, "next");
  201. var onRejected = continuer.bind(continuer, "throw");
  202. return onFulfilled();
  203. }
  204.  
  205. function isIE() {
  206. // var retVal = (("Microsoft Internet Explorer" == navigator.appName) || // IE < 11
  207. // navigator.userAgent.match(/Trident\/./i)); // IE 11
  208. return (browserSpecs.name == 'IE' || browserSpecs.name == 'MSIE');
  209. }
  210.  
  211. function isIOS() {
  212. var retVal = (navigator.userAgent.match(/ipod/i) ||
  213. navigator.userAgent.match(/ipad/i) ||
  214. navigator.userAgent.match(/iphone/i));
  215. return retVal;
  216. }
  217.  
  218. function isNativeMessageSupported()
  219. {
  220. // В IE работаем через NPAPI
  221. if(isIE())
  222. return false;
  223. // В Edge работаем через NativeMessage
  224. if(browserSpecs.name == 'Edge') {
  225. isEdge = true;
  226. return true;
  227. }
  228. // В Chrome, Firefox и Opera работаем через асинхронную версию в зависимости от версии
  229. if(browserSpecs.name == 'Opera') {
  230. isOpera = true;
  231. if(browserSpecs.version >= 33){
  232. return true;
  233. }
  234. else{
  235. return false;
  236. }
  237. }
  238. if(browserSpecs.name == 'Firefox') {
  239. isFireFox = true;
  240. if(browserSpecs.version >= 52){
  241. return true;
  242. }
  243. else{
  244. return false;
  245. }
  246. }
  247. if(browserSpecs.name == 'Chrome') {
  248. if(browserSpecs.version >= 42){
  249. return true;
  250. }
  251. else{
  252. return false;
  253. }
  254. }
  255. }
  256.  
  257. // Функция активации объектов КриптоПро ЭЦП Browser plug-in
  258. function CreateObject(name) {
  259. if (isIOS()) {
  260. // На iOS для создания объектов используется функция
  261. // call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js
  262. return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
  263. }
  264. if (isIE()) {
  265. // В Internet Explorer создаются COM-объекты
  266. if (name.match(/X509Enrollment/i)) {
  267. try {
  268. // Объекты CertEnroll создаются через CX509EnrollmentWebClassFactory
  269. var objCertEnrollClassFactory = document.getElementById("certEnrollClassFactory");
  270. return objCertEnrollClassFactory.CreateObject(name);
  271. }
  272. catch (e) {
  273. throw("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS");
  274. }
  275. }
  276. // Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory
  277. try {
  278. var objWebClassFactory = document.getElementById("webClassFactory");
  279. return objWebClassFactory.CreateObject(name);
  280. }
  281. catch (e) {
  282. // Для версий плагина ниже 2.0.12538
  283. return new ActiveXObject(name);
  284. }
  285. }
  286. // создаются объекты NPAPI
  287. return pluginObject.CreateObject(name);
  288. }
  289.  
  290. function decimalToHexString(number) {
  291. if (number < 0) {
  292. number = 0xFFFFFFFF + number + 1;
  293. }
  294.  
  295. return number.toString(16).toUpperCase();
  296. }
  297.  
  298. function GetMessageFromException(e) {
  299. var err = e.message;
  300. if (!err) {
  301. err = e;
  302. } else if (e.number) {
  303. err += " (0x" + decimalToHexString(e.number) + ")";
  304. }
  305. return err;
  306. }
  307.  
  308. function getLastError(exception) {
  309. if(isNativeMessageSupported() || isIE() || isIOS() ) {
  310. return GetMessageFromException(exception);
  311. }
  312.  
  313. try {
  314. return pluginObject.getLastError();
  315. } catch(e) {
  316. return GetMessageFromException(exception);
  317. }
  318. }
  319.  
  320. // Функция для удаления созданных объектов
  321. function ReleasePluginObjects() {
  322. return cpcsp_chrome_nmcades.ReleasePluginObjects();
  323. }
  324.  
  325. // Функция активации асинхронных объектов КриптоПро ЭЦП Browser plug-in
  326. function CreateObjectAsync(name) {
  327. return pluginObject.CreateObjectAsync(name);
  328. }
  329.  
  330. //Функции для IOS
  331. var ru_cryptopro_npcades_10_native_bridge = {
  332. callbacksCount : 1,
  333. callbacks : {},
  334.  
  335. // Automatically called by native layer when a result is available
  336. resultForCallback : function resultForCallback(callbackId, resultArray) {
  337. var callback = ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId];
  338. if (!callback) return;
  339. callback.apply(null,resultArray);
  340. },
  341.  
  342. // Use this in javascript to request native objective-c code
  343. // functionName : string (I think the name is explicit :p)
  344. // args : array of arguments
  345. // callback : function with n-arguments that is going to be called when the native code returned
  346. call : function call(functionName, args, callback) {
  347. var hasCallback = callback && typeof callback == "function";
  348. var callbackId = hasCallback ? ru_cryptopro_npcades_10_native_bridge.callbacksCount++ : 0;
  349.  
  350. if (hasCallback)
  351. ru_cryptopro_npcades_10_native_bridge.callbacks[callbackId] = callback;
  352.  
  353. var iframe = document.createElement("IFRAME");
  354. var arrObjs = new Array("_CPNP_handle");
  355. try{
  356. iframe.setAttribute("src", "cpnp-js-call:" + functionName + ":" + callbackId+ ":" + encodeURIComponent(JSON.stringify(args, arrObjs)));
  357. } catch(e){
  358. alert(e);
  359. }
  360. document.documentElement.appendChild(iframe);
  361. iframe.parentNode.removeChild(iframe);
  362. iframe = null;
  363. }
  364. };
  365.  
  366. function call_ru_cryptopro_npcades_10_native_bridge(functionName, array){
  367. var tmpobj;
  368. var ex;
  369. ru_cryptopro_npcades_10_native_bridge.call(functionName, array, function(e, response){
  370. ex = e;
  371. var str='tmpobj='+response;
  372. eval(str);
  373. if (typeof (tmpobj) == "string"){
  374. tmpobj = tmpobj.replace(/\\\n/gm, "\n");
  375. tmpobj = tmpobj.replace(/\\\r/gm, "\r");
  376. }
  377. });
  378. if(ex)
  379. throw ex;
  380. return tmpobj;
  381. }
  382.  
  383. function show_firefox_missing_extension_dialog()
  384. {
  385. if (!window.cadesplugin_skip_extension_install)
  386. {
  387. var ovr = document.createElement('div');
  388. ovr.id = "cadesplugin_ovr";
  389. ovr.style = "visibility: hidden; position: fixed; left: 0px; top: 0px; width:100%; height:100%; background-color: rgba(0,0,0,0.7)";
  390. 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'>" +
  391. "<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" +
  392. "<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у Вас включено или установите его." +
  393. "<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" +
  394. "</div>";
  395. document.getElementsByTagName("Body")[0].appendChild(ovr);
  396. document.getElementById("cadesplugin_close_install").addEventListener('click',function()
  397. {
  398. plugin_loaded_error("Плагин недоступен");
  399. document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
  400. });
  401.  
  402. ovr.addEventListener('click',function()
  403. {
  404. plugin_loaded_error("Плагин недоступен");
  405. document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
  406. });
  407. ovr.style.visibility="visible";
  408. }
  409. }
  410.  
  411.  
  412. //Выводим окно поверх других с предложением установить расширение для Opera.
  413. //Если установленна переменная cadesplugin_skip_extension_install - не предлагаем установить расширение
  414. function install_opera_extension()
  415. {
  416. if (!window.cadesplugin_skip_extension_install)
  417. {
  418. document.addEventListener('DOMContentLoaded', function() {
  419. var ovr = document.createElement('div');
  420. ovr.id = "cadesplugin_ovr";
  421. ovr.style = "visibility: hidden; position: fixed; left: 0px; top: 0px; width:100%; height:100%; background-color: rgba(0,0,0,0.7)";
  422. 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'>" +
  423. "<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" +
  424. "<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо установить расширение из каталога дополнений Opera." +
  425. "<p><button id='cadesplugin_install' style='font:12px Arial'>Установить расширение</button></p>" +
  426. "</div>";
  427. document.getElementsByTagName("Body")[0].appendChild(ovr);
  428. var btn_install = document.getElementById("cadesplugin_install");
  429. btn_install.addEventListener('click', function(event) {
  430. opr.addons.installExtension("epebfcehmdedogndhlcacafjaacknbcm",
  431. function()
  432. {
  433. document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
  434. location.reload();
  435. },
  436. function(){})
  437. });
  438. document.getElementById("cadesplugin_close_install").addEventListener('click',function()
  439. {
  440. plugin_loaded_error("Плагин недоступен");
  441. document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
  442. });
  443.  
  444. ovr.addEventListener('click',function()
  445. {
  446. plugin_loaded_error("Плагин недоступен");
  447. document.getElementById("cadesplugin_ovr").style.visibility = 'hidden';
  448. });
  449. ovr.style.visibility="visible";
  450. document.getElementById("cadesplugin_ovr_item").addEventListener('click',function(e){
  451. e.stopPropagation();
  452. });
  453. });
  454. }else
  455. {
  456. plugin_loaded_error("Плагин недоступен");
  457. }
  458. }
  459.  
  460. function firefox_or_edge_nmcades_onload() {
  461. cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
  462. }
  463.  
  464. function nmcades_api_onload () {
  465. window.postMessage("cadesplugin_echo_request", "*");
  466. window.addEventListener("message", function (event){
  467. if (typeof(event.data) != "string" || !event.data.match("cadesplugin_loaded"))
  468. return;
  469. if(isFireFox || isEdge)
  470. {
  471. // Для Firefox вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js
  472. var url = event.data.substring(event.data.indexOf("url:") + 4);
  473. var fileref = document.createElement('script');
  474. fileref.setAttribute("type", "text/javascript");
  475. fileref.setAttribute("src", url);
  476. fileref.onerror = plugin_loaded_error;
  477. fileref.onload = firefox_or_edge_nmcades_onload;
  478. document.getElementsByTagName("head")[0].appendChild(fileref);
  479. // Для Firefox и Edge у нас только по одному расширению.
  480. failed_extensions++;
  481. }else {
  482. cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
  483. }
  484. }, false);
  485. }
  486.  
  487. //Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge
  488. function load_extension()
  489. {
  490.  
  491. if(isFireFox || isEdge){
  492. // вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера.
  493. nmcades_api_onload();
  494. return;
  495. } else {
  496. // в асинхронном варианте для chrome и opera подключаем оба расширения
  497. var fileref = document.createElement('script');
  498. fileref.setAttribute("type", "text/javascript");
  499. fileref.setAttribute("src", "chrome-extension://iifchhfnnmpdbibifmljnfjhpififfog/nmcades_plugin_api.js");
  500. fileref.onerror = plugin_loaded_error;
  501. fileref.onload = nmcades_api_onload;
  502. document.getElementsByTagName("head")[0].appendChild(fileref);
  503. fileref = document.createElement('script');
  504. fileref.setAttribute("type", "text/javascript");
  505. fileref.setAttribute("src", "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js");
  506. fileref.onerror = plugin_loaded_error;
  507. fileref.onload = nmcades_api_onload;
  508. document.getElementsByTagName("head")[0].appendChild(fileref);
  509. }
  510. }
  511.  
  512. //Загружаем плагин для NPAPI
  513. function load_npapi_plugin()
  514. {
  515. var elem = document.createElement('object');
  516. elem.setAttribute("id", "cadesplugin_object");
  517. elem.setAttribute("type", "application/x-cades");
  518. elem.setAttribute("style", "visibility: hidden");
  519. document.getElementsByTagName("body")[0].appendChild(elem);
  520. pluginObject = document.getElementById("cadesplugin_object");
  521. if(isIE())
  522. {
  523. var elem1 = document.createElement('object');
  524. elem1.setAttribute("id", "certEnrollClassFactory");
  525. elem1.setAttribute("classid", "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09");
  526. elem1.setAttribute("style", "visibility: hidden");
  527. document.getElementsByTagName("body")[0].appendChild(elem1);
  528. var elem2 = document.createElement('object');
  529. elem2.setAttribute("id", "webClassFactory");
  530. elem2.setAttribute("classid", "clsid:B04C8637-10BD-484E-B0DA-B8A039F60024");
  531. elem2.setAttribute("style", "visibility: hidden");
  532. document.getElementsByTagName("body")[0].appendChild(elem2);
  533. }
  534. }
  535.  
  536. //Отправляем событие что все ок.
  537. function plugin_loaded()
  538. {
  539. plugin_resolved = 1;
  540. if(canPromise)
  541. {
  542. plugin_resolve();
  543. }else {
  544. window.postMessage("cadesplugin_loaded", "*");
  545. }
  546. }
  547.  
  548. //Отправляем событие что сломались.
  549. function plugin_loaded_error(msg)
  550. {
  551. if(isNativeMessageSupported())
  552. {
  553. //в асинхронном варианте подключаем оба расширения, если сломались оба пробуем установить для Opera
  554. failed_extensions++;
  555. if(failed_extensions<2)
  556. return;
  557. if(isOpera && (typeof(msg) == 'undefined'|| typeof(msg) == 'object'))
  558. {
  559. install_opera_extension();
  560. return;
  561. }
  562. }
  563. if(typeof(msg) == 'undefined' || typeof(msg) == 'object')
  564. msg = "Плагин недоступен";
  565. plugin_resolved = 1;
  566. if(canPromise)
  567. {
  568. plugin_reject(msg);
  569. } else {
  570. window.postMessage("cadesplugin_load_error", "*");
  571. }
  572. }
  573.  
  574. //проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку
  575. function check_load_timeout()
  576. {
  577. if(plugin_resolved == 1)
  578. return;
  579. if(isFireFox)
  580. {
  581. show_firefox_missing_extension_dialog();
  582. }
  583. plugin_resolved = 1;
  584. if(canPromise)
  585. {
  586. plugin_reject("Истекло время ожидания загрузки плагина");
  587. } else {
  588. window.postMessage("cadesplugin_load_error", "*");
  589. }
  590.  
  591. }
  592.  
  593. //Вспомогательная функция для NPAPI
  594. function createPromise(arg)
  595. {
  596. return new Promise(arg);
  597. }
  598.  
  599. function check_npapi_plugin (){
  600. try {
  601. var oAbout = CreateObject("CAdESCOM.About");
  602. plugin_loaded();
  603. }
  604. catch (err) {
  605. document.getElementById("cadesplugin_object").style.display = 'none';
  606. // Объект создать не удалось, проверим, установлен ли
  607. // вообще плагин. Такая возможность есть не во всех браузерах
  608. var mimetype = navigator.mimeTypes["application/x-cades"];
  609. if (mimetype) {
  610. var plugin = mimetype.enabledPlugin;
  611. if (plugin) {
  612. plugin_loaded_error("Плагин загружен, но не создаются обьекты");
  613. }else
  614. {
  615. plugin_loaded_error("Ошибка при загрузке плагина");
  616. }
  617. }else
  618. {
  619. plugin_loaded_error("Плагин недоступен");
  620. }
  621. }
  622. }
  623.  
  624. //Проверяем работает ли плагин
  625. function check_plugin_working()
  626. {
  627. var div = document.createElement("div");
  628. div.innerHTML = "<!--[if lt IE 9]><iecheck></iecheck><![endif]-->";
  629. var isIeLessThan9 = (div.getElementsByTagName("iecheck").length == 1);
  630. if (isIeLessThan9) {
  631. plugin_loaded_error("Internet Explorer версии 8 и ниже не поддерживается");
  632. return;
  633. }
  634.  
  635. if(isNativeMessageSupported())
  636. {
  637. load_extension();
  638. }else if(!canPromise) {
  639. window.addEventListener("message", function (event){
  640. if (event.data != "cadesplugin_echo_request")
  641. return;
  642. load_npapi_plugin();
  643. check_npapi_plugin();
  644. },
  645. false);
  646. }else
  647. {
  648. if(document.readyState === "complete"){
  649. load_npapi_plugin();
  650. check_npapi_plugin();
  651. } else {
  652. window.addEventListener("load", function (event) {
  653. load_npapi_plugin();
  654. check_npapi_plugin();
  655. }, false);
  656. }
  657. }
  658. }
  659.  
  660. function set_pluginObject(obj)
  661. {
  662. pluginObject = obj;
  663. }
  664.  
  665. //Export
  666. cadesplugin.JSModuleVersion = "2.1.0";
  667. cadesplugin.async_spawn = async_spawn;
  668. cadesplugin.set = set_pluginObject;
  669. cadesplugin.set_log_level = set_log_level;
  670. cadesplugin.getLastError = getLastError;
  671.  
  672. if(isNativeMessageSupported())
  673. {
  674. cadesplugin.CreateObjectAsync = CreateObjectAsync;
  675. cadesplugin.ReleasePluginObjects = ReleasePluginObjects;
  676. }
  677.  
  678. if(!isNativeMessageSupported())
  679. {
  680. cadesplugin.CreateObject = CreateObject;
  681. }
  682.  
  683. if(window.cadesplugin_load_timeout)
  684. {
  685. setTimeout(check_load_timeout, window.cadesplugin_load_timeout);
  686. }
  687. else
  688. {
  689. setTimeout(check_load_timeout, 20000);
  690. }
  691.  
  692. set_constantValues();
  693.  
  694. cadesplugin.current_log_level = cadesplugin.LOG_LEVEL_ERROR;
  695. window.cadesplugin = cadesplugin;
  696. check_plugin_working();
  697. }());
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement