summaryrefslogtreecommitdiffstats
path: root/packages/meteor-accounts-cas/cas_client_cordova.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meteor-accounts-cas/cas_client_cordova.js')
-rw-r--r--packages/meteor-accounts-cas/cas_client_cordova.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/packages/meteor-accounts-cas/cas_client_cordova.js b/packages/meteor-accounts-cas/cas_client_cordova.js
new file mode 100644
index 00000000..c7f95b50
--- /dev/null
+++ b/packages/meteor-accounts-cas/cas_client_cordova.js
@@ -0,0 +1,71 @@
+
+Meteor.loginWithCas = function(callback) {
+
+ var credentialToken = Random.id();
+
+ if (!Meteor.settings.public &&
+ !Meteor.settings.public.cas &&
+ !Meteor.settings.public.cas.loginUrl) {
+ return;
+ }
+
+ var settings = Meteor.settings.public.cas;
+
+ var loginUrl = settings.loginUrl +
+ "?" + (settings.service || "service") + "=" +
+ Meteor.absoluteUrl('_cas/') +
+ credentialToken;
+
+
+ var fail = function (err) {
+ Meteor._debug("Error from OAuth popup: " + JSON.stringify(err));
+ };
+
+ // When running on an android device, we sometimes see the
+ // `pageLoaded` callback fire twice for the final page in the OAuth
+ // popup, even though the page only loads once. This is maybe an
+ // Android bug or maybe something intentional about how onPageFinished
+ // works that we don't understand and isn't well-documented.
+ var oauthFinished = false;
+
+ var pageLoaded = function (event) {
+ if (oauthFinished) {
+ return;
+ }
+
+ if (event.url.indexOf(Meteor.absoluteUrl('_cas')) === 0) {
+
+ oauthFinished = true;
+
+ // On iOS, this seems to prevent "Warning: Attempt to dismiss from
+ // view controller <MainViewController: ...> while a presentation
+ // or dismiss is in progress". My guess is that the last
+ // navigation of the OAuth popup is still in progress while we try
+ // to close the popup. See
+ // https://issues.apache.org/jira/browse/CB-2285.
+ //
+ // XXX Can we make this timeout smaller?
+ setTimeout(function () {
+ popup.close();
+ // check auth on server.
+ Accounts.callLoginMethod({
+ methodArguments: [{ cas: { credentialToken: credentialToken } }],
+ userCallback: callback
+ });
+ }, 100);
+ }
+ };
+
+ var onExit = function () {
+ popup.removeEventListener('loadstop', pageLoaded);
+ popup.removeEventListener('loaderror', fail);
+ popup.removeEventListener('exit', onExit);
+ };
+
+ var popup = window.open(loginUrl, '_blank', 'location=no,hidden=no');
+ popup.addEventListener('loadstop', pageLoaded);
+ popup.addEventListener('loaderror', fail);
+ popup.addEventListener('exit', onExit);
+ popup.show();
+
+}; \ No newline at end of file