ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
OpenID.php
Go to the documentation of this file.
1<?php
2
23define('Auth_OpenID_VERSION', '2.2.2');
24
28require_once "Auth/Yadis/PlainHTTPFetcher.php";
29require_once "Auth/Yadis/ParanoidHTTPFetcher.php";
30require_once "Auth/OpenID/BigMath.php";
31require_once "Auth/OpenID/URINorm.php";
32
41define('Auth_OpenID_LOCAL_ERROR', 'local_error');
42
50define('Auth_OpenID_REMOTE_ERROR', 'remote_error');
51
60define('Auth_OpenID_REMOTE_OK', 'remote_ok');
61
70define('Auth_OpenID_REDIRECT', 'redirect');
71
81define('Auth_OpenID_DO_AUTH', 'do_auth');
82
91define('Auth_OpenID_DO_ABOUT', 'do_about');
92
96define('Auth_OpenID_letters',
97 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
99define('Auth_OpenID_digits',
100 "0123456789");
101
102define('Auth_OpenID_punct',
103 "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~");
104
106
113class Auth_OpenID {
114
121 static function isFailure($thing)
122 {
123 return is_a($thing, 'Auth_OpenID_FailureResponse');
124 }
125
145 static function getQuery($query_str=null)
146 {
147 $data = array();
148
149 if ($query_str !== null) {
151 } else if (!array_key_exists('REQUEST_METHOD', $_SERVER)) {
152 // Do nothing.
153 } else {
154 // XXX HACK FIXME HORRIBLE.
155 //
156 // POSTing to a URL with query parameters is acceptable, but
157 // we don't have a clean way to distinguish those parameters
158 // when we need to do things like return_to verification
159 // which only want to look at one kind of parameter. We're
160 // going to emulate the behavior of some other environments
161 // by defaulting to GET and overwriting with POST if POST
162 // data is available.
164
165 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
166 $str = file_get_contents('php://input');
167
168 if ($str === false) {
169 $post = array();
170 } else {
172 }
173
174 $data = array_merge($data, $post);
175 }
176 }
177
178 return $data;
179 }
180
181 static function params_from_string($str)
182 {
183 $chunks = explode("&", $str);
184
185 $data = array();
186 foreach ($chunks as $chunk) {
187 $parts = explode("=", $chunk, 2);
188
189 if (count($parts) != 2) {
190 continue;
191 }
192
193 list($k, $v) = $parts;
194 $data[urldecode($k)] = urldecode($v);
195 }
196
197 return $data;
198 }
199
207 static function ensureDir($dir_name)
208 {
209 if (is_dir($dir_name) || @mkdir($dir_name)) {
210 return true;
211 } else {
212 $parent_dir = dirname($dir_name);
213
214 // Terminal case; there is no parent directory to create.
215 if ($parent_dir == $dir_name) {
216 return true;
217 }
218
219 return (Auth_OpenID::ensureDir($parent_dir) && @mkdir($dir_name));
220 }
221 }
222
229 static function addPrefix($values, $prefix)
230 {
231 $new_values = array();
232 foreach ($values as $s) {
233 $new_values[] = $prefix . $s;
234 }
235 return $new_values;
236 }
237
245 static function arrayGet($arr, $key, $fallback = null)
246 {
247 if (is_array($arr)) {
248 if (array_key_exists($key, $arr)) {
249 return $arr[$key];
250 } else {
251 return $fallback;
252 }
253 } else {
254 trigger_error("Auth_OpenID::arrayGet (key = ".$key.") expected " .
255 "array as first parameter, got " .
256 gettype($arr), E_USER_WARNING);
257
258 return false;
259 }
260 }
261
265 static function parse_str($query)
266 {
267 if ($query === null) {
268 return null;
269 }
270
271 $parts = explode('&', $query);
272
273 $new_parts = array();
274 for ($i = 0; $i < count($parts); $i++) {
275 $pair = explode('=', $parts[$i]);
276
277 if (count($pair) != 2) {
278 continue;
279 }
280
281 list($key, $value) = $pair;
282 $new_parts[urldecode($key)] = urldecode($value);
283 }
284
285 return $new_parts;
286 }
287
299 static function httpBuildQuery($data)
300 {
301 $pairs = array();
302 foreach ($data as $key => $value) {
303 if (is_array($value)) {
304 $pairs[] = urlencode($value[0])."=".urlencode($value[1]);
305 } else {
306 $pairs[] = urlencode($key)."=".urlencode($value);
307 }
308 }
309 return implode("&", $pairs);
310 }
311
327 static function appendArgs($url, $args)
328 {
329 if (count($args) == 0) {
330 return $url;
331 }
332
333 // Non-empty array; if it is an array of arrays, use
334 // multisort; otherwise use sort.
335 if (array_key_exists(0, $args) &&
336 is_array($args[0])) {
337 // Do nothing here.
338 } else {
339 $keys = array_keys($args);
340 sort($keys);
341 $new_args = array();
342 foreach ($keys as $key) {
343 $new_args[] = array($key, $args[$key]);
344 }
345 $args = $new_args;
346 }
347
348 $sep = '?';
349 if (strpos($url, '?') !== false) {
350 $sep = '&';
351 }
352
353 return $url . $sep . Auth_OpenID::httpBuildQuery($args);
354 }
355
371 static function urlunparse($scheme, $host, $port = null, $path = '/',
372 $query = '', $fragment = '')
373 {
374
375 if (!$scheme) {
376 $scheme = 'http';
377 }
378
379 if (!$host) {
380 return false;
381 }
382
383 if (!$path) {
384 $path = '';
385 }
386
387 $result = $scheme . "://" . $host;
388
389 if ($port) {
390 $result .= ":" . $port;
391 }
392
393 $result .= $path;
394
395 if ($query) {
396 $result .= "?" . $query;
397 }
398
399 if ($fragment) {
400 $result .= "#" . $fragment;
401 }
402
403 return $result;
404 }
405
416 static function normalizeUrl($url)
417 {
418 @$parsed = parse_url($url);
419
420 if (!$parsed) {
421 return null;
422 }
423
424 if (isset($parsed['scheme']) &&
425 isset($parsed['host'])) {
426 $scheme = strtolower($parsed['scheme']);
427 if (!in_array($scheme, array('http', 'https'))) {
428 return null;
429 }
430 } else {
431 $url = 'http://' . $url;
432 }
433
434 $normalized = Auth_OpenID_urinorm($url);
435 if ($normalized === null) {
436 return null;
437 }
438 list($defragged, $frag) = Auth_OpenID::urldefrag($normalized);
439 return $defragged;
440 }
441
447 static function intval($value)
448 {
449 $re = "/^\\d+$/";
450
451 if (!preg_match($re, $value)) {
452 return false;
453 }
454
455 return intval($value);
456 }
457
465 static function bytes($str)
466 {
467 return strlen(bin2hex($str)) / 2;
468 }
469
474 static function toBytes($str)
475 {
476 $hex = bin2hex($str);
477
478 if (!$hex) {
479 return array();
480 }
481
482 $b = array();
483 for ($i = 0; $i < strlen($hex); $i += 2) {
484 $b[] = chr(base_convert(substr($hex, $i, 2), 16, 10));
485 }
486
487 return $b;
488 }
489
490 static function urldefrag($url)
491 {
492 $parts = explode("#", $url, 2);
493
494 if (count($parts) == 1) {
495 return array($parts[0], "");
496 } else {
497 return $parts;
499 }
500
501 static function filter($callback, &$sequence)
502 {
503 $result = array();
504
505 foreach ($sequence as $item) {
506 if (call_user_func_array($callback, array($item))) {
507 $result[] = $item;
508 }
509 }
510
511 return $result;
512 }
513
514 static function update(&$dest, &$src)
515 {
516 foreach ($src as $k => $v) {
517 $dest[$k] = $v;
518 }
519 }
520
528 static function log($format_string)
529 {
530 $args = func_get_args();
531 $message = call_user_func_array('sprintf', $args);
532 error_log($message);
533 }
534
535 static function autoSubmitHTML($form, $title="OpenId transaction in progress")
536 {
537 return("<html>".
538 "<head><title>".
539 $title .
540 "</title></head>".
541 "<body onload='document.forms[0].submit();'>".
542 $form .
543 "<script>".
544 "var elements = document.forms[0].elements;".
545 "for (var i = 0; i < elements.length; i++) {".
546 " elements[i].style.display = \"none\";".
547 "}".
548 "</script>".
549 "</body>".
550 "</html>");
551 }
552}
553
554/*
555 * Function to run when this file is included.
556 * Abstracted to a function to make life easier
557 * for some PHP optimizers.
558 */
559function Auth_OpenID_include_init() {
560 if (Auth_OpenID_getMathLib() === null) {
562 }
563}
Auth_OpenID_setNoMathSupport()
Definition: BigMath.php:440
Auth_OpenID_getMathLib()
Definition: BigMath.php:400
$result
Auth_OpenID_include_init()
Definition: OpenID.php:556
Auth_OpenID_urinorm($uri)
Definition: URINorm.php:142
static filter($callback, &$sequence)
Definition: OpenID.php:498
static httpBuildQuery($data)
Implements the PHP 5 'http_build_query' functionality.
Definition: OpenID.php:296
static ensureDir($dir_name)
Create dir_name as a directory if it does not exist.
Definition: OpenID.php:204
static toBytes($str)
Get the bytes in a string independently of multibyte support conditions.
Definition: OpenID.php:471
static autoSubmitHTML($form, $title="OpenId transaction in progress")
Definition: OpenID.php:532
static arrayGet($arr, $key, $fallback=null)
Convenience function for getting array values.
Definition: OpenID.php:242
static log($format_string)
Wrap PHP's standard error_log functionality.
Definition: OpenID.php:525
static addPrefix($values, $prefix)
Adds a string prefix to all values of an array.
Definition: OpenID.php:226
static isFailure($thing)
Return true if $thing is an Auth_OpenID_FailureResponse object; false if not.
Definition: OpenID.php:118
static parse_str($query)
Replacement for PHP's broken parse_str.
Definition: OpenID.php:262
static params_from_string($str)
Definition: OpenID.php:178
static urldefrag($url)
Definition: OpenID.php:487
static intval($value)
Replacement (wrapper) for PHP's intval() because it's broken.
Definition: OpenID.php:444
static update(&$dest, &$src)
Definition: OpenID.php:511
static urlunparse($scheme, $host, $port=null, $path='/', $query='', $fragment='')
Implements python's urlunparse, which is not available in PHP.
Definition: OpenID.php:368
static getQuery($query_str=null)
Gets the query data from the server environment based on the request method used.
Definition: OpenID.php:142
static normalizeUrl($url)
Given a URL, this "normalizes" it by adding a trailing slash and / or a leading http:// scheme where ...
Definition: OpenID.php:413
static appendArgs($url, $args)
"Appends" query arguments onto a URL.
Definition: OpenID.php:324
static bytes($str)
Count the number of bytes in a string independently of multibyte support conditions.
Definition: OpenID.php:462
$data
$fallback
Definition: en-x-test.php:5
$url
Definition: shib_logout.php:72
$path
Definition: index.php:22
if((!isset($_SERVER['DOCUMENT_ROOT'])) OR(empty($_SERVER['DOCUMENT_ROOT']))) $_SERVER['DOCUMENT_ROOT']