packages/ssoinabox-webui/root/usr/local/share/ssoinabox/htdocs/res/user-create-form.js
author Dan Fuhry <dan@enanocms.org>
Sat, 23 Feb 2013 14:26:38 -0500
changeset 9 f4bf6556fb9f
parent 4 2212b2ded8bf
permissions -rw-r--r--
Merged

$(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('&times;')
						.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;
		});
}