2017-01-17 13:22:49 +03:00
var CryptoPro =
/******/ ( function ( modules ) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/
/******/ // Check if module is in cache
/******/ if ( installedModules [ moduleId ] )
/******/ return installedModules [ moduleId ] . exports ;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules [ moduleId ] = {
/******/ exports : { } ,
/******/ id : moduleId ,
/******/ loaded : false
/******/ } ;
/******/
/******/ // Execute the module function
/******/ modules [ moduleId ] . call ( module . exports , module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Flag the module as loaded
/******/ module . loaded = true ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ _ _webpack _require _ _ . m = modules ;
/******/
/******/ // expose the module cache
/******/ _ _webpack _require _ _ . c = installedModules ;
/******/
/******/ // __webpack_public_path__
/******/ _ _webpack _require _ _ . p = "" ;
/******/
/******/ // Load entry module and return exports
/******/ return _ _webpack _require _ _ ( 0 ) ;
/******/ } )
/************************************************************************/
/******/ ( [
/* 0 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
2017-06-08 16:55:04 +03:00
var bowser = _ _webpack _require _ _ ( 1 ) ,
2017-04-20 11:33:20 +03:00
browserInfo = bowser . _detect ( navigator . userAgent ) ,
global = Function ( 'return this' ) ( ) ,
2017-01-17 13:22:49 +03:00
canPromise = Boolean ( global . Promise ) ,
2017-04-20 11:33:20 +03:00
canAsync ,
cadesplugin ,
2017-01-17 13:22:49 +03:00
cryptoService ,
_errorMsg = '' ,
_isLoaded = false ,
_onLoadCbQueue = [ ] ;
2017-04-20 11:33:20 +03:00
global . allow _firefox _cadesplugin _async = browserInfo . firefox && browserInfo . version >= 52 ;
2017-06-08 16:55:04 +03:00
_ _webpack _require _ _ ( 3 ) ;
2017-04-20 11:33:20 +03:00
cadesplugin = global . cadesplugin ;
canAsync = Boolean ( cadesplugin . CreateObjectAsync ) ;
2017-11-29 15:16:02 +03:00
cryptoService = _ _webpack _require _ _ ( 4 ) ;
2017-11-29 14:16:49 +03:00
2017-01-17 13:22:49 +03:00
function execOnloadQueue ( ) {
_onLoadCbQueue . forEach ( function ( callback ) {
callback ( ) ;
} ) ;
}
function passToWaitOnLoad ( callback ) {
if ( Object . prototype . toString . call ( callback ) === '[object Function]' ) {
_onLoadCbQueue . push ( callback ) ;
}
}
function callOnLoad ( method ) {
_isLoaded ? method ( ) : passToWaitOnLoad ( method ) ;
}
function finishLoading ( ) {
_isLoaded = true ;
execOnloadQueue ( ) ;
}
function call ( ) {
var args = Array . prototype . slice . call ( arguments ) ,
methodName = args . shift ( ) ;
return new Promise ( function ( resolve , reject ) {
callOnLoad ( function ( ) {
var method ;
if ( _errorMsg ) {
reject ( _errorMsg ) ;
return ;
}
method = cryptoService [ methodName ] ;
if ( ! method ) {
reject ( 'Метод "' + methodName + '" не доступен' ) ;
return ;
}
method . apply ( null , args ) . then ( resolve , reject ) ;
} ) ;
} ) ;
}
if ( cadesplugin ) {
// Уровень отладки (LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_ERROR)
cadesplugin . set _log _level ( cadesplugin . LOG _LEVEL _ERROR ) ;
if ( canPromise ) {
2017-11-29 14:16:49 +03:00
cadesplugin . then ( finishLoading , function ( ) {
_errorMsg = 'КриптоПРО ЭЦП Browser Plug-In не доступен' ;
finishLoading ( ) ;
} ) ;
2017-01-17 13:22:49 +03:00
} else {
throw new Error ( 'Н е поддерживаются промисы. Необходим полифилл.' ) ;
}
} else {
throw new Error ( 'Н е подключен модуль для работы с cades plugin' ) ;
}
module . exports = {
call : call
} ;
/***/ } ,
2017-06-08 16:55:04 +03:00
/* 1 */
2017-04-21 10:47:03 +03:00
/***/ function ( module , exports , _ _webpack _require _ _ ) {
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
/ * !
* Bowser - a browser detector
* https : //github.com/ded/bowser
* MIT License | ( c ) Dustin Diaz 2015
* /
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
! function ( name , definition ) {
if ( typeof module != 'undefined' && module . exports ) module . exports = definition ( )
2017-06-08 16:55:04 +03:00
else if ( true ) _ _webpack _require _ _ ( 2 ) ( name , definition )
2017-04-21 10:47:03 +03:00
else this [ name ] = definition ( )
} ( 'bowser' , function ( ) {
/ * *
* See useragents . js for examples of navigator . userAgent
* /
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
var t = true
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
function detect ( ua ) {
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
function getFirstMatch ( regex ) {
var match = ua . match ( regex ) ;
return ( match && match . length > 1 && match [ 1 ] ) || '' ;
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
function getSecondMatch ( regex ) {
var match = ua . match ( regex ) ;
return ( match && match . length > 1 && match [ 2 ] ) || '' ;
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
var iosdevice = getFirstMatch ( /(ipod|iphone|ipad)/i ) . toLowerCase ( )
, likeAndroid = /like android/i . test ( ua )
, android = ! likeAndroid && /android/i . test ( ua )
, nexusMobile = /nexus\s*[0-6]\s*/i . test ( ua )
, nexusTablet = ! nexusMobile && /nexus\s*[0-9]+/i . test ( ua )
, chromeos = /CrOS/ . test ( ua )
, silk = /silk/i . test ( ua )
, sailfish = /sailfish/i . test ( ua )
, tizen = /tizen/i . test ( ua )
, webos = /(web|hpw)os/i . test ( ua )
, windowsphone = /windows phone/i . test ( ua )
, samsungBrowser = /SamsungBrowser/i . test ( ua )
, windows = ! windowsphone && /windows/i . test ( ua )
, mac = ! iosdevice && ! silk && /macintosh/i . test ( ua )
, linux = ! android && ! sailfish && ! tizen && ! webos && /linux/i . test ( ua )
, edgeVersion = getFirstMatch ( /edge\/(\d+(\.\d+)?)/i )
, versionIdentifier = getFirstMatch ( /version\/(\d+(\.\d+)?)/i )
, tablet = /tablet/i . test ( ua )
, mobile = ! tablet && /[^-]mobi/i . test ( ua )
, xbox = /xbox/i . test ( ua )
, result
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
if ( /opera/i . test ( ua ) ) {
// an old Opera
result = {
name : 'Opera'
, opera : t
, version : versionIdentifier || getFirstMatch ( /(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i )
}
} else if ( /opr|opios/i . test ( ua ) ) {
// a new Opera
result = {
name : 'Opera'
, opera : t
, version : getFirstMatch ( /(?:opr|opios)[\s\/](\d+(\.\d+)?)/i ) || versionIdentifier
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( /SamsungBrowser/i . test ( ua ) ) {
result = {
name : 'Samsung Internet for Android'
, samsungBrowser : t
, version : versionIdentifier || getFirstMatch ( /(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i )
2017-04-20 13:46:23 +03:00
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( /coast/i . test ( ua ) ) {
result = {
name : 'Opera Coast'
, coast : t
, version : versionIdentifier || getFirstMatch ( /(?:coast)[\s\/](\d+(\.\d+)?)/i )
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( /yabrowser/i . test ( ua ) ) {
result = {
name : 'Yandex Browser'
, yandexbrowser : t
, version : versionIdentifier || getFirstMatch ( /(?:yabrowser)[\s\/](\d+(\.\d+)?)/i )
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( /ucbrowser/i . test ( ua ) ) {
result = {
name : 'UC Browser'
, ucbrowser : t
, version : getFirstMatch ( /(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i )
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( /mxios/i . test ( ua ) ) {
result = {
name : 'Maxthon'
, maxthon : t
, version : getFirstMatch ( /(?:mxios)[\s\/](\d+(?:\.\d+)+)/i )
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( /epiphany/i . test ( ua ) ) {
result = {
name : 'Epiphany'
, epiphany : t
, version : getFirstMatch ( /(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i )
}
2017-01-20 11:45:41 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( /puffin/i . test ( ua ) ) {
result = {
name : 'Puffin'
, puffin : t
, version : getFirstMatch ( /(?:puffin)[\s\/](\d+(?:\.\d+)?)/i )
}
}
else if ( /sleipnir/i . test ( ua ) ) {
result = {
name : 'Sleipnir'
, sleipnir : t
, version : getFirstMatch ( /(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i )
}
}
else if ( /k-meleon/i . test ( ua ) ) {
result = {
name : 'K-Meleon'
, kMeleon : t
, version : getFirstMatch ( /(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i )
}
}
else if ( windowsphone ) {
result = {
name : 'Windows Phone'
, windowsphone : t
}
if ( edgeVersion ) {
result . msedge = t
result . version = edgeVersion
}
else {
result . msie = t
result . version = getFirstMatch ( /iemobile\/(\d+(\.\d+)?)/i )
}
}
else if ( /msie|trident/i . test ( ua ) ) {
result = {
name : 'Internet Explorer'
, msie : t
, version : getFirstMatch ( /(?:msie |rv:)(\d+(\.\d+)?)/i )
}
} else if ( chromeos ) {
result = {
name : 'Chrome'
, chromeos : t
, chromeBook : t
, chrome : t
, version : getFirstMatch ( /(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i )
}
} else if ( /chrome.+? edge/i . test ( ua ) ) {
result = {
name : 'Microsoft Edge'
, msedge : t
, version : edgeVersion
}
}
else if ( /vivaldi/i . test ( ua ) ) {
result = {
name : 'Vivaldi'
, vivaldi : t
, version : getFirstMatch ( /vivaldi\/(\d+(\.\d+)?)/i ) || versionIdentifier
}
}
else if ( sailfish ) {
result = {
name : 'Sailfish'
, sailfish : t
, version : getFirstMatch ( /sailfish\s?browser\/(\d+(\.\d+)?)/i )
}
}
else if ( /seamonkey\//i . test ( ua ) ) {
result = {
name : 'SeaMonkey'
, seamonkey : t
, version : getFirstMatch ( /seamonkey\/(\d+(\.\d+)?)/i )
}
}
else if ( /firefox|iceweasel|fxios/i . test ( ua ) ) {
result = {
name : 'Firefox'
, firefox : t
, version : getFirstMatch ( /(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i )
}
if ( /\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i . test ( ua ) ) {
result . firefoxos = t
}
}
else if ( silk ) {
result = {
name : 'Amazon Silk'
, silk : t
, version : getFirstMatch ( /silk\/(\d+(\.\d+)?)/i )
}
}
else if ( /phantom/i . test ( ua ) ) {
result = {
name : 'PhantomJS'
, phantom : t
, version : getFirstMatch ( /phantomjs\/(\d+(\.\d+)?)/i )
}
}
else if ( /slimerjs/i . test ( ua ) ) {
result = {
name : 'SlimerJS'
, slimer : t
, version : getFirstMatch ( /slimerjs\/(\d+(\.\d+)?)/i )
}
}
else if ( /blackberry|\bbb\d+/i . test ( ua ) || /rim\stablet/i . test ( ua ) ) {
result = {
name : 'BlackBerry'
, blackberry : t
, version : versionIdentifier || getFirstMatch ( /blackberry[\d]+\/(\d+(\.\d+)?)/i )
}
}
else if ( webos ) {
result = {
name : 'WebOS'
, webos : t
, version : versionIdentifier || getFirstMatch ( /w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i )
} ;
/touchpad\//i . test ( ua ) && ( result . touchpad = t )
}
else if ( /bada/i . test ( ua ) ) {
result = {
name : 'Bada'
, bada : t
, version : getFirstMatch ( /dolfin\/(\d+(\.\d+)?)/i )
} ;
2017-01-20 11:45:41 +03:00
}
2017-04-21 10:47:03 +03:00
else if ( tizen ) {
result = {
name : 'Tizen'
, tizen : t
, version : getFirstMatch ( /(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i ) || versionIdentifier
} ;
}
else if ( /qupzilla/i . test ( ua ) ) {
result = {
name : 'QupZilla'
, qupzilla : t
, version : getFirstMatch ( /(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i ) || versionIdentifier
}
}
else if ( /chromium/i . test ( ua ) ) {
result = {
name : 'Chromium'
, chromium : t
, version : getFirstMatch ( /(?:chromium)[\s\/](\d+(?:\.\d+)?)/i ) || versionIdentifier
}
}
else if ( /chrome|crios|crmo/i . test ( ua ) ) {
result = {
name : 'Chrome'
, chrome : t
, version : getFirstMatch ( /(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i )
}
}
else if ( android ) {
result = {
name : 'Android'
, version : versionIdentifier
}
}
else if ( /safari|applewebkit/i . test ( ua ) ) {
result = {
name : 'Safari'
, safari : t
}
if ( versionIdentifier ) {
result . version = versionIdentifier
}
}
else if ( iosdevice ) {
result = {
name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
}
// WTF: version is not part of user agent in web apps
if ( versionIdentifier ) {
result . version = versionIdentifier
}
}
else if ( /googlebot/i . test ( ua ) ) {
result = {
name : 'Googlebot'
, googlebot : t
, version : getFirstMatch ( /googlebot\/(\d+(\.\d+))/i ) || versionIdentifier
}
}
else {
result = {
name : getFirstMatch ( /^(.*)\/(.*) / ) ,
version : getSecondMatch ( /^(.*)\/(.*) / )
} ;
}
2017-01-20 11:45:41 +03:00
2017-04-21 10:47:03 +03:00
// set webkit or gecko flag for browsers based on these engines
if ( ! result . msedge && /(apple)?webkit/i . test ( ua ) ) {
if ( /(apple)?webkit\/537\.36/i . test ( ua ) ) {
result . name = result . name || "Blink"
result . blink = t
} else {
result . name = result . name || "Webkit"
result . webkit = t
}
if ( ! result . version && versionIdentifier ) {
result . version = versionIdentifier
}
} else if ( ! result . opera && /gecko\//i . test ( ua ) ) {
result . name = result . name || "Gecko"
result . gecko = t
result . version = result . version || getFirstMatch ( /gecko\/(\d+(\.\d+)?)/i )
}
2017-01-20 11:45:41 +03:00
2017-04-21 10:47:03 +03:00
// set OS flags for platforms that have multiple browsers
if ( ! result . windowsphone && ! result . msedge && ( android || result . silk ) ) {
result . android = t
} else if ( ! result . windowsphone && ! result . msedge && iosdevice ) {
result [ iosdevice ] = t
result . ios = t
} else if ( mac ) {
result . mac = t
} else if ( xbox ) {
result . xbox = t
} else if ( windows ) {
result . windows = t
} else if ( linux ) {
result . linux = t
2017-01-20 11:45:41 +03:00
}
2017-04-21 10:47:03 +03:00
// OS version extraction
var osVersion = '' ;
if ( result . windowsphone ) {
osVersion = getFirstMatch ( /windows phone (?:os)?\s?(\d+(\.\d+)*)/i ) ;
} else if ( iosdevice ) {
osVersion = getFirstMatch ( /os (\d+([_\s]\d+)*) like mac os x/i ) ;
osVersion = osVersion . replace ( /[_\s]/g , '.' ) ;
} else if ( android ) {
osVersion = getFirstMatch ( /android[ \/-](\d+(\.\d+)*)/i ) ;
} else if ( result . webos ) {
osVersion = getFirstMatch ( /(?:web|hpw)os\/(\d+(\.\d+)*)/i ) ;
} else if ( result . blackberry ) {
osVersion = getFirstMatch ( /rim\stablet\sos\s(\d+(\.\d+)*)/i ) ;
} else if ( result . bada ) {
osVersion = getFirstMatch ( /bada\/(\d+(\.\d+)*)/i ) ;
} else if ( result . tizen ) {
osVersion = getFirstMatch ( /tizen[\/\s](\d+(\.\d+)*)/i ) ;
}
if ( osVersion ) {
result . osversion = osVersion ;
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
// device type extraction
var osMajorVersion = osVersion . split ( '.' ) [ 0 ] ;
if (
tablet
|| nexusTablet
|| iosdevice == 'ipad'
|| ( android && ( osMajorVersion == 3 || ( osMajorVersion >= 4 && ! mobile ) ) )
|| result . silk
) {
result . tablet = t
} else if (
mobile
|| iosdevice == 'iphone'
|| iosdevice == 'ipod'
|| android
|| nexusMobile
|| result . blackberry
|| result . webos
|| result . bada
) {
result . mobile = t
}
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
// Graded Browser Support
// http://developer.yahoo.com/yui/articles/gbs
if ( result . msedge ||
( result . msie && result . version >= 10 ) ||
( result . yandexbrowser && result . version >= 15 ) ||
( result . vivaldi && result . version >= 1.0 ) ||
( result . chrome && result . version >= 20 ) ||
( result . samsungBrowser && result . version >= 4 ) ||
( result . firefox && result . version >= 20.0 ) ||
( result . safari && result . version >= 6 ) ||
( result . opera && result . version >= 10.0 ) ||
( result . ios && result . osversion && result . osversion . split ( "." ) [ 0 ] >= 6 ) ||
( result . blackberry && result . version >= 10.1 )
|| ( result . chromium && result . version >= 20 )
) {
result . a = t ;
}
else if ( ( result . msie && result . version < 10 ) ||
( result . chrome && result . version < 20 ) ||
( result . firefox && result . version < 20.0 ) ||
( result . safari && result . version < 6 ) ||
( result . opera && result . version < 10.0 ) ||
( result . ios && result . osversion && result . osversion . split ( "." ) [ 0 ] < 6 )
|| ( result . chromium && result . version < 20 )
) {
result . c = t
} else result . x = t
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
return result
}
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
var bowser = detect ( typeof navigator !== 'undefined' ? navigator . userAgent || '' : '' )
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
bowser . test = function ( browserList ) {
for ( var i = 0 ; i < browserList . length ; ++ i ) {
var browserItem = browserList [ i ] ;
if ( typeof browserItem === 'string' ) {
if ( browserItem in bowser ) {
return true ;
}
2017-04-20 13:46:23 +03:00
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
return false ;
}
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
/ * *
* Get version precisions count
*
* @ example
* getVersionPrecision ( "1.10.3" ) // 3
*
* @ param { string } version
* @ return { number }
* /
function getVersionPrecision ( version ) {
return version . split ( "." ) . length ;
}
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
/ * *
* Array : : map polyfill
*
* @ param { Array } arr
* @ param { Function } iterator
* @ return { Array }
* /
function map ( arr , iterator ) {
var result = [ ] , i ;
if ( Array . prototype . map ) {
return Array . prototype . map . call ( arr , iterator ) ;
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
for ( i = 0 ; i < arr . length ; i ++ ) {
result . push ( iterator ( arr [ i ] ) ) ;
2017-04-20 10:55:18 +03:00
}
2017-04-21 10:47:03 +03:00
return result ;
}
2017-04-20 10:55:18 +03:00
2017-04-21 10:47:03 +03:00
/ * *
* Calculate browser version weight
*
* @ example
* compareVersions ( [ '1.10.2.1' , '1.8.2.1.90' ] ) // 1
* compareVersions ( [ '1.010.2.1' , '1.09.2.1.90' ] ) ; // 1
* compareVersions ( [ '1.10.2.1' , '1.10.2.1' ] ) ; // 0
* compareVersions ( [ '1.10.2.1' , '1.0800.2' ] ) ; // -1
*
* @ param { Array < String > } versions versions to compare
* @ return { Number } comparison result
* /
function compareVersions ( versions ) {
// 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
var precision = Math . max ( getVersionPrecision ( versions [ 0 ] ) , getVersionPrecision ( versions [ 1 ] ) ) ;
var chunks = map ( versions , function ( version ) {
var delta = precision - getVersionPrecision ( version ) ;
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
// 2) "9" -> "9.0" (for precision = 2)
version = version + new Array ( delta + 1 ) . join ( ".0" ) ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
// 3) "9.0" -> ["000000000"", "000000009"]
return map ( version . split ( "." ) , function ( chunk ) {
return new Array ( 20 - chunk . length ) . join ( "0" ) + chunk ;
} ) . reverse ( ) ;
} ) ;
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
// iterate in reverse order by reversed chunks array
while ( -- precision >= 0 ) {
// 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
if ( chunks [ 0 ] [ precision ] > chunks [ 1 ] [ precision ] ) {
return 1 ;
}
else if ( chunks [ 0 ] [ precision ] === chunks [ 1 ] [ precision ] ) {
if ( precision === 0 ) {
// all version chunks are same
return 0 ;
2017-01-20 11:16:31 +03:00
}
2017-04-21 10:47:03 +03:00
}
else {
return - 1 ;
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
}
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
/ * *
* Check if browser is unsupported
*
* @ example
* bowser . isUnsupportedBrowser ( {
* msie : "10" ,
* firefox : "23" ,
* chrome : "29" ,
* safari : "5.1" ,
* opera : "16" ,
* phantom : "534"
* } ) ;
*
* @ param { Object } minVersions map of minimal version to browser
* @ param { Boolean } [ strictMode = false ] flag to return false if browser wasn ' t found in map
* @ param { String } [ ua ] user agent string
* @ return { Boolean }
* /
function isUnsupportedBrowser ( minVersions , strictMode , ua ) {
var _bowser = bowser ;
// make strictMode param optional with ua param usage
if ( typeof strictMode === 'string' ) {
ua = strictMode ;
strictMode = void ( 0 ) ;
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
if ( strictMode === void ( 0 ) ) {
strictMode = false ;
}
if ( ua ) {
_bowser = detect ( ua ) ;
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
var version = "" + _bowser . version ;
for ( var browser in minVersions ) {
if ( minVersions . hasOwnProperty ( browser ) ) {
if ( _bowser [ browser ] ) {
if ( typeof minVersions [ browser ] !== 'string' ) {
throw new Error ( 'Browser version in the minVersion map should be a string: ' + browser + ': ' + String ( minVersions ) ) ;
}
// browser version and min supported version.
return compareVersions ( [ version , minVersions [ browser ] ] ) < 0 ;
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
}
2017-01-17 13:22:49 +03:00
}
2017-04-21 10:47:03 +03:00
return strictMode ; // not found
}
2017-04-20 13:46:23 +03:00
2017-04-21 10:47:03 +03:00
/ * *
* Check if browser is supported
*
* @ param { Object } minVersions map of minimal version to browser
* @ param { Boolean } [ strictMode = false ] flag to return false if browser wasn ' t found in map
* @ param { String } [ ua ] user agent string
* @ return { Boolean }
* /
function check ( minVersions , strictMode , ua ) {
return ! isUnsupportedBrowser ( minVersions , strictMode , ua ) ;
}
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
bowser . isUnsupportedBrowser = isUnsupportedBrowser ;
bowser . compareVersions = compareVersions ;
bowser . check = check ;
/ *
* Set our detect method to the main bowser object so we can
* reuse it to test other user agents .
* This is needed to implement future tests .
* /
bowser . _detect = detect ;
return bowser
} ) ;
/***/ } ,
2017-06-08 16:55:04 +03:00
/* 2 */
2017-04-21 10:47:03 +03:00
/***/ function ( module , exports ) {
module . exports = function ( ) { throw new Error ( "define cannot be used indirect" ) ; } ;
/***/ } ,
2017-06-08 16:55:04 +03:00
/* 3 */
2017-04-21 10:47:03 +03:00
/***/ function ( module , exports ) {
; ( function ( ) {
//already loaded
if ( window . cadesplugin )
return ;
var pluginObject ;
var plugin _resolved = 0 ;
var plugin _reject ;
var plugin _resolve ;
var isOpera = 0 ;
var isFireFox = 0 ;
2017-09-27 14:26:07 +03:00
var isEdge = 0 ;
2017-04-21 10:47:03 +03:00
var failed _extensions = 0 ;
var canPromise = ! ! window . Promise ;
var cadesplugin ;
if ( canPromise )
2017-04-20 13:46:23 +03:00
{
2017-04-21 10:47:03 +03:00
cadesplugin = new Promise ( function ( resolve , reject )
{
plugin _resolve = resolve ;
plugin _reject = reject ;
} ) ;
} else
{
cadesplugin = { } ;
2017-04-20 13:46:23 +03:00
}
2017-09-27 14:26:07 +03:00
function check _browser ( ) {
var ua = navigator . userAgent , tem , M = ua . match ( /(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i ) || [ ] ;
if ( /trident/i . test ( M [ 1 ] ) ) {
tem = /\brv[ :]+(\d+)/g . exec ( ua ) || [ ] ;
return { name : 'IE' , version : ( tem [ 1 ] || '' ) } ;
}
if ( M [ 1 ] === 'Chrome' ) {
tem = ua . match ( /\b(OPR|Edge)\/(\d+)/ ) ;
if ( tem != null ) 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 ] } ;
}
var browserSpecs = check _browser ( ) ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
function cpcsp _console _log ( level , msg ) {
//IE9 не может писать в консоль если не открыта вкладка developer tools
if ( typeof ( console ) == 'undefined' )
return ;
if ( level <= cadesplugin . current _log _level ) {
if ( level == cadesplugin . LOG _LEVEL _DEBUG )
console . log ( "DEBUG: %s" , msg ) ;
if ( level == cadesplugin . LOG _LEVEL _INFO )
console . info ( "INFO: %s" , msg ) ;
if ( level == cadesplugin . LOG _LEVEL _ERROR )
console . error ( "ERROR: %s" , msg ) ;
return ;
2017-01-17 13:22:49 +03:00
}
}
2017-04-21 10:47:03 +03:00
function set _log _level ( level ) {
if ( ! ( ( level == cadesplugin . LOG _LEVEL _DEBUG ) ||
( level == cadesplugin . LOG _LEVEL _INFO ) ||
( level == cadesplugin . LOG _LEVEL _ERROR ) ) ) {
cpcsp _console _log ( cadesplugin . LOG _LEVEL _ERROR , "cadesplugin_api.js: Incorrect log_level: " + level ) ;
2017-04-20 14:18:39 +03:00
return ;
}
2017-04-21 10:47:03 +03:00
cadesplugin . current _log _level = level ;
if ( cadesplugin . current _log _level == cadesplugin . 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 )
cpcsp _console _log ( cadesplugin . LOG _LEVEL _INFO , "cadesplugin_api.js: log_level = INFO" ) ;
if ( cadesplugin . current _log _level == cadesplugin . LOG _LEVEL _ERROR )
cpcsp _console _log ( cadesplugin . LOG _LEVEL _INFO , "cadesplugin_api.js: log_level = ERROR" ) ;
2017-04-20 13:46:23 +03:00
if ( isNativeMessageSupported ( ) )
{
2017-04-21 10:47:03 +03:00
if ( cadesplugin . current _log _level == cadesplugin . LOG _LEVEL _DEBUG )
window . postMessage ( "set_log_level=debug" , "*" ) ;
if ( cadesplugin . current _log _level == cadesplugin . LOG _LEVEL _INFO )
window . postMessage ( "set_log_level=info" , "*" ) ;
if ( cadesplugin . current _log _level == cadesplugin . LOG _LEVEL _ERROR )
window . postMessage ( "set_log_level=error" , "*" ) ;
2017-01-17 13:22:49 +03:00
}
}
2017-04-21 10:47:03 +03:00
function set _constantValues ( )
2017-04-20 13:46:23 +03:00
{
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _LOCAL _MACHINE _STORE = 1 ;
cadesplugin . CAPICOM _CURRENT _USER _STORE = 2 ;
cadesplugin . CADESCOM _LOCAL _MACHINE _STORE = 1 ;
cadesplugin . CADESCOM _CURRENT _USER _STORE = 2 ;
cadesplugin . CADESCOM _CONTAINER _STORE = 100 ;
cadesplugin . CAPICOM _MY _STORE = "My" ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _STORE _OPEN _MAXIMUM _ALLOWED = 2 ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _CERTIFICATE _FIND _SUBJECT _NAME = 1 ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CADESCOM _XML _SIGNATURE _TYPE _ENVELOPED = 0 ;
cadesplugin . CADESCOM _XML _SIGNATURE _TYPE _ENVELOPING = 1 ;
cadesplugin . CADESCOM _XML _SIGNATURE _TYPE _TEMPLATE = 2 ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . XmlDsigGost3410UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" ;
cadesplugin . XmlDsigGost3411UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr3411" ;
cadesplugin . XmlDsigGost3410Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411" ;
cadesplugin . XmlDsigGost3411Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411" ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CADESCOM _CADES _DEFAULT = 0 ;
cadesplugin . CADESCOM _CADES _BES = 1 ;
cadesplugin . CADESCOM _CADES _T = 0x5 ;
cadesplugin . CADESCOM _CADES _X _LONG _TYPE _1 = 0x5d ;
2017-01-17 13:22:49 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CADESCOM _ENCODE _BASE64 = 0 ;
cadesplugin . CADESCOM _ENCODE _BINARY = 1 ;
cadesplugin . CADESCOM _ENCODE _ANY = - 1 ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _CERTIFICATE _INCLUDE _CHAIN _EXCEPT _ROOT = 0 ;
cadesplugin . CAPICOM _CERTIFICATE _INCLUDE _WHOLE _CHAIN = 1 ;
cadesplugin . CAPICOM _CERTIFICATE _INCLUDE _END _ENTITY _ONLY = 2 ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _CERT _INFO _SUBJECT _SIMPLE _NAME = 0 ;
cadesplugin . CAPICOM _CERT _INFO _ISSUER _SIMPLE _NAME = 1 ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _CERTIFICATE _FIND _SHA1 _HASH = 0 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _SUBJECT _NAME = 1 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _ISSUER _NAME = 2 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _ROOT _NAME = 3 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _TEMPLATE _NAME = 4 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _EXTENSION = 5 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _EXTENDED _PROPERTY = 6 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _APPLICATION _POLICY = 7 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _CERTIFICATE _POLICY = 8 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _TIME _VALID = 9 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _TIME _NOT _YET _VALID = 10 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _TIME _EXPIRED = 11 ;
cadesplugin . CAPICOM _CERTIFICATE _FIND _KEY _USAGE = 12 ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _DIGITAL _SIGNATURE _KEY _USAGE = 128 ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _PROPID _ENHKEY _USAGE = 9 ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _OID _OTHER = 0 ;
cadesplugin . CAPICOM _OID _KEY _USAGE _EXTENSION = 10 ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . CAPICOM _EKU _CLIENT _AUTH = 2 ;
cadesplugin . CAPICOM _EKU _SMARTCARD _LOGON = 5 ;
cadesplugin . CAPICOM _EKU _OTHER = 0 ;
cadesplugin . CAPICOM _AUTHENTICATED _ATTRIBUTE _SIGNING _TIME = 0 ;
cadesplugin . CADESCOM _AUTHENTICATED _ATTRIBUTE _DOCUMENT _NAME = 1 ;
cadesplugin . CADESCOM _AUTHENTICATED _ATTRIBUTE _DOCUMENT _DESCRIPTION = 2 ;
cadesplugin . CADESCOM _ATTRIBUTE _OTHER = - 1 ;
cadesplugin . CADESCOM _STRING _TO _UCS2LE = 0 ;
cadesplugin . CADESCOM _BASE64 _TO _BINARY = 1 ;
cadesplugin . CADESCOM _DISPLAY _DATA _NONE = 0 ;
cadesplugin . CADESCOM _DISPLAY _DATA _CONTENT = 1 ;
cadesplugin . CADESCOM _DISPLAY _DATA _ATTRIBUTE = 2 ;
cadesplugin . CADESCOM _ENCRYPTION _ALGORITHM _RC2 = 0 ;
cadesplugin . CADESCOM _ENCRYPTION _ALGORITHM _RC4 = 1 ;
cadesplugin . CADESCOM _ENCRYPTION _ALGORITHM _DES = 2 ;
cadesplugin . CADESCOM _ENCRYPTION _ALGORITHM _3DES = 3 ;
cadesplugin . CADESCOM _ENCRYPTION _ALGORITHM _AES = 4 ;
cadesplugin . CADESCOM _ENCRYPTION _ALGORITHM _GOST _28147 _89 = 25 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _SHA1 = 0 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _MD2 = 1 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _MD4 = 2 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _MD5 = 3 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _SHA _256 = 4 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _SHA _384 = 5 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _SHA _512 = 6 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _CP _GOST _3411 = 100 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _CP _GOST _3411 _2012 _256 = 101 ;
cadesplugin . CADESCOM _HASH _ALGORITHM _CP _GOST _3411 _2012 _512 = 102 ;
cadesplugin . LOG _LEVEL _DEBUG = 4 ;
cadesplugin . LOG _LEVEL _INFO = 2 ;
cadesplugin . LOG _LEVEL _ERROR = 1 ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function async _spawn ( generatorFunc ) {
function continuer ( verb , arg ) {
var result ;
try {
result = generator [ verb ] ( arg ) ;
} catch ( err ) {
return Promise . reject ( err ) ;
}
if ( result . done ) {
return result . value ;
} else {
return Promise . resolve ( result . value ) . then ( onFulfilled , onRejected ) ;
}
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
var generator = generatorFunc ( Array . prototype . slice . call ( arguments , 1 ) ) ;
var onFulfilled = continuer . bind ( continuer , "next" ) ;
var onRejected = continuer . bind ( continuer , "throw" ) ;
return onFulfilled ( ) ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function isIE ( ) {
2017-09-27 14:26:07 +03:00
// var retVal = (("Microsoft Internet Explorer" == navigator.appName) || // IE < 11
// navigator.userAgent.match(/Trident\/./i)); // IE 11
return ( browserSpecs . name == 'IE' || browserSpecs . name == 'MSIE' ) ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function isIOS ( ) {
var retVal = ( navigator . userAgent . match ( /ipod/i ) ||
navigator . userAgent . match ( /ipad/i ) ||
navigator . userAgent . match ( /iphone/i ) ) ;
return retVal ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function isNativeMessageSupported ( )
{
2017-09-27 14:26:07 +03:00
// В IE работаем через NPAPI
if ( isIE ( ) )
2017-04-21 10:47:03 +03:00
return false ;
2017-09-27 14:26:07 +03:00
// В Edge работаем через NativeMessage
if ( browserSpecs . name == 'Edge' ) {
isEdge = true ;
return true ;
}
// В Chrome, Firefox и Opera работаем через асинхронную версию в зависимости от версии
if ( browserSpecs . name == 'Opera' ) {
isOpera = true ;
if ( browserSpecs . version >= 33 ) {
return true ;
}
else {
return false ;
}
}
if ( browserSpecs . name == 'Firefox' ) {
isFireFox = true ;
if ( browserSpecs . version >= 52 ) {
return true ;
}
else {
return false ;
}
}
if ( browserSpecs . name == 'Chrome' ) {
if ( browserSpecs . version >= 42 ) {
2017-04-21 10:47:03 +03:00
return true ;
}
2017-09-27 14:26:07 +03:00
else {
return false ;
}
2017-04-21 10:47:03 +03:00
}
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
// Функция активации объектов КриптоПро ЭЦП Browser plug-in
function CreateObject ( name ) {
if ( isIOS ( ) ) {
// Н а iOS для создания объектов используется функция
// call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js
return call _ru _cryptopro _npcades _10 _native _bridge ( "CreateObject" , [ name ] ) ;
}
if ( isIE ( ) ) {
// В Internet Explorer создаются COM-объекты
if ( name . match ( /X509Enrollment/i ) ) {
try {
// Объекты CertEnroll создаются через CX509EnrollmentWebClassFactory
var objCertEnrollClassFactory = document . getElementById ( "certEnrollClassFactory" ) ;
return objCertEnrollClassFactory . CreateObject ( name ) ;
}
catch ( e ) {
throw ( "Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS" ) ;
}
}
// Объекты CAPICOM и CAdESCOM создаются через CAdESCOM.WebClassFactory
try {
var objWebClassFactory = document . getElementById ( "webClassFactory" ) ;
return objWebClassFactory . CreateObject ( name ) ;
}
catch ( e ) {
// Для версий плагина ниже 2.0.12538
return new ActiveXObject ( name ) ;
}
}
2017-09-27 14:26:07 +03:00
// создаются объекты NPAPI
2017-04-21 10:47:03 +03:00
return pluginObject . CreateObject ( name ) ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function decimalToHexString ( number ) {
if ( number < 0 ) {
number = 0xFFFFFFFF + number + 1 ;
}
return number . toString ( 16 ) . toUpperCase ( ) ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function GetMessageFromException ( e ) {
var err = e . message ;
if ( ! err ) {
err = e ;
} else if ( e . number ) {
err += " (0x" + decimalToHexString ( e . number ) + ")" ;
}
return err ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function getLastError ( exception ) {
if ( isNativeMessageSupported ( ) || isIE ( ) || isIOS ( ) ) {
return GetMessageFromException ( exception ) ;
}
try {
return pluginObject . getLastError ( ) ;
} catch ( e ) {
return GetMessageFromException ( exception ) ;
}
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
2017-09-27 14:26:07 +03:00
// Функция для удаления созданных объектов
function ReleasePluginObjects ( ) {
return cpcsp _chrome _nmcades . ReleasePluginObjects ( ) ;
}
2017-04-21 10:47:03 +03:00
// Функция активации асинхронных объектов КриптоПро ЭЦП Browser plug-in
function CreateObjectAsync ( name ) {
return pluginObject . CreateObjectAsync ( name ) ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
//Функции для IOS
var ru _cryptopro _npcades _10 _native _bridge = {
callbacksCount : 1 ,
callbacks : { } ,
// Automatically called by native layer when a result is available
resultForCallback : function resultForCallback ( callbackId , resultArray ) {
var callback = ru _cryptopro _npcades _10 _native _bridge . callbacks [ callbackId ] ;
if ( ! callback ) return ;
callback . apply ( null , resultArray ) ;
} ,
// Use this in javascript to request native objective-c code
// functionName : string (I think the name is explicit :p)
// args : array of arguments
// callback : function with n-arguments that is going to be called when the native code returned
call : function call ( functionName , args , callback ) {
var hasCallback = callback && typeof callback == "function" ;
var callbackId = hasCallback ? ru _cryptopro _npcades _10 _native _bridge . callbacksCount ++ : 0 ;
if ( hasCallback )
ru _cryptopro _npcades _10 _native _bridge . callbacks [ callbackId ] = callback ;
var iframe = document . createElement ( "IFRAME" ) ;
var arrObjs = new Array ( "_CPNP_handle" ) ;
try {
iframe . setAttribute ( "src" , "cpnp-js-call:" + functionName + ":" + callbackId + ":" + encodeURIComponent ( JSON . stringify ( args , arrObjs ) ) ) ;
} catch ( e ) {
alert ( e ) ;
}
document . documentElement . appendChild ( iframe ) ;
iframe . parentNode . removeChild ( iframe ) ;
iframe = null ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
} ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
function call _ru _cryptopro _npcades _10 _native _bridge ( functionName , array ) {
var tmpobj ;
var ex ;
ru _cryptopro _npcades _10 _native _bridge . call ( functionName , array , function ( e , response ) {
ex = e ;
var str = 'tmpobj=' + response ;
eval ( str ) ;
if ( typeof ( tmpobj ) == "string" ) {
tmpobj = tmpobj . replace ( /\\\n/gm , "\n" ) ;
tmpobj = tmpobj . replace ( /\\\r/gm , "\r" ) ;
}
} ) ;
if ( ex )
throw ex ;
return tmpobj ;
2017-04-20 11:33:20 +03:00
}
2017-09-27 14:26:07 +03:00
function show _firefox _missing _extension _dialog ( )
{
if ( ! window . cadesplugin _skip _extension _install )
{
var ovr = document . createElement ( 'div' ) ;
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 . 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'>" +
"<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" +
"<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо расширение для браузера. Убедитесь, что оно у В а с включено или установите е г о ." +
"<p><a href='https://www.cryptopro.ru/sites/default/files/products/cades/extensions/firefox_cryptopro_extension_latest.xpi'>Скачать расширение</a></p>" +
"</div>" ;
document . getElementsByTagName ( "Body" ) [ 0 ] . appendChild ( ovr ) ;
document . getElementById ( "cadesplugin_close_install" ) . addEventListener ( 'click' , function ( )
{
plugin _loaded _error ( "Плагин недоступен" ) ;
document . getElementById ( "cadesplugin_ovr" ) . style . visibility = 'hidden' ;
} ) ;
ovr . addEventListener ( 'click' , function ( )
{
plugin _loaded _error ( "Плагин недоступен" ) ;
document . getElementById ( "cadesplugin_ovr" ) . style . visibility = 'hidden' ;
} ) ;
ovr . style . visibility = "visible" ;
}
}
2017-04-21 10:47:03 +03:00
//Выводим окно поверх других с предложением установить расширение для Opera.
//Если установленна переменная cadesplugin_skip_extension_install - не предлагаем установить расширение
function install _opera _extension ( )
{
if ( ! window . cadesplugin _skip _extension _install )
{
document . addEventListener ( 'DOMContentLoaded' , function ( ) {
var ovr = document . createElement ( 'div' ) ;
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 . 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'>" +
"<button id='cadesplugin_close_install' style='float: right; font-size: 10px; background: transparent; border: 1; margin: -5px'>X</button>" +
"<p>Для работы КриптоПро ЭЦП Browser plugin на данном сайте необходимо установить расширение из каталога дополнений Opera." +
"<p><button id='cadesplugin_install' style='font:12px Arial'>Установить расширение</button></p>" +
"</div>" ;
document . getElementsByTagName ( "Body" ) [ 0 ] . appendChild ( ovr ) ;
var btn _install = document . getElementById ( "cadesplugin_install" ) ;
btn _install . addEventListener ( 'click' , function ( event ) {
opr . addons . installExtension ( "epebfcehmdedogndhlcacafjaacknbcm" ,
function ( )
{
document . getElementById ( "cadesplugin_ovr" ) . style . visibility = 'hidden' ;
location . reload ( ) ;
} ,
function ( ) { } )
} ) ;
document . getElementById ( "cadesplugin_close_install" ) . addEventListener ( 'click' , function ( )
{
plugin _loaded _error ( "Плагин недоступен" ) ;
document . getElementById ( "cadesplugin_ovr" ) . style . visibility = 'hidden' ;
} ) ;
ovr . addEventListener ( 'click' , function ( )
{
plugin _loaded _error ( "Плагин недоступен" ) ;
document . getElementById ( "cadesplugin_ovr" ) . style . visibility = 'hidden' ;
} ) ;
ovr . style . visibility = "visible" ;
document . getElementById ( "cadesplugin_ovr_item" ) . addEventListener ( 'click' , function ( e ) {
e . stopPropagation ( ) ;
} ) ;
} ) ;
} else
{
plugin _loaded _error ( "Плагин недоступен" ) ;
}
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
2017-09-27 14:26:07 +03:00
function firefox _or _edge _nmcades _onload ( ) {
2017-04-21 10:47:03 +03:00
cpcsp _chrome _nmcades . check _chrome _plugin ( plugin _loaded , plugin _loaded _error ) ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function nmcades _api _onload ( ) {
window . postMessage ( "cadesplugin_echo_request" , "*" ) ;
window . addEventListener ( "message" , function ( event ) {
if ( typeof ( event . data ) != "string" || ! event . data . match ( "cadesplugin_loaded" ) )
return ;
2017-09-27 14:26:07 +03:00
if ( isFireFox || isEdge )
2017-04-21 10:47:03 +03:00
{
// Для Firefox вместе с сообщением cadesplugin_loaded прилетает url для загрузки nmcades_plugin_api.js
var url = event . data . substring ( event . data . indexOf ( "url:" ) + 4 ) ;
var fileref = document . createElement ( 'script' ) ;
fileref . setAttribute ( "type" , "text/javascript" ) ;
fileref . setAttribute ( "src" , url ) ;
fileref . onerror = plugin _loaded _error ;
2017-09-27 14:26:07 +03:00
fileref . onload = firefox _or _edge _nmcades _onload ;
2017-04-21 10:47:03 +03:00
document . getElementsByTagName ( "head" ) [ 0 ] . appendChild ( fileref ) ;
2017-09-27 14:26:07 +03:00
// Для Firefox и Edge у нас только по одному расширению.
failed _extensions ++ ;
2017-04-21 10:47:03 +03:00
} else {
cpcsp _chrome _nmcades . check _chrome _plugin ( plugin _loaded , plugin _loaded _error ) ;
}
} , false ) ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
//Загружаем расширения для Chrome, Opera, YaBrowser, FireFox, Edge
function load _extension ( )
{
2017-09-27 14:26:07 +03:00
if ( isFireFox || isEdge ) {
2017-04-21 10:47:03 +03:00
// вызываем callback руками т.к. нам нужно узнать ID расширения. Он уникальный для браузера.
nmcades _api _onload ( ) ;
return ;
} else {
// в асинхронном варианте для chrome и opera подключаем о б а расширения
var fileref = document . createElement ( 'script' ) ;
fileref . setAttribute ( "type" , "text/javascript" ) ;
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 ) ;
fileref = document . createElement ( 'script' ) ;
fileref . setAttribute ( "type" , "text/javascript" ) ;
fileref . setAttribute ( "src" , "chrome-extension://epebfcehmdedogndhlcacafjaacknbcm/nmcades_plugin_api.js" ) ;
fileref . onerror = plugin _loaded _error ;
fileref . onload = nmcades _api _onload ;
document . getElementsByTagName ( "head" ) [ 0 ] . appendChild ( fileref ) ;
}
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
//Загружаем плагин для NPAPI
function load _npapi _plugin ( )
{
var elem = document . createElement ( 'object' ) ;
elem . setAttribute ( "id" , "cadesplugin_object" ) ;
elem . setAttribute ( "type" , "application/x-cades" ) ;
elem . setAttribute ( "style" , "visibility: hidden" ) ;
document . getElementsByTagName ( "body" ) [ 0 ] . appendChild ( elem ) ;
pluginObject = document . getElementById ( "cadesplugin_object" ) ;
if ( isIE ( ) )
{
var elem1 = document . createElement ( 'object' ) ;
elem1 . setAttribute ( "id" , "certEnrollClassFactory" ) ;
elem1 . setAttribute ( "classid" , "clsid:884e2049-217d-11da-b2a4-000e7bbb2b09" ) ;
elem1 . setAttribute ( "style" , "visibility: hidden" ) ;
document . getElementsByTagName ( "body" ) [ 0 ] . appendChild ( elem1 ) ;
var elem2 = document . createElement ( 'object' ) ;
elem2 . setAttribute ( "id" , "webClassFactory" ) ;
elem2 . setAttribute ( "classid" , "clsid:B04C8637-10BD-484E-B0DA-B8A039F60024" ) ;
elem2 . setAttribute ( "style" , "visibility: hidden" ) ;
document . getElementsByTagName ( "body" ) [ 0 ] . appendChild ( elem2 ) ;
}
}
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
//Отправляем событие что все ок.
function plugin _loaded ( )
{
plugin _resolved = 1 ;
if ( canPromise )
{
plugin _resolve ( ) ;
} else {
window . postMessage ( "cadesplugin_loaded" , "*" ) ;
}
}
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
//Отправляем событие что сломались.
function plugin _loaded _error ( msg )
{
if ( isNativeMessageSupported ( ) )
{
//в асинхронном варианте подключаем о б а расширения, если сломались о б а пробуем установить для Opera
failed _extensions ++ ;
if ( failed _extensions < 2 )
return ;
if ( isOpera && ( typeof ( msg ) == 'undefined' || typeof ( msg ) == 'object' ) )
{
install _opera _extension ( ) ;
return ;
}
}
if ( typeof ( msg ) == 'undefined' || typeof ( msg ) == 'object' )
msg = "Плагин недоступен" ;
plugin _resolved = 1 ;
if ( canPromise )
{
plugin _reject ( msg ) ;
} else {
window . postMessage ( "cadesplugin_load_error" , "*" ) ;
2017-04-20 11:33:20 +03:00
}
}
2017-04-21 10:47:03 +03:00
//проверяем что у нас хоть какое то событие ушло, и если не уходило кидаем еще раз ошибку
function check _load _timeout ( )
{
if ( plugin _resolved == 1 )
return ;
2017-09-27 14:26:07 +03:00
if ( isFireFox )
{
show _firefox _missing _extension _dialog ( ) ;
}
2017-04-21 10:47:03 +03:00
plugin _resolved = 1 ;
if ( canPromise )
{
plugin _reject ( "Истекло время ожидания загрузки плагина" ) ;
} else {
window . postMessage ( "cadesplugin_load_error" , "*" ) ;
}
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
//Вспомогательная функция для NPAPI
function createPromise ( arg )
{
return new Promise ( arg ) ;
}
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
function check _npapi _plugin ( ) {
try {
var oAbout = CreateObject ( "CAdESCOM.About" ) ;
plugin _loaded ( ) ;
}
catch ( err ) {
document . getElementById ( "cadesplugin_object" ) . style . display = 'none' ;
// Объект создать не удалось, проверим, установлен ли
// вообще плагин. Такая возможность есть не во всех браузерах
var mimetype = navigator . mimeTypes [ "application/x-cades" ] ;
if ( mimetype ) {
var plugin = mimetype . enabledPlugin ;
if ( plugin ) {
plugin _loaded _error ( "Плагин загружен, но не создаются обьекты" ) ;
} else
{
plugin _loaded _error ( "Ошибка при загрузке плагина" ) ;
}
} else
{
plugin _loaded _error ( "Плагин недоступен" ) ;
}
2017-04-20 11:33:20 +03:00
}
}
2017-04-21 10:47:03 +03:00
//Проверяем работает ли плагин
function check _plugin _working ( )
{
var div = document . createElement ( "div" ) ;
div . innerHTML = "<!--[if lt IE 9]><iecheck></iecheck><![endif]-->" ;
var isIeLessThan9 = ( div . getElementsByTagName ( "iecheck" ) . length == 1 ) ;
if ( isIeLessThan9 ) {
plugin _loaded _error ( "Internet Explorer версии 8 и ниже не поддерживается" ) ;
return ;
}
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
if ( isNativeMessageSupported ( ) )
{
load _extension ( ) ;
} else if ( ! canPromise ) {
window . addEventListener ( "message" , function ( event ) {
if ( event . data != "cadesplugin_echo_request" )
return ;
load _npapi _plugin ( ) ;
check _npapi _plugin ( ) ;
} ,
false ) ;
} else
{
2017-09-27 14:26:07 +03:00
if ( document . readyState === "complete" ) {
2017-04-21 10:47:03 +03:00
load _npapi _plugin ( ) ;
check _npapi _plugin ( ) ;
2017-09-27 14:26:07 +03:00
} else {
window . addEventListener ( "load" , function ( event ) {
load _npapi _plugin ( ) ;
check _npapi _plugin ( ) ;
} , false ) ;
}
2017-04-21 10:47:03 +03:00
}
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
function set _pluginObject ( obj )
{
pluginObject = obj ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
//Export
cadesplugin . JSModuleVersion = "2.1.0" ;
cadesplugin . async _spawn = async _spawn ;
cadesplugin . set = set _pluginObject ;
cadesplugin . set _log _level = set _log _level ;
cadesplugin . getLastError = getLastError ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
if ( isNativeMessageSupported ( ) )
{
cadesplugin . CreateObjectAsync = CreateObjectAsync ;
2017-09-27 14:26:07 +03:00
cadesplugin . ReleasePluginObjects = ReleasePluginObjects ;
2017-04-20 11:33:20 +03:00
}
2017-04-21 10:47:03 +03:00
if ( ! isNativeMessageSupported ( ) )
{
cadesplugin . CreateObject = CreateObject ;
}
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
if ( window . cadesplugin _load _timeout )
{
setTimeout ( check _load _timeout , window . cadesplugin _load _timeout ) ;
}
else
{
setTimeout ( check _load _timeout , 20000 ) ;
}
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
set _constantValues ( ) ;
2017-04-20 11:33:20 +03:00
2017-04-21 10:47:03 +03:00
cadesplugin . current _log _level = cadesplugin . LOG _LEVEL _ERROR ;
window . cadesplugin = cadesplugin ;
check _plugin _working ( ) ;
} ( ) ) ;
2017-04-20 11:33:20 +03:00
2017-11-29 14:16:49 +03:00
/***/ } ,
2017-11-29 15:16:02 +03:00
/* 4 */
2017-11-29 14:16:49 +03:00
/***/ function ( module , exports , _ _webpack _require _ _ ) {
2017-11-29 15:16:02 +03:00
var cryptoCommon = _ _webpack _require _ _ ( 5 ) ,
cryptoConstants = _ _webpack _require _ _ ( 7 ) ,
_certListCache ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
function Certificate ( item ) {
this . _cert = item . _cert ;
this . thumbprint = item . thumbprint ;
this . subjectName = item . subjectName ;
this . issuerName = item . issuerName ;
this . validFrom = item . validFrom ;
this . validTo = item . validTo ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Проверяет , валиден ли сертификат
* * /
Certificate . prototype . isValid = function isValid ( ) {
var cert = this . _cert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function isValid ( ) {
var result ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
result = 'yield' + cert . IsValid ( ) ;
result = 'yield' + result . Result ;
} catch ( err ) {
reject ( 'Ошибка при проверке сертификата: ' , err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( result ) ;
} ) ) ;
} ) ;
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Достает указанное свойство у сертификата
* * /
Certificate . prototype . getProp = function ( propName ) {
var cert = this . _cert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function getProp ( ) {
var result ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
result = 'yield' + cert [ propName ] ;
} catch ( err ) {
reject ( 'Ошибка при обращении к свойству сертификата: ' , err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( result ) ;
} ) ) ;
} ) ;
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Экспорт base64 представления сертификата пользователя
* * /
Certificate . prototype . exportBase64 = function exportBase64 ( ) {
var cert = this . _cert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function exportBase64 ( ) {
var base64 ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
base64 = 'yield' + cert . Export ( 0 ) ;
} catch ( err ) {
reject ( 'Ошибка при экспорте сертификата: ' , err . message ) ;
return ;
}
resolve ( base64 ) ;
} ) ) ;
} ) ;
} ;
2017-11-29 14:16:49 +03:00
/ * *
2017-11-29 15:16:02 +03:00
* Возвращает информацию о б алгоритме
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
Certificate . prototype . getAlgorithm = function getAlgorithm ( ) {
var cert = this . _cert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function getAlgorithm ( ) {
var result = { } ,
algorithm ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
algorithm = 'yield' + cert . PublicKey ( ) ;
algorithm = 'yield' + algorithm . Algorithm ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
result . algorithm = 'yield' + algorithm . FriendlyName ;
result . oid = 'yield' + algorithm . Value ;
} catch ( err ) {
reject ( 'Ошибка при получении алгоритма: ' , err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( result ) ;
} ) ) ;
} ) ;
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Разбирает SubjectName сертификата по тэгам
* * /
Certificate . prototype . getOwnerInfo = function getOwnerInfo ( ) {
return getCertInfo . call ( this , cryptoCommon . subjectNameTagsTranslations , 'SubjectName' ) ;
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Разбирает IssuerName сертификата по тэгам
* * /
Certificate . prototype . getIssuerInfo = function getIssuerInfo ( ) {
return getCertInfo . call ( this , cryptoCommon . issuerNameTagsTranslations , 'IssuerName' ) ;
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Получение OID сертификата
*
* @ returns { Array } Возвращает массив OID ( улучшенного ключа )
* * /
Certificate . prototype . getExtendedKeyUsage = function getExtendedKeyUsage ( ) {
var cert = this . _cert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function getExtendedKeyUsage ( ) {
var OIDS = [ ] ,
count ,
item ;
try {
count = 'yield' + cert . ExtendedKeyUsage ( ) ;
count = 'yield' + count . EKUs ;
count = 'yield' + count . Count ;
if ( count > 0 ) {
while ( count > 0 ) {
item = 'yield' + cert . ExtendedKeyUsage ( ) ;
item = 'yield' + item . EKUs ;
item = 'yield' + item . Item ( count ) ;
item = 'yield' + item . OID ;
OIDS . push ( item ) ;
count -- ;
2017-11-29 14:16:49 +03:00
}
}
2017-11-29 15:16:02 +03:00
} catch ( err ) {
reject ( 'Ошибка при получении ОИД\'ов: ' , err . message ) ;
return ;
2017-11-29 14:16:49 +03:00
}
2017-11-29 15:16:02 +03:00
resolve ( OIDS ) ;
} ) ) ;
} ) ;
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
Certificate . prototype . getDecodedExtendedKeyUsage = cryptoCommon . getDecodedExtendedKeyUsage ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
Certificate . prototype . hasExtendedKeyUsage = cryptoCommon . hasExtendedKeyUsage ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Проверяет корректность настроек ЭП на машине
* * /
function isValidEDSSettings ( ) {
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function isValidEDSSettings ( ) {
var result ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
result = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.About' ) ;
} catch ( error ) {
reject ( 'Настройки ЭП на данной машине не верны' ) ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( ) ;
} ) ) ;
} ) ;
2017-11-29 14:16:49 +03:00
}
/ * *
2017-11-29 15:16:02 +03:00
* Получить сертификат в формате cades по хэшу
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getCadesCert ( hash ) {
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function getCadesCert ( ) {
var oStore = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.Store' ) ,
certs ,
certCnt ,
cert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( ! oStore ) {
reject ( 'Н е удалось получить доступ к хранилищу сертификатов' ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
// Открываем хранилище
try {
2017-11-29 15:19:36 +03:00
void ( 'yield' + oStore . Open (
2017-11-29 15:16:02 +03:00
cadesplugin . CAPICOM _CURRENT _USER _STORE ,
cadesplugin . CAPICOM _MY _STORE ,
cadesplugin . CAPICOM _STORE _OPEN _MAXIMUM _ALLOWED
2017-11-29 15:19:36 +03:00
) ) ;
2017-11-29 15:16:02 +03:00
} catch ( err ) {
reject ( 'Ошибка при открытии хранилища: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
// Получаем доступ к сертификатам
try {
certs = 'yield' + oStore . Certificates ;
certCnt = 'yield' + certs . Count ;
} catch ( err ) {
reject ( 'Ошибка получения списка сертификатов: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( ! certCnt ) {
reject ( 'Нет доступных сертификатов' ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
// Получаем сертификат по хэшу
try {
certs = 'yield' + certs . Find ( cadesplugin . CAPICOM _CERTIFICATE _FIND _SHA1 _HASH , hash ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( certs . Count ) {
cert = 'yield' + certs . Item ( 1 ) ;
} else {
throw new Error ( hash ) ;
}
} catch ( err ) {
reject ( 'Н е удалось получить сертификат по хэшу: ' + err . message ) ;
return ;
}
oStore . Close ( ) ;
resolve ( cert ) ;
} ) ) ;
2017-11-29 14:16:49 +03:00
} ) ;
}
/ * *
2017-11-29 15:16:02 +03:00
* Разбирает информацию сертификата по тэгам
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getCertInfo ( tags , propName ) {
var cert = this . _cert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function getCertInfo ( ) {
var propInfo ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
propInfo = 'yield' + cert [ propName ] ;
} catch ( err ) {
reject ( 'Ошибка при извлечении данных из сертификата: ' , err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( cryptoCommon . parseCertInfo ( tags , propInfo ) ) ;
} ) ) ;
2017-11-29 14:16:49 +03:00
} ) ;
}
/ * *
2017-11-29 15:16:02 +03:00
* Возвращает список сертификатов , доступных в системе
2017-11-29 14:16:49 +03:00
*
2017-11-29 15:16:02 +03:00
* @ param { Boolean } [ resetCache = false ] -- нужно ли сбросить кэш списка сертификатов
* @ returns { Promise } -- с о списком сертификатов { Array }
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getCertsList ( resetCache ) {
return new Promise ( function ( resolve , reject ) {
if ( ! resetCache && _certListCache ) {
resolve ( _certListCache ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
eval ( cryptoCommon . generateAsyncFn ( function getCertsList ( ) {
var oStore = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.Store' ) ,
result = [ ] ,
certs ,
count ,
item ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
// Открываем хранилище
try {
2017-11-29 15:19:36 +03:00
void ( 'yield' + oStore . Open (
2017-11-29 15:16:02 +03:00
cadesplugin . CAPICOM _CURRENT _USER _STORE ,
cadesplugin . CAPICOM _MY _STORE ,
cadesplugin . CAPICOM _STORE _OPEN _MAXIMUM _ALLOWED
2017-11-29 15:19:36 +03:00
) ) ;
2017-11-29 15:16:02 +03:00
} catch ( err ) {
reject ( 'Ошибка при открытии хранилища: ' + err . message ) ;
return ;
2017-11-29 14:16:49 +03:00
}
2017-11-29 15:16:02 +03:00
// Получаем доступ к сертификатам
try {
certs = 'yield' + oStore . Certificates ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( certs ) {
certs = 'yield' + certs . Find ( cadesplugin . CAPICOM _CERTIFICATE _FIND _TIME _VALID ) ;
/ * *
* Н е рассматриваются сертификаты , в которых отсутствует закрытый ключ
* или не действительны на данный момент
* * /
certs = 'yield' + certs . Find (
cadesplugin . CAPICOM _CERTIFICATE _FIND _EXTENDED _PROPERTY ,
cryptoConstants . PropId . CAPICOM _PROPID _KEY _PROV _INFO
) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
count = 'yield' + certs . Count ;
}
} catch ( err ) {
reject ( 'Ошибка получения списка сертификатов: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( ! count ) {
reject ( 'Нет доступных сертификатов' ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
while ( count ) {
item = 'yield' + certs . Item ( count ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
result . push ( new Certificate ( {
_cert : 'yield' + item ,
thumbprint : 'yield' + item . Thumbprint ,
subjectName : 'yield' + item . SubjectName ,
issuerName : 'yield' + item . IssuerName ,
validFrom : 'yield' + item . ValidFromDate ,
validTo : 'yield' + item . ValidToDate
} ) ) ;
count -- ;
}
} catch ( err ) {
reject ( 'Ошибка обработки сертификатов: ' + err . message ) ;
return ;
}
oStore . Close ( ) ;
_certListCache = cryptoCommon . prepareCertsInfo ( result ) ;
resolve ( _certListCache ) ;
} ) ) ;
} ) ;
2017-11-29 14:16:49 +03:00
}
/ * *
2017-11-29 15:16:02 +03:00
* Получить сертификат по хэшу
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getCert ( hash ) {
return new Promise ( function ( resolve , reject ) {
if ( ! hash ) {
reject ( 'Хэш не указан' ) ;
return ;
2017-11-29 14:16:49 +03:00
}
2017-11-29 15:16:02 +03:00
getCertsList ( ) . then ( function ( list ) {
var foundCert ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
list . some ( function ( cert ) {
if ( hash === cert . thumbprint ) {
foundCert = cert ;
return true ;
}
} ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( foundCert ) {
resolve ( foundCert ) ;
} else {
reject ( 'Сертификат с хэшем: "' + hash + '" не найден' ) ;
2017-11-29 14:16:49 +03:00
}
2017-11-29 15:16:02 +03:00
} , reject ) ;
2017-11-29 14:16:49 +03:00
} ) ;
2017-11-29 15:16:02 +03:00
}
2017-11-29 14:16:49 +03:00
/ * *
2017-11-29 15:16:02 +03:00
* Создает подпись base64 строки по hash ' у сертификата
*
* @ param { String } hash -- fingerprint ( thumbprint ) сертификата
* @ param { String } dataBase64 -- строковые данные в формате base64
* @ param { Boolean } signType -- тип подписи открепленная ( true ) / присоединенная ( false ) ( default : true )
* @ returns { Promise } -- обещание , которое зарезолвится с данными о подписи { String }
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function signData ( hash , dataBase64 , signType ) {
signType = typeof signType === 'undefined' ? true : Boolean ( signType ) ;
2017-11-29 14:16:49 +03:00
return new Promise ( function ( resolve , reject ) {
2017-11-29 15:16:02 +03:00
getCadesCert ( hash ) . then ( function ( cert ) {
eval ( cryptoCommon . generateAsyncFn ( function signData ( ) {
var clientTime = new Date ( ) ,
oAttrs = 'yield' + cryptoCommon . createObj ( 'CADESCOM.CPAttribute' ) ,
oSignedData = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.CadesSignedData' ) ,
oSigner = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.CPSigner' ) ,
attrs ,
signature ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
clientTime = cryptoCommon . getDateObj ( clientTime ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
2017-11-29 15:19:36 +03:00
void ( 'yield' + oAttrs . propset _Name ( cryptoConstants . Time . AUTHENTICATED _ATTRIBUTE _SIGNING _TIME ) ) ;
void ( 'yield' + oAttrs . propset _Value ( clientTime ) ) ;
2017-11-29 15:16:02 +03:00
} catch ( err ) {
reject ( 'Ошибка при установке данных подписи: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
// Задаем настройки для подписи
try {
2017-11-29 15:19:36 +03:00
void ( 'yield' + oSigner . propset _Certificate ( cert ) ) ;
2017-11-29 15:16:02 +03:00
attrs = 'yield' + oSigner . AuthenticatedAttributes2 ;
2017-11-29 15:19:36 +03:00
void ( 'yield' + attrs . Add ( oAttrs ) ) ;
void ( 'yield' + oSignedData . propset _ContentEncoding ( cadesplugin . CADESCOM _BASE64 _TO _BINARY ) ) ;
void ( 'yield' + oSignedData . propset _Content ( dataBase64 ) ) ;
void ( 'yield' + oSigner . propset _Options ( cadesplugin . CAPICOM _CERTIFICATE _INCLUDE _END _ENTITY _ONLY ) ) ;
2017-11-29 15:16:02 +03:00
} catch ( err ) {
reject ( 'Н е удалось установить настройки для подписи: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
signature = 'yield' + oSignedData . SignCades (
oSigner ,
cadesplugin . CADESCOM _CADES _BES ,
signType
) ;
} catch ( err ) {
reject ( 'Н е удалось создать подпись: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( signature ) ;
} ) ) ;
} , reject ) ;
2017-11-29 14:16:49 +03:00
} ) ;
2017-11-29 15:16:02 +03:00
}
2017-11-29 14:16:49 +03:00
/ * *
2017-11-29 15:16:02 +03:00
* Создает подпись XML строки по hash ' у сертификата
*
* @ param { String } hash -- fingerprint ( thumbprint ) сертификата
* @ param { String } dataXML -- данные в формате XML
* @ returns { Promise } -- обещание , которое зарезолвится с данными о подписи { String }
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function signDataXML ( hash , dataXML ) {
2017-11-29 14:16:49 +03:00
return new Promise ( function ( resolve , reject ) {
2017-11-29 15:16:02 +03:00
getCadesCert ( hash ) . then ( function ( cert ) {
eval ( cryptoCommon . generateAsyncFn ( function signDataXML ( ) {
var oSigner = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.CPSigner' ) ,
signerXML = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.SignedXML' ) ,
cnts = cryptoConstants ,
signature ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
// Задаем настройки для подписи
try {
2017-11-29 15:19:36 +03:00
void ( 'yield' + oSigner . propset _Certificate ( cert ) ) ;
2017-11-29 15:16:02 +03:00
// Добавляем данные для подписи
2017-11-29 15:19:36 +03:00
void ( 'yield' + signerXML . propset _Content ( dataXML ) ) ;
2017-11-29 15:16:02 +03:00
// Устанавливаем тип подписи
2017-11-29 15:19:36 +03:00
void ( 'yield' + signerXML . propset _SignatureType ( cnts . SignatureType . CADESCOM _XML _SIGNATURE _TYPE _ENVELOPED ) ) ;
2017-11-29 15:16:02 +03:00
// Устанавливаем алгоритм подписи
2017-11-29 15:19:36 +03:00
void ( 'yield' + signerXML . propset _SignatureMethod ( cnts . GostXmlDSigUrls . XmlDsigGost3410Url ) ) ;
2017-11-29 15:16:02 +03:00
// Устанавливаем алгоритм хэширования
2017-11-29 15:19:36 +03:00
void ( 'yield' + signerXML . propset _DigestMethod ( cnts . GostXmlDSigUrls . XmlDsigGost3411Url ) ) ;
2017-11-29 15:16:02 +03:00
} catch ( err ) {
reject ( 'Н е удалось установить настройки для подписи: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
signature = 'yield' + signerXML . Sign ( oSigner ) ;
} catch ( err ) {
reject ( 'Н е удалось создать подпись: ' + err . message ) ;
return ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( signature ) ;
} ) ) ;
} , reject ) ;
2017-11-29 14:16:49 +03:00
} ) ;
2017-11-29 15:16:02 +03:00
}
2017-11-29 14:16:49 +03:00
/ * *
2017-11-29 15:16:02 +03:00
* Возвращает информацию о версии CSP и плагина
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getSystemInfo ( ) {
var sysInfo = cryptoCommon . getEnvInfo ( ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve , reject ) {
eval ( cryptoCommon . generateAsyncFn ( function getSystemInfo ( ) {
var e ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
try {
e = 'yield' + cryptoCommon . createObj ( 'CAdESCOM.About' ) ;
sysInfo . cadesVersion = 'yield' + e . PluginVersion ;
// Возможен вызов в ранних версиях в виде sysInfo.cspVersion = 'yield' + e.CSPVersion('', 75);
sysInfo . cspVersion = 'yield' + e . CSPVersion ( ) ;
if ( ! sysInfo . cadesVersion ) {
sysInfo . cadesVersion = 'yield' + e . Version ;
2017-11-29 14:16:49 +03:00
}
2017-11-29 15:16:02 +03:00
sysInfo . cadesVersion = 'yield' + sysInfo . cadesVersion . toString ( ) ;
sysInfo . cspVersion = 'yield' + sysInfo . cspVersion . toString ( ) ;
resolve ( sysInfo ) ;
2017-11-29 14:16:49 +03:00
} catch ( err ) {
2017-11-29 15:16:02 +03:00
reject ( 'Ошибка при получении информации о системе: ' , err . message ) ;
2017-11-29 14:16:49 +03:00
}
} ) ) ;
} ) ;
2017-11-29 15:16:02 +03:00
}
2017-11-29 14:16:49 +03:00
/ * *
2017-11-29 15:16:02 +03:00
* Promise обертка для синхронного вызова проверки версии CSP
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function isValidCSPVersion ( version ) {
return new Promise ( function ( resolve ) {
resolve ( cryptoCommon . isValidCSPVersion ( version ) ) ;
2017-11-29 14:16:49 +03:00
} ) ;
}
/ * *
2017-11-29 15:16:02 +03:00
* Promise обертка для синхронного вызова проверки версии плагина
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function isValidCadesVersion ( version ) {
return new Promise ( function ( resolve ) {
resolve ( cryptoCommon . isValidCadesVersion ( version ) ) ;
} ) ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
module . exports = {
isValidEDSSettings : isValidEDSSettings ,
getCertsList : getCertsList ,
getCert : getCert ,
signData : signData ,
signDataXML : signDataXML ,
getSystemInfo : getSystemInfo ,
isValidCSPVersion : isValidCSPVersion ,
isValidCadesVersion : isValidCadesVersion
} ;
/***/ } ,
/* 5 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var bowser = _ _webpack _require _ _ ( 1 ) ;
var oids = _ _webpack _require _ _ ( 6 ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
var subjectNameTagsTranslations = [
{ possibleNames : [ 'UnstructuredName' ] , translation : 'Неструктурированное имя' } ,
{ possibleNames : [ 'CN' ] , translation : 'Владелец' } ,
{ possibleNames : [ 'SN' ] , translation : 'Фамилия' } ,
{ possibleNames : [ 'G' ] , translation : 'Имя Отчество' } ,
{ possibleNames : [ 'C' ] , translation : 'Страна' } ,
{ possibleNames : [ 'S' ] , translation : 'Регион' } ,
{ possibleNames : [ 'STREET' ] , translation : 'Адрес' } ,
{ possibleNames : [ 'O' ] , translation : 'Компания' } ,
{ possibleNames : [ 'OU' ] , translation : 'Отдел/подразделение' } ,
{ possibleNames : [ 'T' ] , translation : 'Должность' } ,
{ possibleNames : [ 'ОГРН' , 'OGRN' ] , translation : 'ОГРН' } ,
{ possibleNames : [ 'ОГРНИП' , 'OGRNIP' ] , translation : 'ОГРНИП' } ,
{ possibleNames : [ 'СНИЛС' , 'SNILS' ] , translation : 'СНИЛС' } ,
{ possibleNames : [ 'ИНН' , 'INN' ] , translation : 'ИНН' } ,
{ possibleNames : [ 'E' ] , translation : 'Email' } ,
{ possibleNames : [ 'L' ] , translation : 'Город' }
] ,
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
issuerNameTagsTranslations = [
{ possibleNames : [ 'UnstructuredName' ] , translation : 'Неструктурированное имя' } ,
{ possibleNames : [ 'CN' ] , translation : 'Удостоверяющий центр' } ,
{ possibleNames : [ 'S' ] , translation : 'Регион' } ,
{ possibleNames : [ 'C' ] , translation : 'Страна' } ,
{ possibleNames : [ 'STREET' ] , translation : 'Адрес' } ,
{ possibleNames : [ 'O' ] , translation : 'Компания' } ,
{ possibleNames : [ 'OU' ] , translation : 'Тип' } ,
{ possibleNames : [ 'T' ] , translation : 'Должность' } ,
{ possibleNames : [ 'ОГРН' , 'OGRN' ] , translation : 'ОГРН' } ,
{ possibleNames : [ 'ОГРНИП' , 'OGRNIP' ] , translation : 'ОГРНИП' } ,
{ possibleNames : [ 'СНИЛС' , 'SNILS' ] , translation : 'СНИЛС' } ,
{ possibleNames : [ 'ИНН' , 'INN' ] , translation : 'ИНН' } ,
{ possibleNames : [ 'E' ] , translation : 'Email' } ,
{ possibleNames : [ 'L' ] , translation : 'Город' }
] ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
function generateAsyncFn ( cb ) {
var canAsync = cadesplugin . CreateObjectAsync ;
var dynamicScriptName = cb . name || 'asyncFn' ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
cb = String ( cb ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
var args = cb . match ( /^function[\s\w]*?\((.*?)\)/ ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
args = ( args && args [ 1 ] ) || '' ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
cb = cb . replace ( /^.*?{([\s\S]*?)}$/ , '$1' ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
function GeneratorFunction ( ) {
return ( new Function ( '' , 'return Object.getPrototypeOf(function*(){}).constructor' ) ) ( ) ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
cb = String ( new ( canAsync ? GeneratorFunction ( ) : Function ) ( args , cb ) ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
cb = cb . replace ( /cryptoCommon\.createObj(\([\s\S]*?\))/gm , 'cadesplugin.CreateObject' + ( canAsync ? 'Async' : '' ) + '$1' ) ;
cb = cb . replace ( /("|')(yield)(\1)\s*?\+\s*?\b/gm , canAsync ? '$2 ' : '' ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( ! canAsync ) {
cb = cb . replace ( /propset_(.*?)\((.*?)\)/gm , '$1 = $2' ) ;
}
return ( canAsync ?
'cadesplugin.async_spawn(' + cb + ');'
: '(' + cb + ')();' ) + '//# sourceURL=evaled-' + dynamicScriptName + '.js' ;
2017-11-29 14:16:49 +03:00
}
/ * *
2017-11-29 15:16:02 +03:00
* Парсит информацию из строки с информацией о сертификате
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function parseCertInfo ( tags , infoString ) {
/ * *
* Пример входной строки :
*
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
T = Генеральный директор , UnstructuredName = "INN=7811514257/KPP=781101001/OGRN=1127847087884" ,
STREET = "Крыленко, д.3, лит.Б" , CN = Король Анатолий Евгеньевич , G = Анатолий Евгеньевич , SN = Король ,
OU = Администрация , O = "О О О " "Аксиома" "" , L = Санкт - Петербург , S = 78 г . Санкт - Петербург , C = RU , E = korol @ sferasro . ru ,
INN = 007811514257 , OGRN = 1127847087884 , SNILS = 11617693460
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
* * /
var result = infoString . match ( /([а -яА-Яa-zA-Z0-9\.]+)=(?:("[^"]+?")|(.+?))(?:,|$)/g ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( result ) {
result = result . map ( function ( group ) {
/ * *
* Пример входной строки :
*
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
UnstructuredName = "INN=7811514257/KPP=781101001/OGRN=1127847087884" ,
* * /
var parts = group . match ( /^([а -яА-Яa-zA-Z0-9\.]+)=(.+?),?$/ ) ,
title = parts && parts [ 1 ] ,
descr = parts && parts [ 2 ] ,
translated = false ,
oidTitle ;
// Если тайтл содержит ОИД, пытаемся расшифровать
if ( /^OID./ . test ( title ) ) {
oidTitle = title . match ( /^OID\.(.*)/ ) ;
if ( oidTitle && oidTitle [ 1 ] ) {
oidTitle = oids [ oidTitle [ 1 ] ] ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( oidTitle ) {
title = oidTitle ;
}
2017-11-29 14:16:49 +03:00
}
}
2017-11-29 15:16:02 +03:00
// Вырезаем лишние кавычки
descr = descr . replace ( /^"(.*)"/ , '$1' ) ;
descr = descr . replace ( /"{2}/g , '"' ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
tags . some ( function ( tag ) {
return tag . possibleNames . some ( function ( possible ) {
var match = possible === title ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( match ) {
title = tag . translation ;
translated = true ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return match ;
} ) ;
} ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return {
title : title ,
descr : descr ,
translated : translated
} ;
} ) ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return result ;
2017-11-29 14:16:49 +03:00
}
/ * *
2017-11-29 15:16:02 +03:00
* Возвращает дату в формате ( dd . mm . yyyy hh : mm : ss ) из строки , формата , используемого плагином cryptoPro
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getReadableDate ( date ) {
date = new Date ( date ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return ( [
date . getDate ( ) ,
date . getMonth ( ) + 1 ,
date . getFullYear ( )
] . join ( '.' ) + ' ' + [
date . getHours ( ) ,
date . getMinutes ( ) ,
date . getSeconds ( )
] . join ( ':' ) ) . replace ( /\b(\d)\b/g , '0$1' ) ;
2017-11-29 14:16:49 +03:00
}
/ * *
2017-11-29 15:16:02 +03:00
* Преобразует дату для IE
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getDateObj ( dateObj ) {
return bowser . msie ? dateObj . getVarDate ( ) : dateObj ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Подготавливает информацию о сертификатах
* * /
function prepareCertsInfo ( items ) {
return items . map ( function ( c ) {
c . name = c . subjectName . match ( /CN=(.+?)(?:,|$)/ ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
// Удалось ли вытащить Common Name
if ( c . name && c . name [ 1 ] ) {
c . name = c . name [ 1 ] ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
c . validFrom = getReadableDate ( c . validFrom ) ;
c . validTo = getReadableDate ( c . validTo ) ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
c . label = c . name + ' (до ' + c . validTo + ')' ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return c ;
2017-11-29 14:16:49 +03:00
} ) ;
}
/ * *
2017-11-29 15:16:02 +03:00
* Возвращает расшифрованные ОИД ' ы
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function getDecodedExtendedKeyUsage ( ) {
var that = this ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve ) {
that . getExtendedKeyUsage ( ) . then ( function ( certOids ) {
resolve ( certOids . reduce ( function ( oidsLst , oid ) {
oid = {
id : oid ,
descr : oids [ oid ] || null
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( oid . descr ) {
oidsLst . unshift ( oid ) ;
} else {
oidsLst . push ( oid ) ;
2017-11-29 14:16:49 +03:00
}
2017-11-29 15:16:02 +03:00
return oidsLst ;
} , [ ] ) ) ;
} ) ;
2017-11-29 14:16:49 +03:00
} ) ;
}
/ * *
2017-11-29 15:16:02 +03:00
* Проверка наличия ОИД 'а (ОИД' ов ) у сертификата
*
* @ param { String | Array } oids - ОИД ' ы для проверки
* @ returns { Promise } с отложенным результатом типа { Boolean }
2017-11-29 14:16:49 +03:00
* * /
2017-11-29 15:16:02 +03:00
function hasExtendedKeyUsage ( oids ) {
var that = this ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return new Promise ( function ( resolve ) {
that . getExtendedKeyUsage ( ) . then ( function ( certOids ) {
var result ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( Array . isArray ( oids ) ) {
result = oids . every ( function ( oidToCheck ) {
return certOids . some ( function ( certOid ) {
return certOid === oidToCheck ;
} ) ;
} ) ;
} else {
result = certOids . some ( function ( certOid ) {
return certOid === oids ;
} ) ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
resolve ( result ) ;
} ) ;
} ) ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
/ * *
* Выводит информацию о системе пользователя
* * /
function getEnvInfo ( ) {
var parsed = bowser . _detect ( navigator . userAgent ) ,
info = {
browserName : parsed . name ,
browserVersion : parsed . version
} ;
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
if ( parsed . mac ) {
info . os = 'Mac' ;
} else if ( parsed . windows ) {
info . os = 'Windows' ;
} else if ( parsed . linux ) {
info . os = 'Linux' ;
}
2017-11-29 14:16:49 +03:00
2017-11-29 15:16:02 +03:00
return info ;
2017-11-29 14:16:49 +03:00
}
/ * *
2017-11-29 15:16:02 +03:00
* Подходящая ли версия CSP
2017-11-29 14:16:49 +03:00
* * /
function isValidCSPVersion ( version ) {
2017-11-29 15:16:02 +03:00
version = version . match ( /\d+?\b(?:\.\d+)?/ ) ;
return version >= 3.6 ;
2017-11-29 14:16:49 +03:00
}
/ * *
2017-11-29 15:16:02 +03:00
* Подходящая ли версия cades плагина
2017-11-29 14:16:49 +03:00
* * /
function isValidCadesVersion ( version ) {
2017-11-29 15:16:02 +03:00
version = version . split ( '.' ) . reduce ( function ( verInfo , number , i ) {
if ( i === 0 ) {
verInfo . major = number ;
} else if ( i === 1 ) {
verInfo . minor = number ;
} else if ( i === 2 ) {
verInfo . patch = number ;
}
return verInfo ;
} , { } ) ;
if ( version . major < 2 ) {
return false ;
}
return version . patch >= 12438 ;
2017-11-29 14:16:49 +03:00
}
module . exports = {
2017-11-29 15:16:02 +03:00
generateAsyncFn : generateAsyncFn ,
subjectNameTagsTranslations : subjectNameTagsTranslations ,
issuerNameTagsTranslations : issuerNameTagsTranslations ,
parseCertInfo : parseCertInfo ,
getReadableDate : getReadableDate ,
getDateObj : getDateObj ,
prepareCertsInfo : prepareCertsInfo ,
getDecodedExtendedKeyUsage : getDecodedExtendedKeyUsage ,
hasExtendedKeyUsage : hasExtendedKeyUsage ,
getEnvInfo : getEnvInfo ,
2017-11-29 14:16:49 +03:00
isValidCSPVersion : isValidCSPVersion ,
isValidCadesVersion : isValidCadesVersion
} ;
2017-11-29 15:16:02 +03:00
/***/ } ,
/* 6 */
/***/ function ( module , exports ) {
module . exports = {
'1.2.840.113549.1.9.2' : 'Неструктурированное имя' ,
'1.2.643.3.141.1.1' : 'Р Н С ФСС' ,
'1.2.643.3.141.1.2' : 'КП ФСС' ,
'1.2.643.3.131.1.1' : 'ИНН' ,
'1.3.6.1.5.5.7.3.2' : 'Проверка подлинности клиента' ,
'1.3.6.1.5.5.7.3.4' : 'Защищенная электронная почта' ,
'1.2.643.3.8.100.1' : 'Сертификат типа "ekey-ГОСТ"' ,
'1.2.643.3.8.100.1.1' : 'Общее использование в системах ИОК без права заверения финансовых документов' ,
'1.2.643.3.8.100.1.2' : 'Передача отчетности по Т К С ' ,
'1.2.643.3.8.100.1.3' : 'Оформление взаимных обязательств, соглашений, договоров, актов и т.п.' ,
'1.2.643.3.8.100.1.4' : 'Внутрикорпоративный документооборот' ,
'1.2.643.3.8.100.1.5' : 'Использование в системах электронной торговли' ,
'1.2.643.3.8.100.1.6' : 'Использование в торгово-закупочной системе "ЭЛЕКТРА"' ,
'1.2.643.6.2.1.7.2' : 'Использование физическим лицом в отношениях, связанных с возникновением, исполнением (осуществлением) и прекращением гражданских прав и обязанностей в отношении инвестиционных паев паевых инвестиционных фондов, в том числе отношения, связанные с учетом и/или фиксацией прав на инвестиционные паи паевых инвестиционных фондов' ,
'1.2.643.6.2.1.7.1' : 'Использование единоличным исполнительным органом юридического лица или уполномоченными представителями юридического лица в отношениях, связанных с возникновением, исполнением (осуществлением) и прекращением гражданских и иных прав и обязанностей в сфере негосударственного пенсионного обеспечения, негосударственного пенсионного страхования, в сфере деятельности паевых инвестиционных фондов, акционерных инвестиционных фондов, профессиональных участников рынка ценных бумаг, а также связанной с обслуживанием указанной деятельности услуг кредитных и иных организаций' ,
'1.3.6.1.4.1.29919.21' : 'Использование в системе Портал государственных закупок Ростовской области "Рефери".' ,
'1.2.643.3.2.100.65.13.11' : 'Использование в системе АИС "Госзакупки" Сахалинской области.' ,
'1.2.643.3.8.100.1.7' : 'Использование в системе Портал государственных закупок Ставропольского края.' ,
'1.2.643.3.8.100.1.8' : 'Использование в Единой системе электронной торговли B2B-Center и B2G.' ,
'1.2.643.3.8.100.1.9' : 'Для участия в электронных торгах и подписания государственного контракта в электронной площадке О А О «ЕЭТП» уполномоченными лицами участников размещения государственного или муниципального заказа' ,
'1.2.643.3.8.100.1.10' : 'Для участия в электронных торгах и подписания государственного контракта в информационных системах Тендерного комитета города Москвы уполномоченными лицами участников размещения государственного заказа города Москвы' ,
'1.2.643.3.8.100.1.11' : 'Подписание электронных документов в автоматизированной информационной системе размещения государственного и муниципального заказа Саратовской области' ,
'1.2.643.3.8.100.1.12' : 'Использование в системе государственного заказа Иркутской области' ,
'1.2.643.3.8.100.1.13' : 'Использование в электронной торговой площадке агентства государственного заказа Красноярского края' ,
'1.3.6.1.4.1.24138.1.1.8.1' : 'Обеспечение юридической значимости в Системе "Электронная Торговая Площадка"' ,
'1.2.643.3.8.100.1.14' : 'Использование в электронной торговой площадке "Тендер"' ,
'1.2.643.6.3' : 'Использование в электронных торговых системах и в программном обеспечении, связанным с обменом электронных сообщений' ,
'1.2.643.2.2.34.6' : 'Пользователь Центра Регистрации' ,
'1.2.643.2.39.1.1' : 'Использование в программных продуктах системы "1С :Предприятие 8"' ,
'1.2.643.5.1.24.2.1.3' : 'Формирование документов для получения государственных услуг в сфере ведения государственного кадастра недвижимости с о стороны заявителя' ,
'1.2.643.5.1.24.2.1.3.1' : 'Формирование кадастровым инженером документов для получения государственных услуг в сфере ведения государственного кадастра недвижимости с о стороны заявителя' ,
'1.2.643.5.1.24.2.2.2' : 'Формирование документов как результата оказания услуги с о стороны органов регистрации прав' ,
'1.2.643.5.1.24.2.2.3' : 'Формирование документов для получения государственных услуг в сфере государственной регистрации прав на недвижимое имущество и сделок с ним с о стороны заявителя' ,
'1.2.643.6.3.1.1' : 'Использование на электронных площадок отобранных для проведения аукционах в электронной форме' ,
'1.2.643.6.3.1.2.1' : 'Тип участника - Юридическое лицо' ,
'1.2.643.6.3.1.2.2' : 'Тип участника - Физическое лицо' ,
'1.2.643.6.3.1.2.3' : 'Тип участника - Индивидуальный предприниматель' ,
'1.2.643.6.3.1.3.1' : 'Участник размещения заказа' ,
'1.2.643.6.3.1.4.1' : 'Администратор организации' ,
'1.2.643.6.3.1.4.2' : 'Уполномоченный специалист' ,
'1.2.643.6.3.1.4.3' : 'Специалист с правом подписи контракта' ,
'1.3.643.3.8.100.15' : 'Использование в ЭТП "uTender"'
} ;
/***/ } ,
/* 7 */
/***/ function ( module , exports ) {
module . exports = {
// CAPICOM_STORE_LOCATION enumeration
StoreLocation : {
CAPICOM _MEMORY _STORE : 0 ,
CAPICOM _LOCAL _MACHINE _STORE : 1 ,
CAPICOM _CURRENT _USER _STORE : 2 ,
CAPICOM _ACTIVE _DIRECTORY _USER _STORE : 3 ,
CAPICOM _SMART _CARD _USER _STORE : 4
} ,
// CAPICOM_STORE_OPEN_MODE enumeration
StoreOpenMode : {
CAPICOM _STORE _OPEN _READ _ONLY : 0 ,
CAPICOM _STORE _OPEN _READ _WRITE : 1 ,
CAPICOM _STORE _OPEN _MAXIMUM _ALLOWED : 2 ,
CAPICOM _STORE _OPEN _EXISTING _ONLY : 128 ,
CAPICOM _STORE _OPEN _INCLUDE _ARCHIVED : 256
} ,
// CAPICOM_CERTIFICATE_FIND_TYPE enumeration
CertFindType : {
CAPICOM _CERTIFICATE _FIND _SHA1 _HASH : 0 ,
CAPICOM _CERTIFICATE _FIND _SUBJECT _NAME : 1 ,
CAPICOM _CERTIFICATE _FIND _ISSUER _NAME : 2 ,
CAPICOM _CERTIFICATE _FIND _ROOT _NAME : 3 ,
CAPICOM _CERTIFICATE _FIND _TEMPLATE _NAME : 4 ,
CAPICOM _CERTIFICATE _FIND _EXTENSION : 5 ,
CAPICOM _CERTIFICATE _FIND _EXTENDED _PROPERTY : 6 ,
CAPICOM _CERTIFICATE _FIND _APPLICATION _POLICY : 7 ,
CAPICOM _CERTIFICATE _FIND _CERTIFICATE _POLICY : 8 ,
CAPICOM _CERTIFICATE _FIND _TIME _VALID : 9 ,
CAPICOM _CERTIFICATE _FIND _TIME _NOT _YET _VALID : 10 ,
CAPICOM _CERTIFICATE _FIND _TIME _EXPIRED : 11 ,
CAPICOM _CERTIFICATE _FIND _KEY _USAGE : 12
} ,
Time : {
AUTHENTICATED _ATTRIBUTE _SIGNING _TIME : 0
} ,
Check : {
CHECK _NONE : 0 ,
CHECK _TRUSTED _ROOT : 1 ,
CHECK _TIME _VALIDITY : 2 ,
CHECK _SIGNATURE _VALIDITY : 4 ,
CHECK _ONLINE _REVOCATION _STATUS : 8 ,
CHECK _OFFLINE _REVOCATION _STATUS : 16 ,
TRUST _IS _NOT _TIME _VALID : 1 ,
TRUST _IS _NOT _TIME _NESTED : 2 ,
TRUST _IS _REVOKED : 4 ,
TRUST _IS _NOT _SIGNATURE _VALID : 8 ,
TRUST _IS _NOT _VALID _FOR _USAGE : 16 ,
TRUST _IS _UNTRUSTED _ROOT : 32 ,
TRUST _REVOCATION _STATUS _UNKNOWN : 64 ,
TRUST _IS _CYCLIC : 128 ,
TRUST _IS _PARTIAL _CHAIN : 65536 ,
TRUST _CTL _IS _NOT _TIME _VALID : 131072 ,
TRUST _CTL _IS _NOT _SIGNATURE _VALID : 262144 ,
TRUST _CTL _IS _NOT _VALID _FOR _USAGE : 524288 ,
} ,
// CAPICOM_PROPID enumeration
PropId : {
CAPICOM _PROPID _UNKNOWN : 0 ,
CAPICOM _PROPID _KEY _PROV _HANDLE : 1 ,
CAPICOM _PROPID _KEY _PROV _INFO : 2 ,
CAPICOM _PROPID _SHA1 _HASH : 3 ,
CAPICOM _PROPID _HASH _PROP : 3 ,
CAPICOM _PROPID _MD5 _HASH : 4 ,
CAPICOM _PROPID _KEY _CONTEXT : 5 ,
CAPICOM _PROPID _KEY _SPEC : 6 ,
CAPICOM _PROPID _IE30 _RESERVED : 7 ,
CAPICOM _PROPID _PUBKEY _HASH _RESERVED : 8 ,
CAPICOM _PROPID _ENHKEY _USAGE : 9 ,
CAPICOM _PROPID _CTL _USAGE : 9 ,
CAPICOM _PROPID _NEXT _UPDATE _LOCATION : 10 ,
CAPICOM _PROPID _FRIENDLY _NAME : 11 ,
CAPICOM _PROPID _PVK _FILE : 12 ,
CAPICOM _PROPID _DESCRIPTION : 13 ,
CAPICOM _PROPID _ACCESS _STATE : 14 ,
CAPICOM _PROPID _SIGNATURE _HASH : 15 ,
CAPICOM _PROPID _SMART _CARD _DATA : 16 ,
CAPICOM _PROPID _EFS : 17 ,
CAPICOM _PROPID _FORTEZZA _DATA : 18 ,
CAPICOM _PROPID _ARCHIVED : 19 ,
CAPICOM _PROPID _KEY _IDENTIFIER : 20 ,
CAPICOM _PROPID _AUTO _ENROLL : 21 ,
CAPICOM _PROPID _PUBKEY _ALG _PARA : 22 ,
CAPICOM _PROPID _CROSS _CERT _DIST _POINTS : 23 ,
CAPICOM _PROPID _ISSUER _PUBLIC _KEY _MD5 _HASH : 24 ,
CAPICOM _PROPID _SUBJECT _PUBLIC _KEY _MD5 _HASH : 25 ,
CAPICOM _PROPID _ENROLLMENT : 26 ,
CAPICOM _PROPID _DATE _STAMP : 27 ,
CAPICOM _PROPID _ISSUER _SERIAL _NUMBER _MD5 _HASH : 28 ,
CAPICOM _PROPID _SUBJECT _NAME _MD5 _HASH : 29 ,
CAPICOM _PROPID _EXTENDED _ERROR _INFO : 30 ,
CAPICOM _PROPID _RENEWAL : 64 ,
CAPICOM _PROPID _ARCHIVED _KEY _HASH : 65 ,
CAPICOM _PROPID _FIRST _RESERVED : 66 ,
CAPICOM _PROPID _LAST _RESERVED : 0x00007FFF ,
CAPICOM _PROPID _FIRST _USER : 0x00008000 ,
CAPICOM _PROPID _LAST _USER : 0x0000FFFF
} ,
// CADESCOM_XML_SIGNATURE_TYPE enumeration
SignatureType : {
CADESCOM _XML _SIGNATURE _TYPE _ENVELOPED : 0 ,
CADESCOM _XML _SIGNATURE _TYPE _ENVELOPING : 1 ,
CADESCOM _XML _SIGNATURE _TYPE _TEMPLATE : 2
} ,
// CADESCOM_HASH_ALGORITHM enumeration
HashAlgorithm : {
CADESCOM _HASH _ALGORITHM _CP _GOST _3411 : 100 ,
CADESCOM _HASH _ALGORITHM _MD2 : 1 ,
CADESCOM _HASH _ALGORITHM _MD4 : 2 ,
CADESCOM _HASH _ALGORITHM _MD5 : 3 ,
CADESCOM _HASH _ALGORITHM _SHA _256 : 4 ,
CADESCOM _HASH _ALGORITHM _SHA _384 : 5 ,
CADESCOM _HASH _ALGORITHM _SHA _512 : 6 ,
CADESCOM _HASH _ALGORITHM _SHA1 : 0
} ,
CadesType : {
CADESCOM _CADES _DEFAULT : 0 ,
CADESCOM _CADES _BES : 1 ,
CADESCOM _CADES _X _LONG _TYPE _1 : 0x5d
} ,
ContentEncoding : {
CADESCOM _BASE64 _TO _BINARY : 0x01 ,
CADESCOM _STRING _TO _UCS2LE : 0x00
} ,
StoreNames : {
CAPICOM _MY _STORE : 'My'
} ,
Chain : {
CAPICOM _CERTIFICATE _INCLUDE _CHAIN _EXCEPT _ROOT : 0 ,
CAPICOM _CERTIFICATE _INCLUDE _WHOLE _CHAIN : 1 ,
CAPICOM _CERTIFICATE _INCLUDE _END _ENTITY _ONLY : 2
} ,
GostXmlDSigUrls : {
XmlDsigGost3410Url : 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411' ,
XmlDsigGost3411Url : 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411' ,
XmlDsigGost3410UrlObsolete : 'http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411' ,
XmlDsigGost3411UrlObsolete : 'http://www.w3.org/2001/04/xmldsig-more#gostr3411'
}
} ;
2017-01-17 13:22:49 +03:00
/***/ }
/******/ ] ) ;
//# sourceMappingURL=crypto-pro.js.map