<?php
/**
 * Created by JetBrains PhpStorm.
 * User: carlos
 * Date: 10/5/11
 * Time: 9:18 AM
 * To change this template use File | Settings | File Templates.
 */

class Pampa_Controller_Action_Webservice extends Pampa_Controller_Action {

  private $_authRealm = 'Restricted Area';
  
  private function _http_digest_parse($txt){
    // protect against missing data
    $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
    $data = array();
    $keys = implode('|', array_keys($needed_parts));

    preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
      $data[$m[1]] = $m[3] ? $m[3] : $m[4];
      unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
  }

  private function _callHttpAuth(){
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$this->_authRealm.
           '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($this->_authRealm).'"');

    die('Authentication failed');
  }

  public function init(){
    ini_set('memory_limit', '1024M');
    $users = array(
      'luccaco' => 'lc0101',
      'chien' => '43YZt621',
      'noor' => '82D70h3o'
    );


    if (empty($_SERVER['PHP_AUTH_DIGEST'])) {
      $this->_callHttpAuth();
    }


    // analyze the PHP_AUTH_DIGEST variable
    if (!($data = $this->_http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
        !isset($users[$data['username']]))
      $this->_callHttpAuth();


    // generate the valid response
    $A1 = md5($data['username'] . ':' . $this->_authRealm . ':' . $users[$data['username']]);
    $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
    $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

    if ($data['response'] != $valid_response)
      $this->_callHttpAuth();
  }

}
