summaryrefslogtreecommitdiff
path: root/www/lib/ngCordova/dist/ng-cordova.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/lib/ngCordova/dist/ng-cordova.js')
-rw-r--r--www/lib/ngCordova/dist/ng-cordova.js3571
1 files changed, 2365 insertions, 1206 deletions
diff --git a/www/lib/ngCordova/dist/ng-cordova.js b/www/lib/ngCordova/dist/ng-cordova.js
index 4f749d9f..0e7a08f1 100644
--- a/www/lib/ngCordova/dist/ng-cordova.js
+++ b/www/lib/ngCordova/dist/ng-cordova.js
@@ -1,6 +1,6 @@
/*!
* ngCordova
- * v0.1.17-alpha
+ * v0.1.18-alpha
* Copyright 2014 Drifty Co. http://drifty.com/
* See LICENSE in this repository for license information
*/
@@ -133,6 +133,21 @@ angular.module('ngCordova.plugins.appRate', [])
.provider("$cordovaAppRate", [function () {
+ /**
+ * Set defaults settings to AppRate
+ *
+ * @param {Object} defaults - AppRate default settings
+ * @param {string} defaults.language
+ * @param {string} defaults.appName
+ * @param {boolean} defaults.promptForNewVersion
+ * @param {boolean} defaults.openStoreInApp
+ * @param {number} defaults.usesUntilPrompt
+ * @param {boolean} defaults.useCustomRateDialog
+ * @param {string} defaults.iosURL
+ * @param {string} defaults.androidURL
+ * @param {string} defaults.blackberryURL
+ * @param {string} defaults.windowsURL
+ */
this.setPreferences = function (defaults) {
if (!defaults || !angular.isObject(defaults)) {
return;
@@ -150,6 +165,15 @@ angular.module('ngCordova.plugins.appRate', [])
AppRate.preferences.storeAppURL.windows8 = defaults.windowsURL || null;
};
+ /**
+ * Set custom locale
+ *
+ * @param {Object} customObj
+ * @param {string} customObj.title
+ * @param {string} customObj.cancelButtonLabel
+ * @param {string} customObj.laterButtonLabel
+ * @param {string} customObj.rateButtonLabel
+ */
this.setCustomLocale = function (customObj) {
var strings = {
title: 'Rate %@',
@@ -203,13 +227,22 @@ angular.module('ngCordova.plugins.appVersion', [])
.factory('$cordovaAppVersion', ['$q', function ($q) {
return {
- getAppVersion: function () {
+ getVersionNumber: function () {
var q = $q.defer();
- cordova.getAppVersion(function (version) {
+ cordova.getAppVersion.getVersionNumber(function (version) {
q.resolve(version);
});
return q.promise;
+ },
+
+ getVersionCode: function () {
+ var q = $q.defer();
+ cordova.getAppVersion.getVersionCode(function (code) {
+ q.resolve(code);
+ });
+
+ return q.promise;
}
};
}]);
@@ -294,7 +327,7 @@ angular.module('ngCordova.plugins.badge', [])
if (permission) {
q.resolve(true);
} else {
- q.reject("You do not have permission");
+ q.reject('You do not have permission');
}
});
@@ -305,14 +338,16 @@ angular.module('ngCordova.plugins.badge', [])
return cordova.plugins.notification.badge.promptForPermission();
},
- set: function (number) {
+ set: function (badge, callback, scope) {
var q = $q.defer();
cordova.plugins.notification.badge.hasPermission(function (permission) {
if (permission) {
- q.resolve(cordova.plugins.notification.badge.set(number));
+ q.resolve(
+ cordova.plugins.notification.badge.set(badge, callback, scope)
+ );
} else {
- q.reject("You do not have permission to set Badge");
+ q.reject('You do not have permission to set Badge');
}
});
return q.promise;
@@ -326,26 +361,54 @@ angular.module('ngCordova.plugins.badge', [])
q.resolve(badge);
});
} else {
- q.reject("You do not have permission to get Badge");
+ q.reject('You do not have permission to get Badge');
}
});
return q.promise;
},
- clear: function () {
+ clear: function (callback, scope) {
var q = $q.defer();
cordova.plugins.notification.badge.hasPermission(function (permission) {
if (permission) {
- q.resolve(cordova.plugins.notification.badge.clear());
+ q.resolve(cordova.plugins.notification.badge.clear(callback, scope));
} else {
- q.reject("You do not have permission to clear Badge");
+ q.reject('You do not have permission to clear Badge');
}
});
return q.promise;
},
+ increase: function (count, callback, scope) {
+ var q = $q.defer();
+
+ this.hasPermission().then(function (){
+ q.resolve(
+ cordova.plugins.notification.badge.increase(count, callback, scope)
+ );
+ }, function (){
+ q.reject('You do not have permission to increase Badge');
+ }) ;
+
+ return q.promise;
+ },
+
+ decrease: function (count, callback, scope) {
+ var q = $q.defer();
+
+ this.hasPermission().then(function (){
+ q.resolve(
+ cordova.plugins.notification.badge.decrease(count, callback, scope)
+ );
+ }, function (){
+ q.reject('You do not have permission to decrease Badge');
+ }) ;
+
+ return q.promise;
+ },
+
configure: function (config) {
return cordova.plugins.notification.badge.configure(config);
}
@@ -394,18 +457,27 @@ angular.module('ngCordova.plugins.batteryStatus', [])
.factory('$cordovaBatteryStatus', ['$rootScope', '$window', '$timeout', function ($rootScope, $window, $timeout) {
+ /**
+ * @param {string} status
+ */
var batteryStatus = function (status) {
$timeout(function () {
$rootScope.$broadcast('$cordovaBatteryStatus:status', status);
});
};
+ /**
+ * @param {string} status
+ */
var batteryCritical = function (status) {
$timeout(function () {
$rootScope.$broadcast('$cordovaBatteryStatus:critical', status);
});
};
+ /**
+ * @param {string} status
+ */
var batteryLow = function (status) {
$timeout(function () {
$rootScope.$broadcast('$cordovaBatteryStatus:low', status);
@@ -430,16 +502,26 @@ angular.module('ngCordova.plugins.batteryStatus', [])
angular.module('ngCordova.plugins.ble', [])
- .factory('$cordovaBLE', ['$q', function ($q) {
+ .factory('$cordovaBLE', ['$q', '$timeout', function ($q, $timeout) {
return {
scan: function (services, seconds) {
var q = $q.defer();
- ble.scan(services, seconds, function (result) {
- q.resolve(result);
+
+ ble.startScan(services, function (result) {
+ q.notify(result);
}, function (error) {
q.reject(error);
});
+
+ $timeout(function () {
+ ble.stopScan(function () {
+ q.resolve();
+ }, function (error) {
+ q.reject(error);
+ });
+ }, seconds*1000);
+
return q.promise;
},
@@ -545,9 +627,15 @@ angular.module('ngCordova.plugins.bluetoothSerial', [])
return {
connect: function (address) {
var q = $q.defer();
+ var disconnectionPromise = $q.defer();
+ var isConnected = false;
$window.bluetoothSerial.connect(address, function () {
- q.resolve();
+ isConnected = true;
+ q.resolve(disconnectionPromise);
}, function (error) {
+ if(isConnected === false) {
+ disconnectionPromise.reject(error);
+ }
q.reject(error);
});
return q.promise;
@@ -759,11 +847,15 @@ angular.module('ngCordova.plugins.brightness', [])
get: function () {
var q = $q.defer();
- $window.cordova.plugins.brightness.getBrightness(function (result) {
- q.resolve(result);
- }, function (err) {
- q.reject(err);
- });
+ if (!$window.cordova) {
+ q.reject("Not supported without cordova.js");
+ } else {
+ $window.cordova.plugins.brightness.getBrightness(function (result) {
+ q.resolve(result);
+ }, function (err) {
+ q.reject(err);
+ });
+ }
return q.promise;
},
@@ -771,11 +863,15 @@ angular.module('ngCordova.plugins.brightness', [])
set: function (data) {
var q = $q.defer();
- $window.cordova.plugins.brightness.setBrightness(data, function (result) {
- q.resolve(result);
- }, function (err) {
- q.reject(err);
- });
+ if (!$window.cordova) {
+ q.reject("Not supported without cordova.js");
+ } else {
+ $window.cordova.plugins.brightness.setBrightness(data, function (result) {
+ q.resolve(result);
+ }, function (err) {
+ q.reject(err);
+ });
+ }
return q.promise;
},
@@ -783,11 +879,15 @@ angular.module('ngCordova.plugins.brightness', [])
setKeepScreenOn: function (bool) {
var q = $q.defer();
- $window.cordova.plugins.brightness.setKeepScreenOn(bool, function (result) {
- q.resolve(result);
- }, function (err) {
- q.reject(err);
- });
+ if (!$window.cordova) {
+ q.reject("Not supported without cordova.js");
+ } else {
+ $window.cordova.plugins.brightness.setKeepScreenOn(bool, function (result) {
+ q.resolve(result);
+ }, function (err) {
+ q.reject(err);
+ });
+ }
return q.promise;
}
@@ -801,6 +901,7 @@ angular.module('ngCordova.plugins.brightness', [])
angular.module('ngCordova.plugins.calendar', [])
.factory('$cordovaCalendar', ['$q', '$window', function ($q, $window) {
+
return {
createCalendar: function (options) {
var d = $q.defer(),
@@ -1188,6 +1289,115 @@ angular.module('ngCordova.plugins.capture', [])
};
}]);
+// install : cordova plugin add https://github.com/vkeepe/card.io.git
+// link : https://github.com/vkeepe/card.io.git
+
+angular.module('ngCordova.plugins.cardIO', [])
+
+ .provider(
+ '$cordovaNgCardIO', [function () {
+
+ /**
+ * Default array of response data from cardIO scan card
+ */
+ var defaultRespFields = [
+ "card_type",
+ "redacted_card_number",
+ "card_number",
+ "expiry_month",
+ "expiry_year",
+ "short_expiry_year",
+ "cvv",
+ "zip"
+ ];
+
+ /**
+ * Default config for cardIO scan function
+ */
+ var defaultScanConfig = {
+ "expiry": true,
+ "cvv": true,
+ "zip": false,
+ "suppressManual": false,
+ "suppressConfirm": false,
+ "hideLogo": true
+ };
+
+ /**
+ * Configuring defaultRespFields using $cordovaNgCardIOProvider
+ *
+ */
+ this.setCardIOResponseFields = function (filelds) {
+ if (!filelds || !angular.isArray(filelds)) {
+ return;
+ }
+ defaultRespFields = filelds;
+ };
+
+ /**
+ *
+ * Configuring defaultScanConfig using $cordovaNgCardIOProvider
+ */
+ this.setScanerConfig = function (config) {
+ if (!config || !angular.isObject(config)) {
+ return;
+ }
+
+ defaultScanConfig.expiry = config.expiry || true;
+ defaultScanConfig.cvv = config.cvv || true;
+ defaultScanConfig.zip = config.zip || false;
+ defaultScanConfig.suppressManual = config.suppressManual
+ || false;
+ defaultScanConfig.suppressConfirm = config.suppressConfirm
+ || false;
+ defaultScanConfig.hideLogo = config.hideLogo || true;
+ };
+
+ /**
+ * Function scanCard for $cordovaNgCardIO service to make scan of card
+ *
+ */
+ this.$get = ['$q', function ($q) {
+ return {
+ scanCard: function () {
+
+ var deferred = $q.defer();
+ CardIO.scan(
+ defaultScanConfig,
+ function (response) {
+
+ if (response == null) {
+ deferred.reject(null);
+ } else {
+
+ var respData = {};
+ for (
+ var i = 0, len = defaultRespFields.length; i < len; i++) {
+ var field = defaultRespFields[i];
+
+ if (field == "short_expiry_year") {
+ respData[field] = String(response['expiry_year']).substr(
+ 2, 2
+ )
+ || "";
+ } else {
+ respData[field] = response[field] || "";
+ }
+ }
+ deferred.resolve(respData);
+ }
+ },
+ function () {
+ deferred.reject(null);
+ }
+ );
+ return deferred.promise;
+ }
+ }
+ }]
+ }]
+);
+
// install : cordova plugin add https://github.com/VersoSolutions/CordovaClipboard.git
// link : https://github.com/VersoSolutions/CordovaClipboard
@@ -1264,13 +1474,20 @@ angular.module('ngCordova.plugins.contacts', [])
var q = $q.defer();
var fields = options.fields || ['id', 'displayName'];
delete options.fields;
-
- navigator.contacts.find(fields, function (results) {
- q.resolve(results);
- }, function (err) {
- q.reject(err);
- }, options);
-
+ if (Object.keys(options).length === 0) {
+ navigator.contacts.find(fields, function (results) {
+ q.resolve(results);
+ },function (err) {
+ q.reject(err)
+ });
+ }
+ else {
+ navigator.contacts.find(fields, function (results) {
+ q.resolve(results);
+ }, function (err) {
+ q.reject(err);
+ }, options);
+ }
return q.promise;
},
@@ -1298,7 +1515,9 @@ angular.module('ngCordova.plugins.contacts', [])
// link : https://github.com/VitaliiBlagodir/cordova-plugin-datepicker
angular.module('ngCordova.plugins.datePicker', [])
+
.factory('$cordovaDatePicker', ['$window', '$q', function ($window, $q) {
+
return {
show: function (options) {
var q = $q.defer();
@@ -1379,6 +1598,14 @@ angular.module('ngCordova.plugins.device', [])
*/
getVersion: function () {
return device.version;
+ },
+
+ /**
+ * Returns the device manufacturer.
+ * @returns {String}
+ */
+ getManufacturer: function () {
+ return device.manufacturer;
}
};
}]);
@@ -1394,6 +1621,11 @@ angular.module('ngCordova.plugins.deviceMotion', [])
getCurrentAcceleration: function () {
var q = $q.defer();
+ if (angular.isUndefined(navigato.accelerometer) ||
+ !angular.isFunction(navigator.accelerometer.getCurrentAcceleration)) {
+ q.reject('Device do not support watchAcceleration');
+ }
+
navigator.accelerometer.getCurrentAcceleration(function (result) {
q.resolve(result);
}, function (err) {
@@ -1406,6 +1638,11 @@ angular.module('ngCordova.plugins.deviceMotion', [])
watchAcceleration: function (options) {
var q = $q.defer();
+ if (angular.isUndefined(navigato.accelerometer) ||
+ !angular.isFunction(navigator.accelerometer.watchAcceleration)) {
+ q.reject('Device do not support watchAcceleration');
+ }
+
var watchID = navigator.accelerometer.watchAcceleration(function (result) {
q.notify(result);
}, function (err) {
@@ -1437,13 +1674,20 @@ angular.module('ngCordova.plugins.deviceMotion', [])
angular.module('ngCordova.plugins.deviceOrientation', [])
.factory('$cordovaDeviceOrientation', ['$q', function ($q) {
+
var defaultOptions = {
frequency: 3000 // every 3s
};
+
return {
getCurrentHeading: function () {
var q = $q.defer();
+ if(!navigator.compass) {
+ q.reject('No compass on Device');
+ return q.promise;
+ }
+
navigator.compass.getCurrentHeading(function (result) {
q.resolve(result);
}, function (err) {
@@ -1456,6 +1700,11 @@ angular.module('ngCordova.plugins.deviceOrientation', [])
watchHeading: function (options) {
var q = $q.defer();
+ if(!navigator.compass) {
+ q.reject('No compass on Device');
+ return q.promise;
+ }
+
var _options = angular.extend(defaultOptions, options);
var watchID = navigator.compass.watchHeading(function (result) {
q.notify(result);
@@ -1592,6 +1841,12 @@ angular.module('ngCordova.plugins.facebook', [])
.provider('$cordovaFacebook', [function () {
+ /**
+ * Init browser settings for Facebook plugin
+ *
+ * @param {number} id
+ * @param {string} version
+ */
this.browserInit = function (id, version) {
this.appID = id;
this.appVersion = version || "v2.0";
@@ -1668,6 +1923,7 @@ angular.module('ngCordova.plugins.facebook', [])
// link : https://github.com/floatinghotpot/cordova-plugin-facebookads
angular.module('ngCordova.plugins.facebookAds', [])
+
.factory('$cordovaFacebookAds', ['$q', '$window', function ($q, $window) {
return {
@@ -3017,6 +3273,7 @@ angular.module('ngCordova.plugins.globalization', [])
// link : https://github.com/floatinghotpot/cordova-admob-pro
angular.module('ngCordova.plugins.googleAds', [])
+
.factory('$cordovaGoogleAds', ['$q', '$window', function ($q, $window) {
return {
@@ -3310,7 +3567,6 @@ angular.module('ngCordova.plugins.googlePlayGame', [])
.factory('$cordovaGooglePlayGame', ['$q', function ($q) {
return {
-
auth: function () {
var q = $q.defer();
@@ -3428,7 +3684,7 @@ angular.module('ngCordova.plugins.googlePlayGame', [])
// install : cordova plugin add https://github.com/EddyVerbruggen/cordova-plugin-googleplus.git
// link : https://github.com/EddyVerbruggen/cordova-plugin-googleplus
-angular.module('ngCordova.plugins.googleplus', [])
+angular.module('ngCordova.plugins.googlePlus', [])
.factory('$cordovaGooglePlus', ['$q', '$window', function ($q, $window) {
@@ -3475,6 +3731,19 @@ angular.module('ngCordova.plugins.googleplus', [])
$window.plugins.googleplus.disconnect(function (response) {
q.resolve(response);
});
+ },
+
+ isAvailable: function () {
+ var q = $q.defer();
+ $window.plugins.googleplus.isAvailable(function (available) {
+ if (available) {
+ q.resolve(available);
+ } else {
+ q.reject(available);
+ }
+ });
+
+ return q.promise;
}
};
@@ -3712,6 +3981,7 @@ angular.module('ngCordova.plugins.healthKit', [])
// link : https://github.com/floatinghotpot/cordova-httpd
angular.module('ngCordova.plugins.httpd', [])
+
.factory('$cordovaHttpd', ['$q', function ($q) {
return {
@@ -4057,7 +4327,7 @@ angular.module('ngCordova.plugins.instagram', [])
angular.module('ngCordova.plugins.keyboard', [])
- .factory('$cordovaKeyboard', ['$rootScope', '$timeout', function ($rootScope, $timeout) {
+ .factory('$cordovaKeyboard', ['$rootScope', function ($rootScope) {
var keyboardShowEvent = function () {
$rootScope.$evalAsync(function () {
@@ -4148,6 +4418,32 @@ angular.module('ngCordova.plugins.keychain', [])
};
}]);
+// install : cordova plugin add uk.co.workingedge.phonegap.plugin.launchnavigator
+// link : https://github.com/dpa99c/phonegap-launch-navigator
+
+angular.module('ngCordova.plugins.launchNavigator', [])
+
+ .factory('$cordovaLaunchNavigator', ['$q', function ($q) {
+
+ return {
+ navigate: function (destination, start, successFn, errorFn, options) {
+ var q = $q.defer();
+ launchnavigator.navigate(
+ destination,
+ start,
+ function (){
+ q.resolve();
+ },
+ function (error){
+ q.reject(error);
+ },
+ options);
+ return q.promise;
+ }
+ };
+
+ }]);
+
// install : cordova plugin add https://github.com/katzer/cordova-plugin-local-notifications.git
// link : https://github.com/katzer/cordova-plugin-local-notifications
@@ -4510,6 +4806,7 @@ angular.module('ngCordova.plugins.localNotification', [])
// link : https://github.com/floatinghotpot/cordova-plugin-mmedia
angular.module('ngCordova.plugins.mMediaAds', [])
+
.factory('$cordovaMMediaAds', ['$q', '$window', function ($q, $window) {
return {
@@ -4616,83 +4913,142 @@ angular.module('ngCordova.plugins.mMediaAds', [])
angular.module('ngCordova.plugins.media', [])
- .factory('$cordovaMedia', ['$q', function ($q) {
+.service('NewMedia', ['$q', '$interval', function ($q, $interval) {
+ var q, q2, q3, mediaStatus = null, mediaPosition = -1, mediaTimer, mediaDuration = -1;
- return {
- newMedia: function (src) {
- var q = $q.defer();
- var mediaStatus = null;
- var media;
+ function setTimer(media) {
+ if (angular.isDefined(mediaTimer)) return;
- media = new Media(src,
- function (success) {
+ mediaTimer = $interval(function () {
+ if (mediaDuration < 0) {
+ mediaDuration = media.getDuration();
+ if (q && mediaDuration > 0) q.notify({duration: mediaDuration});
+ }
+
+ media.getCurrentPosition(
+ // success callback
+ function (position) {
+ if (position > -1) {
+ mediaPosition = position;
+ }
+ },
+ // error callback
+ function (e) {
+ console.log("Error getting pos=" + e);
+ });
+
+ if (q) q.notify({position: mediaPosition});
+
+ }, 1000);
+ }
+
+ function clearTimer() {
+ if (angular.isDefined(mediaTimer)) {
+ $interval.cancel(mediaTimer);
+ mediaTimer = undefined;
+ }
+ }
+
+ function resetValues() {
+ mediaPosition = -1;
+ mediaDuration = -1;
+ }
+
+ function NewMedia(src) {
+ this.media = new Media(src,
+ function (success) {
+ clearTimer();
+ resetValues();
q.resolve(success);
- }, function (error) {
+ }, function (error) {
+ clearTimer();
+ resetValues();
q.reject(error);
- }, function (status) {
+ }, function (status) {
mediaStatus = status;
- });
+ q.notify({status: mediaStatus});
+ });
+ }
- // getCurrentPosition NOT WORKING!
- q.promise.getCurrentPosition = function () {
- media.getCurrentPosition(function (success) {
- }, function (error) {
- });
- };
+ // iOS quirks :
+ // - myMedia.play({ numberOfLoops: 2 }) -> looping
+ // - myMedia.play({ playAudioWhenScreenIsLocked : false })
+ NewMedia.prototype.play = function (options) {
+ q = $q.defer();
- q.promise.getDuration = function () {
- media.getDuration();
- };
+ if (typeof options !== "object") {
+ options = {};
+ }
- // iOS quirks :
- // - myMedia.play({ numberOfLoops: 2 }) -> looping
- // - myMedia.play({ playAudioWhenScreenIsLocked : false })
- q.promise.play = function (options) {
- if (typeof options !== "object") {
- options = {};
- }
- media.play(options);
- };
+ this.media.play(options);
- q.promise.pause = function () {
- media.pause();
- };
+ setTimer(this.media);
- q.promise.stop = function () {
- media.stop();
- };
+ return q.promise;
+ };
- q.promise.release = function () {
- media.release();
- };
+ NewMedia.prototype.pause = function () {
+ clearTimer();
+ this.media.pause();
+ };
- q.promise.seekTo = function (timing) {
- media.seekTo(timing);
- };
+ NewMedia.prototype.stop = function () {
+ this.media.stop();
+ };
- q.promise.setVolume = function (volume) {
- media.setVolume(volume);
- };
+ NewMedia.prototype.release = function () {
+ this.media.release();
+ this.media = undefined;
+ };
- q.promise.startRecord = function () {
- media.startRecord();
- };
+ NewMedia.prototype.seekTo = function (timing) {
+ this.media.seekTo(timing);
+ };
- q.promise.stopRecord = function () {
- media.stopRecord();
- };
+ NewMedia.prototype.setVolume = function (volume) {
+ this.media.setVolume(volume);
+ };
- q.promise.media = media;
+ NewMedia.prototype.startRecord = function () {
+ this.media.startRecord();
+ };
- return q.promise;
+ NewMedia.prototype.stopRecord = function () {
+ this.media.stopRecord();
+ };
+
+ NewMedia.prototype.currentTime = function () {
+ q2 = $q.defer();
+ this.media.getCurrentPosition(function (position){
+ q2.resolve(position);
+ });
+ return q2.promise;
+ };
+
+ NewMedia.prototype.getDuration = function () {
+ q3 = $q.defer();
+ this.media.getDuration(function (duration){
+ q3.resolve(duration);
+ });
+ return q3.promise;
+ }
+
+ return NewMedia;
+
+}])
+.factory('$cordovaMedia2', ['NewMedia', function (NewMedia) {
+ return {
+ newMedia: function (src) {
+ return new NewMedia(src);
}
- };
- }]);
+ };
+}]);
// install : cordova plugin add https://github.com/floatinghotpot/cordova-mobfox-pro.git
// link : https://github.com/floatinghotpot/cordova-mobfox-pro
angular.module('ngCordova.plugins.mobfoxAds', [])
+
.factory('$cordovaMobFoxAds', ['$q', '$window', function ($q, $window) {
return {
@@ -4832,13 +5188,16 @@ angular.module('ngCordova.plugins', [
'ngCordova.plugins.googleAnalytics',
'ngCordova.plugins.googleMap',
'ngCordova.plugins.googlePlayGame',
+ 'ngCordova.plugins.googlePlus',
'ngCordova.plugins.healthKit',
'ngCordova.plugins.httpd',
'ngCordova.plugins.iAd',
'ngCordova.plugins.imagePicker',
'ngCordova.plugins.inAppBrowser',
+ 'ngCordova.plugins.instagram',
'ngCordova.plugins.keyboard',
'ngCordova.plugins.keychain',
+ 'ngCordova.plugins.launchNavigator',
'ngCordova.plugins.localNotification',
'ngCordova.plugins.media',
'ngCordova.plugins.mMediaAds',
@@ -4846,8 +5205,7 @@ angular.module('ngCordova.plugins', [
'ngCordova.plugins.mopubAds',
'ngCordova.plugins.nativeAudio',
'ngCordova.plugins.network',
- 'ngCordova.plugins.oauth',
- 'ngCordova.plugins.oauthUtility',
+ 'ngCordovaOauth',
'ngCordova.plugins.pinDialog',
'ngCordova.plugins.prefs',
'ngCordova.plugins.printer',
@@ -5004,10 +5362,12 @@ angular.module('ngCordova.plugins.nativeAudio', [])
play: function (id, completeCallback) {
var q = $q.defer();
- $window.plugins.NativeAudio.play(id, completeCallback, function (result) {
- q.resolve(result);
- }, function (err) {
+ $window.plugins.NativeAudio.play(id, completeCallback
+ ,function (err) {
q.reject(err);
+ }
+ , function (result) {
+ q.resolve(result);
});
return q.promise;
@@ -5065,6 +5425,10 @@ angular.module('ngCordova.plugins.network', [])
.factory('$cordovaNetwork', ['$rootScope', '$timeout', function ($rootScope, $timeout) {
+
+ /**
+ * Fires offline a event
+ */
var offlineEvent = function () {
var networkState = navigator.connection.type;
$timeout(function () {
@@ -5072,6 +5436,9 @@ angular.module('ngCordova.plugins.network', [])
});
};
+ /**
+ * Fires online a event
+ */
var onlineEvent = function () {
var networkState = navigator.connection.type;
$timeout(function () {
@@ -5107,7 +5474,7 @@ angular.module('ngCordova.plugins.network', [])
},
clearOnlineWatch: function () {
- document.removeEventListener("online", offlineEvent);
+ document.removeEventListener("online", onlineEvent);
$rootScope.$$listeners["$cordovaNetwork:online"] = [];
}
};
@@ -5115,1050 +5482,6 @@ angular.module('ngCordova.plugins.network', [])
.run(['$cordovaNetwork', function ($cordovaNetwork) {
}]);
-/* Created by Nic Raboy
- * http://www.nraboy.com
- *
- * DESCRIPTION: Use Oauth sign in for various web services.
- *
- * REQUIRES: Apache Cordova 3.5+, Apache InAppBrowser Plugin, jsSHA (Twitter, Magento only)
- *
- * SUPPORTS:
- * Dropbox
- * Digital Ocean
- * Google
- * GitHub
- * Facebook
- * LinkedIn
- * Instagram
- * Box
- * Reddit
- * Twitter
- * Meetup
- * Foursquare
- * Salesforce
- * Strava
- * Magento
- * vkontakte
- * ADFS
- * Imgur
- */
-
-angular.module("ngCordova.plugins.oauth", ["ngCordova.plugins.oauthUtility"])
-
- .factory('$cordovaOauth', ['$q', '$http', '$cordovaOauthUtility', function ($q, $http, $cordovaOauthUtility) {
-
- return {
-
- /*
- * Sign into the ADFS service (ADFS 3.0 onwards)
- *
- * @param string clientId (client registered in ADFS, with redirect_uri configured to: http://localhost/callback)
- * @param string adfsServer (url of the ADFS Server)
- * @param string relyingPartyId (url of the Relying Party (resource relying on ADFS for authentication) configured in ADFS)
- * @return promise
- */
- adfs: function (clientId, adfsServer, relyingPartyId) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open(adfsServer + '/adfs/oauth2/authorize?response_type=code&client_id=' + clientId + '&redirect_uri=http://localhost/callback&resource=' + relyingPartyId, '_blank', 'location=no');
-
- browserRef.addEventListener("loadstart", function (event) {
- if ((event.url).indexOf('http://localhost/callback') === 0) {
- var requestToken = (event.url).split("code=")[1];
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http({method: "post", url: adfsServer + "/adfs/oauth2/token", data: "client_id=" + clientId + "&code=" + requestToken + "&redirect_uri=http://localhost/callback&grant_type=authorization_code"})
- .success(function (data) {
- deferred.resolve(data);
- })
- .error(function (data, status) {
- deferred.reject("Problem authenticating");
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Dropbox service
- *
- * @param string appKey
- * @return promise
- */
- dropbox: function (appKey) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open("https://www.dropbox.com/1/oauth2/authorize?client_id=" + appKey + "&redirect_uri=http://localhost/callback" + "&response_type=token", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
- browserRef.addEventListener("loadstart", function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = [];
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- deferred.resolve({access_token: parameterMap.access_token, token_type: parameterMap.token_type, uid: parameterMap.uid});
- } else {
- deferred.reject("Problem authenticating");
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Digital Ocean service
- *
- * @param string clientId
- * @param string clientSecret
- * @return promise
- */
- digitalOcean: function (clientId, clientSecret) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open("https://cloud.digitalocean.com/v1/oauth/authorize?client_id=" + clientId + "&redirect_uri=http://localhost/callback&response_type=code&scope=read%20write", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
- browserRef.addEventListener("loadstart", function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var requestToken = (event.url).split("code=")[1];
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http({
- method: "post",
- url: "https://cloud.digitalocean.com/v1/oauth/token",
- data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=http://localhost/callback" + "&grant_type=authorization_code" + "&code=" + requestToken
- })
- .success(function (data) {
- deferred.resolve(data);
- })
- .error(function (data, status) {
- deferred.reject("Problem authenticating");
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Google service
- *
- * @param string clientId
- * @param array appScope
- * @return promise
- */
- google: function (clientId, appScope) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://accounts.google.com/o/oauth2/auth?client_id=' + clientId + '&redirect_uri=http://localhost/callback&scope=' + appScope.join(" ") + '&approval_prompt=force&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener("loadstart", function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = [];
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- deferred.resolve({access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in});
- } else {
- deferred.reject("Problem authenticating");
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the GitHub service
- *
- * @param string clientId
- * @param string clientSecret
- * @param array appScope
- * @return promise
- */
- github: function (clientId, clientSecret, appScope) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://github.com/login/oauth/authorize?client_id=' + clientId + '&redirect_uri=http://localhost/callback&scope=' + appScope.join(","), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- requestToken = (event.url).split("code=")[1];
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http.defaults.headers.post.accept = 'application/json';
- $http({method: "post", url: "https://github.com/login/oauth/access_token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=http://localhost/callback" + "&code=" + requestToken})
- .success(function (data) {
- deferred.resolve(data);
- })
- .error(function (data, status) {
- deferred.reject("Problem authenticating");
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Facebook service
- *
- * @param string clientId
- * @param array appScope
- * @return promise
- */
- facebook: function (clientId, appScope) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://www.facebook.com/dialog/oauth?client_id=' + clientId + '&redirect_uri=http://localhost/callback&response_type=token&scope=' + appScope.join(","), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = [];
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- deferred.resolve({access_token: parameterMap.access_token, expires_in: parameterMap.expires_in});
- } else {
- deferred.reject("Problem authenticating");
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the LinkedIn service
- *
- * @param string clientId
- * @param string clientSecret
- * @param array appScope
- * @param string state
- * @return promise
- */
- linkedin: function (clientId, clientSecret, appScope, state) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://www.linkedin.com/uas/oauth2/authorization?client_id=' + clientId + '&redirect_uri=http://localhost/callback&scope=' + appScope.join(" ") + '&response_type=code&state=' + state, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- requestToken = (event.url).split("code=")[1];
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http({
- method: "post",
- url: "https://www.linkedin.com/uas/oauth2/accessToken",
- data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=http://localhost/callback" + "&grant_type=authorization_code" + "&code=" + requestToken
- })
- .success(function (data) {
- deferred.resolve(data);
- })
- .error(function (data, status) {
- deferred.reject("Problem authenticating");
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Instagram service
- *
- * @param string clientId
- * @param array appScope
- * @return promise
- */
- instagram: function (clientId, appScope) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://api.instagram.com/oauth/authorize/?client_id=' + clientId + '&redirect_uri=http://localhost/callback&scope=' + appScope.join(" ") + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = [];
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- deferred.resolve({access_token: parameterMap.access_token});
- } else {
- deferred.reject("Problem authenticating");
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Box service
- *
- * @param string clientId
- * @param string clientSecret
- * @param string appState
- * @return promise
- */
- box: function (clientId, clientSecret, appState) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://app.box.com/api/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=http://localhost/callback&state=' + appState + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- requestToken = (event.url).split("code=")[1];
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http({
- method: "post",
- url: "https://app.box.com/api/oauth2/token",
- data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=http://localhost/callback" + "&grant_type=authorization_code" + "&code=" + requestToken
- })
- .success(function (data) {
- deferred.resolve(data);
- })
- .error(function (data, status) {
- deferred.reject("Problem authenticating");
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Reddit service
- *
- * @param string clientId
- * @param string clientSecret
- * @param array appScope
- * @return promise
- */
- reddit: function (clientId, clientSecret, appScope) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://ssl.reddit.com/api/v1/authorize?client_id=' + clientId + '&redirect_uri=http://localhost/callback&duration=permanent&state=ngcordovaoauth&scope=' + appScope.join(",") + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- requestToken = (event.url).split("code=")[1];
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http.defaults.headers.post.Authorization = 'Basic ' + btoa(clientId + ":" + clientSecret);
- $http({method: "post", url: "https://ssl.reddit.com/api/v1/access_token", data: "redirect_uri=http://localhost/callback" + "&grant_type=authorization_code" + "&code=" + requestToken})
- .success(function (data) {
- deferred.resolve(data);
- })
- .error(function (data, status) {
- deferred.reject("Problem authenticating");
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Twitter service
- * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
- *
- * @param string clientId
- * @param string clientSecret
- * @return promise
- */
- twitter: function (clientId, clientSecret) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- if (typeof jsSHA !== "undefined") {
- var oauthObject = {
- oauth_consumer_key: clientId,
- oauth_nonce: $cordovaOauthUtility.createNonce(10),
- oauth_signature_method: "HMAC-SHA1",
- oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
- oauth_version: "1.0"
- };
- var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/request_token", oauthObject, {oauth_callback: "http://localhost/callback"}, clientSecret);
- $http({
- method: "post",
- url: "https://api.twitter.com/oauth/request_token",
- headers: {
- "Authorization": signatureObj.authorization_header,
- "Content-Type": "application/x-www-form-urlencoded"
- },
- data: "oauth_callback=" + encodeURIComponent("http://localhost/callback")
- })
- .success(function (requestTokenResult) {
- var requestTokenParameters = (requestTokenResult).split("&");
- var parameterMap = {};
- for (var i = 0; i < requestTokenParameters.length; i++) {
- parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
- }
- if (parameterMap.hasOwnProperty("oauth_token") === false) {
- deferred.reject("Oauth request token was not received");
- }
- var browserRef = window.open('https://api.twitter.com/oauth/authenticate?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("?")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = {};
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.hasOwnProperty("oauth_verifier") === false) {
- deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
- }
- delete oauthObject.oauth_signature;
- oauthObject.oauth_token = parameterMap.oauth_token;
- var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/access_token", oauthObject, {oauth_verifier: parameterMap.oauth_verifier}, clientSecret);
- $http({
- method: "post",
- url: "https://api.twitter.com/oauth/access_token",
- headers: {
- "Authorization": signatureObj.authorization_header
- },
- params: {
- "oauth_verifier": parameterMap.oauth_verifier
- }
- })
- .success(function (result) {
- var accessTokenParameters = result.split("&");
- var parameterMap = {};
- for (var i = 0; i < accessTokenParameters.length; i++) {
- parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
- }
- if (parameterMap.hasOwnProperty("oauth_token_secret") === false) {
- deferred.reject("Oauth access token was not received");
- }
- deferred.resolve(parameterMap);
- })
- .error(function (error) {
- deferred.reject(error);
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- })
- .error(function (error) {
- deferred.reject(error);
- });
- } else {
- deferred.reject("Missing jsSHA JavaScript library");
- }
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Meetup service
- *
- * @param string clientId
- * @return promise
- */
- meetup: function (clientId) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://secure.meetup.com/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=http://localhost/callback&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = {};
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- deferred.resolve(parameterMap);
- } else {
- deferred.reject("Problem authenticating");
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Salesforce service
- *
- * Suggestion: use salesforce oauth with forcetk.js(as SDK)
- *
- * @param string loginUrl (such as: https://login.salesforce.com ; please notice community login)
- * @param string clientId (copy from connection app info)
- * @param string redirectUri (callback url in connection app info)
- * @return promise
- */
- salesforce: function (loginUrl, clientId) {
- var redirectUri = 'http://localhost/callback';
- var getAuthorizeUrl = function (loginUrl, clientId, redirectUri) {
- return loginUrl + 'services/oauth2/authorize?display=touch' +
- '&response_type=token&client_id=' + escape(clientId) +
- '&redirect_uri=' + escape(redirectUri);
- };
- var startWith = function (string, str) {
- return (string.substr(0, str.length) === str);
- };
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open(getAuthorizeUrl(loginUrl, clientId, redirectUri), "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
- browserRef.addEventListener("loadstart", function (event) {
- if (startWith(event.url, redirectUri)) {
- var oauthResponse = {};
-
- var fragment = (event.url).split('#')[1];
-
- if (fragment) {
- var nvps = fragment.split('&');
- for (var nvp in nvps) {
- var parts = nvps[nvp].split('=');
- oauthResponse[parts[0]] = unescape(parts[1]);
- }
- }
-
- if (typeof oauthResponse === 'undefined' ||
- typeof oauthResponse.access_token === 'undefined') {
- deferred.reject("Problem authenticating");
- } else {
- deferred.resolve(oauthResponse);
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Strava service
- *
- * @param string clientId
- * @param string clientSecret
- * @param array appScope
- * @return promise
- */
- strava: function (clientId, clientSecret, appScope) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://www.strava.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=http://localhost/callback&scope=' + appScope.join(",") + '&response_type=code&approval_prompt=force', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- requestToken = (event.url).split("code=")[1];
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http({method: "post", url: "https://www.strava.com/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&code=" + requestToken})
- .success(function (data) {
- deferred.resolve(data);
- })
- .error(function (data, status) {
- deferred.reject("Problem authenticating");
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Foursquare service
- *
- * @param string clientId
- * @return promise
- */
- foursquare: function (clientId) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://foursquare.com/oauth2/authenticate?client_id=' + clientId + '&redirect_uri=http://localhost/callback&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = [];
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- var promiseResponse = {
- access_token: parameterMap.access_token,
- expires_in: parameterMap.expires_in
- };
- deferred.resolve(promiseResponse);
- } else {
- deferred.reject("Problem authenticating");
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Magento service
- * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
- *
- * @param string baseUrl
- * @param string clientId
- * @param string clientSecret
- * @return promise
- */
- magento: function (baseUrl, clientId, clientSecret) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- if (typeof jsSHA !== "undefined") {
- var oauthObject = {
- oauth_callback: "http://localhost/callback",
- oauth_consumer_key: clientId,
- oauth_nonce: $cordovaOauthUtility.createNonce(5),
- oauth_signature_method: "HMAC-SHA1",
- oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
- oauth_version: "1.0"
- };
- var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/initiate", oauthObject, {oauth_callback: "http://localhost/callback"}, clientSecret);
- $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http({method: "post", url: baseUrl + "/oauth/initiate", data: "oauth_callback=http://localhost/callback"})
- .success(function (requestTokenResult) {
- var requestTokenParameters = (requestTokenResult).split("&");
- var parameterMap = {};
- for (var i = 0; i < requestTokenParameters.length; i++) {
- parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
- }
- if (parameterMap.hasOwnProperty("oauth_token") === false) {
- deferred.reject("Oauth request token was not received");
- }
- var tokenSecret = parameterMap.oauth_token_secret;
- var browserRef = window.open(baseUrl + '/oauth/authorize?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- var callbackResponse = (event.url).split("?")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = {};
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.hasOwnProperty("oauth_verifier") === false) {
- deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
- }
- delete oauthObject.oauth_signature;
- delete oauthObject.oauth_callback;
- oauthObject.oauth_token = parameterMap.oauth_token;
- oauthObject.oauth_nonce = $cordovaOauthUtility.createNonce(5);
- oauthObject.oauth_verifier = parameterMap.oauth_verifier;
- var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/token", oauthObject, {}, clientSecret, tokenSecret);
- $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
- $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
- $http({method: "post", url: baseUrl + "/oauth/token"})
- .success(function (result) {
- var accessTokenParameters = result.split("&");
- var parameterMap = {};
- for (var i = 0; i < accessTokenParameters.length; i++) {
- parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
- }
- if (parameterMap.hasOwnProperty("oauth_token_secret") === false) {
- deferred.reject("Oauth access token was not received");
- }
- deferred.resolve(parameterMap);
- })
- .error(function (error) {
- deferred.reject(error);
- })
- .finally(function () {
- setTimeout(function () {
- browserRef.close();
- }, 10);
- });
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- })
- .error(function (error) {
- deferred.reject(error);
- });
- } else {
- deferred.reject("Missing jsSHA JavaScript library");
- }
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Vkontakte service
- *
- * @param string clientId
- * @param array appScope (for example: "friends,wall,photos,messages")
- * @return promise
- */
- vkontakte: function (clientId, appScope) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://oauth.vk.com/authorize?client_id=' + clientId + '&redirect_uri=http://oauth.vk.com/blank.html&response_type=token&scope=' + appScope.join(",") + '&display=touch&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- var tmp = (event.url).split("#");
- if (tmp[0] == 'https://oauth.vk.com/blank.html' || tmp[0] == 'http://oauth.vk.com/blank.html') {
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = [];
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- deferred.resolve({access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, user_id: parameterMap.user_id});
- } else {
- deferred.reject("Problem authenticating");
- }
- setTimeout(function () {
- browserRef.close();
- }, 10);
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- },
-
- /*
- * Sign into the Imgur service
- *
- * @param string clientId
- * @return promise
- */
- imgur: function (clientId) {
- var deferred = $q.defer();
- if (window.cordova) {
- var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
- if (cordovaMetadata.hasOwnProperty("org.apache.cordova.inappbrowser") === true) {
- var browserRef = window.open('https://api.imgur.com/oauth2/authorize?client_id=' + clientId + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
- browserRef.addEventListener('loadstart', function (event) {
- if ((event.url).indexOf("http://localhost/callback") === 0) {
- browserRef.removeEventListener("exit", function (event) {
- });
- browserRef.close();
- var callbackResponse = (event.url).split("#")[1];
- var responseParameters = (callbackResponse).split("&");
- var parameterMap = [];
- for (var i = 0; i < responseParameters.length; i++) {
- parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
- }
- if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
- deferred.resolve({access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username});
- } else {
- deferred.reject("Problem authenticating");
- }
- }
- });
- browserRef.addEventListener('exit', function (event) {
- deferred.reject("The sign in flow was canceled");
- });
- } else {
- deferred.reject("Could not find InAppBrowser plugin");
- }
- } else {
- deferred.reject("Cannot authenticate via a web browser");
- }
- return deferred.promise;
- }
-
- };
- }]);
-
-angular.module("ngCordova.plugins.oauthUtility", [])
-
- .factory('$cordovaOauthUtility', ['$q', function ($q) {
-
- return {
-
- /*
- * Sign an Oauth 1.0 request
- *
- * @param string method
- * @param string endPoint
- * @param object headerParameters
- * @param object bodyParameters
- * @param string secretKey
- * @return object
- */
- createSignature: function (method, endPoint, headerParameters, bodyParameters, secretKey, tokenSecret) {
- if (typeof jsSHA !== "undefined") {
- var headerAndBodyParameters = angular.copy(headerParameters);
- var bodyParameterKeys = Object.keys(bodyParameters);
- for (var i = 0; i < bodyParameterKeys.length; i++) {
- headerAndBodyParameters[bodyParameterKeys[i]] = encodeURIComponent(bodyParameters[bodyParameterKeys[i]]);
- }
- var signatureBaseString = method + "&" + encodeURIComponent(endPoint) + "&";
- var headerAndBodyParameterKeys = (Object.keys(headerAndBodyParameters)).sort();
- for (i = 0; i < headerAndBodyParameterKeys.length; i++) {
- if (i == headerAndBodyParameterKeys.length - 1) {
- signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]]);
- } else {
- signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]] + "&");
- }
- }
- var oauthSignatureObject = new jsSHA(signatureBaseString, "TEXT");
-
- var encodedTokenSecret = '';
- if (tokenSecret) {
- encodedTokenSecret = encodeURIComponent(tokenSecret);
- }
-
- headerParameters.oauth_signature = encodeURIComponent(oauthSignatureObject.getHMAC(encodeURIComponent(secretKey) + "&" + encodedTokenSecret, "TEXT", "SHA-1", "B64"));
- var headerParameterKeys = Object.keys(headerParameters);
- var authorizationHeader = 'OAuth ';
- for (i = 0; i < headerParameterKeys.length; i++) {
- if (i == headerParameterKeys.length - 1) {
- authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '"';
- } else {
- authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '",';
- }
- }
- return {signature_base_string: signatureBaseString, authorization_header: authorizationHeader, signature: headerParameters.oauth_signature};
- } else {
- return "Missing jsSHA JavaScript library";
- }
- },
-
- /*
- * Create Random String Nonce
- *
- * @param integer length
- * @return string
- */
- createNonce: function (length) {
- var text = "";
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
- for (var i = 0; i < length; i++) {
- text += possible.charAt(Math.floor(Math.random() * possible.length));
- }
- return text;
- }
-
- };
-
- }]);
-
// install : cordova plugin add https://github.com/Paldom/PinDialog.git
// link : https://github.com/Paldom/PinDialog
@@ -6187,7 +5510,6 @@ angular.module('ngCordova.plugins.prefs', [])
.factory('$cordovaPreferences', ['$window', '$q', function ($window, $q) {
return {
-
set: function (key, value) {
var q = $q.defer();
@@ -6339,6 +5661,7 @@ angular.module('ngCordova.plugins.progressIndicator', [])
angular.module('ngCordova.plugins.push', [])
.factory('$cordovaPush', ['$q', '$window', '$rootScope', '$timeout', function ($q, $window, $rootScope, $timeout) {
+
return {
onNotification: function (notification) {
$timeout(function () {
@@ -6604,16 +5927,15 @@ angular.module('ngCordova.plugins.sqlite', [])
.factory('$cordovaSQLite', ['$q', '$window', function ($q, $window) {
return {
- openDB: function (dbName, background) {
-
- if (typeof background === 'undefined') {
- background = 0;
+ openDB: function (options, background) {
+ if (typeof options !== 'object') {
+ options = {name: options};
+ }
+ if (typeof background !== 'undefined') {
+ options.bgType = background;
}
- return $window.sqlitePlugin.openDatabase({
- name: dbName,
- bgType: background
- });
+ return $window.sqlitePlugin.openDatabase(options);
},
execute: function (db, query, binding) {
@@ -6692,67 +6014,74 @@ angular.module('ngCordova.plugins.sqlite', [])
angular.module('ngCordova.plugins.statusbar', [])
- .factory('$cordovaStatusbar', [function () {
-
- return {
- overlaysWebView: function (bool) {
- return StatusBar.overlaysWebView(!!bool);
- },
-
- STYLES: {
- DEFAULT: 0,
- LIGHT_CONTENT: 1,
- BLACK_TRANSLUCENT: 2,
- BLACK_OPAQUE: 3
- },
+.factory('$cordovaStatusbar', [function () {
- style: function (style) {
- switch (style) {
- // Default
- case 0:
- return StatusBar.styleDefault();
-
- // LightContent
- case 1:
- return StatusBar.styleLightContent();
+ return {
- // BlackTranslucent
- case 2:
- return StatusBar.styleBlackTranslucent();
+ /**
+ * @param {boolean} bool
+ */
+ overlaysWebView: function (bool) {
+ return StatusBar.overlaysWebView(!!bool);
+ },
- // BlackOpaque
- case 3:
- return StatusBar.styleBlackOpaque();
+ STYLES: {
+ DEFAULT: 0,
+ LIGHT_CONTENT: 1,
+ BLACK_TRANSLUCENT: 2,
+ BLACK_OPAQUE: 3
+ },
- default:
- return StatusBar.styleDefault();
- }
- },
+ /**
+ * @param {number} style
+ */
+ style: function (style) {
+ switch (style) {
+ // Default
+ case 0:
+ return StatusBar.styleDefault();
+
+ // LightContent
+ case 1:
+ return StatusBar.styleLightContent();
+
+ // BlackTranslucent
+ case 2:
+ return StatusBar.styleBlackTranslucent();
+
+ // BlackOpaque
+ case 3:
+ return StatusBar.styleBlackOpaque();
+
+ default:
+ return StatusBar.styleDefault();
+ }
+ },
- // supported names:
- // black, darkGray, lightGray, white, gray, red, green,
- // blue, cyan, yellow, magenta, orange, purple, brown
- styleColor: function (color) {
- return StatusBar.backgroundColorByName(color);
- },
+ // supported names:
+ // black, darkGray, lightGray, white, gray, red, green,
+ // blue, cyan, yellow, magenta, orange, purple, brown
+ styleColor: function (color) {
+ return StatusBar.backgroundColorByName(color);
+ },
- styleHex: function (colorHex) {
- return StatusBar.backgroundColorByHexString(colorHex);
- },
+ styleHex: function (colorHex) {
+ return StatusBar.backgroundColorByHexString(colorHex);
+ },
- hide: function () {
- return StatusBar.hide();
- },
+ hide: function () {
+ return StatusBar.hide();
+ },
- show: function () {
- return StatusBar.show();
- },
+ show: function () {
+ return StatusBar.show();
+ },
- isVisible: function () {
- return StatusBar.isVisible;
- }
- };
- }]);
+ isVisible: function () {
+ return StatusBar.isVisible;
+ }
+ };
+}]);
// install : cordova plugin add https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin.git
// link : https://github.com/EddyVerbruggen/Toast-PhoneGap-Plugin
@@ -7020,4 +6349,1834 @@ angular.module('ngCordova.plugins.zip', [])
};
}]);
-})();
+angular.module("oauth.providers", ["oauth.utils"])
+
+ .factory("$cordovaOauth", ["$q", '$http', "$cordovaOauthUtility", function($q, $http, $cordovaOauthUtility) {
+
+ return {
+
+ /*
+ * Sign into the ADFS service (ADFS 3.0 onwards)
+ *
+ * @param string clientId (client registered in ADFS, with redirect_uri configured to: http://localhost/callback)
+ * @param string adfsServer (url of the ADFS Server)
+ * @param string relyingPartyId (url of the Relying Party (resource relying on ADFS for authentication) configured in ADFS)
+ * @return promise
+ */
+ adfs: function(clientId, adfsServer, relyingPartyId) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var browserRef = window.open(adfsServer + '/adfs/oauth2/authorize?response_type=code&client_id=' + clientId +'&redirect_uri=http://localhost/callback&resource=' + relyingPartyId, '_blank', 'location=no');
+
+ browserRef.addEventListener("loadstart", function(event) {
+ if((event.url).indexOf('http://localhost/callback') === 0) {
+ var requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: adfsServer + "/adfs/oauth2/token", data: "client_id=" + clientId + "&code=" + requestToken + "&redirect_uri=http://localhost/callback&grant_type=authorization_code" })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Dropbox service
+ *
+ * @param string appKey
+ * @param object options
+ * @return promise
+ */
+ dropbox: function(appKey, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open("https://www.dropbox.com/1/oauth2/authorize?client_id=" + appKey + "&redirect_uri=" + redirect_uri + "&response_type=token", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
+ browserRef.addEventListener("loadstart", function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, uid: parameterMap.uid });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Digital Ocean service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param object options
+ * @return promise
+ */
+ digitalOcean: function(clientId, clientSecret, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open("https://cloud.digitalocean.com/v1/oauth/authorize?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=read%20write", "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
+ browserRef.addEventListener("loadstart", function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ var requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: "https://cloud.digitalocean.com/v1/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Google service
+ *
+ * @param string clientId
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ google: function(clientId, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://accounts.google.com/o/oauth2/auth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&approval_prompt=force&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener("loadstart", function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the GitHub service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ github: function(clientId, clientSecret, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://github.com/login/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(","), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http.defaults.headers.post.accept = 'application/json';
+ $http({method: "post", url: "https://github.com/login/oauth/access_token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Facebook service
+ *
+ * @param string clientId
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ facebook: function(clientId, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var flowUrl = "https://www.facebook.com/v2.0/dialog/oauth?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=token&scope=" + appScope.join(",");
+ if(options !== undefined && options.hasOwnProperty("auth_type")) {
+ flowUrl += "&auth_type=" + options.auth_type;
+ }
+ var browserRef = window.open(flowUrl, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
+ } else {
+ if ((event.url).indexOf("error_code=100") !== 0)
+ deferred.reject("Facebook returned error_code=100: Invalid permissions");
+ else
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the LinkedIn service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param array appScope
+ * @param string state
+ * @param object options
+ * @return promise
+ */
+ linkedin: function(clientId, clientSecret, appScope, state, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+
+ var browserRef = window.open('https://www.linkedin.com/uas/oauth2/authorization?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&response_type=code&state=' + state, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: "https://www.linkedin.com/uas/oauth2/accessToken", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Instagram service
+ *
+ * @param string clientId
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ instagram: function(clientId, appScope, options) {
+ var deferred = $q.defer();
+
+ var split_tokens = {
+ 'code':'?',
+ 'token':'#'
+ };
+
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ var response_type = "token";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ if(options.hasOwnProperty("response_type")) {
+ response_type = options.response_type;
+ }
+ }
+
+ var browserRef = window.open('https://api.instagram.com/oauth/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(" ") + '&response_type='+response_type, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split(split_tokens[response_type])[1];
+ var parameterMap = $cordovaOauthUtility.parseResponseParameters(callbackResponse);
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token });
+ } else if(parameterMap.code !== undefined && parameterMap.code !== null) {
+ deferred.resolve({ code: parameterMap.code });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Box service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param string appState
+ * @param object options
+ * @return promise
+ */
+ box: function(clientId, clientSecret, appState, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://app.box.com/api/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&state=' + appState + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: "https://app.box.com/api/oauth2/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Reddit service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ reddit: function(clientId, clientSecret, appScope, compact, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://ssl.reddit.com/api/v1/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&duration=permanent&state=ngcordovaoauth&scope=' + appScope.join(",") + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http.defaults.headers.post.Authorization = 'Basic ' + btoa(clientId + ":" + clientSecret);
+ $http({method: "post", url: "https://ssl.reddit.com/api/v1/access_token", data: "redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Twitter service
+ * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @return promise
+ */
+ twitter: function(clientId, clientSecret, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+
+ if(typeof jsSHA !== "undefined") {
+ var oauthObject = {
+ oauth_consumer_key: clientId,
+ oauth_nonce: $cordovaOauthUtility.createNonce(10),
+ oauth_signature_method: "HMAC-SHA1",
+ oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
+ oauth_version: "1.0"
+ };
+ var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/request_token", oauthObject, { oauth_callback: redirect_uri }, clientSecret);
+ $http({
+ method: "post",
+ url: "https://api.twitter.com/oauth/request_token",
+ headers: {
+ "Authorization": signatureObj.authorization_header,
+ "Content-Type": "application/x-www-form-urlencoded"
+ },
+ data: "oauth_callback=" + encodeURIComponent(redirect_uri)
+ })
+ .success(function(requestTokenResult) {
+ var requestTokenParameters = (requestTokenResult).split("&");
+ var parameterMap = {};
+ for(var i = 0; i < requestTokenParameters.length; i++) {
+ parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
+ }
+ if(parameterMap.hasOwnProperty("oauth_token") === false) {
+ deferred.reject("Oauth request token was not received");
+ }
+ var browserRef = window.open('https://api.twitter.com/oauth/authenticate?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ var callbackResponse = (event.url).split("?")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = {};
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
+ deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
+ }
+ delete oauthObject.oauth_signature;
+ oauthObject.oauth_token = parameterMap.oauth_token;
+ var signatureObj = $cordovaOauthUtility.createSignature("POST", "https://api.twitter.com/oauth/access_token", oauthObject, { oauth_verifier: parameterMap.oauth_verifier }, clientSecret);
+ $http({
+ method: "post",
+ url: "https://api.twitter.com/oauth/access_token",
+ headers: {
+ "Authorization": signatureObj.authorization_header
+ },
+ params: {
+ "oauth_verifier": parameterMap.oauth_verifier
+ }
+ })
+ .success(function(result) {
+ var accessTokenParameters = result.split("&");
+ var parameterMap = {};
+ for(var i = 0; i < accessTokenParameters.length; i++) {
+ parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
+ }
+ if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
+ deferred.reject("Oauth access token was not received");
+ }
+ deferred.resolve(parameterMap);
+ })
+ .error(function(error) {
+ deferred.reject(error);
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ })
+ .error(function(error) {
+ deferred.reject(error);
+ });
+ } else {
+ deferred.reject("Missing jsSHA JavaScript library");
+ }
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Meetup service
+ *
+ * @param string clientId
+ * @param object options
+ * @return promise
+ */
+ meetup: function(clientId, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://secure.meetup.com/oauth2/authorize/?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = {};
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve(parameterMap);
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Salesforce service
+ *
+ * Suggestion: use salesforce oauth with forcetk.js(as SDK)
+ *
+ * @param string loginUrl (such as: https://login.salesforce.com ; please notice community login)
+ * @param string clientId (copy from connection app info)
+ * @param string redirectUri (callback url in connection app info)
+ * @return promise
+ */
+ salesforce: function (loginUrl, clientId) {
+ var redirectUri = 'http://localhost/callback';
+ var getAuthorizeUrl = function (loginUrl, clientId, redirectUri) {
+ return loginUrl+'services/oauth2/authorize?display=touch'+
+ '&response_type=token&client_id='+escape(clientId)+
+ '&redirect_uri='+escape(redirectUri);
+ };
+ var startWith = function(string, str) {
+ return (string.substr(0, str.length) === str);
+ };
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var browserRef = window.open(getAuthorizeUrl(loginUrl, clientId, redirectUri), "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
+ browserRef.addEventListener("loadstart", function(event) {
+ if(startWith(event.url, redirectUri)) {
+ var oauthResponse = {};
+
+ var fragment = (event.url).split('#')[1];
+
+ if (fragment) {
+ var nvps = fragment.split('&');
+ for (var nvp in nvps) {
+ var parts = nvps[nvp].split('=');
+ oauthResponse[parts[0]] = unescape(parts[1]);
+ }
+ }
+
+ if (typeof oauthResponse === 'undefined' ||
+ typeof oauthResponse.access_token === 'undefined') {
+ deferred.reject("Problem authenticating");
+ } else {
+ deferred.resolve(oauthResponse);
+ }
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Strava service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ strava: function(clientId, clientSecret, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://www.strava.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope.join(",") + '&response_type=code&approval_prompt=force', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: "https://www.strava.com/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Withings service
+ * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @return promise
+ */
+ withings: function(clientId, clientSecret) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ if(typeof jsSHA !== "undefined") {
+
+ // Step 1 : get a oAuth "request token"
+ var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
+ oauthObject.oauth_callback = 'http://localhost/callback';
+
+ var requestTokenUrlBase = "https://oauth.withings.com/account/request_token";
+ var signatureObj = $cordovaOauthUtility.createSignature("GET", requestTokenUrlBase, {}, oauthObject, clientSecret);
+ oauthObject.oauth_signature = signatureObj.signature;
+
+ var requestTokenParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
+
+ $http({method: "get", url: requestTokenUrlBase + "?" + requestTokenParameters })
+ .success(function(requestTokenResult) {
+
+ // Step 2 : End-user authorization
+ var parameterMap = $cordovaOauthUtility.parseResponseParameters(requestTokenResult);
+ if(parameterMap.hasOwnProperty("oauth_token") === false) {
+ deferred.reject("Oauth request token was not received");
+ }
+ var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
+ oauthObject.oauth_token = parameterMap.oauth_token;
+
+ // used in step 3
+ var oauthTokenSecret = parameterMap.oauth_token_secret;
+
+ var authorizeUrlBase = "https://oauth.withings.com/account/authorize";
+ var signatureObj = $cordovaOauthUtility.createSignature("GET", authorizeUrlBase, {}, oauthObject, clientSecret);
+ oauthObject.oauth_signature = signatureObj.signature;
+
+ var authorizeParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
+ var browserRef = window.open(authorizeUrlBase + '?' + authorizeParameters, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+
+ // STEP 3: User Data Access token
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf("http://localhost/callback") === 0) {
+ var callbackResponse = (event.url).split("?")[1];
+ parameterMap = $cordovaOauthUtility.parseResponseParameters(callbackResponse);
+ if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
+ deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
+ }
+
+ var oauthObject = $cordovaOauthUtility.generateOauthParametersInstance(clientId);
+ oauthObject.oauth_token = parameterMap.oauth_token;
+
+ var accessTokenUrlBase = "https://oauth.withings.com/account/access_token";
+ var signatureObj = $cordovaOauthUtility.createSignature("GET", accessTokenUrlBase, {}, oauthObject, clientSecret, oauthTokenSecret);
+ oauthObject.oauth_signature = signatureObj.signature;
+
+ var accessTokenParameters = $cordovaOauthUtility.generateUrlParameters(oauthObject);
+
+ $http({method: "get", url: accessTokenUrlBase + '?' + accessTokenParameters})
+ .success(function(result) {
+ var parameterMap = $cordovaOauthUtility.parseResponseParameters(result);
+ if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
+ deferred.reject("Oauth access token was not received");
+ }
+ deferred.resolve(parameterMap);
+ })
+ .error(function(error) {
+ deferred.reject(error);
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ })
+ .error(function(error) {
+ deferred.reject(error);
+ });
+ } else {
+ deferred.reject("Missing jsSHA JavaScript library");
+ }
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Foursquare service
+ *
+ * @param string clientId
+ * @param object options
+ * @return promise
+ */
+ foursquare: function(clientId, options) {
+ var deferred = $q.defer();
+ if (window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if ($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://foursquare.com/oauth2/authenticate?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function (event) {
+ if ((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for (var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ var promiseResponse = {
+ access_token: parameterMap.access_token,
+ expires_in: parameterMap.expires_in
+ };
+ deferred.resolve(promiseResponse);
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Magento service
+ * Note that this service requires jsSHA for generating HMAC-SHA1 Oauth 1.0 signatures
+ *
+ * @param string baseUrl
+ * @param string clientId
+ * @param string clientSecret
+ * @return promise
+ */
+ magento: function(baseUrl, clientId, clientSecret) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ if(typeof jsSHA !== "undefined") {
+ var oauthObject = {
+ oauth_callback: "http://localhost/callback",
+ oauth_consumer_key: clientId,
+ oauth_nonce: $cordovaOauthUtility.createNonce(5),
+ oauth_signature_method: "HMAC-SHA1",
+ oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
+ oauth_version: "1.0"
+ };
+ var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/initiate", oauthObject, { oauth_callback: "http://localhost/callback" }, clientSecret);
+ $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: baseUrl + "/oauth/initiate", data: "oauth_callback=http://localhost/callback" })
+ .success(function(requestTokenResult) {
+ var requestTokenParameters = (requestTokenResult).split("&");
+ var parameterMap = {};
+ for(var i = 0; i < requestTokenParameters.length; i++) {
+ parameterMap[requestTokenParameters[i].split("=")[0]] = requestTokenParameters[i].split("=")[1];
+ }
+ if(parameterMap.hasOwnProperty("oauth_token") === false) {
+ deferred.reject("Oauth request token was not received");
+ }
+ var tokenSecret = parameterMap.oauth_token_secret;
+ var browserRef = window.open(baseUrl + '/oauth/authorize?oauth_token=' + parameterMap.oauth_token, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf("http://localhost/callback") === 0) {
+ var callbackResponse = (event.url).split("?")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = {};
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.hasOwnProperty("oauth_verifier") === false) {
+ deferred.reject("Browser authentication failed to complete. No oauth_verifier was returned");
+ }
+ delete oauthObject.oauth_signature;
+ delete oauthObject.oauth_callback;
+ oauthObject.oauth_token = parameterMap.oauth_token;
+ oauthObject.oauth_nonce = $cordovaOauthUtility.createNonce(5);
+ oauthObject.oauth_verifier = parameterMap.oauth_verifier;
+ var signatureObj = $cordovaOauthUtility.createSignature("POST", baseUrl + "/oauth/token", oauthObject, {}, clientSecret, tokenSecret);
+ $http.defaults.headers.post.Authorization = signatureObj.authorization_header;
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: baseUrl + "/oauth/token" })
+ .success(function(result) {
+ var accessTokenParameters = result.split("&");
+ var parameterMap = {};
+ for(var i = 0; i < accessTokenParameters.length; i++) {
+ parameterMap[accessTokenParameters[i].split("=")[0]] = accessTokenParameters[i].split("=")[1];
+ }
+ if(parameterMap.hasOwnProperty("oauth_token_secret") === false) {
+ deferred.reject("Oauth access token was not received");
+ }
+ deferred.resolve(parameterMap);
+ })
+ .error(function(error) {
+ deferred.reject(error);
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ })
+ .error(function(error) {
+ deferred.reject(error);
+ });
+ } else {
+ deferred.reject("Missing jsSHA JavaScript library");
+ }
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Vkontakte service
+ *
+ * @param string clientId
+ * @param array appScope (for example: "friends,wall,photos,messages")
+ * @return promise
+ */
+ vkontakte: function(clientId, appScope) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var browserRef = window.open('https://oauth.vk.com/authorize?client_id=' + clientId + '&redirect_uri=http://oauth.vk.com/blank.html&response_type=token&scope=' + appScope.join(",") + '&display=touch&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ var tmp = (event.url).split("#");
+ if (tmp[0] == 'https://oauth.vk.com/blank.html' || tmp[0] == 'http://oauth.vk.com/blank.html') {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ var output = { access_token: parameterMap.access_token, expires_in: parameterMap.expires_in };
+ if(parameterMap.email !== undefined && parameterMap.email !== null){
+ output.email = parameterMap.email;
+ }
+ deferred.resolve(output);
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Odnoklassniki service
+ *
+ * @param string clientId
+ * @param array appScope (for example: "VALUABLE_ACCESS ,GROUP_CONTENT,VIDEO_CONTENT")
+ * @return promise
+ */
+ odnoklassniki: function (clientId, appScope)
+ {
+ var deferred = $q.defer();
+ if (window.cordova)
+ {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if ($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true)
+ {
+ var browserRef = window.open('http://www.odnoklassniki.ru/oauth/authorize?client_id=' + clientId + '&scope=' + appScope.join(",") + '&response_type=token&redirect_uri=http://localhost/callback' + '&layout=m', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function (event)
+ {
+ if ((event.url).indexOf("http://localhost/callback") === 0)
+ {
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for (var i = 0; i < responseParameters.length; i++)
+ {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if (parameterMap.access_token !== undefined && parameterMap.access_token !== null)
+ {
+ deferred.resolve({ access_token: parameterMap.access_token, session_secret_key: parameterMap.session_secret_key });
+ } else
+ {
+ deferred.reject("Problem authenticating");
+ }
+ setTimeout(function ()
+ {
+ browserRef.close();
+ }, 10);
+ }
+ });
+ browserRef.addEventListener('exit', function (event)
+ {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else
+ {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else
+ {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+
+ /*
+ * Sign into the Imgur service
+ *
+ * @param string clientId
+ * @param object options
+ * @return promise
+ */
+ imgur: function(clientId, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://api.imgur.com/oauth2/authorize?client_id=' + clientId + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Spotify service
+ *
+ * @param string clientId
+ * @param object options
+ * @return promise
+ */
+ spotify: function(clientId, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://accounts.spotify.com/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in, account_username: parameterMap.account_username });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Uber service
+ *
+ * @param string clientId
+ * @param appScope array
+ * @param object options
+ * @return promise
+ */
+ uber: function(clientId, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://login.uber.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, token_type: parameterMap.token_type, expires_in: parameterMap.expires_in, scope: parameterMap.scope });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Windows Live Connect service
+ *
+ * @param string clientId
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ windowsLive: function (clientId, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "https://login.live.com/oauth20_desktop.srf";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://login.live.com/oauth20_authorize.srf?client_id=' + clientId + "&scope=" + appScope.join(",") + '&response_type=token&display=touch' + '&redirect_uri=' + redirect_uri, '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function (event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit", function (event) { });
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for (var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if (parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function (event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Yammer service
+ *
+ * @param string clientId
+ * @param object options
+ * @return promise
+ */
+ yammer: function(clientId, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://www.yammer.com/dialog/oauth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Venmo service
+ *
+ * @param string clientId
+ * @param array appScope
+ * @param object options
+ * @return promise
+ */
+ venmo: function(clientId, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://api.venmo.com/v1/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token&scope=' + appScope.join(" "), '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Stripe service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param string appScope
+ * @param object options
+ * @return promise
+ */
+ stripe: function(clientId, clientSecret, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://connect.stripe.com/oauth/authorize?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf("http://localhost/callback") === 0) {
+ requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: "https://connect.stripe.com/oauth/token", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Rally service
+ *
+ * @param string clientId
+ * @param string clientSecret
+ * @param string appScope
+ * @param object options
+ * @return promise
+ */
+ rally: function(clientId, clientSecret, appScope, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://rally1.rallydev.com/login/oauth2/auth?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&scope=' + appScope + '&response_type=code', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf("http://localhost/callback") === 0) {
+ requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: "https://rally1.rallydev.com/login/oauth2/auth", data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code" + "&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the FamilySearch service
+ *
+ * @param string clientId
+ * @param object options
+ * @return promise
+ */
+ familySearch: function(clientId, state, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if(cordovaMetadata.hasOwnProperty("cordova-plugin-inappbrowser") === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open("https://ident.familysearch.org/cis-web/oauth2/v3/authorization?client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&response_type=code&state=" + state, "_blank", "location=no,clearsessioncache=yes,clearcache=yes");
+ browserRef.addEventListener("loadstart", function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ var requestToken = (event.url).split("code=")[1];
+ $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
+ $http({method: "post", url: "https://ident.familysearch.org/cis-web/oauth2/v3/token", data: "client_id=" + clientId + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code&code=" + requestToken })
+ .success(function(data) {
+ deferred.resolve(data);
+ })
+ .error(function(data, status) {
+ deferred.reject("Problem authenticating");
+ })
+ .finally(function() {
+ setTimeout(function() {
+ browserRef.close();
+ }, 10);
+ });
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ },
+
+ /*
+ * Sign into the Envato service
+ *
+ * @param string clientId
+ * @param object options
+ * @return promise
+ */
+ envato: function(clientId, options) {
+ var deferred = $q.defer();
+ if(window.cordova) {
+ var cordovaMetadata = cordova.require("cordova/plugin_list").metadata;
+ if($cordovaOauthUtility.isInAppBrowserInstalled(cordovaMetadata) === true) {
+ var redirect_uri = "http://localhost/callback";
+ if(options !== undefined) {
+ if(options.hasOwnProperty("redirect_uri")) {
+ redirect_uri = options.redirect_uri;
+ }
+ }
+ var browserRef = window.open('https://api.envato.com/authorization?client_id=' + clientId + '&redirect_uri=' + redirect_uri + '&response_type=token', '_blank', 'location=no,clearsessioncache=yes,clearcache=yes');
+ browserRef.addEventListener('loadstart', function(event) {
+ if((event.url).indexOf(redirect_uri) === 0) {
+ browserRef.removeEventListener("exit",function(event){});
+ browserRef.close();
+ var callbackResponse = (event.url).split("#")[1];
+ var responseParameters = (callbackResponse).split("&");
+ var parameterMap = [];
+ for(var i = 0; i < responseParameters.length; i++) {
+ parameterMap[responseParameters[i].split("=")[0]] = responseParameters[i].split("=")[1];
+ }
+ if(parameterMap.access_token !== undefined && parameterMap.access_token !== null) {
+ deferred.resolve({ access_token: parameterMap.access_token, expires_in: parameterMap.expires_in });
+ } else {
+ deferred.reject("Problem authenticating");
+ }
+ }
+ });
+ browserRef.addEventListener('exit', function(event) {
+ deferred.reject("The sign in flow was canceled");
+ });
+ } else {
+ deferred.reject("Could not find InAppBrowser plugin");
+ }
+ } else {
+ deferred.reject("Cannot authenticate via a web browser");
+ }
+ return deferred.promise;
+ }
+
+ };
+
+ }]);
+
+/*
+ * Cordova AngularJS Oauth
+ *
+ * Created by Nic Raboy
+ * http://www.nraboy.com
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Use Oauth sign in for various web services.
+ *
+ *
+ * REQUIRES:
+ *
+ * Apache Cordova 3.5+
+ * Apache InAppBrowser Plugin
+ * Apache Cordova Whitelist Plugin
+ *
+ *
+ * SUPPORTS:
+ *
+ * Dropbox
+ * Digital Ocean
+ * Google
+ * GitHub
+ * Facebook
+ * LinkedIn
+ * Instagram
+ * Box
+ * Reddit
+ * Twitter
+ * Meetup
+ * Salesforce
+ * Strava
+ * Withings
+ * Foursquare
+ * Magento
+ * vkontakte
+ * Odnoklassniki
+ * ADFS
+ * Imgur
+ * Spotify
+ * Uber
+ * Windows Live Connect
+ * Yammer
+ * Venmo
+ * Stripe
+ * Rally
+ * Family Search
+ * Envato
+ */
+
+angular.module("ngCordovaOauth", [
+ "oauth.providers",
+ "oauth.utils"
+]);
+
+angular.module("oauth.utils", [])
+
+ .factory("$cordovaOauthUtility", ["$q", function($q) {
+
+ return {
+
+ /*
+ * Check to see if the mandatory InAppBrowser plugin is installed
+ *
+ * @param
+ * @return boolean
+ */
+ isInAppBrowserInstalled: function(cordovaMetadata) {
+ var inAppBrowserNames = ["cordova-plugin-inappbrowser", "org.apache.cordova.inappbrowser"];
+
+ return inAppBrowserNames.some(function(name) {
+ return cordovaMetadata.hasOwnProperty(name);
+ });
+ },
+
+ /*
+ * Sign an Oauth 1.0 request
+ *
+ * @param string method
+ * @param string endPoint
+ * @param object headerParameters
+ * @param object bodyParameters
+ * @param string secretKey
+ * @param string tokenSecret (optional)
+ * @return object
+ */
+ createSignature: function(method, endPoint, headerParameters, bodyParameters, secretKey, tokenSecret) {
+ if(typeof jsSHA !== "undefined") {
+ var headerAndBodyParameters = angular.copy(headerParameters);
+ var bodyParameterKeys = Object.keys(bodyParameters);
+ for(var i = 0; i < bodyParameterKeys.length; i++) {
+ headerAndBodyParameters[bodyParameterKeys[i]] = encodeURIComponent(bodyParameters[bodyParameterKeys[i]]);
+ }
+ var signatureBaseString = method + "&" + encodeURIComponent(endPoint) + "&";
+ var headerAndBodyParameterKeys = (Object.keys(headerAndBodyParameters)).sort();
+ for(i = 0; i < headerAndBodyParameterKeys.length; i++) {
+ if(i == headerAndBodyParameterKeys.length - 1) {
+ signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]]);
+ } else {
+ signatureBaseString += encodeURIComponent(headerAndBodyParameterKeys[i] + "=" + headerAndBodyParameters[headerAndBodyParameterKeys[i]] + "&");
+ }
+ }
+ var oauthSignatureObject = new jsSHA(signatureBaseString, "TEXT");
+
+ var encodedTokenSecret = '';
+ if (tokenSecret) {
+ encodedTokenSecret = encodeURIComponent(tokenSecret);
+ }
+
+ headerParameters.oauth_signature = encodeURIComponent(oauthSignatureObject.getHMAC(encodeURIComponent(secretKey) + "&" + encodedTokenSecret, "TEXT", "SHA-1", "B64"));
+ var headerParameterKeys = Object.keys(headerParameters);
+ var authorizationHeader = 'OAuth ';
+ for(i = 0; i < headerParameterKeys.length; i++) {
+ if(i == headerParameterKeys.length - 1) {
+ authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '"';
+ } else {
+ authorizationHeader += headerParameterKeys[i] + '="' + headerParameters[headerParameterKeys[i]] + '",';
+ }
+ }
+ return { signature_base_string: signatureBaseString, authorization_header: authorizationHeader, signature: headerParameters.oauth_signature };
+ } else {
+ return "Missing jsSHA JavaScript library";
+ }
+ },
+
+ /*
+ * Create Random String Nonce
+ *
+ * @param integer length
+ * @return string
+ */
+ createNonce: function(length) {
+ var text = "";
+ var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ for(var i = 0; i < length; i++) {
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
+ }
+ return text;
+ },
+
+ generateUrlParameters: function (parameters) {
+ var sortedKeys = Object.keys(parameters);
+ sortedKeys.sort();
+
+ var params = "";
+ var amp = "";
+
+ for (var i = 0 ; i < sortedKeys.length; i++) {
+ params += amp + sortedKeys[i] + "=" + parameters[sortedKeys[i]];
+ amp = "&";
+ }
+
+ return params;
+ },
+
+ parseResponseParameters: function (response) {
+ if (response.split) {
+ var parameters = response.split("&");
+ var parameterMap = {};
+ for(var i = 0; i < parameters.length; i++) {
+ parameterMap[parameters[i].split("=")[0]] = parameters[i].split("=")[1];
+ }
+ return parameterMap;
+ }
+ else {
+ return {};
+ }
+ },
+
+ generateOauthParametersInstance: function(consumerKey) {
+ var nonceObj = new jsSHA(Math.round((new Date()).getTime() / 1000.0), "TEXT");
+ var oauthObject = {
+ oauth_consumer_key: consumerKey,
+ oauth_nonce: nonceObj.getHash("SHA-1", "HEX"),
+ oauth_signature_method: "HMAC-SHA1",
+ oauth_timestamp: Math.round((new Date()).getTime() / 1000.0),
+ oauth_version: "1.0"
+ };
+ return oauthObject;
+ }
+
+ };
+
+ }]);
+
+})(); \ No newline at end of file