123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- function addParameterToURL(url, param){
- var urlSplit = url.split('?');
- return url+(urlSplit.length>0 ? '?':'&') + param;
- }
- Meteor.initCas = function(callback) {
- const casTokenMatch = window.location.href.match(/[?&]casToken=([^&]+)/);
- if (casTokenMatch == null) {
- return;
- }
- window.history.pushState('', document.title, window.location.href.replace(/([&?])casToken=[^&]+[&]?/, '$1').replace(/[?&]+$/g, ''));
- Accounts.callLoginMethod({
- methodArguments: [{ cas: { credentialToken: casTokenMatch[1] } }],
- userCallback: function(err){
- if (err == null) {
- // should we do anything on success?
- }
- if (callback != null) {
- callback(err);
- }
- }
- });
- }
- Meteor.loginWithCas = function(options, 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 backURL = window.location.href.replace('#', '');
- if (options != null && options.redirectUrl != null)
- backURL = options.redirectUrl;
- var serviceURL = addParameterToURL(backURL, 'casToken='+credentialToken);
- var loginUrl = settings.loginUrl +
- "?" + (settings.serviceParam || "service") + "=" +
- encodeURIComponent(serviceURL)
- if (settings.popup == false) {
- window.location = loginUrl;
- return;
- }
- var popup = openCenteredPopup(
- loginUrl,
- settings.width || 800,
- settings.height || 600
- );
- var checkPopupOpen = setInterval(function() {
- try {
- if(popup && popup.document && popup.document.getElementById('popupCanBeClosed')) {
- popup.close();
- }
- // Fix for #328 - added a second test criteria (popup.closed === undefined)
- // to humour this Android quirk:
- // http://code.google.com/p/android/issues/detail?id=21061
- var popupClosed = popup.closed || popup.closed === undefined;
- } catch (e) {
- // For some unknown reason, IE9 (and others?) sometimes (when
- // the popup closes too quickly?) throws "SCRIPT16386: No such
- // interface supported" when trying to read 'popup.closed'. Try
- // again in 100ms.
- return;
- }
- if (popupClosed) {
- clearInterval(checkPopupOpen);
- // check auth on server.
- Accounts.callLoginMethod({
- methodArguments: [{ cas: { credentialToken: credentialToken } }],
- userCallback: err => {
- // Fix redirect bug after login successfully
- if (!err) {
- window.location.href = '/';
- }
- }
- });
- }
- }, 100);
- };
- var openCenteredPopup = function(url, width, height) {
- var screenX = typeof window.screenX !== 'undefined'
- ? window.screenX : window.screenLeft;
- var screenY = typeof window.screenY !== 'undefined'
- ? window.screenY : window.screenTop;
- var outerWidth = typeof window.outerWidth !== 'undefined'
- ? window.outerWidth : document.body.clientWidth;
- var outerHeight = typeof window.outerHeight !== 'undefined'
- ? window.outerHeight : (document.body.clientHeight - 22);
- // XXX what is the 22?
- // Use `outerWidth - width` and `outerHeight - height` for help in
- // positioning the popup centered relative to the current window
- var left = screenX + (outerWidth - width) / 2;
- var top = screenY + (outerHeight - height) / 2;
- var features = ('width=' + width + ',height=' + height +
- ',left=' + left + ',top=' + top + ',scrollbars=yes');
- var newwindow = window.open(url, '_blank', features);
- if (newwindow.focus)
- newwindow.focus();
- return newwindow;
- };
|