packages/ssoinabox-webui/root/usr/local/share/ssoinabox/htdocs/res/user-create-form.js
$(function()
{
$('table.sort-me').tablesorter({
headers: {
4: { sorter: false }
}
});
var updateCNAndUsername = function()
{
$(document.forms.userCreateForm.cn).val(
$(document.forms.userCreateForm.givenName).val() + ' ' +
$(document.forms.userCreateForm.surname).val()
);
$(document.forms.userCreateForm.uid).val(
$(document.forms.userCreateForm.givenName).val().charAt(0).toLowerCase() +
$(document.forms.userCreateForm.surname).val().toLowerCase().replace(/[^a-z0-9]/g, '')
);
};
$(document.forms.userCreateForm.givenName).blur(updateCNAndUsername);
$(document.forms.userCreateForm.surname).blur(updateCNAndUsername);
$(document.forms.userCreateForm.uid).blur(function()
{
var me = this;
$.get('/ajax.php?op=checkAvailability&uid=' + $(this).val(), function(response)
{
if ( typeof(response) == 'string' )
{
$(me).parents('.control-group').removeClass('success').addClass('error');
$('p.help-block', $(me).parent()).text(response);
}
else
{
$(me).parents('.control-group').removeClass('error').addClass('success');
$('p.help-block', $(me).parent()).text("Username is available");
}
}, 'json');
})
.focus(function()
{
$(this).parents('.control-group').removeClass('error').removeClass('success');
$('p.help-block', $(this).parent()).text("All lowercase. Will be used for logging in to the admin/resale portal, e-mail, etc.");
});
var passwordValidate = function()
{
var status = $('p.compliance-status', $(this).parents('div.controls'));
var result = checkPasswordCompliance($(this).val());
if ( typeof(result) == 'boolean' && result )
{
$(this).parents('div.control-group').removeClass('error').addClass('success');
$(status).text('Password meets security requirements.');
}
else if ( typeof(result) == 'string' )
{
$(this).parents('div.control-group').removeClass('success').addClass('error');
$(status).text('Password does not meet security requirements: ' + result + '.');
}
};
var passwordConfirmValidate = function()
{
var status = $('p.compliance-status', $(this).parents('div.controls'));
if ( $(this).val() == $('input[name="password"]', $(this).parents('div.modal-body')).val() )
{
$(this).parents('div.control-group').removeClass('error').addClass('success');
$(status).text('Passwords match.');
}
else
{
$(this).parents('div.control-group').removeClass('success').addClass('error');
$(status).text('Passwords do not match.');
}
}
$(document.forms.userCreateForm.password).bind('keyup', passwordValidate);
$(document.forms.userCreateForm.password_confirm).bind('keyup', passwordConfirmValidate);
$(document.forms.userResetForm.password).bind('keyup', passwordValidate);
$(document.forms.userResetForm.password_confirm).bind('keyup', passwordConfirmValidate);
$('form[name="userCreateForm"], form[name="userResetForm"]').bind('submit', function()
{
if ( $('div.control-group.error', this).length )
{
$('div.control-group.error:first input:first', this).focus();
return false;
}
});
setupSSHKeyUI();
$('.show-tooltip').tooltip();
});
function checkPasswordCompliance(str)
{
if ( str.length < 8 )
return 'must be at least 8 characters in length';
if ( countUniqueChars(str) < 6 )
return 'must have at least 6 unique characters';
if ( str.length <= 16 )
{
if ( !(/[a-z]/).test(str) )
return 'must contain at least one lowercase letter';
if ( !(/[A-Z]/).test(str) )
return 'must contain at least one uppercase letter';
if ( !(/[0-9]/).test(str) )
return 'must contain at least one digit (0-9)';
if ( !(/[^A-Za-z0-9]/).test(str) )
return 'must contain at least one symbol';
}
return true;
}
function countUniqueChars(str)
{
var count = 0;
var uniq = '';
for ( var i = 0; i < str.length; i++ )
{
if ( uniq.indexOf(str.charAt(i)) == -1 )
uniq += str.charAt(i);
}
return uniq.length;
}
function resetPassword(username)
{
$('#userResetForm input[name="uid"]').val(username);
$('#userResetForm').bind('shown', function()
{
$('input[name="password"]', this).focus();
});
$('#userResetForm').modal('show');
}
function binToByteArray(str)
{
var arr = [], str = escape(str);
for ( var i = 0; i < str.length; i++ )
{
var chr = str.charAt(i);
switch(chr)
{
case '%':
if ( str.charAt(i+1) == 'u' && str.substr(i+2, 4).match(/[A-F0-9]{4}/) )
{
arr.push(parseInt(str.substr(i+2, 2), 16));
arr.push(parseInt(str.substr(i+4, 2), 16));
i += 4;
break;
}
else if ( str.substr(i+1, 2).match(/[A-F0-9]{2}/) )
{
arr.push(parseInt(str.substr(i+1, 2), 16));
i += 2;
break;
}
default:
arr.push(str.charCodeAt(i));
}
}
return arr;
}
function setupSSHKeyUI()
{
if ( typeof(document.forms.addSSHKey) !== 'object' )
return;
$('div.btn.ssh-key a.close').click(function()
{
$(this).parents('div.btn.ssh-key').remove();
});
$(document.forms.addSSHKey).submit(function()
{
$('#modal-addssh div.control-group').removeClass('error');
var keyValue = $('#newSSHKey').val();
if ( (keyValue.split(/ /)).length < 2 )
{
$('#modal-addssh div.control-group').addClass('error');
return false;
}
var keyValue = keyValue.split(/ /);
var keyType = keyValue[0];
var keyEncoded = keyValue[1];
if ( typeof(ssh_key_lengths[keyType]) != 'object' )
{
$('#modal-addssh div.control-group').addClass('error');
return false;
}
var keyLength = keyEncoded.length * 0.75 - keyEncoded.replace(/[^=]/g, '').length;
var keyBits = typeof(ssh_key_lengths[keyType][keyLength]) == 'number' ? ssh_key_lengths[keyType][keyLength] : 0;
var keyName = ssh_key_lengths[keyType].name;
var keyFingerprint = (rstr2hex(rstr_md5(Base64.decode(keyEncoded), 8))).split(/(..)/).join(':').replace(/(^:|:$)/g, '').replace(/::/g, ':');
$('<div />')
.addClass('btn').addClass('btn-warning').addClass('ssh-key')
.append($('<div />')
.addClass('pull-right')
.append($('<a />')
.addClass('close')
.html('×')
.click(function()
{
$(this).parents('div.btn.ssh-key').remove();
})
)
)
.append($('<span />')
.addClass('label')
.append($('<span />')
.addClass('type')
.text(keyName)
)
.append(' ')
.append($('<span />')
.addClass('bits')
.text(keyBits)
)
.append('-bit')
)
.append(' ')
.append($('<span />')
.addClass('fingerprint')
.text(keyFingerprint)
)
.append($('<input />')
.attr('type', 'hidden')
.attr('name', 'sshPublicKey[]')
.val(keyType + ' ' + keyEncoded)
)
.prependTo('.put-ssh-keys-here');
$('#newSSHKey').val('');
$('#modal-addssh').modal('hide');
return false;
});
}