Added: incubator/shindig/trunk/php/js/json.js URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/js/json.js?rev=606463&view=auto ============================================================================== --- incubator/shindig/trunk/php/js/json.js (added) +++ incubator/shindig/trunk/php/js/json.js Sat Dec 22 08:11:57 2007 @@ -0,0 +1,319 @@ +/* + json.js + 2007-10-10 + + Public Domain + + This file adds these methods to JavaScript: + + array.toJSONString(whitelist) + boolean.toJSONString() + date.toJSONString() + number.toJSONString() + object.toJSONString(whitelist) + string.toJSONString() + These methods produce a JSON text from a JavaScript value. + It must not contain any cyclical references. Illegal values + will be excluded. + + The default conversion for dates is to an ISO string. You can + add a toJSONString method to any date object to get a different + representation. + + The object and array methods can take an optional whitelist + argument. A whitelist is an array of strings. If it is provided, + keys in objects not found in the whitelist are excluded. + + string.parseJSON(filter) + This method parses a JSON text to produce an object or + array. It can throw a SyntaxError exception. + + The optional filter parameter is a function which can filter and + transform the results. It receives each of the keys and values, and + its return value is used instead of the original value. If it + returns what it received, then structure is not modified. If it + returns undefined then the member is deleted. + + Example: + + // Parse the text. If a key contains the string 'date' then + // convert the value to a date. + + myData = text.parseJSON(function (key, value) { + return key.indexOf('date') >= 0 ? new Date(value) : value; + }); + + It is expected that these methods will formally become part of the + JavaScript Programming Language in the Fourth Edition of the + ECMAScript standard in 2008. + + This file will break programs with improper for..in loops. See + http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ + + This is a reference implementation. You are free to copy, modify, or + redistribute. + + Use your own copy. It is extremely unwise to load untrusted third party + code into your pages. +*/ + +/*jslint evil: true */ + +// Augment the basic prototypes if they have not already been augmented. + +if (!Object.prototype.toJSONString) { + + Array.prototype.toJSONString = function (w) { + var a = [], // The array holding the partial texts. + i, // Loop counter. + l = this.length, + v; // The value to be stringified. + +// For each value in this array... + + for (i = 0; i < l; i += 1) { + v = this[i]; + switch (typeof v) { + case 'object': + +// Serialize a JavaScript object value. Treat objects thats lack the +// toJSONString method as null. Due to a specification error in ECMAScript, +// typeof null is 'object', so watch out for that case. + + if (v && typeof v.toJSONString === 'function') { + a.push(v.toJSONString(w)); + } else { + a.push('null'); + } + break; + + case 'string': + case 'number': + case 'boolean': + a.push(v.toJSONString()); + break; + default: + a.push('null'); + } + } + +// Join all of the member texts together and wrap them in brackets. + + return '[' + a.join(',') + ']'; + }; + + + Boolean.prototype.toJSONString = function () { + return String(this); + }; + + + Date.prototype.toJSONString = function () { + +// Eventually, this method will be based on the date.toISOString method. + + function f(n) { + +// Format integers to have at least two digits. + + return n < 10 ? '0' + n : n; + } + + return '"' + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z"'; + }; + + + Number.prototype.toJSONString = function () { + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(this) ? String(this) : 'null'; + }; + + + Object.prototype.toJSONString = function (w) { + var a = [], // The array holding the partial texts. + k, // The current key. + i, // The loop counter. + v; // The current value. + +// If a whitelist (array of keys) is provided, use it assemble the components +// of the object. + + if (w) { + for (i = 0; i < w.length; i += 1) { + k = w[i]; + if (typeof k === 'string') { + v = this[k]; + switch (typeof v) { + case 'object': + +// Serialize a JavaScript object value. Ignore objects that lack the +// toJSONString method. Due to a specification error in ECMAScript, +// typeof null is 'object', so watch out for that case. + + if (v) { + if (typeof v.toJSONString === 'function') { + a.push(k.toJSONString() + ':' + + v.toJSONString(w)); + } + } else { + a.push(k.toJSONString() + ':null'); + } + break; + + case 'string': + case 'number': + case 'boolean': + a.push(k.toJSONString() + ':' + v.toJSONString()); + +// Values without a JSON representation are ignored. + + } + } + } + } else { + +// Iterate through all of the keys in the object, ignoring the proto chain +// and keys that are not strings. + + for (k in this) { + if (typeof k === 'string' && + Object.prototype.hasOwnProperty.apply(this, [k])) { + v = this[k]; + switch (typeof v) { + case 'object': + +// Serialize a JavaScript object value. Ignore objects that lack the +// toJSONString method. Due to a specification error in ECMAScript, +// typeof null is 'object', so watch out for that case. + + if (v) { + if (typeof v.toJSONString === 'function') { + a.push(k.toJSONString() + ':' + + v.toJSONString()); + } + } else { + a.push(k.toJSONString() + ':null'); + } + break; + + case 'string': + case 'number': + case 'boolean': + a.push(k.toJSONString() + ':' + v.toJSONString()); + +// Values without a JSON representation are ignored. + + } + } + } + } + +// Join all of the member texts together and wrap them in braces. + + return '{' + a.join(',') + '}'; + }; + + + (function (s) { + +// Augment String.prototype. We do this in an immediate anonymous function to +// avoid defining global variables. + +// m is a table of character substitutions. + + var m = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + + + s.parseJSON = function (filter) { + var j; + + function walk(k, v) { + var i, n; + if (v && typeof v === 'object') { + for (i in v) { + if (Object.prototype.hasOwnProperty.apply(v, [i])) { + n = walk(i, v[i]); + if (n !== undefined) { + v[i] = n; + } + } + } + } + return filter(k, v); + } + + +// Parsing happens in three stages. In the first stage, we run the text against +// a regular expression which looks for non-JSON characters. We are especially +// concerned with '()' and 'new' because they can cause invocation, and '=' +// because it can cause mutation. But just to be safe, we will reject all +// unexpected characters. + +// We split the first stage into 4 regexp operations in order to work around +// crippling deficiencies in IE's and Safari's regexp engines. First we replace +// all backslash pairs with '@' (a non-JSON character). Second, we replace all +// simple value tokens with ']' characters. Third, we delete all open brackets +// that follow a colon or comma or that begin the text. Finally, we look to see +// that the remaining characters are only whitespace or ']' or ',' or ':' or '{' +// or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/.test(this.replace(/\\./g, '@'). + replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']'). + replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the second stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + this + ')'); + +// In the optional third stage, we recursively walk the new structure, passing +// each name/value pair to a filter function for possible transformation. + + return typeof filter === 'function' ? walk('', j) : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('parseJSON'); + }; + + + s.toJSONString = function () { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can simply slap some quotes around it. +// Otherwise we must also replace the offending characters with safe +// sequences. + + if (/["\\\x00-\x1f]/.test(this)) { + return '"' + this.replace(/[\x00-\x1f\\"]/g, function (a) { + var c = m[a]; + if (c) { + return c; + } + c = a.charCodeAt(); + return '\\u00' + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }) + '"'; + } + return '"' + this + '"'; + }; + })(String.prototype); +} \ No newline at end of file
Added: incubator/shindig/trunk/php/key-modulo URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/key-modulo?rev=606463&view=auto ============================================================================== --- incubator/shindig/trunk/php/key-modulo (added) +++ incubator/shindig/trunk/php/key-modulo Sat Dec 22 08:11:57 2007 @@ -0,0 +1 @@ +1004152471828278089 \ No newline at end of file Added: incubator/shindig/trunk/php/key-private URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/key-private?rev=606463&view=auto ============================================================================== --- incubator/shindig/trunk/php/key-private (added) +++ incubator/shindig/trunk/php/key-private Sat Dec 22 08:11:57 2007 @@ -0,0 +1 @@ +365146352663319971 \ No newline at end of file Added: incubator/shindig/trunk/php/key-public URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/key-public?rev=606463&view=auto ============================================================================== --- incubator/shindig/trunk/php/key-public (added) +++ incubator/shindig/trunk/php/key-public Sat Dec 22 08:11:57 2007 @@ -0,0 +1 @@ +11 \ No newline at end of file Added: incubator/shindig/trunk/php/proxy.php URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/php/proxy.php?rev=606463&view=auto ============================================================================== --- incubator/shindig/trunk/php/proxy.php (added) +++ incubator/shindig/trunk/php/proxy.php Sat Dec 22 08:11:57 2007 @@ -0,0 +1,74 @@ +<?php +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +?><?php +function errorPage($code, $message) { + header("Status: $code"); + header("Content-Type: text/plain"); + echo $message; +} + +error_log('----------------------------starting API call-----------------------------------'); +$op = $_POST['op']; +if (!$op || $op == '') { + //try from GET + $op = $_GET['op']; +} + +$appOrigin = $_POST['origin']; +if (preg_match('@[\W]@', $appOrigin)) { + errorPage(400, 'Bogus origin param'); + return; +} + +$curl = curl_init(); + +if ($op == 'proxy') { + $url = $_GET['url']; + curl_setopt($curl,CURLOPT_GET,true); +} +else if ($appOrigin){ + $url = 'http://' . $appOrigin . XN_AtomHelper::$DOMAIN_SUFFIX . '/gadgets/index/backendApi'; + curl_setopt($curl,CURLOPT_POST,true); + curl_setopt($curl,CURLOPT_POSTFIELDS,$_POST); +} +else { + error_log("Bogus API call: $appOrigin -> $op"); + return; +} + +error_log('api: url=' . $url); + +curl_setopt($curl,CURLOPT_USERAGENT,"Mozilla/4.0 (Compatible; Shindig Auth)"); +curl_setopt($curl, CURLOPT_TIMEOUT, 30); +curl_setopt($curl, CURLOPT_MAXREDIRS, 5); +curl_setopt($curl,CURLOPT_URL,$url); +ob_start(); +$result = curl_exec($curl); +if ($result == false) { + $errno = curl_errno($curl); + error_log("Error excuting api request $op $appOrigin $url : $errno"); + header("HTTP/1.1 500 Error"); + echo "Error executing request"; +} +$data = ob_get_contents(); +ob_end_clean(); + +$retcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); +curl_close($curl); +header('Content-Type: text/plain'); +echo $data; +error_log('----------------------------END API call-----------------------------------'); + +?>

