Valijson is a project mainly written in JAVASCRIPT and RUBY, based on the MIT license.
EXAMPLE USAGE: RUBY ON RAILS BACK-END *****
class AccountController < ApplicationController
class Reqs PASSWORDRE = /^[a-z0-9!@#$%^&*+.]+$/i INVITATION_NAMERE = /^[a-z0-9ÅÄÖåäö& ]+$/i
REQ_NAME = ['string', 'req', ['min',4], ['max',150], ['match', INVITATION_NAME_RE]]
REQ_PASSWORD = ['string', 'req', ['min', 5], ['max', 64], ['match', PASSWORD_RE] ]
REQ_EMAIL = ['email', 'req']
REGISTER_INVITATION_LOGGED_IN = {
'name' => REQ_NAME ,
}
REGISTER_INVITATION_SIGNUP = {
'name' => REQ_NAME,
'email' => REQ_EMAIL,
'password' => REQ_PASSWORD,
}
REGISTER_INVITATION_LOGIN = {
'name' => REQ_NAME,
'email' => REQ_EMAIL,
'password' => REQ_PASSWORD,
}
LOGIN = {
'email' => REQ_EMAIL,
'password' => REQ_PASSWORD,
}
REGAIN_ACCESS = {
'email' => REQ_EMAIL
}
RESET_PASSWORD = {
'new_password' => REQ_PASSWORD
}
end
def reset_password raise 'illegal' if !request.post?
h = params[:form]
err = Validate.form( h, Reqs::RESET_PASSWORD ) || {}
if err.blank?
user = User.find_by_email( h[:email] )
if ( !user )
err[:email] = :no_such_user
elsif ( user.password!=Digest::SHA2.hexdigest( user.salt + h[:password] ) and user.temporary_password!=h[:password] )
err[:password] = :incorrect
end
end
if err.blank?
user.set_password( h )
end
render :json => ( err.blank? ? {
:response_code => 1
} : {
:response_code => 0,
:errors => err
} )
end
def regain_access raise 'illegal' if !request.post?
h = params[:form]
err = Validate.form( h, Reqs::REGAIN_ACCESS ) || {}
if ( err.blank? )
user = User.find_by_email( h[:email] )
if ( !user )
err[:email] = :no_such_user
end
if err.blank?
user.send_temporary_password
end
end
render :json => ( err.blank? ? {
:response_code => 1
} : {
:response_code => 0,
:erors => err
} )
end
def login raise 'illegal' if !request.post?
h = params[:form]
err = Validate.form( h, Reqs::LOGIN ) || {}
if ( err.blank? )
user = User.find_by_email( h[:email] )
temporary = false
if ( !user )
err[:email] = :no_such_user
elsif ( user.password!=Digest::SHA2.hexdigest( user.salt + h[:password] ) )
if ( user.temporary_password==h[:password] )
temporary = true
else
err[:password] = :incorrect
end
end
if err.blank?
session[:current_user_id] = user.id
end
end
render :json => ( err.blank? ? {
:response_code => 1,
:current_user_email => user.email,
:temporary => ( temporary ? 1 : 0 )
} : { :response_code => 0, :errors => err }
)
end
def logout session[:current_user_id] = nil redirect_to '/', :status => 302 return end
def register_invitation raise 'illegal' if !request.post?
h = params[:form]
if ( logged_in? )
reqs = Reqs::REGISTER_INVITATION_LOGGED_IN
else
reqs = h[:login]=='1' ? Reqs::REGISTER_INVITATION_LOGIN : Reqs::REGISTER_INVITATION_SIGNUP
end
err = Validate.form( h, reqs )
account_created = false
if err.blank?
err = {}
h[:nameid] = h[:name].gsub( /[s/.?&]/, '_' ).mb_chars.downcase.to_s
err[:name] = :not_unique if Invitation.find_by_sid( h[:nameid] )
err[:name] = :not_unique if Invitation.find_by_nameid( h[:nameid] )
if ( logged_in? )
user = current_user
else
if ( h[:login]=='1' )
user = User.find_by_email( h[:email] )
err[:email] = :no_such_user if !user
if ( user and user.password!=Digest::SHA2.hexdigest( user.salt + h[:password] ) )
err[:password] = :incorrect
end
else
err[:email] = :not_unique if User.find_by_email( h[:email] )
if err.blank?
user = User.create( h )
account_created = true
end
end
session[:current_user_id] = user.id if err.blank?
end
end
if err.blank?
invitation = Invitation.find_by_sid( h[:sid] )
raise h.inspect if !invitation || invitation.name
user.user_x_invitations.create( :invitation_id => invitation.id )
invitation.update_attributes( :name => h[:name], :nameid => h[:nameid] )
end
render :json => ( err.blank? ? {
:response_code => 1,
:current_user_email => user.email,
:invitation_name => invitation.name,
:account_created => account_created ? 1 : 0
} : { :response_code => 0, :errors => err }
)
end end
EXAMPLE USAGE: RUBY ON RAILS FRONT-END *****
var register_logged_in_reqs = new Hash( <%= AccountController::Reqs::REGISTER_INVITATION_LOGGED_IN.to_json %> ); var register_login_reqs = new Hash( <%= AccountController::Reqs::REGISTER_INVITATION_LOGIN.to_json %> ); var register_signup_reqs = new Hash( <%= AccountController::Reqs::REGISTER_INVITATION_SIGNUP.to_json %> );
var register_form = new Form( $('#register_form'), { 'reqs' : ( current_user_email ? register_logged_in_reqs : register_login_reqs ), 'submit_type' : 'ajax', 'submitting_text' : 'Saving...', 'ajax' : { 'url' : '/account/register_invitation', 'success_hook' : success_fn } });
function Form( form, config ) { var self = this; this.form = form; this.config = config; this.submit_button = form.find( "input[name='form[submit]']" );
form.find( "input[type=text], input[type=password]" ).bind( 'keyup blur', function() { var name = $(this).attr( 'name' ); name = name.substring( 5, name.length-1 ); var error = Validate.field( form, name, config.reqs.get( name ) ); var field = form.find( '.' + name ); if ( error ) { if ( field.find( 'input' ).hasClass( 'error' ) ) { field.find( '.error-message' ).text( error ); } } else { field.find( '.error-message' ).text( '' ); field.find( "input" ).removeClass( 'error' ); } });
this.draw_errors = function( errors ) { var keys = errors.keys(); for ( var i = 0; i<keys.length; i++ ) { var name = keys[i]; var error = errors.get( name ); var field = form.find( '.' + name ); field.find( '.error-message' ).text( error ); field.find( "input" ).addClass( 'error' ); } }
this.submit_button.click( function() {
var errors = Validate.form( form, config.reqs );
if ( errors ) {
self.draw_errors( errors );
return false;
} else {
var button_text = self.submit_button.val();
self.submit_button.val( self.config.submitting_text );
self.submit_button.attr( { disabled: true } ).addClass( 'disabled' );
if ( self.config.submit_type=='ajax' ) {
$.ajax( {
url: self.config.ajax.url,
type: 'POST',
data: form.serialize(),
success: function( data ) {
if ( data.response_code==0 ) {
self.draw_errors( new Hash( data.errors ) );
self.submit_button.attr( { disabled: false } ).removeClass( 'disabled' ).val( button_text );
} else {
self.config.ajax.success_hook( data );
}
}
});
return false;
}
}
return true;
});
};
Copyright (c) 2010 Peder Linder. See LICENSE for details.