Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
HTML Block

<html>
<head>
<meta charset="UTF-8">

<script type="text/javascript" src="rutoken.js"></script>
<script type="text/javascript" src="scripts.js"></script>

<title>Rutoken Plugin Tutorial</title>
</head>
<body>
<pre>
- - - - - - - - - - - - - - - - подготовьте Рутокен- - - - - - - - - - - - - - - - - - - - - -
| |
Для работы этой странички требуется ключевая пара и сертификат. <a href="http://ra.rutoken.ru">Создайте их на ra.rutoken.ru</a>
| |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
</pre>
<div id="pluginStatus"><pre>Загрузка Плагина...</pre></div>
<textarea rows="10" cols="95" id="textToSign" placeholder="Введите текст для подписи"></textarea><br/>
<button id="signButton" onclick="sign()" style="display: block; background: none; border: 4px solid black; font-family: monospace; width: 20em; height: 3em; text-align: center; cursor: pointer;">Подписать текст</button>
</body>
</html>

Mainpagestyle
var rutoken = (function (my) {
    var loadCallbacks = [];
    var pluginMimeType = "application/x-rutoken-pki";
    var extension = window["C3B7563B-BF85-45B7-88FC-7CFF1BD3C2DB"];
    function isFunction (obj) {
        return !!(obj && obj.call && obj.apply);
    }
    function proxyMember (target, member) {
        if (isFunction(target[member])) {
            return function () {
                return target[member].apply(target, arguments);
            };
        } else {
            return target[member];
        }
    }
    function returnPromise (promise) {
        return function () {
            return promise;
        };
    }
    function initialize () {
        my.ready = Promise.resolve(true);
        my.isExtensionInstalled = returnPromise(Promise.resolve(false));
        my.isPluginInstalled = returnPromise(Promise.resolve(true));
        my.loadPlugin = loadPlugin;
        window.rutokenLoaded = onPluginLoaded;
    }
    function initializeExtension() {
        var readyPromise = extension.initialize().then(function () {
            return extension.isPluginInstalled();
        }).then(function (result) {
            my.isExtensionInstalled = returnPromise(Promise.resolve(true));
            my.isPluginInstalled = proxyMember(extension, "isPluginInstalled");
            if (result) {
                pluginMimeType = "application/x-rutoken-plugin";
                my.loadPlugin = loadChromePlugin;
            }
            return true;
        });
        my.ready = readyPromise;
    }
    function initializeWithoutPlugin () {
        my.ready = Promise.resolve(true);
        my.isExtensionInstalled = returnPromise(Promise.resolve(false));
        my.isPluginInstalled = returnPromise(Promise.resolve(false));
    }
    function loadPlugin () {
        var obj = document.createElement("object");
        obj.style.setProperty("visibility", "hidden", "important");
        obj.style.setProperty("width", "0px", "important");
        obj.style.setProperty("height", "0px", "important");
        obj.style.setProperty("margin", "0px", "important");
        obj.style.setProperty("padding", "0px", "important");
        obj.style.setProperty("border-style", "none", "important");
        obj.style.setProperty("border-width", "0px", "important");
        obj.style.setProperty("max-width", "0px", "important");
        obj.style.setProperty("max-height", "0px", "important");
        // onload callback must be set before type attribute in IE earlier than 11.
        obj.innerHTML = "<param name='onload' value='rutokenLoaded'/>";
        // Just after setting type attribute before function returns promise
        // FireBreath uses onload callback to execute it with a small delay.
        // So it must be valid, but it will be called a little bit later.
        // In other browsers plugin will be initialized only after appending
        // an element to the document.
        obj.setAttribute("type", pluginMimeType);
        document.body.appendChild(obj);
        var promise = new Promise(function (resolve, reject) {
            loadCallbacks.push(resolve);
        });
        return promise;
    }
    function loadChromePlugin () {
        return extension.loadPlugin().then(function (plugin) {
            return resolveObject(plugin);
        }).then(function (resolvedPlugin) {
            resolvedPlugin.wrapWithOldInterface = wrapNewPluginWithOldInterface;
            return resolvedPlugin;
        });
    }
    function onPluginLoaded (plugin, error) {
        wrapOldPluginWithNewInterface(plugin).then(function (wrappedPlugin) {
            if (loadCallbacks.length == 0) {
                throw "Internal error";
            }
            var callback = loadCallbacks.shift();
            callback(wrappedPlugin);
        });
    }
    function resolveObject (obj) {
        var resolvedObject = {};
        var promises = [];
        for (var m in obj) {
            (function (m) {
                if (isFunction(obj[m].then)) {
                    promises.push(obj[m].then(function (result) {
                        return resolveObject(result).then(function (resolvedProperty) {
                            if (isFunction(resolvedProperty)) {
                                resolvedObject[m] = proxyMember(obj, m);
                            } else {
                                resolvedObject[m] = resolvedProperty;
                            }
                        });
                    }));
                } else {
                    resolvedObject[m] = obj[m];
                }
            })(m);
        }
        if (promises.length == 0) {
            return new Promise(function (resolve) {
                resolve(obj);
            });
        } else {
            return Promise.all(promises).then(function () {
                return resolvedObject;
            });
        }
    }
    function wrapNewPluginWithOldInterface () {
        var wrappedPlugin = {};
        for (var m in this) {
            if (isFunction(this[m])) {
                wrappedPlugin[m] = (function(plugin, member) {
                    return function() {
                        var successCallback = arguments[arguments.length - 2];
                        var errorCallback = arguments[arguments.length - 1];
                        var args = Array.prototype.slice.call(arguments, 0, -2);
                        return member.apply(plugin, args).then(function (result) {
                            successCallback(result);
                        }, function (error) {
                            errorCallback(error.message);
                        });
                    };
                })(this, this[m]);
            } else {
                wrappedPlugin[m] = this[m];
            }
        }
        return new Promise(function (resolve) {
            resolve(wrappedPlugin);
        });
    }
    function wrapOldPluginWithOldInterface () {
        var unwrappedPlugin = { originalObject: this.originalObject };
        
        for (var m in this.originalObject) {
            unwrappedPlugin[m] = proxyMember(this.originalObject, m);
        }
        return new Promise(function (resolve) {
            resolve(unwrappedPlugin);
        });
    }
    function wrapOldPluginWithNewInterface (plugin) {
        var wrappedPlugin = {
            originalObject: plugin,
            wrapWithOldInterface: wrapOldPluginWithOldInterface
        };
        for (var m in plugin) {
            if (isFunction(plugin[m])) {
                wrappedPlugin[m] = (function (plugin, member) {
                    return function() {
                        var args = Array.prototype.slice.call(arguments);
                        return new Promise(function (resolve, reject) {
                            args.push(resolve, reject);
                            member.apply(plugin, args);
                        });
                    };
                })(plugin, plugin[m]);
            } else {
                wrappedPlugin[m] = plugin[m];
            }
        }
        return new Promise(function (resolve) {
            resolve(wrappedPlugin);
        });
    }
    if (extension) {
        initializeExtension();
    } else if (navigator.mimeTypes && navigator.mimeTypes[pluginMimeType]) {
        initialize();
    } else {
        try {
            var plugin = new ActiveXObject("Aktiv.CryptoPlugin");
            initialize();
        } catch (e) {
            initializeWithoutPlugin();
        }
    }
    return my;
}(rutoken || {}));
if (typeof module !== 'undefined') {
    module.exports = rutoken;
}