This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
bistro/askbot/media/jquery-openid/jquery.openid.js

521 lines
18 KiB
JavaScript

$.fn.authenticator = function() {
var signin_page = $(this);
var signin_form = $('#signin-form');
var openid_login_token_input = $('input[name=openid_login_token]');
var openid_login_token_input_fields = $('#openid-fs');
var provider_name_input = $('input[name=login_provider_name]');
var email_input_fields = $('#email-input-fs');
var account_recovery_heading = $('#account-recovery-heading');
var account_recovery_hint = $('#account-recovery-form>.hint');
var account_recovery_link = $('#account-recovery-form>.hint>span.link');
var account_recovery_text_span = $('#account-recovery-form>.hint>span.text');
var password_input_fields = $('#password-fs');
var existing_login_methods_div = $('#existing-login-methods');
var openid_submit_button = $('input[name=openid_login_with_extra_token]');
var existing_login_methods = {};
var account_recovery_question_text = account_recovery_heading.html();
var account_recovery_prompt_text = account_recovery_text_span.html();
var setup_click_handler = function(elements, handler_function){
elements.unbind('click').click(handler_function);
};
var setup_enter_key_handler = function(elements, handler_function){
elements.each(
function(index, element){
$(element).unbind('keypress').keypress(
function(e){
if ((e.which && e.which == 13)||(e.keyCode && e.keyCode == 13)){
if (handler_function){
return handler_function();
}
else {
element.click();
return false;
}
}
}
);
}
);
};
var setup_event_handlers = function(elements, handler_function){
setup_click_handler(elements, handler_function);
setup_enter_key_handler(elements);
};
var get_provider_name = function(row_el){
var row = $(row_el);
var name_span = row.find('.ab-provider-name');
return provider_name = $.trim(name_span.html());
};
var read_existing_login_methods = function(){
$('.ab-provider-row').each(
function(i, provider_row){
var provider_name = get_provider_name(provider_row);
existing_login_methods[provider_name] = true;
}
);
};
var setup_login_method_deleters = function(){
$('.ab-provider-row').each(
function(i, provider_row){
var provider_name = get_provider_name(provider_row);
var remove_button = $(
provider_row
).find('button');
remove_button.click(
function(){
var message = interpolate(gettext('Are you sure you want to remove your %s login?'), [provider_name]);
if (confirm(message)){
$.ajax({
type: 'POST',
url: authUrl + 'delete_login_method/',//url!!!
data: {provider_name: provider_name},
success: function(data, text_status, xhr){
$(provider_row).remove();
delete existing_login_methods[provider_name];
provider_count -=1;
if (provider_count < 0){
provider_count === 0;
}
if (provider_count === 0){
$('#ab-existing-login-methods').remove();
$('#ab-show-login-methods').remove();
$('h1').html(
gettext("Please add one or more login methods.")
);
$('#login-intro').html(
gettext("You don\'t have a method to log in right now, please add one or more by clicking any of the icons below.")
);
existing_login_methods = null;
}
}
});
}
}
);
}
);
}
var submit_login_with_password = function(){
var username = $('#id_username');
var password = $('#id_password');
if (username.val().length < 1){
username.focus();
return false;
}
if (password.val().length < 1){
password.focus();
return false;
}
return true;
};
var submit_change_password = function(){
var newpass = $('#id_new_password');
var newpass_retyped = $('#id_new_password_retyped');
if (newpass.val().length < 1){
newpass.focus();
return false
}
if (newpass_retyped.val().length < 1){
newpass_retyped.focus();
return false;
}
if (newpass.val() !== newpass_retyped.val()){
newpass_retyped.after(
'<span class="error">' +
gettext('passwords do not match') +
'</span>'
);
newpass.val('').focus();
newpass_retyped.val('');
return false;
}
return true;
};
//validator, may be extended to check url for openid
var submit_with_extra_openid_token = function() {
if (openid_login_token_input.val().length < 1) {
openid_login_token_input.focus();
return false;
}
return true;
};
var insert_login_list_enabler = function(){
var enabler = $('#login-list-enabler');
if (enabler.is('p#login-list-enabler')){
enabler.show();
}
else {
enabler = $(
'<p id="login-list-enabler"><a href="#">' +
gettext('Show/change current login methods') +
'</a></p>');
setup_event_handlers(
enabler,
function(){
if (askbot['settings']['signin_always_show_local_login'] === false){
password_input_fields.hide();
}
openid_login_token_input_fields.hide();
enabler.hide();
existing_login_methods_div.show();
}
);
existing_login_methods_div.after(enabler);
}
};
var reset_password_input_fields = function(){
if (userIsAuthenticated){
$('#id_new_password').val('');
$('#id_new_password_retyped').val('');
}
else {
$('#id_username').val('');
$('#id_password').val('');
}
};
var reset_form = function(){
openid_login_token_input_fields.hide();
if (askbot['settings']['signin_always_show_local_login'] === false){
password_input_fields.hide();
}
reset_password_input_fields();
if (userIsAuthenticated === false){
email_input_fields.hide();
account_recovery_heading.hide();
account_recovery_link.show();
account_recovery_hint.show();
$('#account-recovery-form>p.hint').css('margin-top','10px');
account_recovery_text_span.html(account_recovery_question_text).show();
}
else {
if (existing_login_methods !== null){
existing_login_methods_div.hide();
insert_login_list_enabler();
}
}
};
var reset_form_and_errors = function(){
reset_form();
$('.error').remove();
}
var set_provider_name = function(element){
var provider_name = element.attr('name');
provider_name_input.val(provider_name);
};
var show_openid_input_fields = function(provider_name){
reset_form_and_errors();
var token_name = extra_token_name[provider_name]
if (userIsAuthenticated){
$('#openid-heading').html(
interpolate(gettext('Please enter your %s, then proceed'), [token_name])
);
var button_text = gettext('Connect your %(provider_name)s account to %(site)s');
var data = {
provider_name: provider_name,
site: siteName
}
button_text = interpolate(button_text, data, true);
openid_submit_button.val(button_text);
}
else {
$('#openid-heading>span').html(token_name);
}
openid_login_token_input_fields.show();
openid_login_token_input.focus();
};
var start_simple_login = function() {
//$('#openid_form .providers td').removeClass('highlight');
//$li.addClass('highlight');
set_provider_name($(this));
signin_form.submit();
return true;
};
var start_login_with_extra_openid_token = function() {
show_openid_input_fields($(this).attr('name'));
set_provider_name($(this));
setup_enter_key_handler(
openid_login_token_input,
function(){
openid_submit_button.click();
return false;
}
);
setup_event_handlers(
openid_submit_button,
function(){
signin_form.unbind(
'submit'
).submit(
submit_with_extra_openid_token
);
}
);
return false;
};
var start_facebook_login = function(){
set_provider_name($(this));
if (typeof FB != 'undefined'){
FB.getLoginStatus(function(response){
if (response.authResponse){
signin_form.submit();
}
else {
if (FB.getAuthResponse()){
signin_form.submit();
}
FB.login();
}
});
}
return false;
};
var start_password_login_or_change = function(){
//called upon clicking on one of the password login buttons
reset_form_and_errors();
set_provider_name($(this));
var provider_name = $(this).attr('name');
return setup_password_login_or_change(provider_name);
};
var init_always_visible_password_login = function(){
reset_form();
//will break wordpress and ldap
provider_name_input.val('local');
setup_password_login_or_change('local');
};
var setup_password_login_or_change = function(provider_name){
var token_name = extra_token_name[provider_name]
var password_action_input = $('input[name=password_action]');
if (userIsAuthenticated === true && askbot['settings']['useLdapForPasswordLogin'] == false){
var password_button = $('input[name=change_password]');
var submit_action = submit_change_password;
if (provider_name === 'local'){
var provider_cleaned_name = siteName;
}
else {
var provider_cleaned_name = provider_name;
}
if (existing_login_methods && existing_login_methods[provider_name]){
var password_heading_text = interpolate(gettext('Change your %s password'), [provider_cleaned_name])
var password_button_text = gettext('Change password')
}
else {
var password_heading_text = interpolate(gettext('Create a password for %s'), [provider_cleaned_name])
var password_button_text = gettext('Create password')
}
$('#password-heading').html(
password_heading_text
)
password_button.val(password_button_text);
password_action_input.val('change_password');
var focus_input = $('#id_new_password');
var submittable_input = $('#id_new_password_retyped');
} else {
$('#password-heading>span').html(token_name);
var password_button = $('input[name=login_with_password]');
var submit_action = submit_login_with_password;
var create_pw_link = $('a.create-password-account')
if (create_pw_link.length > 0){
create_pw_link.html(gettext('Create a password-protected account'));
var url = create_pw_link.attr('href');
if (url.indexOf('?') !== -1){
url = url.replace(/\?.*$/,'?login_provider=' + provider_name);
}
else{
url += '?login_provider=' + provider_name;
}
create_pw_link.attr('href', url);
}
password_action_input.val('login');
var focus_input = $('#id_username');
var submittable_input = $('#id_password');
}
password_input_fields.show();
focus_input.focus();
var submit_password_login = function(){
signin_form.unbind('submit').submit(submit_action);
};
setup_enter_key_handler(
submittable_input,
function() {
password_button.click();
return false;
}
);
setup_event_handlers(password_button, submit_password_login);
return false;
};
var start_account_recovery = function(){
reset_form_and_errors();
account_recovery_hint.hide();
account_recovery_heading.css('margin-bottom', '0px');
account_recovery_heading.html(account_recovery_prompt_text).show();
email_input_fields.show();
$('#id_email').focus();
};
var clear_password_fields = function(){
$('#id_password').val('');
$('#id_new_password').val('');
$('#id_new_password_retyped').val('');
};
var setup_default_handlers = function(){
setup_event_handlers(
signin_page.find('input.openid-direct'),
start_simple_login
);
setup_event_handlers(
signin_page.find('input.openid-username'),
start_login_with_extra_openid_token
);
setup_event_handlers(
signin_page.find('input.openid-generic'),
start_login_with_extra_openid_token
);
setup_event_handlers(
signin_page.find('input.oauth,input.oauth2'),
start_simple_login
);
setup_event_handlers(
signin_page.find('input.password'),
start_password_login_or_change
);
setup_event_handlers(
signin_page.find('input.wordpress_site'),
start_password_login_or_change
);
setup_event_handlers(account_recovery_link, start_account_recovery);
if (userIsAuthenticated){
read_existing_login_methods();
setup_login_method_deleters();
}
};
setup_default_handlers();
if (askbot['settings']['signin_always_show_local_login'] === true){
init_always_visible_password_login();
}
clear_password_fields();
return this;
};
/**
* @constructor
*/
var ChangePasswordForm = function() {
WrappedElement.call(this);
};
inherits(ChangePasswordForm, WrappedElement);
ChangePasswordForm.prototype.showMessage = function(message, callback) {
var flash = new FlashAlert('...merci');
if (callback) {
flash.setPostRunHandler(callback);
}
this._passwordHeading.append(flash.getElement());
flash.run();
};
ChangePasswordForm.prototype.clearErrors = function() {
this._pwInput1Errors.html('');
this._pwInput2Errors.html('');
};
ChangePasswordForm.prototype.showErrors = function(errors) {
if (errors['new_password']) {
this._pwInput1Errors.html(errors['new_password'][0]);
}
if (errors['new_password_retyped']) {
this._pwInput2Errors.html(errors['new_password_retyped'][0]);
}
if (errors['__all__']) {
this._pwInput2Errors.html(errors['__all__'][0]);
}
};
ChangePasswordForm.prototype.getData = function() {
return {
'new_password': this._pwInput1.val(),
'new_password_retyped': this._pwInput2.val()
};
};
ChangePasswordForm.prototype.getSubmitHandler = function() {
var me = this;
return function() {
$.ajax({
type: 'POST',
dataType: 'json',
data: me.getData(),
url: askbot['urls']['changePassword'],
success: function(data) {
if (data['message']) {
if (me.inAccountRecovery()) {
var callback = function() {
window.location.href = askbot['urls']['questions'];
};
me.showMessage(data['message'], callback);
} else {
me.showMessage(data['message']);
}
me.clearErrors();
}
if (data['errors']) {
me.clearErrors();
me.showErrors(data['errors']);
}
}
});
return false;
};
};
ChangePasswordForm.prototype.inAccountRecovery = function() {
return ($('input[name="in_recovery"]').length === 1);
};
ChangePasswordForm.prototype.decorate = function(element) {
this._element = element;
this._pwInput1 = element.find('#id_new_password');
this._pwInput2 = element.find('#id_new_password_retyped');
this._pwInput1Errors = element.find('.new-password-errors');
this._pwInput2Errors = element.find('.new-password-retyped-errors');
this._button = element.find('input[name="change_password"]');
this._passwordHeading = element.find('#password-heading');
setupButtonEventHandlers(this._button, this.getSubmitHandler());
};