Current Path : /var/www/html/clients/wodo.e-nk.ru/bitrix/otp/ |
Current File : /var/www/html/clients/wodo.e-nk.ru/bitrix/otp/index.html |
<!DOCTYPE html> <html manifest="/bitrix/otp/manifest.php"> <head> <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0"/> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <link rel="apple-touch-icon" sizes="114x114" href="icon.png"/> <link rel="apple-touch-icon" sizes="72x72" href="icon.png"/> <link rel="apple-touch-icon-precomposed" href="icon.png"/> <link rel="apple-touch-startup-image" href="startup.png"> <link rel="stylesheet" href="jquery.mobile-1.0a3.min.css" /> <link rel="stylesheet" href="otp.css" /> <script type="text/javascript" src="jquery-1.5.min.js"></script> <script type="text/javascript" src="lang.js"></script> <script type="text/javascript" src="otp.js"></script> <script type="text/javascript" src="jquery.mobile-1.0a3.min.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Bitrix OTP</title> </head> <body> <script> window.addEventListener('load', function(e) { window.applicationCache.addEventListener('updateready', function(e) { if (window.applicationCache.status == window.applicationCache.UPDATEREADY) { window.applicationCache.swapCache(); if (confirm(GetMessage('confupdate'))) { window.location.reload(); } } }, false); }, false); function isOnline() { if(navigator.userAgent.indexOf('iPhone')!=-1 || navigator.userAgent.indexOf('iPad')!=-1 || navigator.userAgent.indexOf('Android')!=-1) return navigator.onLine; return true; } function errorHandler(transaction, error) { alert(GetMessage('alertsave')+' '+error.message+' (Code '+error.code+')'); return true; } function goTo(id, page) { sessionStorage.curSiteID = id; $.mobile.changePage(page); } var protocol = 'https://'; function sslAjaxCall(url, data, success, error) { protocol = 'https://'; $.ajax({ 'url': 'https://' + url, 'type': 'POST', 'timeout': 5000, 'data': data, 'success': success, 'error': function(e) { if(e.status>=400) error(e); else { protocol = 'http://'; $.ajax({ 'url': 'http://' + url, 'type': 'POST', 'timeout': 10000, 'data': data, 'success': success, 'error': error }); } } }); } ///// function getSiteRows(id, F) { db.transaction( function(transaction) { transaction.executeSql( 'SELECT * FROM sites WHERE id=?;', [id], function (transaction, result) { if(result.rows.length!=1) F(false); else F(result.rows.item(0)); }, errorHandler ); } ); } function getNextOtp() { getSiteRows(sessionStorage.curSiteID, function (siteRows) { var str = ''; str = ''+HOTP(siteRows.position+1, siteRows.secret); db.transaction( function(transaction) { transaction.executeSql( 'UPDATE sites SET position=? WHERE id=?', [siteRows.position+1, siteRows.id], function (transaction, result) { }, errorHandler ); } ); $('#passwordfield').slideDown('fast'); $('#otppassword').html(str); setTimeout(function () { $('#getOtpLink').hide(); $('#getOtpLink2').show(); }, 500); //$('#get_content').page(); } ); } function deleteSite() { getSiteRows(sessionStorage.curSiteID, function (siteRows) { if(!siteRows) $.mobile.changePage('#home'); else { if($('#unreg').attr('value') != "on") deleteSiteRow(); else { var login = $("#delete").find("#login").attr('value'); var password = $("#delete").find("#password").attr('value'); if(login.length<=0 || password.length<=0) alert(GetMessage('alertlogin')); else { var str = HOTP(siteRows.position+1, siteRows.secret); db.transaction( function(transaction) { transaction.executeSql( 'UPDATE sites SET position=? WHERE id=?', [siteRows.position+1, siteRows.id], function (transaction, result) { }, errorHandler ); } ); password += str; var data = {'action': 'unregister', 'login': login, 'password': password, 'secret': siteRows.secret}; if($('#delcaptchablock').css('display') != 'none') { data['delcaptcha_sid'] = $("#delcaptcha_sid").attr('value'); data['delcaptcha_word'] = captcha; } sslAjaxCall( siteRows.url + '/bitrix/otp/ws/index.php', data, deleteSiteRow, function(e) { $.mobile.pageLoading(true); if(e.status==401) { if(confirm(GetMessage('confdelete1'))) deleteSiteRow(); var ob = false; try{ eval('ob = ' + e.responseText); }catch(e){} if(ob && ob.captchaCode) { $('#delcaptchablock').show(); $('#delcaptcha_sid').attr('value', ob.captchaCode); $('#delcaptcha_word').attr('value', ''); $('#delcaptcha_img').attr('src', protocol + site + '/bitrix/tools/captcha.php?captcha_sid='+ob.captchaCode); } } else if(confirm(GetMessage('confdelete2')+' ('+e.status+').' + GetMessage('confdelete3'))) deleteSiteRow(); } ); } } } } ); } function deleteSiteRow() { db.transaction( function(transaction) { transaction.executeSql( 'DELETE FROM sites WHERE id=?;', [sessionStorage.curSiteID], function (transaction, result) { }, errorHandler ); } ); $.mobile.changePage('#home'); } function saveSite() { var name = $("#edit").find("#name").attr('value'); var site = $("#edit").find("#site").attr('value'); var secret = $("#edit").find("#secret").attr('value'); if(name.length<=0) alert(GetMessage('alertdesc')); else if(site.length<=0) alert(GetMessage('alerturl')); else if(secret.length<=0) alert(GetMessage('alertsecret')); else { db.transaction( function(transaction) { transaction.executeSql( 'UPDATE sites SET url=?, name=?, secret=? WHERE id=?;', [site, name, secret, sessionStorage.curSiteID], function(){ $.mobile.changePage('#home'); }, errorHandler ); } ); } } function onClickAddSite() { if(!isOnline()) { alert(GetMessage('alertinet')); return false; } $.mobile.changePage("#add"); } function onClickAddNew() { var name = $("#add").find("#name").attr('value'); var site = $("#add").find("#site").attr('value'); if(site.indexOf("://")>-1) site = site.substring(site.indexOf("://")+3); if(site.indexOf("/")>-1) site = site.substring(0, site.indexOf("/")); var login = $("#add").find("#login").attr('value'); var password = $("#add").find("#password").attr('value'); var captcha = $("#add").find("#captcha_word").attr('value'); if(site.length<=0) alert(GetMessage('alerturl')); else if(name.length<=0) alert(GetMessage('alertdesc')); else if(login.length<=0 || password.length<=0) alert(GetMessage('alertpass')); else { $.mobile.pageLoading(); var secret = GenNewSecret(); function fsucc(html) { // проверить ответ db.transaction( function(transaction) { transaction.executeSql( 'INSERT INTO sites (url, name, secret, position) VALUES (?, ?, ?, ?);', [site, name, secret, 0], function(){ $.mobile.changePage('#home'); }, errorHandler ); } ); $.mobile.pageLoading(true); }; var data = {'action': 'register', 'login': login, 'password': password, 'secret': secret}; if($('#captchablock').css('display') != 'none') { data['captcha_sid'] = $("#add").find("#captcha_sid").attr('value'); data['captcha_word'] = captcha; } sslAjaxCall( site + '/bitrix/otp/ws/index.php', data, fsucc, function(e) { if(e.status==401) { alert(GetMessage('alertablogin')); var ob = false; try{ eval('ob = ' + e.responseText); }catch(e){} if(ob && ob.captchaCode) { $('#captchablock').show(); $('#captcha_sid').attr('value', ob.captchaCode); $('#captcha_word').attr('value', ''); $('#captcha_img').attr('src', protocol + site + '/bitrix/tools/captcha.php?captcha_sid='+ob.captchaCode); } } else if(confirm(GetMessage('alertregerr1')+' ('+e.status+'). '+GetMessage('alertregerr2'))) fsucc(); $.mobile.pageLoading(true); } ); } } //// var firstTime = true; function onHomePageShow() { if((navigator.userAgent.indexOf('iPhone')!=-1 || navigator.userAgent.indexOf('iPad')!=-1) && !window.navigator.standalone) { if(navigator.userAgent.indexOf('iPhone')!=-1) $('#home_content').css('background', 'url(images/arrow.png) no-repeat bottom center').css('min-height', '400px'); $('#addbtn').hide(); var v = navigator.appVersion.match(/OS \d+_\d+/g); v = v ? v[0].replace(/[^\d_]/g, "").replace("_", ".") * 1 : 0, $('#home_content').html(GetMessage('inst').replace('#icon#', '<img height="20" src="images/iphone'+(v>=4.2?'4':'3')+'.png">')); return; } db.transaction( function(transaction) { transaction.executeSql( 'SELECT * FROM sites ORDER BY id;', [], function (transaction, result) { var str = ''; if(firstTime) { firstTime = false; if(result.rows.length == 1) { goTo(result.rows.item(0).id, "#get"); } } if(result.rows.length>0) { str = '<ul data-role="listview" id="listsites">'; for (var i=0; i < result.rows.length; i++) { var row = result.rows.item(i); str += '<li><a onclick="goTo('+row.id+', \'#get\')"><h3>'+row.name+'</h3></a></li>'; } str += '</ul>'; } else { str = GetMessage('addnew'); } $('#home_content').empty(); $(str).appendTo($('#home_content')); $('#listsites').page(); }, errorHandler ); } ); } $('#home').live('pagebeforeshow', onHomePageShow); function onGetPageShow() { getSiteRows(sessionStorage.curSiteID, function (siteRows) { if(siteRows) $('#gettitle').html(siteRows.name); else $.mobile.changePage('#home'); } ); } $('#get').live('pagebeforeshow', onGetPageShow); function onAddPage() { $("#add_content").find("#name").attr('value', ''); $("#add_content").find("#site").attr('value', ''); $("#add_content").find("#login").attr('value', ''); $("#add_content").find("#password").attr('value', ''); $('#captcha_word').attr('value', ''); $('#captchablock').hide(); } $('#add').live('pagebeforeshow', onAddPage); function onDeletePage() { $('#delcaptcha_word').attr('value', ''); $('#delcaptchablock').hide(); $("#delete_content").find("#login").attr('value', ''); $("#delete_content").find("#password").attr('value', ''); } $('#delete').live('pagebeforeshow', onDeletePage); function onEditPage() { getSiteRows(sessionStorage.curSiteID, function (siteRows) { if(siteRows) { $("#edit_content").find("#name").attr('value', siteRows.name); $("#edit_content").find("#site").attr('value', siteRows.url); $("#edit_content").find("#secret").attr('value', siteRows.secret); } else $.mobile.changePage('#home'); } ); } $('#edit').live('pagebeforeshow', onEditPage); </script> <div data-role="page" id="home" data-theme="b"> <div data-role="header" data-nobackbtn="true"> <a href="#add" data-icon="plus" data-transition="pop" style="display:none"></a> <h1 data-lang="title">Bitrix OTP</h1> <a onclick="onClickAddSite()" data-icon="plus" id="addbtn" data-transition="pop" class="ui-btn-right" data-lang="add">Добавить</a> </div> <div data-role="content" id="home_content"> <div style="width:100%;min-height:200px;text-align: center; padding-top: 120px; "> <span style="background: url(./images/loading.gif) no-repeat top left; padding-left: 21px; height: 18px;" data-lang="wait">Пожалуйста, подождите....</span> </div> </div> </div> <div data-role="page" id="get" data-theme="b"> <div data-role="header"> <a href="#home" data-direction="reverse" data-lang="sitebut">Сайты</a> <h1 id="gettitle" data-lang="pwdtitle">Пароль</h1> <a href="#edit" data-transition="pop" class="ui-btn-right" data-lang="edit">Изменить</a> </div> <div data-role="content" id="get_content"> <div id="passwordfield" style="display: none;"> <span data-lang="yourpwd">Ваш одноразовый пароль для сайта:</span> <div id="otppassword"></div> </div> <a onclick="getNextOtp();" id="getOtpLink" data-transition="pop" data-role="button" data-lang="getpwd">Получить пароль</a> <a onclick="getNextOtp();" id="getOtpLink2" data-transition="pop" data-role="button" style="display:none" data-lang="getpwd2">Получить другой пароль</a> <br> <span data-lang="notespwd">Одноразовый пароль (см. 2 на рисунке) вводится в поле "Пароль" стандартной формы авторизации на сайте сразу после обычного пароля (см. 1 на рисунке) без пробелов:<br><br><img src="./images/ru_pass_form.jpg"><span> </div> </div> <div data-role="page" id="add" data-theme="b"> <div data-role="header" data-nobackbtn="true"> <a href="#home" data-direction="reverse" data-lang="cancel">Отменить</a> <h1 data-lang="newtitle">Новый сайт</h1> <a onclick="onClickAddNew()" data-icon="arrow-r" class="ui-btn-right" data-lang="next">Далее</a> </div> <div data-role="content" id="add_content"> <div data-role="fieldcontain"> <label for="site" data-lang="url">Адрес сайта:</label> <input type="text" name="site" autocapitalize="off" autocorrect="off" id="site" onchange="if($('#add').find('#name').attr('value').length<=0)$('#add').find('#name').attr('value', this.value)" placeholder="www.yoursite.com" value="" /> <label for="name" data-lang="descr">Описание:</label> <input type="text" name="name" id="name" data-lang="req" data-lang-attr="placeholder" placeholder="Обязательно" value="" /> <label for="login" data-lang="login">Имя входа на сайт:</label> <input type="text" autocapitalize="off" autocorrect="off" name="login" id="login" data-lang="req" data-lang-attr="placeholder" placeholder="Обязательно" value="" /> <label for="password" data-lang="password">Пароль:</label> <input type="password" name="password" id="password" value="" /> <div id="captchablock" style="display: none"> <label for="captcha_word" data-lang="captcha">Защита:</label> <img id="captcha_img" width="180" height="40" alt="CAPTCHA" /> <input type="hidden" id="captcha_sid" value=""/> <input type="text" autocapitalize="off" autocorrect="off" name="captcha_word" data-lang="capt" data-lang-attr="placeholder" id="captcha_word" maxlength="50" value="" placeholder="Введите текст на картинке"/> </div> </div> </div> </div> <div data-role="page" data-theme="b" id="edit"> <div data-role="header" data-nobackbtn="true"> <a href="#home" data-direction="reverse" data-lang="cancel">Отменить</a> <h1 data-lang="edittitle">Редактирование</h1> <a onclick="saveSite()" class="ui-btn-right" data-lang="save">Сохранить</a> </div> <div data-role="content" id="edit_content"> <div data-role="fieldcontain"> <label for="name" data-lang="url">Адрес сайта:</label> <input type="text" autocapitalize="off" autocorrect="off" name="site" id="site" data-lang="req" data-lang-attr="placeholder" value="" placeholder="Обязательно" /> <label for="name" data-lang="descr">Описание:</label> <input type="text" name="name" id="name" data-lang="req" data-lang-attr="placeholder" value="" placeholder="Обязательно" /> <label for="name" data-lang="secret">Секретный ключ:</label> <input type="text" name="secret" autocapitalize="off" autocorrect="off" id="secret" value="" /> </div> <div data-role="fieldcontain"><br><br><br> <a href="#delete" data-transition="pop" data-role="button" data-theme="r" data-lang="delete">Удалить</a> </div> </div> </div> <div data-role="page" data-theme="b" id="delete"> <div data-role="header" data-nobackbtn="true"> <a href="#home" data-direction="reverse" data-lang="cancel">Отменить</a> <h1 data-lang="deltitle">Удаление</h1> <a onclick="deleteSite()" data-icon="delete" class="ui-btn-right" data-lang="delete">Удалить</a> </div> <div data-role="content" id="delete_content"> <div data-lang="delwarn">Внимание! Вся информация связанная с авторизацией на сайте будет удалена. Для корректного удаления необходимо разрегистрировать устройство на сайте.</div> <div data-role="fieldcontain"> <label for="slider" data-lang="unreg">Разрегистрировать устройство:</label> <select name="unreg" id="unreg" data-role="slider" onchange="if(this.value=='on')$('#unregparams').slideDown('fast'); else $('#unregparams').slideUp('fast');"> <option value="off" data-lang="no">Нет</option> <option value="on" selected="selected" data-lang="yes">Да</option> </select> </div> <div data-role="fieldcontain" id="unregparams"> <label for="name" data-lang="login">Имя входа на сайт:</label> <input type="text" autocapitalize="off" autocorrect="off" name="login" id="login" data-lang="req" data-lang-attr="placeholder" placeholder="Обязательно" value="" /><br> <label for="name" data-lang="password2">Пароль (без одноразового пароля OTP):</label> <input type="password" name="password" id="password" value="" /> <div id="delcaptchablock" style="display: none"> <label for="delcaptcha_word" data-lang="captcha">Защита:</label> <img id="delcaptcha_img" width="180" height="40" alt="CAPTCHA" /> <input type="hidden" id="delcaptcha_sid" value=""/> <input type="text" name="delcaptcha_word" autocapitalize="off" autocorrect="off" id="delcaptcha_word" maxlength="50" value="" data-lang="entcapt" data-lang-attr="placeholder" placeholder="Введите текст на картинке"/> </div> </div> </div> </div> </body> </html>