nc_auth = function ( settings ) { if ( !settings ) settings = {}; // проверять логин this.check_login = settings.check_login;// || true; // минимальная длина пароля this.pass_min = settings.pass_min || 0; // id input'a для логина this.login_id = '#' + (settings.login_id || 'f_Login'); // id input'a для пароля this.pass1_id = '#' + (settings.pass1_id || 'Password1'); // id input'a для подтверждения пароля this.pass2_id = '#' + (settings.pass2_id || 'Password2'); // id элемента "ждите" this.wait_id = '#' + (settings.wait_id || 'nc_auth_wait'); // id элемента "логин свободен" this.login_ok_id = '#' + (settings.login_ok_id || 'nc_auth_login_ok'); // id элемента "логин занят" this.login_fail_id = '#' + (settings.login_fail_id || 'nc_auth_login_fail'); // id элемента "логин содержит запрещенные символы" this.login_incorrect_id = '#' + (settings.login_incorrect_id || 'nc_auth_login_incorrect'); // id элемента "надежность пароля" this.pass1_security = '#' + (settings.pass1_security || 'nc_auth_pass1_security'); // id элемента "пароль не может быть пустым" this.pass1_empty = '#' + (settings.pass1_empty || 'nc_auth_pass1_empty'); // id элемента "пароли совпадают" this.pass2_ok_id = '#' + (settings.pass2_ok_id || 'nc_auth_pass2_ok'); // id элемента "пароли не совпадают" this.pass2_fail_id = '#' + (settings.pass2_fail_id || 'nc_auth_pass2_fail'); if ( this.check_login && this.check_login != "0" ) { jQuery(this.login_id).change ( function() { nc_auth_obj.check_loginf() } ); jQuery(this.login_id).keypress( function() { jQuery('.nc_auth_login_check').hide() } ); this.check_loginf(); } if ( settings.check_pass && settings.check_pass != "0") jQuery(this.pass1_id).bind ( 'keyup change', function() { nc_auth_obj.check_pass() } ); if ( settings.check_pass2 && settings.check_pass2 != "0") jQuery(this.pass2_id).bind ( 'keyup change', function() { nc_auth_obj.check_pass2() } ); this.cache_pass = ''; } nc_auth.prototype = { check_loginf : function () { if ( !jQuery(this.login_id).val().length ) { jQuery('.nc_auth_login_check').hide(); jQuery('.nc_auth_pass1_check').hide(); jQuery('.nc_auth_pass2_check').hide(); return false; } jQuery.post(NETCAT_PATH + 'modules/auth/ajax.php', 'act=check_login&login='+jQuery(this.login_id).val(), function(res) { nc_auth_obj.check_login_res(res); }, "json" ); this.process = true; jQuery('.nc_auth_login_check').hide(); jQuery('.nc_auth_pass1_check').hide(); jQuery('.nc_auth_pass2_check').hide(); jQuery(this.wait_id).show(); return false; }, check_login_res : function ( res ) { jQuery('.nc_auth_login_check').hide(); jQuery('.nc_auth_pass1_check').hide(); jQuery('.nc_auth_pass2_check').hide(); if ( res == 2 ) { jQuery(this.login_fail_id).show(); } else if ( res == 1 ) { jQuery(this.login_incorrect_id).show(); } else { jQuery(this.login_ok_id).show(); } }, check_pass : function () { var p = jQuery(this.pass1_id).val(); // кэширование во избежание одинаковых проверок if ( this.cache_pass == p ) return false; this.cache_pass = p; jQuery('.nc_auth_pass1_check').hide(); var l = p.length; if ( !l ) { jQuery(this.pass1_empty).show(); jQuery(this.pass1_security).hide(); return false; } else { jQuery(this.pass1_empty).hide(); } if ( l < this.pass_min ) { jQuery("#nc_auth_pass_min").show(); jQuery(this.pass1_security).hide(); return false; } jQuery("#nc_auth_pass_min").hide(); // количетво множеств, из которых составлен пароль ( a-z, A-Z, 0-9, остальные) var s = 0; var expr1 = new RegExp('[a-z]'); var expr2 = new RegExp('[A-Z]'); var expr3 = new RegExp('[0-9]'); var expr4 = new RegExp('[^a-zA-Z0-9]'); if ( expr1.test(p) ) s++; if ( expr2.test(p) ) s++; if ( expr3.test(p) ) s++; if ( expr4.test(p) ) s++; jQuery(this.pass1_security).show(); if ( s == 4 && l >= 12 ) { jQuery('#nc_auth_pass1_s4').show(); } else if ( s >= 3 && l >= 8 ) { jQuery('#nc_auth_pass1_s3').show(); } else if ( s >= 2 && l >= 6 ) { jQuery('#nc_auth_pass1_s2').show(); } else { jQuery('#nc_auth_pass1_s1').show(); } if ( jQuery(this.pass2_id).val() ) this.check_pass2(); return false; }, check_pass2 : function () { jQuery('.nc_auth_pass2_check').hide(); if ( jQuery(this.pass1_id).val() == jQuery(this.pass2_id).val() ) { jQuery(this.pass2_ok_id).show(); } else { jQuery(this.pass2_fail_id).show(); } } } nc_auth_token = function ( settings ) { // случайное числов this.randnum = settings.randnum || 0; // id формы this.form_id = settings.form_id || 'nc_auth_form'; // id селекта с логинами this.select_id = settings.select_id || 'nc_token_login'; // id input'a для ввода нового логина this.login_id = settings.login_id || 'nc_token_login'; // id скрытого поля с цифровой подписью/публичный ключом this.token_id = settings.token_id || 'nc_token_signature'; // id объекта-плагина this.plugin_id = settings.plugin_id || 'nc_token_plugin'; this.plugin = document.getElementById(this.plugin_id); } nc_auth_token.prototype = { load : function () { if ( !this.plugin.rtwIsTokenPresentAndOK() ) return false; i=0; this.plugin.rtwGetNumberOfContainers(); while ( (cont_name = this.plugin.rtwGetContainerName(i++)) ) { this.add_option(cont_name, cont_name, 0, 0); } return true; }, add_option : function (text, value, isDefaultSelected, isSelected) { oListbox = document.getElementById(this.select_id); var oOption = document.createElement("option"); oOption.appendChild(document.createTextNode(text)); oOption.setAttribute("value", value); if (isDefaultSelected) oOption.defaultSelected = true; else if (isSelected) oOption.selected = true; oListbox.appendChild(oOption); }, sign : function () { // Проверки: // плагин не установлен if ( !this.plugin.valid ) return 1; // токен отсутсвует if ( !this.plugin.rtwIsTokenPresentAndOK() ) return 2; // диалоговое окно ввода пин-кода if ( !this.plugin.rtwIsUserLoggedIn()) this.plugin.rtwUserLoginDlg(); // ошибочный пин-код if ( !this.plugin.rtwIsUserLoggedIn()) return 3; tsign = document.getElementById(this.token_id); ltlog = document.getElementById(this.select_id); // заполнение эцп tsign.value = this.plugin.rtwSign(ltlog.value, this.randnum); this.plugin.rtwLogout(); if (tsign.value){ document.getElementById('nc_token_form').submit(); } else { return 4; } return 0; }, reg : function () { // Проверки: // плагин не установлен if ( !this.plugin.valid ) return 1; // токен отсутсвует if ( !this.plugin.rtwIsTokenPresentAndOK() ) return 2; // диалоговое окно ввода пин-кода if ( !this.plugin.rtwIsUserLoggedIn()) this.plugin.rtwUserLoginDlg(); // ошибочный пин-код if ( !this.plugin.rtwIsUserLoggedIn()) return 3; // логин отсутствует if ( !jQuery('#' + this.login_id).val() ) return 4; // регистрация var key = this.plugin.rtwGenKeyPair(jQuery('#' + this.login_id).val()); this.plugin.rtwLogout(); // ошибка создания ключа if ( !key ) return 5; jQuery('#' + this.token_id).val(key); return 0; }, attempt_delete : function ( name ) { if ( !this.plugin.valid || !this.plugin.rtwIsTokenPresentAndOK() ) return false; //запрос пин-кода if ( !this.plugin.rtwIsUserLoggedIn()) this.plugin.rtwUserLoginDlg(); if ( !this.plugin.rtwIsUserLoggedIn()) return false; // удаление var r = this.plugin.rtwDestroyContainer(name); this.plugin.rtwLogout(); return r; } } nc_auth_ajax = function ( settings ) { if ( !settings ) settings = {}; this.auth_link = '#' + (settings.auth_link || 'nc_auth_link'); this.params = settings.params || ''; this.postlink = settings.postlink || NETCAT_PATH + 'modules/auth/ajax.php'; this.template = settings.template || ''; jQuery(this.auth_link).click( function(){ nc_auth_ajax_obj.show_layer(); } ); jQuery('#nc_auth_form_ajax').submit( function(){ nc_auth_ajax_obj.sign(); return false; } ); } nc_auth_ajax.prototype = { show_layer : function () { jQuery('#nc_auth_layer').modal(); }, sign : function () { // collect form values into array oForm = document.getElementById('nc_auth_form_ajax'); var values = 'act=auth¶ms='+nc_auth_ajax_obj.params +'&template='+nc_auth_ajax_obj.template; for (var i=0; i < oForm.length; i++) { var el = oForm.elements[i]; if (el.tagName=="SELECT") { values += '&' + el.name + '=' + el.options[el.options.selectedIndex].value; } else if (el.tagName=="INPUT" && (el.type=="checkbox" || el.type=="radio")) { if (el.checked) values += '&' + el.name + '=' + el.value; } else if (el.name && el.value != undefined) { values += '&' + el.name + '=' + el.value; } } jQuery.post(this.postlink, values, function(res) { nc_auth_ajax_obj.sign_res(res); }, 'json'); }, sign_res : function ( res ) { if ( res.captcha_wrong ) { jQuery('#nc_auth_captcha_error').show(); var s = jQuery("#nc_auth_form_ajax img[name='nc_captcha_img']").attr('src'); s = s.replace(/code=[a-z0-9]+/, "code="+res.captcha_hash); jQuery("#nc_auth_form_ajax img[name='nc_captcha_img']").attr('src', s); return false; } if ( !res.user_id ) { jQuery('#nc_auth_error').show(); return false; } jQuery.modal.close(); jQuery('.auth_block').replaceWith(res.auth_block); return false; } } function nc_auth_openid_select ( url ) { oTxt = document.getElementById('openid_url'); oTxt.value = url; if ( (start = url.indexOf("USERNAME") ) > 0 ) { length = 8; if (oTxt.createTextRange) { var oRange = oTxt.createTextRange(); oRange.moveStart("character", start); oRange.moveEnd("character", length - oTxt.value.length); oRange.select(); } else if (oTxt.setSelectionRange) { oTxt.setSelectionRange(start, start+length); } oTxt.focus(); } }