Added authentication to deployment page

This commit is contained in:
Dallon Feldner
2012-11-28 12:01:37 -07:00
parent beb6104d1c
commit 1941e97643
5 changed files with 145 additions and 12 deletions

View File

@@ -5,7 +5,8 @@ var path = require('path')
, tar = require('tar')
, zlib = require('zlib')
, request = require('request')
, fs = require('fs');
, fs = require('fs')
, q = require('q');
/**
* deploy all files to a remote testing instance
@@ -13,6 +14,9 @@ var path = require('path')
function Deployment(appPath, user, subdomain) {
var remote = this.remote = 'deploydapp.com';
this.api = "http://api.deploydapp.com:3000";
this.path = path.resolve(appPath);
if(!subdomain) {
@@ -140,6 +144,10 @@ Deployment.prototype.setConfig = function(key, val) {
cur[key] = val;
fs.writeFileSync(this.path + '/.dpd/deployments.json', JSON.stringify(cur, null, ' '));
delete require.cache[path.resolve(this.path + '/.dpd/deployments.json')];
console.log();
console.log("Saved ", key, val);
};
Deployment.prototype.authenticate = function (credentials, fn) {
@@ -152,12 +160,12 @@ Deployment.prototype.authenticate = function (credentials, fn) {
if(credentials) {
var options = {
url: 'http://api.deploydapp.com:3000/users/login',
url: deployment.api + '/users/login',
json: credentials,
method: 'POST'
};
request(options, function (err, res, session) {
if(err) return fn(err);
if(err) return fn(false);
var sid = session && session.id;
if(sid) {
@@ -181,4 +189,59 @@ Deployment.prototype.authenticate = function (credentials, fn) {
fn(false);
}
}
};
Deployment.prototype.getOnlineDeployments = function(fn) {
var deployment = this;
var sid = deployment.getConfig('sid');
console.log('sid', sid);
request.cookie('sid', sid);
var meIdQ = q.fcall(function() {
var d = q.defer();
request({
url: deployment.api + "/users/me",
headers: {
'Accept': 'application/json'
}
}, function(err, res, user) {
if (err) return d.reject(err);
if (!user) return d.reject(new Error("Not logged in"));
d.resolve(user.id);
});
return d.promise;
});
var deploymentsQ = meIdQ.then(function(meId) {
var d = q.defer();
request({
url: deployment.api + "/apps",
qs: {owner: meId},
headers: {
'Accept': 'application/json'
}
}, function(err, res, deployments) {
if (err) return d.reject(err);
if (typeof deployments === 'string') {
deployments = JSON.parse(deployments);
}
d.resolve(deployments);
});
return d.promise;
});
deploymentsQ.then(function(deployments) {
fn(null, deployments);
}, function(err) {
fn(err);
});
};

View File

@@ -23,7 +23,7 @@
</button>
<br />
<select id="existing-deployment-dropdown" class="empty">
<select id="existing-deployment-dropdown" class="empty hide">
<option>or add an existing deployment...</option>
<option>my-awesome-app-demo</option>
<option>diamond-shovel</option>
@@ -38,7 +38,8 @@
<h3>Log into Deployd.com</h3>
</div>
<div class="modal-body">
<p>Log in to your <a href="http://deployapp.com">deploydapp.com</a> account or <a href="http://deploy.deployapp.com/">register</a> if you don't already have one.</p>
<div class="alert alert-error hide" id="auth-error">Invalid email or password</div>
<p>Log in to your <a href="http://deploydapp.com">deploydapp.com</a> account or <a href="http://deploydapp.com/">register</a> if you don't already have one.</p>
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="inputEmail">Email</label>

View File

@@ -2,6 +2,7 @@
var scope = {
deployments: null
, onlineDeployments: null
, checkedAuthentication: false
, isAuthenticated: false
};
@@ -15,9 +16,11 @@
});
loadDeployments();
checkAuthentication();
loadOnlineDeployments();
// checkAuthentication();
$('#deployment-list').on('click', '.component-item', onClickDeployment);
$('#deployAuthModal .login-btn').click(onClickLogin);
function loadDeployments() {
dpdDeployments.get(function(deployments, error) {
@@ -26,15 +29,23 @@
});
}
function loadOnlineDeployments() {
dpdDeployments.get('online', function(deployments, error) {
scope.checkedAuthentication = true;
scope.isAuthenticated = !error;
showLogin(true);
scope.onlineDeployments = deployments;
renderOnlineDeployments();
});
}
function checkAuthentication() {
dpdDeployments.post('authenticate', {}, function(res, err) {
scope.isAuthenticated = !err;
scope.checkedAuthentication = true;
if (scope.isAuthenticated) {
$('#deployments').show();
} else {
$modal.modal('show');
}
showLogin();
});
}
@@ -44,6 +55,38 @@
location.href = href;
}
function onClickLogin() {
var email = $('#deployAuthModal #inputEmail').val()
, password = $('#deployAuthModal #inputPassword').val();
$('#auth-error').hide();
dpdDeployments.post('authenticate', {
username: email,
password: password
}, function(res, err) {
scope.isAuthenticated = !err;
showLogin(true);
loadOnlineDeployments();
});
}
function showLogin(error) {
if (scope.isAuthenticated) {
$modal.modal('hide');
$('#deployments').show();
} else {
$modal.modal('show');
$('#deployments').hide();
if (error) {
$('#auth-error').show();
} else {
$('#auth-error').hide();
}
}
}
function renderDeployments() {
if (scope.deployments === null || scope.deployments.length) {
$('#deployments-empty').hide();
@@ -62,4 +105,18 @@
}
}
function renderOnlineDeployments() {
var $dropdown = $('#existing-deployment-dropdown');
if (scope.onlineDeployments && scope.onlineDeployments.length) {
$dropdown.show().empty();
$dropdown.append("<option>or add an existing deployment...</option>");
console.log(scope.onlineDeployments, scope.onlineDeployments.length);
scope.onlineDeployments.forEach(function(o) {
$dropdown.append("<option>" + o.name + "</option>");
});
} else {
$dropdown.hide();
}
}
})();

View File

@@ -23,6 +23,8 @@ InternalDeployments.prototype.handle = function(ctx, next) {
this.getList(ctx, next);
} else if (ctx.method === "POST" && ctx.url === "/authenticate") {
this.authenticate(ctx, next);
} else if (ctx.method === "GET" && ctx.url === '/online') {
this.getOnline(ctx, next);
} else {
next();
}
@@ -63,6 +65,15 @@ InternalDeployments.prototype.getList = function(ctx, next) {
};
InternalDeployments.prototype.getOnline = function(ctx, next) {
var d = new Deployment('.', null, '');
d.getOnlineDeployments(function(err, deployments) {
console.log(err, deployments);
ctx.done(err, deployments);
});
};
InternalDeployments.prototype.authenticate = function(ctx, next) {
var d = new Deployment('.', null, '');

View File

@@ -38,7 +38,8 @@ var excludedTypes = {
Dashboard: 1,
Files: 1,
ClientLib: 1,
InternalResources: 1
InternalResources: 1,
InternalDeployments: 1
};
InternalResources.prototype.handle = function(ctx, next) {