src/pyams_security/resources/js/authomatic.js
changeset 0 f04e1d0a0723
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/pyams_security/resources/js/authomatic.js	Thu Feb 19 10:53:29 2015 +0100
@@ -0,0 +1,524 @@
+// Generated by CoffeeScript 1.6.2
+/*
+# CoffeeDoc example documentation #
+
+This is a module-level docstring, and will be displayed at the top of the module documentation.
+Documentation generated by [CoffeeDoc](http://github.com/omarkhan/coffeedoc)
+
+npm install -g coffeedoc
+*/
+
+
+(function() {
+  var $, Authomatic, BaseProvider, Flickr, Foursquare, Google, LinkedIn, Oauth1Provider, Oauth2Provider, WindowsLive, deserializeCredentials, format, getProviderClass, globalOptions, jsonPCallbackCounter, log, openWindow, parseQueryString, parseUrl, _ref, _ref1, _ref2, _ref3, _ref4, _ref5,
+    __slice = [].slice,
+    __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },
+    __hasProp = {}.hasOwnProperty,
+    __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+  $ = jQuery;
+
+  jsonPCallbackCounter = 0;
+
+  globalOptions = {
+    logging: true,
+    popupWidth: 800,
+    popupHeight: 600,
+    popupLinkSelector: 'a.authomatic',
+    popupFormSelector: 'form.authomatic',
+    popupFormValidator: function($form) {
+      return true;
+    },
+    backend: null,
+    forceBackend: false,
+    substitute: {},
+    params: {},
+    headers: {},
+    body: '',
+    jsonpCallbackPrefix: 'authomaticJsonpCallback',
+    onPopupInvalid: null,
+    onPopupOpen: null,
+    onLoginComplete: null,
+    onBackendStart: null,
+    onBackendComplete: null,
+    onAccessSuccess: null,
+    onAccessComplete: null
+  };
+
+  log = function() {
+    var args, _ref;
+
+    args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
+    if (globalOptions.logging && ((typeof console !== "undefined" && console !== null ? (_ref = console.log) != null ? _ref.apply : void 0 : void 0) != null)) {
+      return typeof console !== "undefined" && console !== null ? console.log.apply(console, ['Authomatic:'].concat(__slice.call(args))) : void 0;
+    }
+  };
+
+  openWindow = function(url) {
+    var height, left, settings, top, width;
+
+    width = globalOptions.popupWidth;
+    height = globalOptions.popupHeight;
+    top = (screen.height / 2) - (height / 2);
+    left = (screen.width / 2) - (width / 2);
+    settings = "width=" + width + ",height=" + height + ",top=" + top + ",left=" + left;
+    log('Opening popup:', url);
+    if (typeof globalOptions.onPopupOpen === "function") {
+      globalOptions.onPopupOpen(url);
+    }
+    return window.open(url, '', settings);
+  };
+
+  parseQueryString = function(queryString) {
+    var item, k, result, v, _i, _len, _ref, _ref1;
+
+    result = {};
+    _ref = queryString.split('&');
+    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+      item = _ref[_i];
+      _ref1 = item.split('='), k = _ref1[0], v = _ref1[1];
+      v = decodeURIComponent(v);
+      if (result.hasOwnProperty(k)) {
+        if (Array.isArray(result[k])) {
+          result[k].push(v);
+        } else {
+          result[k] = [result[k], v];
+        }
+      } else {
+        result[k] = v;
+      }
+    }
+    return result;
+  };
+
+  parseUrl = function(url) {
+    var qs, questionmarkIndex, u;
+
+    log('parseUrl', url);
+    questionmarkIndex = url.indexOf('?');
+    if (questionmarkIndex >= 0) {
+      u = url.substring(0, questionmarkIndex);
+      qs = url.substring(questionmarkIndex + 1);
+    } else {
+      u = url;
+    }
+    return {
+      url: u,
+      query: qs,
+      params: qs ? parseQueryString(qs) : void 0
+    };
+  };
+
+  deserializeCredentials = function(credentials) {
+    var sc, subtype, type, typeId, _ref;
+
+    sc = decodeURIComponent(credentials).split('\n');
+    typeId = sc[1];
+    _ref = typeId.split('-'), type = _ref[0], subtype = _ref[1];
+    return {
+      id: parseInt(sc[0]),
+      typeId: typeId,
+      type: parseInt(type),
+      subtype: parseInt(subtype),
+      rest: sc.slice(2)
+    };
+  };
+
+  getProviderClass = function(credentials) {
+    var subtype, type, _ref;
+
+    _ref = deserializeCredentials(credentials), type = _ref.type, subtype = _ref.subtype;
+    if (type === 1) {
+      if (subtype === 2) {
+        return Flickr;
+      } else {
+        return Oauth1Provider;
+      }
+    } else if (type === 2) {
+      if (subtype === 6) {
+        return Foursquare;
+      } else if (subtype === 9) {
+        return LinkedIn;
+      } else if (subtype === 14) {
+        return WindowsLive;
+      } else if (subtype === 12 || subtype === 15) {
+        return BaseProvider;
+      } else {
+        return Oauth2Provider;
+      }
+    } else {
+      return BaseProvider;
+    }
+  };
+
+  format = function(template, substitute) {
+    return template.replace(/{([^}]*)}/g, function(match, tag) {
+      var level, target, _i, _len, _ref;
+
+      target = substitute;
+      _ref = tag.split('.');
+      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+        level = _ref[_i];
+        target = target[level];
+      }
+      return target;
+    });
+  };
+
+  window.authomatic = new (Authomatic = (function() {
+    function Authomatic() {}
+
+    Authomatic.prototype.setup = function(options) {
+      $.extend(globalOptions, options);
+      return log('Setting up authomatic to:', globalOptions);
+    };
+
+    Authomatic.prototype.popupInit = function() {
+      $(globalOptions.popupLinkSelector).click(function(e) {
+        e.preventDefault();
+        return openWindow($(this).attr('href'));
+      });
+      return $(globalOptions.popupFormSelector).submit(function(e) {
+        var $form, url;
+
+        e.preventDefault();
+        $form = $(this);
+        url = $form.attr('action') + '?' + $form.serialize();
+        if (globalOptions.popupFormValidator($form)) {
+          return openWindow(url);
+        } else {
+          return typeof globalOptions.onPopupInvalid === "function" ? globalOptions.onPopupInvalid($form) : void 0;
+        }
+      });
+    };
+
+    Authomatic.prototype.loginComplete = function(result, closer) {
+      var result_copy;
+
+      result_copy = $.extend(true, {}, result);
+      log('Login procedure complete', result_copy);
+      closer();
+      return globalOptions.onLoginComplete(result_copy);
+    };
+
+    Authomatic.prototype.access = function(credentials, url, options) {
+      var Provider, localEvents, provider, updatedOptions;
+
+      if (options == null) {
+        options = {};
+      }
+      localEvents = {
+        onBackendStart: null,
+        onBackendComplete: null,
+        onAccessSuccess: null,
+        onAccessComplete: null
+      };
+      updatedOptions = {};
+      $.extend(updatedOptions, globalOptions, localEvents, options);
+      url = format(url, updatedOptions.substitute);
+      log('access options', updatedOptions, globalOptions);
+      if (updatedOptions.forceBackend) {
+        Provider = BaseProvider;
+      } else {
+        Provider = getProviderClass(credentials);
+      }
+      provider = new Provider(options.backend, credentials, url, updatedOptions);
+      log('Instantiating provider:', provider);
+      return provider.access();
+    };
+
+    return Authomatic;
+
+  })());
+
+  BaseProvider = (function() {
+    BaseProvider.prototype._x_jsonpCallbackParamName = 'callback';
+
+    function BaseProvider(backend, credentials, url, options) {
+      var parsedUrl;
+
+      this.backend = backend;
+      this.credentials = credentials;
+      this.options = options;
+      this.access = __bind(this.access, this);
+      this.contactProvider = __bind(this.contactProvider, this);
+      this.contactBackend = __bind(this.contactBackend, this);
+      this.backendRequestType = 'auto';
+      this.jsonpRequest = false;
+      this.jsonpCallbackName = "" + globalOptions.jsonpCallbackPrefix + jsonPCallbackCounter;
+      this.deserializedCredentials = deserializeCredentials(this.credentials);
+      this.providerID = this.deserializedCredentials.id;
+      this.providerType = this.deserializedCredentials.type;
+      this.credentialsRest = this.deserializedCredentials.rest;
+      parsedUrl = parseUrl(url);
+      this.url = parsedUrl.url;
+      this.params = {};
+      $.extend(this.params, parsedUrl.params, this.options.params);
+    }
+
+    BaseProvider.prototype.contactBackend = function(callback) {
+      var data, _base;
+
+      if (this.jsonpRequest && this.options.method === !'GET') {
+        this.backendRequestType = 'fetch';
+      }
+      data = {
+        type: this.backendRequestType,
+        credentials: this.credentials,
+        url: this.url,
+        method: this.options.method,
+        body: this.options.body,
+        params: JSON.stringify(this.params),
+        headers: JSON.stringify(this.options.headers)
+      };
+      if (typeof globalOptions.onBackendStart === "function") {
+        globalOptions.onBackendStart(data);
+      }
+      if (typeof (_base = this.options).onBackendStart === "function") {
+        _base.onBackendStart(data);
+      }
+      log("Contacting backend at " + this.options.backend + ".", data);
+      return $.get(this.options.backend, data, callback);
+    };
+
+    BaseProvider.prototype.contactProvider = function(requestElements) {
+      var body, headers, jsonpOptions, method, options, params, url,
+        _this = this;
+
+      url = requestElements.url, method = requestElements.method, params = requestElements.params, headers = requestElements.headers, body = requestElements.body;
+      options = {
+        type: method,
+        data: params,
+        headers: headers,
+        complete: [
+          (function(jqXHR, textStatus) {
+            return log('Request complete.', textStatus, jqXHR);
+          }), globalOptions.onAccessComplete, this.options.onAccessComplete
+        ],
+        success: [
+          (function(data) {
+            return log('Request successful.', data);
+          }), globalOptions.onAccessSuccess, this.options.onAccessSuccess
+        ],
+        error: function(jqXHR, textStatus, errorThrown) {
+          if (jqXHR.state() === 'rejected') {
+            if (_this.options.method === 'GET') {
+              log('Cross domain request failed! trying JSONP request.');
+              _this.jsonpRequest = true;
+            } else {
+              _this.backendRequestType = 'fetch';
+            }
+            return _this.access();
+          }
+        }
+      };
+      if (this.jsonpRequest) {
+        jsonpOptions = {
+          jsonpCallback: this.jsonpCallbackName,
+          jsonp: this._x_jsonpCallbackParamName,
+          cache: true,
+          dataType: 'jsonp',
+          error: function(jqXHR, textStatus, errorThrown) {
+            return log('JSONP failed! State:', jqXHR.state());
+          }
+        };
+        $.extend(options, jsonpOptions);
+        log("Contacting provider with JSONP request.", url, options);
+      } else {
+        log("Contacting provider with cross domain request", url, options);
+      }
+      return $.ajax(url, options);
+    };
+
+    BaseProvider.prototype.access = function() {
+      var callback,
+        _this = this;
+
+      callback = function(data, textStatus, jqXHR) {
+        var responseTo, _base, _base1, _base2;
+
+        if (typeof globalOptions.onBackendComplete === "function") {
+          globalOptions.onBackendComplete(data, textStatus, jqXHR);
+        }
+        if (typeof (_base = _this.options).onBackendComplete === "function") {
+          _base.onBackendComplete(data, textStatus, jqXHR);
+        }
+        responseTo = jqXHR != null ? jqXHR.getResponseHeader('Authomatic-Response-To') : void 0;
+        if (responseTo === 'fetch') {
+          log("Fetch data returned from backend.", jqXHR.getResponseHeader('content-type'), data);
+          if (typeof globalOptions.onAccessSuccess === "function") {
+            globalOptions.onAccessSuccess(data);
+          }
+          if (typeof (_base1 = _this.options).onAccessSuccess === "function") {
+            _base1.onAccessSuccess(data);
+          }
+          if (typeof globalOptions.onAccessComplete === "function") {
+            globalOptions.onAccessComplete(jqXHR, textStatus);
+          }
+          return typeof (_base2 = _this.options).onAccessComplete === "function" ? _base2.onAccessComplete(jqXHR, textStatus) : void 0;
+        } else if (responseTo === 'elements') {
+          log("Request elements data returned from backend.", data);
+          return _this.contactProvider(data);
+        }
+      };
+      if (this.jsonpRequest) {
+        jsonPCallbackCounter += 1;
+      }
+      return this.contactBackend(callback);
+    };
+
+    return BaseProvider;
+
+  })();
+
+  Oauth1Provider = (function(_super) {
+    __extends(Oauth1Provider, _super);
+
+    function Oauth1Provider() {
+      this.contactProvider = __bind(this.contactProvider, this);
+      this.access = __bind(this.access, this);      _ref = Oauth1Provider.__super__.constructor.apply(this, arguments);
+      return _ref;
+    }
+
+    Oauth1Provider.prototype.access = function() {
+      this.jsonpRequest = true;
+      this.params[this._x_jsonpCallbackParamName] = this.jsonpCallbackName;
+      return Oauth1Provider.__super__.access.call(this);
+    };
+
+    Oauth1Provider.prototype.contactProvider = function(requestElements) {
+      delete requestElements.params.callback;
+      return Oauth1Provider.__super__.contactProvider.call(this, requestElements);
+    };
+
+    return Oauth1Provider;
+
+  })(BaseProvider);
+
+  Flickr = (function(_super) {
+    __extends(Flickr, _super);
+
+    function Flickr() {
+      _ref1 = Flickr.__super__.constructor.apply(this, arguments);
+      return _ref1;
+    }
+
+    Flickr.prototype._x_jsonpCallbackParamName = 'jsoncallback';
+
+    return Flickr;
+
+  })(Oauth1Provider);
+
+  Oauth2Provider = (function(_super) {
+    __extends(Oauth2Provider, _super);
+
+    Oauth2Provider.prototype._x_accessToken = 'access_token';
+
+    Oauth2Provider.prototype._x_bearer = 'Bearer';
+
+    function Oauth2Provider() {
+      var args, _ref2;
+
+      args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
+      this.access = __bind(this.access, this);
+      this.handleTokenType = __bind(this.handleTokenType, this);
+      Oauth2Provider.__super__.constructor.apply(this, args);
+      _ref2 = this.credentialsRest, this.accessToken = _ref2[0], this.refreshToken = _ref2[1], this.expirationTime = _ref2[2], this.tokenType = _ref2[3];
+      this.handleTokenType();
+    }
+
+    Oauth2Provider.prototype.handleTokenType = function() {
+      if (this.tokenType === '1') {
+        return this.options.headers['Authorization'] = "" + this._x_bearer + " " + this.accessToken;
+      } else {
+        return this.params[this._x_accessToken] = this.accessToken;
+      }
+    };
+
+    Oauth2Provider.prototype.access = function() {
+      var requestElements;
+
+      if (this.backendRequestType === 'fetch') {
+        return Oauth2Provider.__super__.access.call(this);
+      } else {
+        requestElements = {
+          url: this.url,
+          method: this.options.method,
+          params: this.params,
+          headers: this.options.headers,
+          body: this.options.body
+        };
+        return this.contactProvider(requestElements);
+      }
+    };
+
+    return Oauth2Provider;
+
+  })(BaseProvider);
+
+  Foursquare = (function(_super) {
+    __extends(Foursquare, _super);
+
+    function Foursquare() {
+      _ref2 = Foursquare.__super__.constructor.apply(this, arguments);
+      return _ref2;
+    }
+
+    Foursquare.prototype._x_accessToken = 'oauth_token';
+
+    return Foursquare;
+
+  })(Oauth2Provider);
+
+  Google = (function(_super) {
+    __extends(Google, _super);
+
+    function Google() {
+      _ref3 = Google.__super__.constructor.apply(this, arguments);
+      return _ref3;
+    }
+
+    Google.prototype._x_bearer = 'OAuth';
+
+    return Google;
+
+  })(Oauth2Provider);
+
+  LinkedIn = (function(_super) {
+    __extends(LinkedIn, _super);
+
+    function LinkedIn() {
+      _ref4 = LinkedIn.__super__.constructor.apply(this, arguments);
+      return _ref4;
+    }
+
+    LinkedIn.prototype._x_accessToken = 'oauth2_access_token';
+
+    return LinkedIn;
+
+  })(Oauth2Provider);
+
+  WindowsLive = (function(_super) {
+    __extends(WindowsLive, _super);
+
+    function WindowsLive() {
+      this.handleTokenType = __bind(this.handleTokenType, this);      _ref5 = WindowsLive.__super__.constructor.apply(this, arguments);
+      return _ref5;
+    }
+
+    WindowsLive.prototype.handleTokenType = function() {
+      if (this.tokenType === '1') {
+        this.options.headers['Authorization'] = "" + this._x_bearer + " " + this.accessToken;
+      }
+      return this.params[this._x_accessToken] = this.accessToken;
+    };
+
+    return WindowsLive;
+
+  })(Oauth2Provider);
+
+}).call(this);
+
+/*
+//@ sourceMappingURL=authomatic.map
+*/