/*******************************************************************************
* Copyright 2018 The MIT Internet Trust Consortium
*
* Portions copyright 2011-2013 The MITRE Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
var WhiteListModel = Backbone.Model.extend({
idAttribute: "id",
initialize: function() {
},
urlRoot: "api/whitelist"
});
var WhiteListCollection = Backbone.Collection.extend({
initialize: function() {
// this.fetch();
},
getByClientId: function(clientId) {
var clients = this.where({
clientId: clientId
});
if (clients.length == 1) {
return clients[0];
} else {
return null;
}
},
model: WhiteListModel,
url: "api/whitelist"
});
var WhiteListListView = Backbone.View.extend({
tagName: 'span',
initialize: function(options) {
this.options = options;
},
load: function(callback) {
if (this.model.isFetched && this.options.clientList.isFetched && this.options.systemScopeList.isFetched) {
callback();
return;
}
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('whitelist.whitelist') + ' ' + '' + $.t('common.clients') + ' ' + '' + $.t('common.scopes') + ' ');
$.when(this.model.fetchIfNeeded({
success: function(e) {
$('#loading-whitelist').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.clientList.fetchIfNeeded({
success: function(e) {
$('#loading-clients').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.systemScopeList.fetchIfNeeded({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
callback();
});
},
events: {
"click .refresh-table": "refreshTable"
},
render: function(eventName) {
$(this.el).html($('#tmpl-whitelist-table').html());
var _self = this;
_.each(this.model.models, function(whiteList) {
// look up client
var client = _self.options.clientList.getByClientId(whiteList.get('clientId'));
// if there's no client ID, this is an error!
if (client != null) {
var view = new WhiteListView({
model: whiteList,
client: client,
systemScopeList: _self.options.systemScopeList
});
view.parentView = _self;
$('#whitelist-table', _self.el).append(view.render().el);
}
}, this);
this.togglePlaceholder();
$(this.el).i18n();
return this;
},
togglePlaceholder: function() {
if (this.model.length > 0) {
$('#whitelist-table', this.el).show();
$('#whitelist-table-empty', this.el).hide();
} else {
$('#whitelist-table', this.el).hide();
$('#whitelist-table-empty', this.el).show();
}
},
refreshTable: function(e) {
e.preventDefault();
var _self = this;
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('whitelist.whitelist') + ' ' + '' + $.t('common.clients') + ' ' + '' + $.t('common.scopes') + ' ');
$.when(this.model.fetch({
success: function(e) {
$('#loading-whitelist').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.clientList.fetch({
success: function(e) {
$('#loading-clients').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.systemScopeList.fetch({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
_self.render();
});
}
});
var WhiteListView = Backbone.View.extend({
tagName: 'tr',
initialize: function(options) {
this.options = options;
if (!this.template) {
this.template = _.template($('#tmpl-whitelist').html());
}
if (!this.scopeTemplate) {
this.scopeTemplate = _.template($('#tmpl-scope-list').html());
}
if (!this.moreInfoTemplate) {
this.moreInfoTemplate = _.template($('#tmpl-client-more-info-block').html());
}
this.model.bind('change', this.render, this);
},
render: function(eventName) {
var json = {
whiteList: this.model.toJSON(),
client: this.options.client.toJSON()
};
this.$el.html(this.template(json));
$('.scope-list', this.el).html(this.scopeTemplate({
scopes: this.model.get('allowedScopes'),
systemScopes: this.options.systemScopeList
}));
$('.client-more-info-block', this.el).html(this.moreInfoTemplate({
client: this.options.client.toJSON()
}));
this.$('.dynamically-registered').tooltip({
title: $.t('common.dynamically-registered')
});
$(this.el).i18n();
return this;
},
events: {
'click .btn-edit': 'editWhitelist',
'click .btn-delete': 'deleteWhitelist',
'click .toggleMoreInformation': 'toggleMoreInformation'
},
editWhitelist: function(e) {
e.preventDefault();
app.navigate('admin/whitelist/' + this.model.get('id'), {
trigger: true
});
},
deleteWhitelist: function(e) {
e.preventDefault();
if (confirm($.t('whitelist.confirm'))) {
var _self = this;
this.model.destroy({
dataType: false,
processData: false,
success: function() {
_self.$el.fadeTo("fast", 0.00, function() { // fade
$(this).slideUp("fast", function() { // slide up
$(this).remove(); // then remove from the DOM
// check the placeholder in case it's empty now
_self.parentView.togglePlaceholder();
});
});
},
error: app.errorHandlerView.handleError()
});
_self.parentView.delegateEvents();
}
return false;
},
toggleMoreInformation: function(e) {
e.preventDefault();
if ($('.moreInformation', this.el).is(':visible')) {
// hide it
$('.moreInformation', this.el).hide('fast');
$('.toggleMoreInformation i', this.el).attr('class', 'icon-chevron-right');
$('.moreInformationContainer', this.el).removeClass('alert').removeClass('alert-info').addClass('muted');
} else {
// show it
$('.moreInformation', this.el).show('fast');
$('.toggleMoreInformation i', this.el).attr('class', 'icon-chevron-down');
$('.moreInformationContainer', this.el).addClass('alert').addClass('alert-info').removeClass('muted');
}
},
close: function() {
$(this.el).unbind();
$(this.el).empty();
}
});
var WhiteListFormView = Backbone.View.extend({
tagName: 'span',
initialize: function(options) {
this.options = options;
if (!this.template) {
this.template = _.template($('#tmpl-whitelist-form').html());
}
this.scopeCollection = new Backbone.Collection();
this.listWidgetViews = [];
},
load: function(callback) {
if (this.options.client) {
// we know what client we're dealing with already
if (this.model.isFetched && this.options.client.isFetched) {
callback();
return;
}
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('whitelist.whitelist') + ' ' + '' + $.t('common.clients') + ' ' + '' + $.t('common.scopes') + ' ');
$.when(this.model.fetchIfNeeded({
success: function(e) {
$('#loading-whitelist').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.client.fetchIfNeeded({
success: function(e) {
$('#loading-clients').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.systemScopeList.fetchIfNeeded({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
callback();
});
} else {
// we need to get the client information from the list
if (this.model.isFetched && this.options.clientList.isFetched && this.options.systemScopeList.isFetched) {
var client = this.options.clientList.getByClientId(this.model.get('clientId'));
this.options.client = client;
callback();
return;
}
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('whitelist.whitelist') + ' ' + '' + $.t('common.clients') + ' ' + '' + $.t('common.scopes') + ' ');
var _self = this;
$.when(this.model.fetchIfNeeded({
success: function(e) {
$('#loading-whitelist').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.clientList.fetchIfNeeded({
success: function(e) {
$('#loading-clients').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.systemScopeList.fetchIfNeeded({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
var client = _self.options.clientList.getByClientId(_self.model.get('clientId'));
_self.options.client = client;
$('#loadingbox').sheet('hide');
callback();
});
}
},
events: {
'click .btn-save': 'saveWhiteList',
'click .btn-cancel': 'cancelWhiteList',
},
saveWhiteList: function(e) {
e.preventDefault();
$('.control-group').removeClass('error');
// sync any leftover collection items
_.each(this.listWidgetViews, function(v) {
v.addItem($.Event('click'));
});
// process allowed scopes
var allowedScopes = this.scopeCollection.pluck("item");
this.model.set({
clientId: this.options.client.get('clientId')
}, {
silent: true
});
var valid = this.model.set({
allowedScopes: allowedScopes
});
if (valid) {
var _self = this;
this.model.save({}, {
success: function() {
app.whiteListList.add(_self.model);
app.navigate('admin/whitelists', {
trigger: true
});
},
error: app.errorHandlerView.handleError()
});
}
return false;
},
cancelWhiteList: function(e) {
e.preventDefault();
// TODO: figure out where we came from and go back there instead
if (this.model.get('id') == null) {
// if it's a new whitelist entry, go back to the client listing page
app.navigate('admin/clients', {
trigger: true
});
} else {
// if we're editing a whitelist, go back to the whitelists page
app.navigate('admin/whitelists', {
trigger: true
});
}
},
render: function(eventName) {
var json = {
whiteList: this.model.toJSON(),
client: this.options.client.toJSON()
};
this.$el.html(this.template(json));
this.listWidgetViews = [];
var _self = this;
// build and bind scopes
_.each(this.model.get("allowedScopes"), function(scope) {
_self.scopeCollection.add(new Backbone.Model({
item: scope
}));
});
var scopeView = new ListWidgetView({
placeholder: $.t('whitelist.whitelist-form.scope-placeholder'),
autocomplete: this.options.client.get("scope"),
helpBlockText: $.t('whitelist.whitelist-form.scope-help'),
collection: this.scopeCollection
});
$("#scope .controls", this.el).html(scopeView.render().el);
this.listWidgetViews.push(scopeView);
$(this.el).i18n();
return this;
}
});
ui.routes.push({
path: "admin/whitelists",
name: "whiteList",
callback: function() {
if (!isAdmin()) {
this.root();
return;
}
this.updateSidebar('admin/whitelists');
this.breadCrumbView.collection.reset();
this.breadCrumbView.collection.add([{
text: $.t('admin.home'),
href: ""
}, {
text: $.t('whitelist.manage'),
href: "manage/#admin/whitelists"
}]);
var view = new WhiteListListView({
model: this.whiteListList,
clientList: this.clientList,
systemScopeList: this.systemScopeList
});
view.load(function() {
$('#content').html(view.render().el);
view.delegateEvents();
setPageTitle($.t('whitelist.manage'));
});
}
});
ui.routes.push({
path: "admin/whitelist/new/:cid",
name: "newWhitelist",
callback: function(cid) {
if (!isAdmin()) {
this.root();
return;
}
this.breadCrumbView.collection.reset();
this.breadCrumbView.collection.add([{
text: $.t('admin.home'),
href: ""
}, {
text: $.t('whitelist.manage'),
href: "manage/#admin/whitelists"
}, {
text: $.t('whitelist.new'),
href: "manage/#admin/whitelist/new/" + cid
}]);
this.updateSidebar('admin/whitelists');
var whiteList = new WhiteListModel();
var client = this.clientList.get(cid);
if (!client) {
client = new ClientModel({
id: cid
});
}
var view = new WhiteListFormView({
model: whiteList,
client: client,
systemScopeList: this.systemScopeList
});
view.load(function() {
// set the scopes on the model now that everything's loaded
whiteList.set({
allowedScopes: client.get('scope')
}, {
silent: true
});
$('#content').html(view.render().el);
view.delegateEvents();
setPageTitle($.t('whitelist.manage'));
});
}
});
ui.routes.push({
path: "admin/whitelist/:id",
name: "editWhitelist",
callback: function(id) {
if (!isAdmin()) {
this.root();
return;
}
this.breadCrumbView.collection.reset();
this.breadCrumbView.collection.add([{
text: $.t('admin.home'),
href: ""
}, {
text: $.t('whitelist.manage'),
href: "manage/#admin/whitelists"
}, {
text: $.t('whitelist.edit'),
href: "manage/#admin/whitelist/" + id
}]);
this.updateSidebar('admin/whitelists');
var whiteList = this.whiteListList.get(id);
if (!whiteList) {
whiteList = new WhiteListModel({
id: id
});
}
var view = new WhiteListFormView({
model: whiteList,
clientList: this.clientList,
systemScopeList: this.systemScopeList
});
view.load(function() {
$('#content').html(view.render().el);
view.delegateEvents();
setPageTitle($.t('whitelist.manage'));
});
}
});
ui.templates.push('resources/template/whitelist.html');
ui.init.push(function(app) {
app.whiteListList = new WhiteListCollection();
});