1<?php 2 3/** 4 * OpenID protocol key-value/comma-newline format parsing and 5 * serialization 6 * 7 * PHP versions 4 and 5 8 * 9 * LICENSE: See the COPYING file included in this distribution. 10 * 11 * @access private 12 * @package OpenID 13 * @author JanRain, Inc. <openid@janrain.com> 14 * @copyright 2005-2008 Janrain, Inc. 15 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache 16 */ 17 18/** 19 * Container for key-value/comma-newline OpenID format and parsing 20 */ 21class Auth_OpenID_KVForm { 22 /** 23 * Convert an OpenID colon/newline separated string into an 24 * associative array 25 * 26 * @static 27 * @access private 28 */ 29 static function toArray($kvs, $strict=false) 30 { 31 $lines = explode("\n", $kvs); 32 33 $last = array_pop($lines); 34 if ($last !== '') { 35 array_push($lines, $last); 36 if ($strict) { 37 return false; 38 } 39 } 40 41 $values = array(); 42 43 for ($lineno = 0; $lineno < count($lines); $lineno++) { 44 $line = $lines[$lineno]; 45 $kv = explode(':', $line, 2); 46 if (count($kv) != 2) { 47 if ($strict) { 48 return false; 49 } 50 continue; 51 } 52 53 $key = $kv[0]; 54 $tkey = trim($key); 55 if ($tkey != $key) { 56 if ($strict) { 57 return false; 58 } 59 } 60 61 $value = $kv[1]; 62 $tval = trim($value); 63 if ($tval != $value) { 64 if ($strict) { 65 return false; 66 } 67 } 68 69 $values[$tkey] = $tval; 70 } 71 72 return $values; 73 } 74 75 /** 76 * Convert an array into an OpenID colon/newline separated string 77 * 78 * @static 79 * @access private 80 */ 81 static function fromArray($values) 82 { 83 if ($values === null) { 84 return null; 85 } 86 87 ksort($values); 88 89 $serialized = ''; 90 foreach ($values as $key => $value) { 91 if (is_array($value)) { 92 list($key, $value) = array($value[0], $value[1]); 93 } 94 95 if (strpos($key, ':') !== false) { 96 return null; 97 } 98 99 if (strpos($key, "\n") !== false) { 100 return null; 101 } 102 103 if (strpos($value, "\n") !== false) { 104 return null; 105 } 106 $serialized .= "$key:$value\n"; 107 } 108 return $serialized; 109 } 110} 111 112