summaryrefslogtreecommitdiffstats
path: root/packages/meteor-accounts-cas/cas_client.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meteor-accounts-cas/cas_client.js')
-rw-r--r--packages/meteor-accounts-cas/cas_client.js112
1 files changed, 112 insertions, 0 deletions
diff --git a/packages/meteor-accounts-cas/cas_client.js b/packages/meteor-accounts-cas/cas_client.js
new file mode 100644
index 00000000..bd94be6b
--- /dev/null
+++ b/packages/meteor-accounts-cas/cas_client.js
@@ -0,0 +1,112 @@
+
+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: callback
+ });
+ }
+ }, 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;
+};