1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- 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();
- };
|