1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: require_once 'Auth/Yadis/Misc.php';
13: require_once 'Auth/Yadis/Yadis.php';
14: require_once 'Auth/OpenID.php';
15:
16: function Auth_Yadis_getDefaultProxy()
17: {
18: return 'http://xri.net/';
19: }
20:
21: function Auth_Yadis_getXRIAuthorities()
22: {
23: return array('!', '=', '@', '+', '$', '(');
24: }
25:
26: function Auth_Yadis_getEscapeRE()
27: {
28: $parts = array();
29: foreach (array_merge(Auth_Yadis_getUCSChars(),
30: Auth_Yadis_getIPrivateChars()) as $pair) {
31: list($m, $n) = $pair;
32: $parts[] = sprintf("%s-%s", chr($m), chr($n));
33: }
34:
35: return sprintf('/[%s]/', implode('', $parts));
36: }
37:
38: function Auth_Yadis_getXrefRE()
39: {
40: return '/\((.*?)\)/';
41: }
42:
43: function Auth_Yadis_identifierScheme($identifier)
44: {
45: if (Auth_Yadis_startswith($identifier, 'xri://') ||
46: ($identifier &&
47: in_array($identifier[0], Auth_Yadis_getXRIAuthorities()))) {
48: return "XRI";
49: } else {
50: return "URI";
51: }
52: }
53:
54: function Auth_Yadis_toIRINormal($xri)
55: {
56: if (!Auth_Yadis_startswith($xri, 'xri://')) {
57: $xri = 'xri://' . $xri;
58: }
59:
60: return Auth_Yadis_escapeForIRI($xri);
61: }
62:
63: function _escape_xref($xref_match)
64: {
65: $xref = $xref_match[0];
66: $xref = str_replace('/', '%2F', $xref);
67: $xref = str_replace('?', '%3F', $xref);
68: $xref = str_replace('#', '%23', $xref);
69: return $xref;
70: }
71:
72: function Auth_Yadis_escapeForIRI($xri)
73: {
74: $xri = str_replace('%', '%25', $xri);
75: $xri = preg_replace_callback(Auth_Yadis_getXrefRE(),
76: '_escape_xref', $xri);
77: return $xri;
78: }
79:
80: function Auth_Yadis_toURINormal($xri)
81: {
82: return Auth_Yadis_iriToURI(Auth_Yadis_toIRINormal($xri));
83: }
84:
85: function Auth_Yadis_iriToURI($iri)
86: {
87: if (1) {
88: return $iri;
89: } else {
90:
91: return preg_replace_callback(Auth_Yadis_getEscapeRE(),
92: 'Auth_Yadis_pct_escape_unicode', $iri);
93: }
94: }
95:
96:
97: function Auth_Yadis_XRIAppendArgs($url, $args)
98: {
99:
100:
101:
102:
103: if (count($args) == 0) {
104: return $url;
105: }
106:
107:
108:
109: if (array_key_exists(0, $args) &&
110: is_array($args[0])) {
111:
112: } else {
113: $keys = array_keys($args);
114: sort($keys);
115: $new_args = array();
116: foreach ($keys as $key) {
117: $new_args[] = array($key, $args[$key]);
118: }
119: $args = $new_args;
120: }
121:
122:
123:
124:
125:
126:
127:
128: if (strpos(rtrim($url, '?'), '?') !== false) {
129: $sep = '&';
130: } else {
131: $sep = '?';
132: }
133:
134: return $url . $sep . Auth_OpenID::httpBuildQuery($args);
135: }
136:
137: function Auth_Yadis_providerIsAuthoritative($providerID, $canonicalID)
138: {
139: $lastbang = strrpos($canonicalID, '!');
140: $p = substr($canonicalID, 0, $lastbang);
141: return $p == $providerID;
142: }
143:
144: function Auth_Yadis_rootAuthority($xri)
145: {
146:
147:
148: $root = null;
149:
150: if (Auth_Yadis_startswith($xri, 'xri://')) {
151: $xri = substr($xri, 6);
152: }
153:
154: $authority = explode('/', $xri, 2);
155: $authority = $authority[0];
156: if ($authority[0] == '(') {
157:
158:
159:
160:
161:
162: $root = substr($authority, 0, strpos($authority, ')') + 1);
163: } else if (in_array($authority[0], Auth_Yadis_getXRIAuthorities())) {
164:
165: $root = $authority[0];
166: } else {
167:
168: $_segments = explode("!", $authority);
169: $segments = array();
170: foreach ($_segments as $s) {
171: $segments = array_merge($segments, explode("*", $s));
172: }
173: $root = $segments[0];
174: }
175:
176: return Auth_Yadis_XRI($root);
177: }
178:
179: function Auth_Yadis_XRI($xri)
180: {
181: if (!Auth_Yadis_startswith($xri, 'xri://')) {
182: $xri = 'xri://' . $xri;
183: }
184: return $xri;
185: }
186:
187: function Auth_Yadis_getCanonicalID($iname, $xrds)
188: {
189:
190:
191:
192: $xrd_list = array_reverse($xrds->allXrdNodes);
193: $parser = $xrds->parser;
194: $node = $xrd_list[0];
195:
196: $canonicalID_nodes = $parser->evalXPath('xrd:CanonicalID', $node);
197:
198: if (!$canonicalID_nodes) {
199: return false;
200: }
201:
202: $canonicalID = $canonicalID_nodes[0];
203: $canonicalID = Auth_Yadis_XRI($parser->content($canonicalID));
204:
205: $childID = $canonicalID;
206:
207: for ($i = 1; $i < count($xrd_list); $i++) {
208: $xrd = $xrd_list[$i];
209:
210: $parent_sought = substr($childID, 0, strrpos($childID, '!'));
211: $parentCID = $parser->evalXPath('xrd:CanonicalID', $xrd);
212: if (!$parentCID) {
213: return false;
214: }
215: $parentCID = Auth_Yadis_XRI($parser->content($parentCID[0]));
216:
217: if (strcasecmp($parent_sought, $parentCID)) {
218:
219: return false;
220: }
221:
222: $childID = $parent_sought;
223: }
224:
225: $root = Auth_Yadis_rootAuthority($iname);
226: if (!Auth_Yadis_providerIsAuthoritative($root, $childID)) {
227:
228: return false;
229: }
230:
231: return $canonicalID;
232: }
233:
234:
235: