mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 09:12:52 +00:00
140 lines
4.9 KiB
JavaScript
140 lines
4.9 KiB
JavaScript
iD.OAuth = function() {
|
|
var baseurl = 'http://api06.dev.openstreetmap.org',
|
|
apibase = 'http://api06.dev.openstreetmap.org',
|
|
oauth_secret = 'aMnOOCwExO2XYtRVWJ1bI9QOdqh1cay2UgpbhA6p',
|
|
oauth = {};
|
|
|
|
var o = {
|
|
oauth_consumer_key: 'zwQZFivccHkLs3a8Rq5CoS412fE5aPCXDw9DZj7R',
|
|
oauth_signature_method: 'HMAC-SHA1'
|
|
};
|
|
|
|
function keyclean(x) { return x.replace(/\W/g, ''); }
|
|
|
|
if (token('oauth_token')) {
|
|
o.oauth_token = token('oauth_token');
|
|
}
|
|
|
|
function timenonce(o) {
|
|
o.oauth_timestamp = ohauth.timestamp();
|
|
o.oauth_nonce = ohauth.nonce();
|
|
return o;
|
|
}
|
|
|
|
// token getter/setter, namespaced to the current `apibase` value.
|
|
function token(k, x) {
|
|
if (arguments.length == 2) {
|
|
localStorage[keyclean(apibase) + k] = x;
|
|
}
|
|
return localStorage[keyclean(apibase) + k];
|
|
}
|
|
|
|
oauth.authenticated = function() {
|
|
return token('oauth_token') && token('oauth_token_secret');
|
|
};
|
|
|
|
oauth.logout = function() {
|
|
token('oauth_token', '');
|
|
token('oauth_token_secret', '');
|
|
token('oauth_request_token_secret', '');
|
|
return oauth;
|
|
};
|
|
|
|
oauth.xhr = function(options, callback) {
|
|
if (token('oauth_token')) {
|
|
o.oauth_token = token('oauth_token');
|
|
}
|
|
o = timenonce(o);
|
|
var url = apibase + options.path;
|
|
var oauth_token_secret = token('oauth_token_secret');
|
|
o.oauth_signature = ohauth.signature(oauth_secret, oauth_token_secret,
|
|
ohauth.baseString(options.method, url, o));
|
|
ohauth.xhr(options.method, url, o, options.content, options.options, function(err, xhr) {
|
|
if (xhr.responseXML) callback(err, xhr.responseXML);
|
|
else callback(err, xhr.response);
|
|
});
|
|
};
|
|
|
|
oauth.authenticate = function(callback) {
|
|
if (oauth.authenticated()) return callback();
|
|
|
|
oauth.logout();
|
|
|
|
o = timenonce(o);
|
|
var url = baseurl + '/oauth/request_token';
|
|
o.oauth_signature = ohauth.signature(oauth_secret, '',
|
|
ohauth.baseString('POST', url, o));
|
|
|
|
var l = iD.loading('contacting openstreetmap...');
|
|
|
|
ohauth.xhr('POST', url, o, null, {}, function(err, xhr) {
|
|
if (err) callback(err);
|
|
l.remove();
|
|
var modal = iD.modal();
|
|
modal
|
|
.select('.content')
|
|
.append('button')
|
|
.text('Authenticate with OpenStreetMap')
|
|
.on('click', function() {
|
|
modal.remove();
|
|
authorize(ohauth.stringQs(xhr.response));
|
|
});
|
|
});
|
|
|
|
function authorize(resp) {
|
|
token('oauth_request_token_secret', resp.oauth_token_secret);
|
|
var w = 600, h = 550,
|
|
settings = [
|
|
['width', w], ['height', h],
|
|
['left', screen.width / 2 - w / 2],
|
|
['top', screen.height / 2 - h / 2]].map(function(x) {
|
|
return x.join('=');
|
|
}).join(','),
|
|
popup = window.open(
|
|
baseurl + '/oauth/authorize?' + ohauth.qsString({
|
|
oauth_token: resp.oauth_token,
|
|
oauth_callback: location.href.replace('index.html', '')
|
|
.replace(/#.+/, '') + 'land.html'
|
|
}), 'oauth_window', settings),
|
|
locationCheck = window.setInterval(function() {
|
|
if (popup.closed) return window.clearInterval(locationCheck);
|
|
if (popup.location.search) {
|
|
var search = popup.location.search,
|
|
oauth_token = ohauth.stringQs(search.slice(1));
|
|
popup.close();
|
|
get_access_token(oauth_token);
|
|
window.clearInterval(locationCheck);
|
|
}
|
|
}, 100);
|
|
}
|
|
|
|
function get_access_token(oauth_token) {
|
|
var url = baseurl + '/oauth/access_token';
|
|
o = timenonce(o);
|
|
|
|
o.oauth_token = oauth_token.oauth_token;
|
|
var request_token_secret = token('oauth_request_token_secret');
|
|
o.oauth_signature = ohauth.signature(oauth_secret, request_token_secret,
|
|
ohauth.baseString('POST', url, o));
|
|
var l = iD.loading('contacting openstreetmap...');
|
|
ohauth.xhr('POST', url, o, null, {}, function(err, xhr) {
|
|
if (err) callback(err);
|
|
l.remove();
|
|
var access_token = ohauth.stringQs(xhr.response);
|
|
token('oauth_token', access_token.oauth_token);
|
|
token('oauth_token_secret', access_token.oauth_token_secret);
|
|
callback();
|
|
});
|
|
}
|
|
|
|
};
|
|
|
|
oauth.api = function(_) {
|
|
if (!arguments.length) return apibase;
|
|
apibase = _;
|
|
return oauth;
|
|
};
|
|
|
|
return oauth;
|
|
};
|