tags:

views:

26

answers:

1

I am trying to build my own user authentication system (simply because the ones out there are too convoluted and big).

I have trouble getting to grasps with the symfony form processing though. Am looking at sfDoctrineGuardPlugin, but for the life of me, can't figure out, when the inputted password is converted to a sha1 hash before being saved into the db. I've literally spent an hour with xdebug/netbeans and thousands of breakpoints.

Where can I read up on the form processing and automagical stuff that doctrine might do in between? Looking at "A Gentle Introduction to Symfony", but it's not really helping.

I found out, it's happening somewhere in the updateObject() Method.

    if ($request->isMethod('post'))
    {
      $this->form->bind($request->getParameter($this->form->getName()));
      if ($this->form->isValid())
      {
        var_dump($this->form->getObject()->password);
        $this->form->updateObject();
        var_dump($this->form->getObject()->password);
      }
    }
// Prints:
// null
// string '989d88b585ce29839687f2938303e828e191ecef' (length=40)

But am having trouble finding the implementation of that method, and what exactly it calls/does.

Can anyone shed some light? I just want to understand what symfony is doing in the background ;) Too much magic going on and the documentation is lacking sometimes.

+1  A: 

http://trac.symfony-project.org/browser/plugins/sfDoctrineGuardPlugin/branches/1.3/lib/model/doctrine/PluginsfGuardUser.class.php#L33

  public function setPassword($password)
  {
    if (!$password && 0 == strlen($password))
    {
      return;
    }

    if (!$salt = $this->getSalt())
    {
      $salt = md5(rand(100000, 999999).$this->getUsername());
      $this->setSalt($salt);
    }
    $modified = $this->getModified();
    if ((!$algorithm = $this->getAlgorithm()) || (isset($modified['algorithm']) && $modified['algorithm'] == $this->getTable()->getDefaultValueOf('algorithm')))
    {
      $algorithm = sfConfig::get('app_sf_guard_plugin_algorithm_callable', 'sha1');
    }
    $algorithmAsStr = is_array($algorithm) ? $algorithm[0].'::'.$algorithm[1] : $algorithm;
    if (!is_callable($algorithm))
    {
      throw new sfException(sprintf('The algorithm callable "%s" is not callable.', $algorithmAsStr));
    }
    $this->setAlgorithm($algorithmAsStr);

    parent::_set('password', call_user_func_array($algorithm, array($salt.$password)));
  }
Maerlyn
Man, how was I ever going to find it there? ;) So Doctrine actually calls setValue for every field when you call save()? Where can I see that in the code? (Just want to get behind the automagic). Thanks for the help.
tilman
Never dug that much into doctrine's code to be able to answer that, but I've dug enough into this plugin's code to know the answer to your original question.
Maerlyn
Thanks. I guess will just use it like that and not ask questions ;)
tilman
@tillman: I can't fit the answer in here, but you want to read about Doctrine's accessors/mutators and look at the __set/_set/set methods on Doctrine_Record, Doctrine_Record_Abstract, and Doctrine_Access.
jeremy