Archived
Latest version
This commit is contained in:
+4
-1
@@ -1 +1,4 @@
|
|||||||
tmp
|
.DS_Store
|
||||||
|
.bzr/
|
||||||
|
build/
|
||||||
|
tmp/
|
||||||
|
|||||||
+11
-60
@@ -1,64 +1,15 @@
|
|||||||
// this sets the background color of the master UIView (when there are no windows/tab groups on it)
|
Ti.API.info( '▶▶▶ app.js' );
|
||||||
Titanium.UI.setBackgroundColor('#000');
|
|
||||||
|
|
||||||
// create tab group
|
$ = {}; // root element
|
||||||
var tabGroup = Titanium.UI.createTabGroup();
|
|
||||||
|
|
||||||
|
$.config = {
|
||||||
|
client_id: '98896cbfaa12dfba67ccdc18352a6374',
|
||||||
|
client_secret: '20667fe88eaace9d86ad19e48c772490',
|
||||||
|
endpoint_uri: 'http://oauth.extranet.silversolutions.de/ssl/oauth/',
|
||||||
|
oauth_authorize: 'http://london2011.ez.no/oauth/authorize',
|
||||||
|
oauth_token: 'http://london2011.ez.no/oauth/token'
|
||||||
|
};
|
||||||
|
|
||||||
//
|
// TEST with ex. http://london2011.ez.no/api/ezp/content/node/2
|
||||||
// create base UI tab and root window
|
|
||||||
//
|
|
||||||
var win1 = Titanium.UI.createWindow({
|
|
||||||
title:'Tab 1',
|
|
||||||
backgroundColor:'#fff'
|
|
||||||
});
|
|
||||||
var tab1 = Titanium.UI.createTab({
|
|
||||||
icon:'KS_nav_views.png',
|
|
||||||
title:'Tab 1',
|
|
||||||
window:win1
|
|
||||||
});
|
|
||||||
|
|
||||||
var label1 = Titanium.UI.createLabel({
|
Ti.include( 'main.js' );
|
||||||
color:'#999',
|
|
||||||
text:'I am Window 1',
|
|
||||||
font:{fontSize:20,fontFamily:'Helvetica Neue'},
|
|
||||||
textAlign:'center',
|
|
||||||
width:'auto'
|
|
||||||
});
|
|
||||||
|
|
||||||
win1.add(label1);
|
|
||||||
|
|
||||||
//
|
|
||||||
// create controls tab and root window
|
|
||||||
//
|
|
||||||
var win2 = Titanium.UI.createWindow({
|
|
||||||
title:'Tab 2',
|
|
||||||
backgroundColor:'#fff'
|
|
||||||
});
|
|
||||||
var tab2 = Titanium.UI.createTab({
|
|
||||||
icon:'KS_nav_ui.png',
|
|
||||||
title:'Tab 2',
|
|
||||||
window:win2
|
|
||||||
});
|
|
||||||
|
|
||||||
var label2 = Titanium.UI.createLabel({
|
|
||||||
color:'#999',
|
|
||||||
text:'I am Window 2',
|
|
||||||
font:{fontSize:20,fontFamily:'Helvetica Neue'},
|
|
||||||
textAlign:'center',
|
|
||||||
width:'auto'
|
|
||||||
});
|
|
||||||
|
|
||||||
win2.add(label2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// add tabs
|
|
||||||
//
|
|
||||||
tabGroup.addTab(tab1);
|
|
||||||
tabGroup.addTab(tab2);
|
|
||||||
|
|
||||||
|
|
||||||
// open tab group
|
|
||||||
tabGroup.open();
|
|
||||||
|
|||||||
@@ -0,0 +1,110 @@
|
|||||||
|
class EzOAuth2
|
||||||
|
constructor: ( @root_url, @customer_id, @customer_secret, @endpoint_uri ) ->
|
||||||
|
id = Ti.Utils.md5HexDigest( @root_url + @customer_id + @customer_secret + @endpoint_uri )
|
||||||
|
@access_token = Ti.App.Properties.getString( id + '_access', null )
|
||||||
|
@refresh_token = Ti.App.Properties.getString( id + '_refresh', null )
|
||||||
|
@update_stamp = Ti.App.Properties.getString( id + '_updated', null )
|
||||||
|
@expiry_time = Ti.App.Properties.getInt( id + '_expires', 3600 )
|
||||||
|
Ti.API.debug( 'EzOAuth2 object initialized.' )
|
||||||
|
|
||||||
|
saveSettings: ->
|
||||||
|
id = Ti.Utils.md5HexDigest( @root_url + @customer_id + @customer_secret + @endpoint_uri )
|
||||||
|
Ti.App.Properties.setString( id + '_access', @access_token )
|
||||||
|
Ti.App.Properties.setString( id + '_refresh', @refresh_token )
|
||||||
|
Ti.App.Properties.setString( id + '_updated', @update_stamp )
|
||||||
|
Ti.App.Properties.setInt( id + '_expires', @expiry_time )
|
||||||
|
|
||||||
|
getAuthView: ( success_function, cancel_function )->
|
||||||
|
authUrl = @root_url + '/oauth/authorize' +
|
||||||
|
'?response_type=token' +
|
||||||
|
'&client_id=' + @customer_id +
|
||||||
|
'&redirect_uri=' + encodeURIComponent( @endpoint_uri )
|
||||||
|
Ti.API.debug( 'authUrl: ' + authUrl )
|
||||||
|
wv = Ti.UI.createWebView(
|
||||||
|
url: authUrl
|
||||||
|
)
|
||||||
|
wv.parent_obj = this
|
||||||
|
wv.success_function = success_function
|
||||||
|
wv.cancel_function = cancel_function
|
||||||
|
wv.addEventListener( 'beforeload', @processOAuth2Response )
|
||||||
|
@auth_web = wv
|
||||||
|
|
||||||
|
@auth_btn = Ti.UI.createButton(
|
||||||
|
left: 0
|
||||||
|
top: 0
|
||||||
|
title: "Cancel"
|
||||||
|
)
|
||||||
|
@auth_btn.click_function = cancel_function
|
||||||
|
@auth_btn.addEventListener( 'click', (e) ->
|
||||||
|
e.source.auth_view.hide()
|
||||||
|
e.source.click_function( e )
|
||||||
|
)
|
||||||
|
|
||||||
|
@auth_view = Ti.UI.createView()
|
||||||
|
@auth_view.add( @auth_web )
|
||||||
|
@auth_view.add( @auth_btn )
|
||||||
|
@auth_web.auth_view = @auth_view
|
||||||
|
@auth_btn.auth_view = @auth_view
|
||||||
|
return @auth_view
|
||||||
|
|
||||||
|
doRequest: ( url, success_function, type = 'GET' ) ->
|
||||||
|
if @access_token is null
|
||||||
|
Ti.API.warning( 'No access token.' )
|
||||||
|
return false
|
||||||
|
if Ti.Network.networkType is Ti.Network.NETWORK_NONE
|
||||||
|
Ti.API.warning( 'No Internet connection.' )
|
||||||
|
return false
|
||||||
|
xhr = Ti.Network.createHTTPClient(
|
||||||
|
onerror: ->
|
||||||
|
Ti.API.error( 'ERROR communicating. (' + this.responseText + ')' )
|
||||||
|
onload: success_function
|
||||||
|
)
|
||||||
|
xhr.open( type, @root_url + '/api/ezp/v1' + url )
|
||||||
|
xhr.setRequestHeader( 'Authorization', 'OAuth ' + @access_token )
|
||||||
|
xhr.setRequestHeader( 'Accept', 'application/json' )
|
||||||
|
xhr.send()
|
||||||
|
|
||||||
|
getNode: ( node_id, success_function ) ->
|
||||||
|
@doRequest( '/content/node/' + node_id, success_function )
|
||||||
|
|
||||||
|
getNodeFields: ( node_id, success_function ) ->
|
||||||
|
@doRequest( '/content/node/' + node_id + '/fields', success_function )
|
||||||
|
|
||||||
|
getNodeField: ( node_id, field_id, success_function ) ->
|
||||||
|
@doRequest( '/content/node/' + node_id + '/field/' + field_id, success_function )
|
||||||
|
|
||||||
|
getNodeList: ( root_node_id, success_function, offset = null, limit = null, sortKey = null, sortType = null ) ->
|
||||||
|
req_url = '/content/node/' + root_node_id + '/list'
|
||||||
|
req_url += '/offset/' + offset if offset?
|
||||||
|
req_url += '/limit/' + limit if limit?
|
||||||
|
if sortKey?
|
||||||
|
req_url += '/sort/' + sortKey
|
||||||
|
req_url += '/' + sortType if sortType?
|
||||||
|
@doRequest( req_url, success_function )
|
||||||
|
|
||||||
|
getGetParameters: ( url ) ->
|
||||||
|
# borrowed and modified from: http://jquery-howto.blogspot.com/2009/09/get-url-parameters-values-with-jquery.html
|
||||||
|
vars = {}
|
||||||
|
pairs = url.slice( url.indexOf( '?' ) + 1 ).split( '&' )
|
||||||
|
for pair in pairs
|
||||||
|
Ti.API.debug( 'Now splitting: "' + pair + '"' )
|
||||||
|
pair_split = pair.split( '=' )
|
||||||
|
vars[ pair_split[0] ] = pair_split[1]
|
||||||
|
return vars
|
||||||
|
|
||||||
|
processOAuth2Response: ( e ) ->
|
||||||
|
Ti.API.debug( '[beforeload] URL: ' + e.url )
|
||||||
|
Ti.API.debug( 'Endpoint URI: ' + e.source.parent_obj.endpoint_uri )
|
||||||
|
Ti.API.debug( 'Index:' + e.url.indexOf( e.source.parent_obj.endpoint_uri ) )
|
||||||
|
if e.url.indexOf( e.source.parent_obj.endpoint_uri ) is 0
|
||||||
|
Ti.API.info( 'ENDPOINT URL DETECTED!!!!' )
|
||||||
|
e.source.parent_obj.final_url = e.url
|
||||||
|
params = e.source.parent_obj.getGetParameters( e.url )
|
||||||
|
e.source.parent_obj.access_token = params['access_token']
|
||||||
|
e.source.parent_obj.refresh_token = params['refresh_token']
|
||||||
|
e.source.parent_obj.expiry_time = params['expires_in']
|
||||||
|
e.source.parent_obj.update_stamp = Math.round( +new Date() / 1000 )
|
||||||
|
e.source.auth_view.hide()
|
||||||
|
Ti.API.info( 'Got new token. Will expire in ' + params['expires_in'] + ' seconds.' )
|
||||||
|
e.source.success_function( e )
|
||||||
|
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
var EzOAuth2;
|
||||||
|
EzOAuth2 = (function() {
|
||||||
|
function EzOAuth2(root_url, customer_id, customer_secret, endpoint_uri) {
|
||||||
|
var id;
|
||||||
|
this.root_url = root_url;
|
||||||
|
this.customer_id = customer_id;
|
||||||
|
this.customer_secret = customer_secret;
|
||||||
|
this.endpoint_uri = endpoint_uri;
|
||||||
|
id = Ti.Utils.md5HexDigest(this.root_url + this.customer_id + this.customer_secret + this.endpoint_uri);
|
||||||
|
this.access_token = Ti.App.Properties.getString(id + '_access', null);
|
||||||
|
this.refresh_token = Ti.App.Properties.getString(id + '_refresh', null);
|
||||||
|
this.update_stamp = Ti.App.Properties.getString(id + '_updated', null);
|
||||||
|
this.expiry_time = Ti.App.Properties.getInt(id + '_expires', 3600);
|
||||||
|
Ti.API.debug('EzOAuth2 object initialized.');
|
||||||
|
}
|
||||||
|
EzOAuth2.prototype.saveSettings = function() {
|
||||||
|
var id;
|
||||||
|
id = Ti.Utils.md5HexDigest(this.root_url + this.customer_id + this.customer_secret + this.endpoint_uri);
|
||||||
|
Ti.App.Properties.setString(id + '_access', this.access_token);
|
||||||
|
Ti.App.Properties.setString(id + '_refresh', this.refresh_token);
|
||||||
|
Ti.App.Properties.setString(id + '_updated', this.update_stamp);
|
||||||
|
return Ti.App.Properties.setInt(id + '_expires', this.expiry_time);
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.getAuthView = function(success_function, cancel_function) {
|
||||||
|
var authUrl, wv;
|
||||||
|
authUrl = this.root_url + '/oauth/authorize' + '?response_type=token' + '&client_id=' + this.customer_id + '&redirect_uri=' + encodeURIComponent(this.endpoint_uri);
|
||||||
|
Ti.API.debug('authUrl: ' + authUrl);
|
||||||
|
wv = Ti.UI.createWebView({
|
||||||
|
url: authUrl
|
||||||
|
});
|
||||||
|
wv.parent_obj = this;
|
||||||
|
wv.success_function = success_function;
|
||||||
|
wv.cancel_function = cancel_function;
|
||||||
|
wv.addEventListener('beforeload', this.processOAuth2Response);
|
||||||
|
this.auth_web = wv;
|
||||||
|
this.auth_btn = Ti.UI.createButton({
|
||||||
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
width: 50,
|
||||||
|
height: 30,
|
||||||
|
title: "Cancel"
|
||||||
|
});
|
||||||
|
this.auth_btn.click_function = cancel_function;
|
||||||
|
this.auth_btn.addEventListener('click', function(e) {
|
||||||
|
e.source.auth_view.hide();
|
||||||
|
return e.source.click_function(e);
|
||||||
|
});
|
||||||
|
this.auth_view = Ti.UI.createView();
|
||||||
|
this.auth_view.add(this.auth_web);
|
||||||
|
this.auth_view.add(this.auth_btn);
|
||||||
|
this.auth_web.auth_view = this.auth_view;
|
||||||
|
this.auth_btn.auth_view = this.auth_view;
|
||||||
|
return this.auth_view;
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.doRequest = function(url, success_function, type) {
|
||||||
|
var xhr;
|
||||||
|
if (type == null) {
|
||||||
|
type = 'GET';
|
||||||
|
}
|
||||||
|
if (this.access_token === null) {
|
||||||
|
Ti.API.warning('No access token.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (Ti.Network.networkType === Ti.Network.NETWORK_NONE) {
|
||||||
|
Ti.API.warning('No Internet connection.');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
xhr = Ti.Network.createHTTPClient({
|
||||||
|
onerror: function() {
|
||||||
|
return Ti.API.error('ERROR communicating. (' + this.responseText + ')');
|
||||||
|
},
|
||||||
|
onload: success_function
|
||||||
|
});
|
||||||
|
xhr.open(type, this.root_url + '/api/ezp/v1' + url);
|
||||||
|
xhr.setRequestHeader('Authorization', 'OAuth ' + this.access_token);
|
||||||
|
xhr.setRequestHeader('Accept', 'application/json');
|
||||||
|
return xhr.send();
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.getNode = function(node_id, success_function) {
|
||||||
|
return this.doRequest('/content/node/' + node_id, success_function);
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.getNodeFields = function(node_id, success_function) {
|
||||||
|
return this.doRequest('/content/node/' + node_id + '/fields', success_function);
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.getNodeField = function(node_id, field_id, success_function) {
|
||||||
|
return this.doRequest('/content/node/' + node_id + '/field/' + field_id, success_function);
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.getNodeList = function(root_node_id, success_function, offset, limit, sortKey, sortType) {
|
||||||
|
var req_url;
|
||||||
|
if (offset == null) {
|
||||||
|
offset = null;
|
||||||
|
}
|
||||||
|
if (limit == null) {
|
||||||
|
limit = null;
|
||||||
|
}
|
||||||
|
if (sortKey == null) {
|
||||||
|
sortKey = null;
|
||||||
|
}
|
||||||
|
if (sortType == null) {
|
||||||
|
sortType = null;
|
||||||
|
}
|
||||||
|
req_url = '/content/node/' + root_node_id + '/list';
|
||||||
|
if (offset != null) {
|
||||||
|
req_url += '/offset/' + offset;
|
||||||
|
}
|
||||||
|
if (limit != null) {
|
||||||
|
req_url += '/limit/' + limit;
|
||||||
|
}
|
||||||
|
if (sortKey != null) {
|
||||||
|
req_url += '/sort/' + sortKey;
|
||||||
|
if (sortType != null) {
|
||||||
|
req_url += '/' + sortType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return this.doRequest(req_url, success_function);
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.getGetParameters = function(url) {
|
||||||
|
var pair, pair_split, pairs, vars, _i, _len;
|
||||||
|
vars = {};
|
||||||
|
pairs = url.slice(url.indexOf('?') + 1).split('&');
|
||||||
|
for (_i = 0, _len = pairs.length; _i < _len; _i++) {
|
||||||
|
pair = pairs[_i];
|
||||||
|
Ti.API.debug('Now splitting: "' + pair + '"');
|
||||||
|
pair_split = pair.split('=');
|
||||||
|
vars[pair_split[0]] = pair_split[1];
|
||||||
|
}
|
||||||
|
return vars;
|
||||||
|
};
|
||||||
|
EzOAuth2.prototype.processOAuth2Response = function(e) {
|
||||||
|
var params;
|
||||||
|
Ti.API.debug('[beforeload] URL: ' + e.url);
|
||||||
|
Ti.API.debug('Endpoint URI: ' + e.source.parent_obj.endpoint_uri);
|
||||||
|
Ti.API.debug('Index:' + e.url.indexOf(e.source.parent_obj.endpoint_uri));
|
||||||
|
if (e.url.indexOf(e.source.parent_obj.endpoint_uri) === 0) {
|
||||||
|
Ti.API.info('ENDPOINT URL DETECTED!!!!');
|
||||||
|
e.source.parent_obj.final_url = e.url;
|
||||||
|
params = e.source.parent_obj.getGetParameters(e.url);
|
||||||
|
e.source.parent_obj.access_token = params['access_token'];
|
||||||
|
e.source.parent_obj.refresh_token = params['refresh_token'];
|
||||||
|
e.source.parent_obj.expiry_time = params['expires_in'];
|
||||||
|
e.source.parent_obj.update_stamp = Math.round(+new Date() / 1000);
|
||||||
|
e.source.auth_view.hide();
|
||||||
|
Ti.API.info('Got new token. Will expire in ' + params['expires_in'] + ' seconds.');
|
||||||
|
return e.source.success_function(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return EzOAuth2;
|
||||||
|
})();
|
||||||
@@ -0,0 +1,551 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 Netflix, Inc.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Here's some JavaScript software for implementing OAuth.
|
||||||
|
|
||||||
|
This isn't as useful as you might hope. OAuth is based around
|
||||||
|
allowing tools and websites to talk to each other. However,
|
||||||
|
JavaScript running in web browsers is hampered by security
|
||||||
|
restrictions that prevent code running on one website from
|
||||||
|
accessing data stored or served on another.
|
||||||
|
|
||||||
|
Before you start hacking, make sure you understand the limitations
|
||||||
|
posed by cross-domain XMLHttpRequest.
|
||||||
|
|
||||||
|
On the bright side, some platforms use JavaScript as their
|
||||||
|
language, but enable the programmer to access other web sites.
|
||||||
|
Examples include Google Gadgets, and Microsoft Vista Sidebar.
|
||||||
|
For those platforms, this library should come in handy.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// The HMAC-SHA1 signature method calls b64_hmac_sha1, defined by
|
||||||
|
// http://pajhome.org.uk/crypt/md5/sha1.js
|
||||||
|
|
||||||
|
/* An OAuth message is represented as an object like this:
|
||||||
|
{method: "GET", action: "http://server.com/path", parameters: ...}
|
||||||
|
|
||||||
|
The parameters may be either a map {name: value, name2: value2}
|
||||||
|
or an Array of name-value pairs [[name, value], [name2, value2]].
|
||||||
|
The latter representation is more powerful: it supports parameters
|
||||||
|
in a specific sequence, or several parameters with the same name;
|
||||||
|
for example [["a", 1], ["b", 2], ["a", 3]].
|
||||||
|
|
||||||
|
Parameter names and values are NOT percent-encoded in an object.
|
||||||
|
They must be encoded before transmission and decoded after reception.
|
||||||
|
For example, this message object:
|
||||||
|
{method: "GET", action: "http://server/path", parameters: {p: "x y"}}
|
||||||
|
... can be transmitted as an HTTP request that begins:
|
||||||
|
GET /path?p=x%20y HTTP/1.0
|
||||||
|
(This isn't a valid OAuth request, since it lacks a signature etc.)
|
||||||
|
Note that the object "x y" is transmitted as x%20y. To encode
|
||||||
|
parameters, you can call OAuth.addToURL, OAuth.formEncode or
|
||||||
|
OAuth.getAuthorization.
|
||||||
|
|
||||||
|
This message object model harmonizes with the browser object model for
|
||||||
|
input elements of an form, whose value property isn't percent encoded.
|
||||||
|
The browser encodes each value before transmitting it. For example,
|
||||||
|
see consumer.setInputs in example/consumer.js.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This script needs to know what time it is. By default, it uses the local
|
||||||
|
clock (new Date), which is apt to be inaccurate in browsers. To do
|
||||||
|
better, you can load this script from a URL whose query string contains
|
||||||
|
an oauth_timestamp parameter, whose value is a current Unix timestamp.
|
||||||
|
For example, when generating the enclosing document using PHP:
|
||||||
|
|
||||||
|
<script src="oauth.js?oauth_timestamp=<?=time()?>" ...
|
||||||
|
|
||||||
|
Another option is to call OAuth.correctTimestamp with a Unix timestamp.
|
||||||
|
*/
|
||||||
|
|
||||||
|
var OAuth; if (OAuth == null) OAuth = {};
|
||||||
|
|
||||||
|
OAuth.setProperties = function setProperties(into, from) {
|
||||||
|
if (into != null && from != null) {
|
||||||
|
for (var key in from) {
|
||||||
|
into[key] = from[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return into;
|
||||||
|
}
|
||||||
|
|
||||||
|
OAuth.setProperties(OAuth, // utility functions
|
||||||
|
{
|
||||||
|
percentEncode: function percentEncode(s) {
|
||||||
|
if (s == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
if (s instanceof Array) {
|
||||||
|
var e = "";
|
||||||
|
for (var i = 0; i < s.length; ++s) {
|
||||||
|
if (e != "") e += '&';
|
||||||
|
e += OAuth.percentEncode(s[i]);
|
||||||
|
}
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
s = encodeURIComponent(s);
|
||||||
|
// Now replace the values which encodeURIComponent doesn't do
|
||||||
|
// encodeURIComponent ignores: - _ . ! ~ * ' ( )
|
||||||
|
// OAuth dictates the only ones you can ignore are: - _ . ~
|
||||||
|
// Source: http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Functions:encodeURIComponent
|
||||||
|
s = s.replace(/\!/g, "%21");
|
||||||
|
s = s.replace(/\*/g, "%2A");
|
||||||
|
s = s.replace(/\'/g, "%27");
|
||||||
|
s = s.replace(/\(/g, "%28");
|
||||||
|
s = s.replace(/\)/g, "%29");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
decodePercent: function decodePercent(s) {
|
||||||
|
if (s != null) {
|
||||||
|
// Handle application/x-www-form-urlencoded, which is defined by
|
||||||
|
// http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
|
||||||
|
s = s.replace(/\+/g, " ");
|
||||||
|
}
|
||||||
|
return decodeURIComponent(s);
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Convert the given parameters to an Array of name-value pairs. */
|
||||||
|
getParameterList: function getParameterList(parameters) {
|
||||||
|
if (parameters == null) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
if (typeof parameters != "object") {
|
||||||
|
return OAuth.decodeForm(parameters + "");
|
||||||
|
}
|
||||||
|
if (parameters instanceof Array) {
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
var list = [];
|
||||||
|
for (var p in parameters) {
|
||||||
|
list.push([p, parameters[p]]);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Convert the given parameters to a map from name to value. */
|
||||||
|
getParameterMap: function getParameterMap(parameters) {
|
||||||
|
if (parameters == null) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
if (typeof parameters != "object") {
|
||||||
|
return OAuth.getParameterMap(OAuth.decodeForm(parameters + ""));
|
||||||
|
}
|
||||||
|
if (parameters instanceof Array) {
|
||||||
|
var map = {};
|
||||||
|
for (var p = 0; p < parameters.length; ++p) {
|
||||||
|
var key = parameters[p][0];
|
||||||
|
if (map[key] === undefined) { // first value wins
|
||||||
|
map[key] = parameters[p][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
return parameters;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
getParameter: function getParameter(parameters, name) {
|
||||||
|
if (parameters instanceof Array) {
|
||||||
|
for (var p = 0; p < parameters.length; ++p) {
|
||||||
|
if (parameters[p][0] == name) {
|
||||||
|
return parameters[p][1]; // first value wins
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return OAuth.getParameterMap(parameters)[name];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
formEncode: function formEncode(parameters) {
|
||||||
|
var form = "";
|
||||||
|
var list = OAuth.getParameterList(parameters);
|
||||||
|
for (var p = 0; p < list.length; ++p) {
|
||||||
|
var value = list[p][1];
|
||||||
|
if (value == null) value = "";
|
||||||
|
if (form != "") form += '&';
|
||||||
|
form += OAuth.percentEncode(list[p][0])
|
||||||
|
+'='+ OAuth.percentEncode(value);
|
||||||
|
}
|
||||||
|
return form;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
decodeForm: function decodeForm(form) {
|
||||||
|
var list = [];
|
||||||
|
var nvps = form.split('&');
|
||||||
|
for (var n = 0; n < nvps.length; ++n) {
|
||||||
|
var nvp = nvps[n];
|
||||||
|
if (nvp == "") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var equals = nvp.indexOf('=');
|
||||||
|
var name;
|
||||||
|
var value;
|
||||||
|
if (equals < 0) {
|
||||||
|
name = OAuth.decodePercent(nvp);
|
||||||
|
value = null;
|
||||||
|
} else {
|
||||||
|
name = OAuth.decodePercent(nvp.substring(0, equals));
|
||||||
|
value = OAuth.decodePercent(nvp.substring(equals + 1));
|
||||||
|
}
|
||||||
|
list.push([name, value]);
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
setParameter: function setParameter(message, name, value) {
|
||||||
|
var parameters = message.parameters;
|
||||||
|
if (parameters instanceof Array) {
|
||||||
|
for (var p = 0; p < parameters.length; ++p) {
|
||||||
|
if (parameters[p][0] == name) {
|
||||||
|
if (value === undefined) {
|
||||||
|
parameters.splice(p, 1);
|
||||||
|
} else {
|
||||||
|
parameters[p][1] = value;
|
||||||
|
value = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (value !== undefined) {
|
||||||
|
parameters.push([name, value]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
parameters = OAuth.getParameterMap(parameters);
|
||||||
|
parameters[name] = value;
|
||||||
|
message.parameters = parameters;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
setParameters: function setParameters(message, parameters) {
|
||||||
|
var list = OAuth.getParameterList(parameters);
|
||||||
|
for (var i = 0; i < list.length; ++i) {
|
||||||
|
OAuth.setParameter(message, list[i][0], list[i][1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Fill in parameters to help construct a request message.
|
||||||
|
This function doesn't fill in every parameter.
|
||||||
|
The accessor object should be like:
|
||||||
|
{consumerKey:'foo', consumerSecret:'bar', accessorSecret:'nurn', token:'krelm', tokenSecret:'blah'}
|
||||||
|
The accessorSecret property is optional.
|
||||||
|
*/
|
||||||
|
completeRequest: function completeRequest(message, accessor) {
|
||||||
|
if (message.method == null) {
|
||||||
|
message.method = "GET";
|
||||||
|
}
|
||||||
|
var map = OAuth.getParameterMap(message.parameters);
|
||||||
|
if (map.oauth_consumer_key == null) {
|
||||||
|
OAuth.setParameter(message, "oauth_consumer_key", accessor.consumerKey || "");
|
||||||
|
}
|
||||||
|
if (map.oauth_token == null && accessor.token != null) {
|
||||||
|
OAuth.setParameter(message, "oauth_token", accessor.token);
|
||||||
|
}
|
||||||
|
if (map.oauth_version == null) {
|
||||||
|
OAuth.setParameter(message, "oauth_version", "1.0");
|
||||||
|
}
|
||||||
|
if (map.oauth_timestamp == null) {
|
||||||
|
OAuth.setParameter(message, "oauth_timestamp", OAuth.timestamp());
|
||||||
|
}
|
||||||
|
if (map.oauth_nonce == null) {
|
||||||
|
OAuth.setParameter(message, "oauth_nonce", OAuth.nonce(6));
|
||||||
|
}
|
||||||
|
OAuth.SignatureMethod.sign(message, accessor);
|
||||||
|
}
|
||||||
|
,
|
||||||
|
setTimestampAndNonce: function setTimestampAndNonce(message) {
|
||||||
|
OAuth.setParameter(message, "oauth_timestamp", OAuth.timestamp());
|
||||||
|
OAuth.setParameter(message, "oauth_nonce", OAuth.nonce(6));
|
||||||
|
}
|
||||||
|
,
|
||||||
|
addToURL: function addToURL(url, parameters) {
|
||||||
|
newURL = url;
|
||||||
|
if (parameters != null) {
|
||||||
|
var toAdd = OAuth.formEncode(parameters);
|
||||||
|
if (toAdd.length > 0) {
|
||||||
|
var q = url.indexOf('?');
|
||||||
|
if (q < 0) newURL += '?';
|
||||||
|
else newURL += '&';
|
||||||
|
newURL += toAdd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newURL;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Construct the value of the Authorization header for an HTTP request. */
|
||||||
|
getAuthorizationHeader: function getAuthorizationHeader(realm, parameters) {
|
||||||
|
var header = 'OAuth realm="' + OAuth.percentEncode(realm) + '"';
|
||||||
|
var list = OAuth.getParameterList(parameters);
|
||||||
|
for (var p = 0; p < list.length; ++p) {
|
||||||
|
var parameter = list[p];
|
||||||
|
var name = parameter[0];
|
||||||
|
if (name.indexOf("oauth_") == 0) {
|
||||||
|
header += ',' + OAuth.percentEncode(name) + '="' + OAuth.percentEncode(parameter[1]) + '"';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Correct the time using a parameter from the URL from which the last script was loaded. */
|
||||||
|
correctTimestampFromSrc: function correctTimestampFromSrc(parameterName) {
|
||||||
|
parameterName = parameterName || "oauth_timestamp";
|
||||||
|
var scripts = document.getElementsByTagName('script');
|
||||||
|
if (scripts == null || !scripts.length) return;
|
||||||
|
var src = scripts[scripts.length-1].src;
|
||||||
|
if (!src) return;
|
||||||
|
var q = src.indexOf("?");
|
||||||
|
if (q < 0) return;
|
||||||
|
parameters = OAuth.getParameterMap(OAuth.decodeForm(src.substring(q+1)));
|
||||||
|
var t = parameters[parameterName];
|
||||||
|
if (t == null) return;
|
||||||
|
OAuth.correctTimestamp(t);
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Generate timestamps starting with the given value. */
|
||||||
|
correctTimestamp: function correctTimestamp(timestamp) {
|
||||||
|
OAuth.timeCorrectionMsec = (timestamp * 1000) - (new Date()).getTime();
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** The difference between the correct time and my clock. */
|
||||||
|
timeCorrectionMsec: 0
|
||||||
|
,
|
||||||
|
timestamp: function timestamp() {
|
||||||
|
var t = (new Date()).getTime() + OAuth.timeCorrectionMsec;
|
||||||
|
return Math.floor(t / 1000);
|
||||||
|
}
|
||||||
|
,
|
||||||
|
nonce: function nonce(length) {
|
||||||
|
var chars = OAuth.nonce.CHARS;
|
||||||
|
var result = "";
|
||||||
|
for (var i = 0; i < length; ++i) {
|
||||||
|
var rnum = Math.floor(Math.random() * chars.length);
|
||||||
|
result += chars.substring(rnum, rnum+1);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
OAuth.nonce.CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
|
||||||
|
|
||||||
|
/** Define a constructor function,
|
||||||
|
without causing trouble to anyone who was using it as a namespace.
|
||||||
|
That is, if parent[name] already existed and had properties,
|
||||||
|
copy those properties into the new constructor.
|
||||||
|
*/
|
||||||
|
OAuth.declareClass = function declareClass(parent, name, newConstructor) {
|
||||||
|
var previous = parent[name];
|
||||||
|
parent[name] = newConstructor;
|
||||||
|
if (newConstructor != null && previous != null) {
|
||||||
|
for (var key in previous) {
|
||||||
|
if (key != "prototype") {
|
||||||
|
newConstructor[key] = previous[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newConstructor;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** An abstract algorithm for signing messages. */
|
||||||
|
OAuth.declareClass(OAuth, "SignatureMethod", function OAuthSignatureMethod(){});
|
||||||
|
|
||||||
|
OAuth.setProperties(OAuth.SignatureMethod.prototype, // instance members
|
||||||
|
{
|
||||||
|
/** Add a signature to the message. */
|
||||||
|
sign: function sign(message) {
|
||||||
|
var baseString = OAuth.SignatureMethod.getBaseString(message);
|
||||||
|
var signature = this.getSignature(baseString);
|
||||||
|
OAuth.setParameter(message, "oauth_signature", signature);
|
||||||
|
return signature; // just in case someone's interested
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Set the key string for signing. */
|
||||||
|
initialize: function initialize(name, accessor) {
|
||||||
|
var consumerSecret;
|
||||||
|
if (accessor.accessorSecret != null
|
||||||
|
&& name.length > 9
|
||||||
|
&& name.substring(name.length-9) == "-Accessor")
|
||||||
|
{
|
||||||
|
consumerSecret = accessor.accessorSecret;
|
||||||
|
} else {
|
||||||
|
consumerSecret = accessor.consumerSecret;
|
||||||
|
}
|
||||||
|
this.key = OAuth.percentEncode(consumerSecret)
|
||||||
|
+"&"+ OAuth.percentEncode(accessor.tokenSecret);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* SignatureMethod expects an accessor object to be like this:
|
||||||
|
{tokenSecret: "lakjsdflkj...", consumerSecret: "QOUEWRI..", accessorSecret: "xcmvzc..."}
|
||||||
|
The accessorSecret property is optional.
|
||||||
|
*/
|
||||||
|
// Class members:
|
||||||
|
OAuth.setProperties(OAuth.SignatureMethod, // class members
|
||||||
|
{
|
||||||
|
sign: function sign(message, accessor) {
|
||||||
|
var name = OAuth.getParameterMap(message.parameters).oauth_signature_method;
|
||||||
|
if (name == null || name == "") {
|
||||||
|
name = "HMAC-SHA1";
|
||||||
|
OAuth.setParameter(message, "oauth_signature_method", name);
|
||||||
|
}
|
||||||
|
OAuth.SignatureMethod.newMethod(name, accessor).sign(message);
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Instantiate a SignatureMethod for the given method name. */
|
||||||
|
newMethod: function newMethod(name, accessor) {
|
||||||
|
var impl = OAuth.SignatureMethod.REGISTERED[name];
|
||||||
|
if (impl != null) {
|
||||||
|
var method = new impl();
|
||||||
|
method.initialize(name, accessor);
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
var err = new Error("signature_method_rejected");
|
||||||
|
var acceptable = "";
|
||||||
|
for (var r in OAuth.SignatureMethod.REGISTERED) {
|
||||||
|
if (acceptable != "") acceptable += '&';
|
||||||
|
acceptable += OAuth.percentEncode(r);
|
||||||
|
}
|
||||||
|
err.oauth_acceptable_signature_methods = acceptable;
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** A map from signature method name to constructor. */
|
||||||
|
REGISTERED : {}
|
||||||
|
,
|
||||||
|
/** Subsequently, the given constructor will be used for the named methods.
|
||||||
|
The constructor will be called with no parameters.
|
||||||
|
The resulting object should usually implement getSignature(baseString).
|
||||||
|
You can easily define such a constructor by calling makeSubclass, below.
|
||||||
|
*/
|
||||||
|
registerMethodClass: function registerMethodClass(names, classConstructor) {
|
||||||
|
for (var n = 0; n < names.length; ++n) {
|
||||||
|
OAuth.SignatureMethod.REGISTERED[names[n]] = classConstructor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
,
|
||||||
|
/** Create a subclass of OAuth.SignatureMethod, with the given getSignature function. */
|
||||||
|
makeSubclass: function makeSubclass(getSignatureFunction) {
|
||||||
|
var superClass = OAuth.SignatureMethod;
|
||||||
|
var subClass = function() {
|
||||||
|
superClass.call(this);
|
||||||
|
};
|
||||||
|
subClass.prototype = new superClass();
|
||||||
|
// Delete instance variables from prototype:
|
||||||
|
// delete subclass.prototype... There aren't any.
|
||||||
|
subClass.prototype.getSignature = getSignatureFunction;
|
||||||
|
subClass.prototype.constructor = subClass;
|
||||||
|
return subClass;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
getBaseString: function getBaseString(message) {
|
||||||
|
var URL = message.action;
|
||||||
|
var q = URL.indexOf('?');
|
||||||
|
var parameters;
|
||||||
|
if (q < 0) {
|
||||||
|
parameters = message.parameters;
|
||||||
|
} else {
|
||||||
|
// Combine the URL query string with the other parameters:
|
||||||
|
parameters = OAuth.decodeForm(URL.substring(q + 1));
|
||||||
|
var toAdd = OAuth.getParameterList(message.parameters);
|
||||||
|
for (var a = 0; a < toAdd.length; ++a) {
|
||||||
|
parameters.push(toAdd[a]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return OAuth.percentEncode(message.method.toUpperCase())
|
||||||
|
+'&'+ OAuth.percentEncode(OAuth.SignatureMethod.normalizeUrl(URL))
|
||||||
|
+'&'+ OAuth.percentEncode(OAuth.SignatureMethod.normalizeParameters(parameters));
|
||||||
|
}
|
||||||
|
,
|
||||||
|
normalizeUrl: function normalizeUrl(url) {
|
||||||
|
var uri = OAuth.SignatureMethod.parseUri(url);
|
||||||
|
var scheme = uri.protocol.toLowerCase();
|
||||||
|
var authority = uri.authority.toLowerCase();
|
||||||
|
var dropPort = (scheme == "http" && uri.port == 80)
|
||||||
|
|| (scheme == "https" && uri.port == 443);
|
||||||
|
if (dropPort) {
|
||||||
|
// find the last : in the authority
|
||||||
|
var index = authority.lastIndexOf(":");
|
||||||
|
if (index >= 0) {
|
||||||
|
authority = authority.substring(0, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var path = uri.path;
|
||||||
|
if (!path) {
|
||||||
|
path = "/"; // conforms to RFC 2616 section 3.2.2
|
||||||
|
}
|
||||||
|
// we know that there is no query and no fragment here.
|
||||||
|
return scheme + "://" + authority + path;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
parseUri: function parseUri (str) {
|
||||||
|
/* This function was adapted from parseUri 1.2.1
|
||||||
|
http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
|
||||||
|
*/
|
||||||
|
var o = {key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
|
||||||
|
parser: {strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/ }};
|
||||||
|
var m = o.parser.strict.exec(str);
|
||||||
|
var uri = {};
|
||||||
|
var i = 14;
|
||||||
|
while (i--) uri[o.key[i]] = m[i] || "";
|
||||||
|
return uri;
|
||||||
|
}
|
||||||
|
,
|
||||||
|
normalizeParameters: function normalizeParameters(parameters) {
|
||||||
|
if (parameters == null) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
var list = OAuth.getParameterList(parameters);
|
||||||
|
var sortable = [];
|
||||||
|
for (var p = 0; p < list.length; ++p) {
|
||||||
|
var nvp = list[p];
|
||||||
|
if (nvp[0] != "oauth_signature") {
|
||||||
|
sortable.push([ OAuth.percentEncode(nvp[0])
|
||||||
|
+ " " // because it comes before any character that can appear in a percentEncoded string.
|
||||||
|
+ OAuth.percentEncode(nvp[1])
|
||||||
|
, nvp]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sortable.sort(function(a,b) {
|
||||||
|
if (a[0] < b[0]) return -1;
|
||||||
|
if (a[0] > b[0]) return 1;
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
var sorted = [];
|
||||||
|
for (var s = 0; s < sortable.length; ++s) {
|
||||||
|
sorted.push(sortable[s][1]);
|
||||||
|
}
|
||||||
|
return OAuth.formEncode(sorted);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
OAuth.SignatureMethod.registerMethodClass(["PLAINTEXT", "PLAINTEXT-Accessor"],
|
||||||
|
OAuth.SignatureMethod.makeSubclass(
|
||||||
|
function getSignature(baseString) {
|
||||||
|
return this.key;
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
|
OAuth.SignatureMethod.registerMethodClass(["HMAC-SHA1", "HMAC-SHA1-Accessor"],
|
||||||
|
OAuth.SignatureMethod.makeSubclass(
|
||||||
|
function getSignature(baseString) {
|
||||||
|
b64pad = '=';
|
||||||
|
var signature = b64_hmac_sha1(this.key, baseString);
|
||||||
|
return signature;
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
|
try {
|
||||||
|
OAuth.correctTimestampFromSrc();
|
||||||
|
} catch(e) {
|
||||||
|
}
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
/*
|
||||||
|
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
|
||||||
|
* in FIPS PUB 180-1
|
||||||
|
* Version 2.1a Copyright Paul Johnston 2000 - 2002.
|
||||||
|
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
|
||||||
|
* Distributed under the BSD License
|
||||||
|
* See http://pajhome.org.uk/crypt/md5 for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configurable variables. You may need to tweak these to be compatible with
|
||||||
|
* the server-side, but the defaults work in most cases.
|
||||||
|
*/
|
||||||
|
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
|
||||||
|
var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
|
||||||
|
var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are the functions you'll usually want to call
|
||||||
|
* They take string arguments and return either hex or base-64 encoded strings
|
||||||
|
*/
|
||||||
|
function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
|
||||||
|
function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
|
||||||
|
function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
|
||||||
|
function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
|
||||||
|
function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
|
||||||
|
function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform a simple self-test to see if the VM is working
|
||||||
|
*/
|
||||||
|
function sha1_vm_test()
|
||||||
|
{
|
||||||
|
return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate the SHA-1 of an array of big-endian words, and a bit length
|
||||||
|
*/
|
||||||
|
function core_sha1(x, len)
|
||||||
|
{
|
||||||
|
/* append padding */
|
||||||
|
x[len >> 5] |= 0x80 << (24 - len % 32);
|
||||||
|
x[((len + 64 >> 9) << 4) + 15] = len;
|
||||||
|
|
||||||
|
var w = Array(80);
|
||||||
|
var a = 1732584193;
|
||||||
|
var b = -271733879;
|
||||||
|
var c = -1732584194;
|
||||||
|
var d = 271733878;
|
||||||
|
var e = -1009589776;
|
||||||
|
|
||||||
|
for(var i = 0; i < x.length; i += 16)
|
||||||
|
{
|
||||||
|
var olda = a;
|
||||||
|
var oldb = b;
|
||||||
|
var oldc = c;
|
||||||
|
var oldd = d;
|
||||||
|
var olde = e;
|
||||||
|
|
||||||
|
for(var j = 0; j < 80; j++)
|
||||||
|
{
|
||||||
|
if(j < 16) w[j] = x[i + j];
|
||||||
|
else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
|
||||||
|
var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
|
||||||
|
safe_add(safe_add(e, w[j]), sha1_kt(j)));
|
||||||
|
e = d;
|
||||||
|
d = c;
|
||||||
|
c = rol(b, 30);
|
||||||
|
b = a;
|
||||||
|
a = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
a = safe_add(a, olda);
|
||||||
|
b = safe_add(b, oldb);
|
||||||
|
c = safe_add(c, oldc);
|
||||||
|
d = safe_add(d, oldd);
|
||||||
|
e = safe_add(e, olde);
|
||||||
|
}
|
||||||
|
return Array(a, b, c, d, e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform the appropriate triplet combination function for the current
|
||||||
|
* iteration
|
||||||
|
*/
|
||||||
|
function sha1_ft(t, b, c, d)
|
||||||
|
{
|
||||||
|
if(t < 20) return (b & c) | ((~b) & d);
|
||||||
|
if(t < 40) return b ^ c ^ d;
|
||||||
|
if(t < 60) return (b & c) | (b & d) | (c & d);
|
||||||
|
return b ^ c ^ d;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Determine the appropriate additive constant for the current iteration
|
||||||
|
*/
|
||||||
|
function sha1_kt(t)
|
||||||
|
{
|
||||||
|
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
|
||||||
|
(t < 60) ? -1894007588 : -899497514;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate the HMAC-SHA1 of a key and some data
|
||||||
|
*/
|
||||||
|
function core_hmac_sha1(key, data)
|
||||||
|
{
|
||||||
|
var bkey = str2binb(key);
|
||||||
|
if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
|
||||||
|
|
||||||
|
var ipad = Array(16), opad = Array(16);
|
||||||
|
for(var i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
ipad[i] = bkey[i] ^ 0x36363636;
|
||||||
|
opad[i] = bkey[i] ^ 0x5C5C5C5C;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
|
||||||
|
return core_sha1(opad.concat(hash), 512 + 160);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
|
||||||
|
* to work around bugs in some JS interpreters.
|
||||||
|
*/
|
||||||
|
function safe_add(x, y)
|
||||||
|
{
|
||||||
|
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
||||||
|
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||||||
|
return (msw << 16) | (lsw & 0xFFFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bitwise rotate a 32-bit number to the left.
|
||||||
|
*/
|
||||||
|
function rol(num, cnt)
|
||||||
|
{
|
||||||
|
return (num << cnt) | (num >>> (32 - cnt));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert an 8-bit or 16-bit string to an array of big-endian words
|
||||||
|
* In 8-bit function, characters >255 have their hi-byte silently ignored.
|
||||||
|
*/
|
||||||
|
function str2binb(str)
|
||||||
|
{
|
||||||
|
var bin = Array();
|
||||||
|
var mask = (1 << chrsz) - 1;
|
||||||
|
for(var i = 0; i < str.length * chrsz; i += chrsz)
|
||||||
|
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
|
||||||
|
return bin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert an array of big-endian words to a string
|
||||||
|
*/
|
||||||
|
function binb2str(bin)
|
||||||
|
{
|
||||||
|
var str = "";
|
||||||
|
var mask = (1 << chrsz) - 1;
|
||||||
|
for(var i = 0; i < bin.length * 32; i += chrsz)
|
||||||
|
str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert an array of big-endian words to a hex string.
|
||||||
|
*/
|
||||||
|
function binb2hex(binarray)
|
||||||
|
{
|
||||||
|
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
|
||||||
|
var str = "";
|
||||||
|
for(var i = 0; i < binarray.length * 4; i++)
|
||||||
|
{
|
||||||
|
str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
|
||||||
|
hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert an array of big-endian words to a base-64 string
|
||||||
|
*/
|
||||||
|
function binb2b64(binarray)
|
||||||
|
{
|
||||||
|
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
|
var str = "";
|
||||||
|
for(var i = 0; i < binarray.length * 4; i += 3)
|
||||||
|
{
|
||||||
|
var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
|
||||||
|
| (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
|
||||||
|
| ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
|
||||||
|
for(var j = 0; j < 4; j++)
|
||||||
|
{
|
||||||
|
if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
|
||||||
|
else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return str;
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
Ti.API.info( '▶▶▶ main.coffee' )
|
||||||
|
|
||||||
|
Ti.include( 'lib/EzOAuth2.js' )
|
||||||
|
|
||||||
|
oa = new EzOAuth2( 'http://london2011.ez.no', '98896cbfaa12dfba67ccdc18352a6374', '20667fe88eaace9d86ad19e48c772490', 'http://oauth.extranet.silversolutions.de/ssl/oauth/' )
|
||||||
|
|
||||||
|
# this sets the background color of the master UIView (when there are no windows/tab groups on it)
|
||||||
|
Ti.UI.setBackgroundColor('#000')
|
||||||
|
|
||||||
|
# create tab group
|
||||||
|
tabGroup = Ti.UI.createTabGroup()
|
||||||
|
|
||||||
|
|
||||||
|
# create base UI tab and root window
|
||||||
|
win1 = Ti.UI.createWindow(
|
||||||
|
title: 'eZ.REST Auth'
|
||||||
|
backgroundColor: '#fff'
|
||||||
|
)
|
||||||
|
|
||||||
|
tab1 = Ti.UI.createTab(
|
||||||
|
icon: 'KS_nav_views.png'
|
||||||
|
title: 'Auth'
|
||||||
|
window: win1
|
||||||
|
)
|
||||||
|
|
||||||
|
# create controls tab and root window
|
||||||
|
win2 = Ti.UI.createWindow(
|
||||||
|
title: 'eZ.REST Data'
|
||||||
|
backgroundColor: '#fff'
|
||||||
|
)
|
||||||
|
tab2 = Ti.UI.createTab(
|
||||||
|
icon: 'KS_nav_ui.png'
|
||||||
|
title: 'Data'
|
||||||
|
window: win2
|
||||||
|
)
|
||||||
|
|
||||||
|
label2 = Ti.UI.createLabel(
|
||||||
|
color: '#999'
|
||||||
|
text: 'I am Window 2'
|
||||||
|
font:
|
||||||
|
fontSize: 20
|
||||||
|
fontFamily: 'Helvetica Neue'
|
||||||
|
textAlign: 'center'
|
||||||
|
width: 'auto'
|
||||||
|
)
|
||||||
|
win2.add( label2 )
|
||||||
|
|
||||||
|
success_function = ( e ) ->
|
||||||
|
Ti.API.info( 'SUCCESS!!!!!!einself!!' )
|
||||||
|
Ti.API.info( 'Token valid for ' + e.source.parent_obj.expiry_time + ' seconds.' )
|
||||||
|
tabGroup.setActiveTab( 1 )
|
||||||
|
oa.getNodeList( 2, ->
|
||||||
|
Ti.API.info( 'Successful response! (' + this.responseText + ')' )
|
||||||
|
)
|
||||||
|
|
||||||
|
cancel_function = ( e ) ->
|
||||||
|
Ti.API.info( 'CANCELLED!!!!!!einself!!' )
|
||||||
|
|
||||||
|
|
||||||
|
win1.add( oa.getAuthView( success_function, cancel_function ) )
|
||||||
|
|
||||||
|
|
||||||
|
# add tabs
|
||||||
|
tabGroup.addTab( tab1 )
|
||||||
|
tabGroup.addTab( tab2 )
|
||||||
|
|
||||||
|
# open tab group
|
||||||
|
tabGroup.open()
|
||||||
|
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
var cancel_function, label2, oa, success_function, tab1, tab2, tabGroup, win1, win2;
|
||||||
|
Ti.API.info('▶▶▶ main.coffee');
|
||||||
|
Ti.include('lib/EzOAuth2.js');
|
||||||
|
oa = new EzOAuth2('http://london2011.ez.no', '98896cbfaa12dfba67ccdc18352a6374', '20667fe88eaace9d86ad19e48c772490', 'http://oauth.extranet.silversolutions.de/ssl/oauth/');
|
||||||
|
Ti.UI.setBackgroundColor('#000');
|
||||||
|
tabGroup = Ti.UI.createTabGroup();
|
||||||
|
win1 = Ti.UI.createWindow({
|
||||||
|
title: 'eZ.REST Auth',
|
||||||
|
backgroundColor: '#fff'
|
||||||
|
});
|
||||||
|
tab1 = Ti.UI.createTab({
|
||||||
|
icon: 'KS_nav_views.png',
|
||||||
|
title: 'Auth',
|
||||||
|
window: win1
|
||||||
|
});
|
||||||
|
win2 = Ti.UI.createWindow({
|
||||||
|
title: 'eZ.REST Data',
|
||||||
|
backgroundColor: '#fff'
|
||||||
|
});
|
||||||
|
tab2 = Ti.UI.createTab({
|
||||||
|
icon: 'KS_nav_ui.png',
|
||||||
|
title: 'Data',
|
||||||
|
window: win2
|
||||||
|
});
|
||||||
|
label2 = Ti.UI.createLabel({
|
||||||
|
color: '#999',
|
||||||
|
text: 'I am Window 2',
|
||||||
|
font: {
|
||||||
|
fontSize: 20,
|
||||||
|
fontFamily: 'Helvetica Neue'
|
||||||
|
},
|
||||||
|
textAlign: 'center',
|
||||||
|
width: 'auto'
|
||||||
|
});
|
||||||
|
win2.add(label2);
|
||||||
|
success_function = function(e) {
|
||||||
|
Ti.API.info('SUCCESS!!!!!!einself!!');
|
||||||
|
Ti.API.info('Token valid for ' + e.source.parent_obj.expiry_time + ' seconds.');
|
||||||
|
tabGroup.setActiveTab(1);
|
||||||
|
return oa.getNodeList(2, function() {
|
||||||
|
return Ti.API.info('Successful response! (' + this.responseText + ')');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
cancel_function = function(e) {
|
||||||
|
return Ti.API.info('CANCELLED!!!!!!einself!!');
|
||||||
|
};
|
||||||
|
win1.add(oa.getAuthView(success_function, cancel_function));
|
||||||
|
tabGroup.addTab(tab1);
|
||||||
|
tabGroup.addTab(tab2);
|
||||||
|
tabGroup.open();
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# -c compile
|
||||||
|
# -b bare
|
||||||
|
# -o output directory
|
||||||
|
coffee -c -b -o ../Resources/ ./
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"objectName": "eZ CONFERENCE & AWARDS 2011",
|
||||||
|
"classIdentifier": "frontpage",
|
||||||
|
"datePublished": 1195480486,
|
||||||
|
"dateModified": 1306758058,
|
||||||
|
"objectRemoteId": "8a9c9c761004866fb458d89910f52bee",
|
||||||
|
"objectId": 57,
|
||||||
|
"nodeId": 2,
|
||||||
|
"nodeRemoteId": "f3e90596361e31d496d4026eb624c983",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no"
|
||||||
|
},
|
||||||
|
"links": {
|
||||||
|
"name": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/field\/name",
|
||||||
|
"subtitle": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/field\/subtitle",
|
||||||
|
"summary": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/field\/summary",
|
||||||
|
"body": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/field\/body",
|
||||||
|
"page": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/field\/page",
|
||||||
|
"tags": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/field\/tags",
|
||||||
|
"description": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/field\/description",
|
||||||
|
"*": "http:\/\/london2011.ez.no\/api\/ezp\/content\/node\/2\/fields"
|
||||||
|
},
|
||||||
|
"requestedResponseGroups": [ "Metadata" ]
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"childrenNodes": [
|
||||||
|
{
|
||||||
|
"objectName": "Register",
|
||||||
|
"classIdentifier": "pardot_form",
|
||||||
|
"datePublished": 1302090674,
|
||||||
|
"dateModified": 1305549106,
|
||||||
|
"objectRemoteId": "fc831ba2d12dceb7063c3cc505eb6835",
|
||||||
|
"objectId": 1202,
|
||||||
|
"nodeId": 1255,
|
||||||
|
"nodeRemoteId": "ee2f05144e759af66ecce51c951e1d8e",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Register",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1255"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Awards",
|
||||||
|
"classIdentifier": "subcategory",
|
||||||
|
"datePublished": 1302091069,
|
||||||
|
"dateModified": 1307614988,
|
||||||
|
"objectRemoteId": "d0030e4e9bcc7c750f8632f6a21e3e94",
|
||||||
|
"objectId": 1203,
|
||||||
|
"nodeId": 1257,
|
||||||
|
"nodeRemoteId": "f4ef16fc0a59312cba563846df0947f2",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Awards",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1257"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Sponsorship",
|
||||||
|
"classIdentifier": "subcategory",
|
||||||
|
"datePublished": 1302092485,
|
||||||
|
"dateModified": 1306836982,
|
||||||
|
"objectRemoteId": "b6e0996328760db15880e369b80d4ad7",
|
||||||
|
"objectId": 1204,
|
||||||
|
"nodeId": 1258,
|
||||||
|
"nodeRemoteId": "985753bbd2cb56f4974b77c6706592e5",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Sponsorship",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1258"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Program",
|
||||||
|
"classIdentifier": "subcategory",
|
||||||
|
"datePublished": 1302615154,
|
||||||
|
"dateModified": 1306758514,
|
||||||
|
"objectRemoteId": "6a33ea773cb4b53b6e9cfaa3eba30a83",
|
||||||
|
"objectId": 1242,
|
||||||
|
"nodeId": 1290,
|
||||||
|
"nodeRemoteId": "863a37e73db4bc871ca7ba376b5ffdd0",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Program",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1290"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Become a sponsor",
|
||||||
|
"classIdentifier": "pardot_form",
|
||||||
|
"datePublished": 1302880201,
|
||||||
|
"dateModified": 1303844141,
|
||||||
|
"objectRemoteId": "9b658dadee4e7eae6b1e6f862d383e3d",
|
||||||
|
"objectId": 1284,
|
||||||
|
"nodeId": 1317,
|
||||||
|
"nodeRemoteId": "c5451492ef07cb27d3181053e88ca04d",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Become-a-sponsor",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1317"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Venue",
|
||||||
|
"classIdentifier": "subcategory",
|
||||||
|
"datePublished": 1303379183,
|
||||||
|
"dateModified": 1306504026,
|
||||||
|
"objectRemoteId": "a85b88e6470a3774174577333a2d2d7a",
|
||||||
|
"objectId": 1312,
|
||||||
|
"nodeId": 1340,
|
||||||
|
"nodeRemoteId": "f5639db00ad1c98775e5d5baac86a880",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Venue",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1340"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Location & Travel",
|
||||||
|
"classIdentifier": "subcategory",
|
||||||
|
"datePublished": 1303379268,
|
||||||
|
"dateModified": 1306504277,
|
||||||
|
"objectRemoteId": "7ec71fe395d7762ab6b53f4d1ba7ac0b",
|
||||||
|
"objectId": 1313,
|
||||||
|
"nodeId": 1341,
|
||||||
|
"nodeRemoteId": "d779c3fed2911e33c6fd44c6ed6e82ff",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Location-Travel",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1341"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Home",
|
||||||
|
"classIdentifier": "link",
|
||||||
|
"datePublished": 1303379367,
|
||||||
|
"dateModified": 1303840076,
|
||||||
|
"objectRemoteId": "a71a195cc6fcef87c1d3521e2ce720ac",
|
||||||
|
"objectId": 1314,
|
||||||
|
"nodeId": 1342,
|
||||||
|
"nodeRemoteId": "5e5a68e4bc098b37d6e53b4db7eac2d3",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Home",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1342"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Additional content",
|
||||||
|
"classIdentifier": "folder",
|
||||||
|
"datePublished": 1303383727,
|
||||||
|
"dateModified": 1303383727,
|
||||||
|
"objectRemoteId": "5c1e3a53e573cbdb1c316dd84abae1c5",
|
||||||
|
"objectId": 1319,
|
||||||
|
"nodeId": 1346,
|
||||||
|
"nodeRemoteId": "6b73f1f785501e23275132800fcd70f8",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Additional-content",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1346"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"objectName": "Contact",
|
||||||
|
"classIdentifier": "pardot_form",
|
||||||
|
"datePublished": 1303391868,
|
||||||
|
"dateModified": 1303392073,
|
||||||
|
"objectRemoteId": "b7e9ec37c1fff91c6f153d0b64a09632",
|
||||||
|
"objectId": 1325,
|
||||||
|
"nodeId": 1352,
|
||||||
|
"nodeRemoteId": "b7305ebbdbeee0f253f2410a7372b66e",
|
||||||
|
"fullUrl": "http:\/\/london2011.ez.no\/Contact",
|
||||||
|
"link": "http:\/\/london2011.ez.no\/api\/ezp\/v1\/content\/node\/1352"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"childrenCount":"14",
|
||||||
|
"parentNodeId":"2"
|
||||||
|
},
|
||||||
|
"requestedResponseGroups": [ "Metadata" ]
|
||||||
|
}
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>OAuth 2 User Agent Authentication Flow Demo</title>
|
||||||
|
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
$(function () {
|
||||||
|
var extractToken = function(hash) {
|
||||||
|
var match = hash.match(/access_token=(\w+)/);
|
||||||
|
return !!match && match[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
var setting =
|
||||||
|
{
|
||||||
|
'host': "london2011.ez.no"
|
||||||
|
, 'clientId': "98896cbfaa12dfba67ccdc18352a6374"
|
||||||
|
};
|
||||||
|
|
||||||
|
var authHost = "http://" + setting.host;
|
||||||
|
var resourceHost = "http://" + setting.host + "/api/ezp/v1";
|
||||||
|
|
||||||
|
var endUserAuthorizationEndpoint = authHost + "/oauth/authorize";
|
||||||
|
|
||||||
|
var token = extractToken(document.location.search);
|
||||||
|
if (token) {
|
||||||
|
$('div.authenticated').show();
|
||||||
|
|
||||||
|
$('span.token').text(token);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: resourceHost + '/content/node/2'
|
||||||
|
, beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('Authorization', "OAuth " + token);
|
||||||
|
xhr.setRequestHeader('Accept', "application/json");
|
||||||
|
}
|
||||||
|
, success: function (response) {
|
||||||
|
var container = $('span.user');
|
||||||
|
if (response) {
|
||||||
|
container.text(response);
|
||||||
|
} else {
|
||||||
|
container.text("An error occurred.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$('div.authenticate').show();
|
||||||
|
var returnTo = window.location;
|
||||||
|
returnTo = 'http://oauth.extranet.silversolutions.de/ssl/oauth/';
|
||||||
|
|
||||||
|
var authUrl = endUserAuthorizationEndpoint +
|
||||||
|
"?response_type=token" +
|
||||||
|
"&client_id=" + setting.clientId +
|
||||||
|
"&redirect_uri=" + encodeURIComponent( returnTo );
|
||||||
|
console.log( 'authUrl: %o', authUrl );
|
||||||
|
$("a.connect").attr("href", authUrl);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="authenticate hidden">
|
||||||
|
<a class="connect" href="">Connect</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="authenticated hidden">
|
||||||
|
<p>
|
||||||
|
You are using token
|
||||||
|
<span class="token">[no token]</span>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Your data is
|
||||||
|
<span class="user">[no username]</span>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>OAuth 2 User Agent Authentication Flow Demo</title>
|
||||||
|
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
$(function () {
|
||||||
|
var extractToken = function(hash) {
|
||||||
|
var match = hash.match(/access_token=(\w+)/);
|
||||||
|
return !!match && match[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
var setting =
|
||||||
|
{
|
||||||
|
'host': "london2011.ez.no"
|
||||||
|
, 'clientId': "77d9f303efe45b6bfdf6a3e8e5860952"
|
||||||
|
};
|
||||||
|
|
||||||
|
var authHost = "http://" + setting.host;
|
||||||
|
var resourceHost = "http://" + setting.host + "/api/ezp/v1";
|
||||||
|
|
||||||
|
var endUserAuthorizationEndpoint = authHost + "/oauth/authorize";
|
||||||
|
|
||||||
|
var token = extractToken(document.location.search);
|
||||||
|
if (token) {
|
||||||
|
$('div.authenticated').show();
|
||||||
|
|
||||||
|
$('span.token').text(token);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: resourceHost + '/content/node/2'
|
||||||
|
, beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('Authorization', "OAuth " + token);
|
||||||
|
xhr.setRequestHeader('Accept', "application/json");
|
||||||
|
}
|
||||||
|
, success: function (response) {
|
||||||
|
var container = $('span.user');
|
||||||
|
if (response) {
|
||||||
|
container.text(response);
|
||||||
|
} else {
|
||||||
|
container.text("An error occurred.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$('div.authenticate').show();
|
||||||
|
var returnTo = window.location;
|
||||||
|
returnTo = 'http://london2011.ez.no/api/ezp/v1';
|
||||||
|
|
||||||
|
var authUrl = endUserAuthorizationEndpoint +
|
||||||
|
"?response_type=token" +
|
||||||
|
"&client_id=" + setting.clientId +
|
||||||
|
"&redirect_uri=" + encodeURIComponent( returnTo );
|
||||||
|
console.log( 'authUrl: %o', authUrl );
|
||||||
|
$("a.connect").attr("href", authUrl);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="authenticate hidden">
|
||||||
|
<a class="connect" href="">Connect</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="authenticated hidden">
|
||||||
|
<p>
|
||||||
|
You are using token
|
||||||
|
<span class="token">[no token]</span>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Your data is
|
||||||
|
<span class="user">[no username]</span>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>OAuth 2 User Agent Authentication Flow Demo</title>
|
||||||
|
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
$(function () {
|
||||||
|
var extractToken = function(hash) {
|
||||||
|
var match = hash.match(/access_token=(\w+)/);
|
||||||
|
return !!match && match[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
var setting =
|
||||||
|
{
|
||||||
|
'host': "ssl.extranet.silversolutions.de"
|
||||||
|
, 'clientId': "03d34a9cc1f59cbd25f61f244f45826f"
|
||||||
|
};
|
||||||
|
|
||||||
|
var authHost = "http://" + setting.host;
|
||||||
|
var resourceHost = "http://" + setting.host + "/api/ezp/v1";
|
||||||
|
|
||||||
|
var endUserAuthorizationEndpoint = authHost + "/oauth/authorize";
|
||||||
|
|
||||||
|
var token = extractToken(document.location.search);
|
||||||
|
if (token) {
|
||||||
|
$('div.authenticated').show();
|
||||||
|
|
||||||
|
$('span.token').text(token);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: resourceHost + '/content/node/2'
|
||||||
|
, beforeSend: function (xhr) {
|
||||||
|
xhr.setRequestHeader('Authorization', "OAuth " + token);
|
||||||
|
xhr.setRequestHeader('Accept', "application/json");
|
||||||
|
}
|
||||||
|
, success: function (response) {
|
||||||
|
var container = $('span.user');
|
||||||
|
if (response) {
|
||||||
|
console.log( 'XHR Response: %o', response );
|
||||||
|
container.text( response.metadata.objectName );
|
||||||
|
} else {
|
||||||
|
container.text("An error occurred.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$('div.authenticate').show();
|
||||||
|
var returnTo = window.location;
|
||||||
|
// returnTo = 'http://london2011.ez.no/api/ezp/v1';
|
||||||
|
|
||||||
|
var authUrl = endUserAuthorizationEndpoint +
|
||||||
|
"?response_type=token" +
|
||||||
|
"&client_id=" + setting.clientId +
|
||||||
|
"&redirect_uri=" + encodeURIComponent( returnTo );
|
||||||
|
console.log( 'authUrl: %o', authUrl );
|
||||||
|
$("a.connect").attr("href", authUrl);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="authenticate hidden">
|
||||||
|
<a class="connect" href="">Connect</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="authenticated hidden">
|
||||||
|
<p>
|
||||||
|
You are using token
|
||||||
|
<span class="token">[no token]</span>.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Your data is
|
||||||
|
<span class="user" style="font-weight: bold;">loading...</span>.
|
||||||
|
</p>
|
||||||
|
(See JavaScript console for more info.)
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user