24 require_once
"Auth/Auth.php";
26 define(
'AUTH_HTTP_NONCE_TIME_LEN', 16);
27 define(
'AUTH_HTTP_NONCE_HASH_LEN', 32);
176 $this->options = array(
'cryptType' =>
'md5',
177 'algorithm' =>
'MD5',
178 'qop' =>
'auth-int,auth',
179 'opaquekey' =>
'moo',
181 'digestRealm' =>
'protected area',
182 'forceDigestOnly' =>
false,
184 'sessionSharing' =>
true,
188 $this->authType = strtolower(
$options[
'authType']);
193 if (array_key_exists(
$key, $this->options)) {
194 $this->options[
$key] = $value;
198 if (!empty($this->options[
'opaquekey'])) {
199 $this->opaque = md5($this->options[
'opaquekey']);
219 if (method_exists($this,
'_importGlobalVariable')) {
220 $this->server = &$this->_importGlobalVariable(
'server');
224 if ($this->authType ==
'basic') {
225 if (!empty($this->server[
'PHP_AUTH_USER'])) {
226 $this->username = $this->server[
'PHP_AUTH_USER'];
229 if (!empty($this->server[
'PHP_AUTH_PW'])) {
230 $this->password = $this->server[
'PHP_AUTH_PW'];
236 if (empty($this->username) && empty($this->password)) {
237 if (!empty($this->server[
'HTTP_AUTHORIZATION'])) {
238 list($this->username, $this->password) =
239 explode(
':', base64_decode(substr($this->server[
'HTTP_AUTHORIZATION'], 6)));
242 }
elseif ($this->authType ==
'digest') {
243 $this->username =
'';
244 $this->password =
'';
246 $this->digest_header = null;
247 if (!empty($this->server[
'PHP_AUTH_DIGEST'])) {
248 $this->digest_header = substr($this->server[
'PHP_AUTH_DIGEST'],
249 strpos($this->server[
'PHP_AUTH_DIGEST'],
' ')+1);
251 $headers = getallheaders();
252 if(isset($headers[
'Authorization']) && !empty($headers[
'Authorization'])) {
253 $this->digest_header = substr($headers[
'Authorization'],
254 strpos($headers[
'Authorization'],
' ')+1);
258 if($this->digest_header) {
259 $authtemp = explode(
',', $this->digest_header);
261 foreach($authtemp as
$key => $value) {
262 $value = trim($value);
263 if(strpos($value,
'=') !==
false) {
264 $lhs = substr($value,0,strpos($value,
'='));
265 $rhs = substr($value,strpos($value,
'=')+1);
266 if(substr($rhs,0,1) ==
'"' && substr($rhs,-1,1) ==
'"') {
267 $rhs = substr($rhs,1,-1);
273 if (!isset(
$auth[
'uri']) || !isset(
$auth[
'realm'])) {
278 $this->uri =
$auth[
'uri'];
279 if (substr($headers[
'Authorization'],0,7) ==
'Digest ') {
281 $this->authType =
'digest';
283 if (!isset(
$auth[
'nonce']) || !isset(
$auth[
'username']) ||
284 !isset(
$auth[
'response']) || !isset(
$auth[
'qop']) ||
285 !isset(
$auth[
'nc']) || !isset(
$auth[
'cnonce'])){
289 if (
$auth[
'qop'] !=
'auth' &&
$auth[
'qop'] !=
'auth-int') {
295 if ($this->nextNonce ==
false) {
299 $this->username =
$auth[
'username'];
300 $this->password =
$auth[
'response'];
301 $this->auth[
'nonce'] =
$auth[
'nonce'];
303 $this->auth[
'qop'] =
$auth[
'qop'];
304 $this->auth[
'nc'] =
$auth[
'nc'];
305 $this->auth[
'cnonce'] =
$auth[
'cnonce'];
307 if (isset(
$auth[
'opaque'])) {
308 $this->auth[
'opaque'] =
$auth[
'opaque'];
311 }
elseif (substr($headers[
'Authorization'],0,6) ==
'Basic ') {
312 if ($this->options[
'forceDigestOnly']) {
316 $this->authType =
'basic';
318 explode(
':',base64_decode(substr($headers[
'Authorization'],6)));
327 if ($this->options[
'sessionSharing'] &&
328 isset($this->username) && isset($this->password)) {
329 session_id(md5(
'Auth_HTTP' . $this->username . $this->password));
336 $this->_sessionName =
"_authhttp".md5($this->realm);
351 if (method_exists($this,
'_loadStorage')) {
360 if (!empty($this->username) && !empty($this->password)) {
361 if ($this->authType ==
'basic' && !$this->options[
'forceDigestOnly']) {
362 if (
true === $this->storage->fetchData($this->username, $this->password)) {
377 if (!DB::isConnection($dbs->db)) {
378 $dbs->_connect($dbs->options[
'dsn']);
381 $query =
'SELECT '.$dbs->options[
'passwordcol'].
" FROM ".$dbs->options[
'table'].
382 ' WHERE '.$dbs->options[
'usernamecol'].
" = '".
383 $dbs->db->quoteString($this->username).
"' ";
385 $pwd = $dbs->db->getOne(
$query);
387 if (DB::isError($pwd)) {
391 if ($this->options[
'cryptType'] ==
'none') {
392 $a1 = md5($this->username.
':'.$this->options[
'digestRealm'].
':'.$pwd);
403 if ($this->nextNonce ==
false) {
408 if (!$login_ok && is_callable($this->loginFailedCallback)) {
409 call_user_func($this->loginFailedCallback,$this->username, $this);
413 if (!empty($this->username) && $login_ok) {
414 $this->
setAuth($this->username);
415 if (is_callable($this->loginCallback)) {
416 call_user_func($this->loginCallback,$this->username, $this);
424 if (!empty($this->username) && !$login_ok) {
428 if ((empty($this->username) || !$login_ok) && $this->showLogin) {
429 $this->
drawLogin($this->storage->activeUser);
433 if (!empty($this->username) && $login_ok && $this->authType ==
'digest'
434 && $this->auth[
'qop'] ==
'auth') {
454 if ($this->authType ==
'basic') {
455 header(
"WWW-Authenticate: Basic realm=\"".$this->realm.
"\"");
456 header(
'HTTP/1.0 401 Unauthorized');
457 }
else if ($this->authType ==
'digest') {
460 $wwwauth =
'WWW-Authenticate: Digest ';
461 $wwwauth .=
'qop="'.$this->options[
'qop'].
'", ';
462 $wwwauth .=
'algorithm='.$this->options[
'algorithm'].
', ';
463 $wwwauth .=
'realm="'.$this->options[
'digestRealm'].
'", ';
464 $wwwauth .=
'nonce="'.$this->nonce.
'", ';
466 $wwwauth .=
'stale=true, ';
468 if (!empty($this->opaque)) {
469 $wwwauth .=
'opaque="'.$this->opaque.
'"' ;
472 if (!$this->options[
'forceDigestOnly']) {
473 $wwwauth .=
'WWW-Authenticate: Basic realm="'.$this->realm.
'"';
476 header(
'HTTP/1.0 401 Unauthorized');
484 echo
'Stale nonce value, please re-authenticate.';
505 if (!empty($digestRealm)) {
506 $this->options[
'digestRealm'] = $digestRealm;
522 $this->CancelText = $text;
538 if (method_exists($this,
'_importGlobalVariable')) {
539 $this->server = &$this->_importGlobalVariable(
'server');
542 $a2unhashed = $this->server[
'REQUEST_METHOD'].
":".$this->
selfURI();
543 if($this->auth[
'qop'] ==
'auth-int') {
544 if(isset(
$GLOBALS[
"HTTP_RAW_POST_DATA"])) {
546 $body =
$GLOBALS[
"HTTP_RAW_POST_DATA"];
547 }
else if($lines = @file(
'php://input')) {
549 $body = implode(
"\n", $lines);
551 if (method_exists($this,
'_importGlobalVariable')) {
552 $this->post = &$this->_importGlobalVariable(
'post');
555 foreach($this->post as
$key => $value) {
556 if($body !=
'') $body .=
'&';
557 $body .= rawurlencode(
$key) .
'=' . rawurlencode($value);
561 $a2unhashed .=
':'.md5($body);
564 $a2 = md5($a2unhashed);
566 $this->auth[
'nonce'].
':'.
567 $this->auth[
'nc'].
':'.
568 $this->auth[
'cnonce'].
':'.
569 $this->auth[
'qop'].
':'.
571 $expectedResponse = md5($combined);
573 if(!isset($this->auth[
'opaque']) || $this->auth[
'opaque'] == $this->opaque) {
574 if($response == $expectedResponse) {
601 $this->nextNonce =
false;
606 if ($time < time() - $this->options[
'nonceLife']) {
610 $this->nextNonce =
$nonce;
630 if (method_exists($this,
'_importGlobalVariable')) {
631 $this->server = &$this->_importGlobalVariable(
'server');
641 $hash = md5($time . $this->server[
'HTTP_USER_AGENT'] . $this->options[
'noncekey']);
643 if ($hash_cli != $hash) {
661 if (method_exists($this,
'_importGlobalVariable')) {
662 $this->server = &$this->_importGlobalVariable(
'server');
666 $hash = md5($time . $this->server[
'HTTP_USER_AGENT'] . $this->options[
'noncekey']);
668 return base64_encode($time) . $hash;
688 $a2unhashed =
":".$this->selfURI();
689 if($this->auth[
'qop'] ==
'auth-int') {
690 $a2unhashed .=
':'.$contentMD5;
692 $a2 = md5($a2unhashed);
695 $this->auth[
'nc'].
':'.
696 $this->auth[
'cnonce'].
':'.
697 $this->auth[
'qop'].
':'.
701 $wwwauth =
'Authentication-Info: ';
702 if($this->nonce != $this->nextNonce) {
703 $wwwauth .=
'nextnonce="'.$this->nextNonce.
'", ';
705 $wwwauth .=
'qop='.$this->auth[
'qop'].
', ';
706 $wwwauth .=
'rspauth="'.md5($combined).
'", ';
707 $wwwauth .=
'cnonce="'.$this->auth[
'cnonce'].
'", ';
708 $wwwauth .=
'nc='.$this->auth[
'nc'].
'';
724 if (is_array(
$name)) {
726 if (array_key_exists(
$key, $this->options)) {
727 $this->options[
$key] = $value;
731 if (array_key_exists(
$name, $this->options)) {
732 $this->options[
$name] = $value;
748 if (array_key_exists(
$name, $this->options)) {
749 return $this->options[
$name];
751 if (
$name ==
'CancelText') {
754 if (
$name ==
'Realm') {
770 if (method_exists($this,
'_importGlobalVariable')) {
771 $this->server = &$this->_importGlobalVariable(
'server');
774 if (preg_match(
"/MSIE/",$this->server[
'HTTP_USER_AGENT'])) {
776 $uri = preg_replace(
"/^(.*)\?/",
"\\1",$this->server[
'REQUEST_URI']);
778 $uri = $this->server[
'REQUEST_URI'];