1 /*jshint indent:2, curly:true, eqeqeq:true, immed:true, latedef:true,
2 newcap:true, noarg:true, regexp:true, undef:true, strict:true, trailing:true,
4 /*global XT:true, XM:true, XV:true, Backbone:true, _:true, window:true */
9 XT.extensions.oauth2.initModels = function () {
15 XM.Oauth2client = XM.Model.extend({
17 recordType: "XM.Oauth2client",
21 defaults: function () {
34 bindEvents: function () {
35 XM.Model.prototype.bindEvents.apply(this, arguments);
36 this.on('statusChange', this.statusDidChange);
37 this.on('change:clientType', this.clientTypeDidChange);
40 // clientType must not be editable once first saved.
41 statusDidChange: function () {
42 this.setReadOnly('clientType', this.getStatus() !== XM.Model.READY_NEW);
44 if (this.getStatus() === XM.Model.READY_NEW) {
45 this.set('clientID', XT.getOrganizationPath().substring(1) + "_" + XT.generateUUID());
46 // XXX the secret is only relevant for websites, but we generate it here
47 // for both because it's required to be unique on the DB level
48 // secret keys only seem to be applicable for website clients, so we might
49 // not want to make it unique
50 this.set('clientSecret', XT.generateUUID());
51 this.set('issued', new Date());
55 clientTypeDidChange: function () {
56 this.set("delegatedAccess", this.get("clientType") === 'jwt bearer');
59 save: function (key, value, options) {
60 // Handle both `"key", value` and `{key: value}` -style arguments.
61 if (_.isObject(key) || _.isEmpty(key)) {
64 options = options ? _.clone(options) : {};
66 var success = options.success,
67 status = this.getStatus(),
70 options.success = function (model, resp, options) {
71 if (status === XM.Model.READY_NEW && that.get("clientType") === 'jwt bearer') {
72 // Download the private key.
73 XV.downloadURL(XT.getOrganizationPath() + '/oauth/generate-key?id=' + that.id);
76 if (success) { success(model, resp, options); }
79 // Handle both `"key", value` and `{key: value}` -style arguments.
80 if (_.isObject(key) || _.isEmpty(key)) {
84 if (status === XM.Model.READY_NEW && that.get("clientType") === 'jwt bearer') {
85 // The order of operations for a new jwt bearer is
86 // 1. Notify the user that the download is coming
88 // 3. Open the download tab.
90 // It's a little curious that 2 happens after 1, but the notify listener
91 // on the workspace gets destroyed by the time we would need it otherwise.
92 that.notify("_generatingPrivateKey".loc(), {callback: function () {
93 XM.Model.prototype.save.call(that, key, value, options);
96 XM.Model.prototype.save.call(this, key, value, options);
102 XM.Oauth2clientRedirs = XM.Model.extend({
104 recordType: "XM.Oauth2clientRedirs",
114 XM.Oauth2clientCollection = XM.Collection.extend({
115 model: XM.Oauth2client
118 XM.Oauth2clientRedirsCollection = XM.Collection.extend({
119 model: XM.Oauth2clientRedirs