<?php
/**
 * login actions.
 *
 * @package    Controller
 * @subpackage Login
 * @author     Matteo Montanari <matteo@italinux.com>
 * @version    SVN: $Id: actions.class.php 12479 2008-10-31 10:54:40Z fabien $
 */
class loginActions extends sfActions
{
 
/**
  * Executes Validate Email (Registration Login)
  *
  * @param sfRequest $request A request object
  * @return string    return   'true' or 'false'
  */
 
public function executeValidateRegLoginEmail(sfWebRequest $request)
 {
  
$validator = new njlValidatorEmail();
  echo 
$validator->doValidate($request->getParameter('regLogin[email]'));
  return 
sfView::NONE
 }
 
/**
  * Executes Validate Pass (Registration Login)
  *
  * @param sfRequest $request A request object
  * @return string    return   'true' or 'false'
  */
 
public function executeValidateRegLoginPass(sfWebRequest $request)
 {
  
$validator = new njlValidatorPass();
  echo 
$validator->doValidate($request->getParameter('regLogin[passwd]'));
  return 
sfView::NONE;
 }
 
/**
  * Executes Validate Email (Password Request)
  *
  * @param sfRequest $request A request object
  * @return string    return   'true' or 'false'
  */
 
public function executeValidateReqPassEmail(sfWebRequest $request)
 {
  
$validator = new njlValidatorEmail();
  echo 
$validator->doValidate($request->getParameter('reqPass[email]'));
  return 
sfView::NONE;
 }
 
/**
  * Executes Login
  *
  * @param sfRequest $request A request object
  * @return mixed    return   A set of output messages (json)
  */
 
public function executeLogin(sfWebRequest $request)
 {
  
$this->forward404Unless($request->isMethod('post'));

  
$login = new ItaTmARegLoginForm();
  
$login->unsetFields();

  
$addParam = Array('user'           =>$request->getParameter('regLogin[email]'),
                    
'ip'             =>$request->getRemoteAddress(),
                    
'inserted_tstamp'=>strtotime('now'),
                    
'updated_tstamp' =>strtotime('now'),
                    
'num_login'      =>1);

  
$login->bind(
      
array_merge($request->getParameter($login->getName()), $addParam),
      
$request->getFiles($login->getName())
  );

  
$msg=Array('form'   =>'login'
             
'display'=>'block'
             
'msg'    =>Array(0=>'Thanks for Registering'1=>'Login successfull'2=>'Password incorrect'));

  if(
$this->getRequest()->isXmlHttpRequest()==true)
   {
    
usleep(sfConfig::get('app_sleep_login'));
    echo 
json_encode($this->processForm($msg$login));
    return 
sfView::NONE;
   }else{
    if(
$this->json_msg['resp']==true)
     {
      
$login->disableFields();
     }
   }
 }
 
/**
  * Executes RequestPassword
  *
  * @param sfRequest $request A request object
  * @return mixed    return   A set of output messages (json)
  */
 
public function executeRequestPassword(sfWebRequest $request)
 {
  
$this->forward404Unless($request->isMethod('post'));

  
$req_pass = new ItaTmAReqPassForm();
  
$req_pass->unsetFields();

  
$req_pass->bind(
      
$request->getParameter($req_pass->getName()),
      
$request->getFiles($req_pass->getName())
  );

  
$msg=Array('form'   =>'req_pass',
             
'display'=>'none',
             
'msg'    =>Array(0=>'Sorry no such account'1=>'Password sent'2=>'Password sent'));

  if(
$this->getRequest()->isXmlHttpRequest()==true)
   {
    
usleep(sfConfig::get('app_sleep_pass'));
    echo 
json_encode($this->processForm($msg$req_pass));
    return 
sfView::NONE;
   }else{
    if(
$this->json_msg['resp']==true)
     {
      
$req_pass->disableFields();
     }
   }
 }
/**
 * Executes processForm
 *
 * @param  array $a1    set of response messages
 * @param  mixed $form  form object
 * @return array return set of response messages
*/
 
public function processForm($a1sfForm $form)
 {
  
$fnc = new njlFormatAndConversion();
/**
 * Response message description
 *
 * $o = container
 * $o['resp']    = String values: 0 (failure), 1 (success), 2(additional)
 * $o['msg']     = Array  values: [related]
 * $o['form']    = String value : form name
 * $o['display'] = String values: hidden, block
 * $o['user']    = String value : user forename
 * $o['acc_ref'] = String value : account reference number
 * $o['email']   = String value : email address
*/
  
$o=Array();

 if(
$form->isValid())
  {
   
$register=ItaTmAUsersPeer::checkLogin($form->getValue('email'), 0);
   switch(
count($register)){
     case 
0:
       switch(
$a1['form']){
         case 
'login':
           
$form->updateObject();
             try {
                  
// register new user and get the last_insert_id
                  
$new_reg $form->save();
                  
$idUser $new_reg->getIdUser();
                  
                  
// setup sessions
                  
$this->getUser()->setAttribute('acc_ref'$fnc->njlFormatAccount($idUser));
                  
$this->getUser()->setAttribute('user'$form->getValue('user'));
                  
$this->getUser()->setAttribute('email'$form->getValue('email'));
                  try {
                       
ItaTmAUsersMail::sendRegistration(Array('acc_ref'=> $this->getUser()->getAttribute('acc_ref''{Session expired}'),
                                                               
'user'   => $this->getUser()->getAttribute('user''{Session expired}'),
                                                               
'email'  => $this->getUser()->getAttribute('email''{Session expired}'),
                                                               
'passwd' => $form->getValue('passwd')));
                       
$o['resp']=2// new registration

                       
$o['user']=$form->getValue('user');
                       
$o['acc_ref']=$fnc->njlFormatAccount($idUser);
                       
$o['email']=$form->getValue('email');

                       
$o['msg']=$a1['msg'][0]; // Array key 0: "Thanks for Regitering"
                  
} catch (Exception $e) {
                       
$o=$this->errorHandler($o'mail'$form);
                  }
             } catch (
Exception $e) {
                   
$o=$this->errorHandler($o'mail'$form);
             }
         break;
         case 
'req_pass':
           
$o['resp']=0// existing email so we do NOT deliver an email
           
$o['msg']=$a1['msg'][0]; // Array key 0: "Sorry.. no such account"
         
break;}
     break;
     default:
       switch(
$a1['form']){
         case 
'login':
           
$login=ItaTmAUsersPeer::checkLogin($form->getValue('email'), md5($form->getValue('passwd')));
             if(
count($login)==1){
               
// login and update some of the values (UpdatedTstamp, NumLogin)

               
$login->setRemember($fnc->njlFormatBoolean($form->getValue('remember'), 'en-10'));
               
$login->setUpdatedTstamp(strtotime('now'));
               
$login->setNumLogin($login->getNumLogin() + 1);
               try {
                    
// login existing user
                    
$login->save();
                    
$o['resp']=1// login successful
                    
$o['msg']=$a1['msg'][1]; // Array key 1: "Login Successfull"

                    // setup sessions
                    
$this->getUser()->setAttribute('acc_ref'$fnc->njlFormatAccount($login->getIdUser()));
                    
$this->getUser()->setAttribute('user'$form->getValue('user'));
                    
$this->getUser()->setAttribute('email'$form->getValue('email'));
               } catch (
Exception $e) {
                    
$o=$this->errorHandler($o'mail'$form);
               }
             } else {
               
$o['resp']=0// login failure
               
$o['msg']=$a1['msg'][2]; // Array key 2: "Password incorrect"
             
}
           
$o['user']=$form->getValue('user');
           
$o['acc_ref']=$fnc->njlFormatAccount($login->getIdUser());
           
$o['email']=$form->getValue('email');
         break;
         case 
'req_pass':
           try {
                
ItaTmAUsersMail::sendPasswd(Array('email'=>$form->getValue('email')));

                
$o['resp']=1// not existing email so we deliver an email
                
$o['msg']=$a1['msg'][1]; // Array key 1: "Password has been sent"
           
} catch (Exception $e) {
                
$o=$this->errorHandler($o'mail'$form);
           }
         break;}
     break;}
  } else {
   
$o=$this->errorHandler($o'form'$form);
  }
  return Array(
$a1['form']=>'resp_def_'.$o['resp'], 'display'=>$a1['display'], 'user'=>$o['user'], 'acc_ref'=>$o['acc_ref'], 'email'=>$o['email'], 'resp'=>$o['resp'], 'msg'=>$o['msg']);
 }
/**
 * Executes errorHandler
 *
 * @param  array  $o     set of response messages
 * @param  string $area  set area (mail or form)
 * @param  mixed  $form  form object
 * @return array return set of response messages
*/
 
public function errorHandler($o$areasfForm $form)
 {
  
$b1=Array();
  switch(
$area){
     case 
'mail':
       
$b1[0]='Temporary Internal Error';
     break;
     case 
'form':
       if(
$form->hasGlobalErrors())
        {
         foreach(
$form->getGlobalErrors() as $key => $value)
          {
           
settype($value'string');
           
$b1[]=$key.' '.$value;
          }
        }
       foreach(
$form->getErrorSchema()->getErrors() as $key => $value)
        {
         
settype($value'string');
         
$b1[]=$key.' '.$value;
        }
     break;}

  
$o['resp']=0;
  
$o['msg']=$b1[0];
  
$o['user']=null;

     try {
  
$o['err_file']=__FILE__;
  
$o['err_line']=__LINE__;
  
$o['err_fname']=$form->getName();

           
ErrorMail::form($o);
         } catch (
Exception $e) {}

  return 
$o;
 }
}