blob: 321d3026d4fba909f5b7b1caf72efc67026a9a5d [file] [log] [blame]
// 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.
define([
"app",
"api",
"core/CouchdbSession"
],
function (app, FauxtonAPI, CouchdbSession) {
var Auth = new FauxtonAPI.addon();
var Admin = Backbone.Model.extend({
url: function () {
return app.host + '/_config/admins/' + this.get("name");
},
isNew: function () { return false; },
sync: function (method, model, options) {
var params = {
url: model.url(),
contentType: 'application/json',
dataType: 'json',
data: JSON.stringify(model.get('value'))
};
if (method === 'delete') {
params.type = 'DELETE';
} else {
params.type = 'PUT';
}
return $.ajax(params);
}
});
Auth.Session = CouchdbSession.Session.extend({
url: app.host + '/_session',
initialize: function (options) {
if (!options) { options = {}; }
this.messages = _.extend({}, {
missingCredentials: 'Username or password cannot be blank.',
passwordsNotMatch: 'Passwords do not match.',
incorrectCredentials: 'Incorrect username or password.',
loggedIn: 'You have been logged in.',
adminCreated: 'Couchdb admin created',
changePassword: 'Your password has been updated.'
}, options.messages);
},
isAdminParty: function () {
var userCtx = this.get('userCtx');
if (!userCtx.name && userCtx.roles.indexOf("_admin") > -1) {
return true;
}
return false;
},
isLoggedIn: function () {
var userCtx = this.get('userCtx');
if (userCtx.name) {
return true;
}
return false;
},
userRoles: function () {
var user = this.user();
if (user && user.roles) {
return user.roles;
}
return [];
},
matchesRoles: function (roles) {
if (roles.length === 0) {
return true;
}
var numberMatchingRoles = _.intersection(this.userRoles(), roles).length;
if (numberMatchingRoles > 0) {
return true;
}
return false;
},
validateUser: function (username, password, msg) {
if (_.isEmpty(username) || _.isEmpty(password)) {
var deferred = FauxtonAPI.Deferred();
deferred.rejectWith(this, [msg]);
return deferred;
}
},
validatePasswords: function (password, password_confirm, msg) {
if (_.isEmpty(password) || _.isEmpty(password_confirm) || (password !== password_confirm)) {
var deferred = FauxtonAPI.Deferred();
deferred.rejectWith(this, [msg]);
return deferred;
}
},
createAdmin: function (username, password, login) {
var that = this,
error_promise = this.validateUser(username, password, this.messages.missingCredentials);
if (error_promise) { return error_promise; }
var admin = new Admin({
name: username,
value: password
});
return admin.save().then(function () {
if (login) {
return that.login(username, password);
} else {
return that.fetchUser({forceFetch: true});
}
});
},
login: function (username, password) {
var error_promise = this.validateUser(username, password, this.messages.missingCredentials);
if (error_promise) { return error_promise; }
var that = this;
return $.ajax({
cache: false,
type: "POST",
url: app.host + "/_session",
dataType: "json",
data: {name: username, password: password}
}).then(function () {
return that.fetchUser({forceFetch: true});
});
},
logout: function () {
var that = this;
return $.ajax({
type: "DELETE",
url: app.host + "/_session",
dataType: "json",
username : "_",
password : "_"
}).then(function () {
return that.fetchUser({forceFetch: true });
});
},
changePassword: function (password, password_confirm) {
var error_promise = this.validatePasswords(password, password_confirm, this.messages.passwordsNotMatch);
if (error_promise) { return error_promise; }
var that = this,
info = this.get('info'),
userCtx = this.get('userCtx');
var admin = new Admin({
name: userCtx.name,
value: password
});
return admin.save().then(function () {
return that.login(userCtx.name, password);
});
}
});
Auth.CreateAdminView = FauxtonAPI.View.extend({
template: 'addons/auth/templates/create_admin',
initialize: function (options) {
options = options || {};
this.login_after = options.login_after === false ? false : true;
},
events: {
"submit #create-admin-form": "createAdmin"
},
createAdmin: function (event) {
event.preventDefault();
var that = this,
username = this.$('#username').val(),
password = this.$('#password').val();
var promise = this.model.createAdmin(username, password, this.login_after);
promise.then(function () {
FauxtonAPI.addNotification({
msg: FauxtonAPI.session.messages.adminCreated,
});
if (that.login_after) {
FauxtonAPI.navigate('/');
} else {
that.$('#username').val('');
that.$('#password').val('');
}
});
promise.fail(function (rsp) {
FauxtonAPI.addNotification({
msg: 'Could not create admin. Reason' + rsp + '.',
type: 'error'
});
});
}
});
Auth.LoginView = FauxtonAPI.View.extend({
template: 'addons/auth/templates/login',
events: {
"submit #login": "login"
},
login: function (event) {
event.preventDefault();
var that = this,
username = this.$('#username').val(),
password = this.$('#password').val(),
promise = this.model.login(username, password);
promise.then(function () {
FauxtonAPI.addNotification({msg: FauxtonAPI.session.messages.loggedIn });
FauxtonAPI.navigate('/');
});
promise.fail(function (xhr, type, msg) {
if (arguments.length === 3) {
msg = FauxtonAPI.session.messages.incorrectCredentials;
} else {
msg = xhr;
}
FauxtonAPI.addNotification({
msg: msg,
type: 'error'
});
});
}
});
Auth.ChangePassword = FauxtonAPI.View.extend({
template: 'addons/auth/templates/change_password',
events: {
"submit #change-password": "changePassword"
},
changePassword: function () {
event.preventDefault();
var that = this,
new_password = this.$('#password').val(),
password_confirm = this.$('#password-confirm').val();
var promise = this.model.changePassword(new_password, password_confirm);
promise.done(function () {
FauxtonAPI.addNotification({msg: FauxtonAPI.session.messages.changePassword});
that.$('#password').val('');
that.$('#password-confirm').val('');
});
promise.fail(function (xhr, error, msg) {
if (arguments.length < 3) {
msg = xhr;
}
FauxtonAPI.addNotification({
msg: xhr,
type: 'error'
});
});
}
});
Auth.NavLink = FauxtonAPI.View.extend({
template: 'addons/auth/templates/nav_link_title',
tagName: 'li',
beforeRender: function () {
this.listenTo(this.model, 'change', this.render);
},
serialize: function () {
return {
admin_party: this.model.isAdminParty(),
user: this.model.user()
};
}
});
Auth.NavDropDown = FauxtonAPI.View.extend({
template: 'addons/auth/templates/nav_dropdown',
beforeRender: function () {
this.listenTo(this.model, 'change', this.render);
},
setTab: function (selectedTab) {
this.selectedTab = selectedTab;
this.$('.active').removeClass('active');
var $tab = this.$('a[data-select="' + selectedTab +'"]');
$tab.parent().addClass('active');
},
afterRender: function () {
if (this.selectedTab) {
this.setTab(this.selectedTab);
}
},
serialize: function () {
return {
admin_party: this.model.isAdminParty(),
user: this.model.user()
};
}
});
Auth.NoAccessView = FauxtonAPI.View.extend({
template: "addons/auth/templates/noAccess"
});
return Auth;
});