webgme-engine
Version:
WebGME server and Client API without a GUI
429 lines (390 loc) • 17.5 kB
JavaScript
/*eslint-env node*/
/*eslint no-console: 0*/
/**
* NOTE: Expected to be run only under nodejs.
*
* @module Bin:UserManager
* @author kecso / https://github.com/kecso
* @author ksmyth / https://github.com/ksmyth
* @author lattmann / https://github.com/lattmann
*/
var webgme = require('../../index'),
Q = require('q'),
MongoURI = require('mongo-uri'),
GMEAuth = require('../server/middleware/auth/gmeauth'),
main,
path = require('path'),
gmeConfig = require(path.join(process.cwd(), 'config'));
webgme.addToRequireJsPaths(gmeConfig);
main = function (argv) {
'use strict';
var Command = require('commander').Command,
program = new Command(), // we need a new program (Command) instance every time when main is called.
auth,
mainDeferred = Q.defer(),
setupGMEAuth = function (databaseConnectionString, callback) {
if (databaseConnectionString) {
// this line throws a TypeError for invalid databaseConnectionString
MongoURI.parse(databaseConnectionString);
gmeConfig.mongo.uri = databaseConnectionString;
}
console.log(gmeConfig.mongo.uri);
auth = new GMEAuth(null, gmeConfig);
auth.connect(callback);
},
args = Array.prototype.slice.call(argv);
if (args.length === 2) {
args.push('--help');
}
program
.version('0.1.0')
.option('--db <database>', 'database connection string')
.on('--help', function () {
mainDeferred.resolve();
});
program
.command('useradd <username> <email> <password>')
.description('adds a new user')
.option('-c, --canCreate', 'user can create a new project', false)
.option('-s, --siteAdmin', 'make user site admin', false)
.action(function (username, email, password, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
// TODO: we may need to use a module like 'prompt' to get user password
if (username && email && password) {
auth.addUser(username, email, password, options.canCreate || false,
{overwrite: true, siteAdmin: options.siteAdmin || false})
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('username, email, and password parameters are required'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js useradd brubble brubble@example.com Password.123');
console.log(' $ node usermanager.js useradd --canCreate brubble brubble@example.com Password.123');
console.log();
});
program
.command('userlist [username]')
.option('-t, --generateToken', 'Generates a token for given username', false)
.option('-d, --disabled', 'list users that are disabled', false)
.description('lists all users or the specified user')
.action(function (username, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (username) {
auth.getUser(username, {disabled: undefined})
.then(function (userObject) {
if (options.generateToken) {
return auth.generateJWTokenForAuthenticatedUser(username);
} else {
// TODO: pretty print users
return userObject;
}
})
.then(function (output) {
console.log(output);
mainDeferred.resolve();
})
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
let query = {};
if (options.disabled) {
query = {disabled: {$eq: true}};
}
auth.listUsers(query)
.then(function (userObject) {
// TODO: pretty print users
console.log(userObject);
mainDeferred.resolve();
})
.catch(mainDeferred.reject)
.finally(auth.unload);
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js userlist');
console.log(' $ node usermanager.js userlist user23');
console.log();
});
program
.command('passwd <username> <password>')
.description('updates the user')
.action(function (username, password, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
// TODO: we may need to use a module like 'prompt' to get user password
if (username && password) {
auth.updateUser(username, {password: password})
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('username and password parameters are required'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js passwd brubble NewPass.123');
console.log();
});
program
.command('userdel <username>')
.description('deletes a user')
.option('-f, --force', 'removes the entry from the database', false)
.action(function (username, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (username) {
auth.deleteUser(username, options.force)
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('username parameter is missing'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js userdel brubble');
console.log(' $ node usermanager.js userdel brubble -f');
console.log();
});
program
.command('verify <username>')
.description('verifies a user')
.action(function (username, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (username) {
auth.reEnableUser(username)
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('username parameter is missing'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js verify misterX');
console.log();
});
program
.command('organizationadd <organizationname>')
.description('adds a new organization')
.action(function (organizationname, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (organizationname) {
auth.addOrganization(organizationname)
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('organizationname parameter is missing'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js organizationadd neworg');
console.log();
});
program
.command('organizationdel <organizationname>')
.description('deletes an existing organization')
.option('-f, --force', 'removes the entry from the database', false)
.action(function (organizationname, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (organizationname) {
auth.removeOrganizationByOrgId(organizationname, options.force)
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('organizationname parameter is missing'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js organizationdel sample_organization');
console.log();
});
var authUserOrGroup = function (id, projectname, options) {
var rights = {
read: options.authorize.indexOf('r') !== -1,
write: options.authorize.indexOf('w') !== -1,
delete: options.authorize.indexOf('d') !== -1
};
setupGMEAuth(options.parent.db, function (/*err*/) {
var projectAuthParams = {
entityType: auth.authorizer.ENTITY_TYPES.PROJECT,
};
if (options.deauthorize) {
// deauthorize
rights = {
read: false,
write: false,
delete: false
};
}
// authorize
auth.authorizer.setAccessRights(id, projectname, rights, projectAuthParams)
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
});
};
program
.command('usermod_auth <username> <projectname>')
.description('authorizes a user for a project')
.option('-a, --authorize <mode>', 'mode is rwd, read, write, delete', 'rwd')
.option('-d, --deauthorize', 'deauthorizes user', false)
.action(function (username, projectname, options) {
if (username && projectname) {
authUserOrGroup(username, projectname, options);
} else {
mainDeferred.reject(new SyntaxError('username and projectname parameter are missing'));
}
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js usermod_auth user23 project42');
console.log(' $ node usermanager.js usermod_auth --authorize r user23 project42');
console.log(' $ node usermanager.js usermod_auth --authorize rw user23 project42');
console.log(' $ node usermanager.js usermod_auth -a rw user23 project42');
console.log(' $ node usermanager.js usermod_auth --deauthorize user23 project42');
console.log(' $ node usermanager.js usermod_auth -d user23 project42');
console.log();
});
program
.command('orgmod_auth <orgname> <projectname>')
.description('authorizes an organization for a project')
.option('-a, --authorize <mode>', 'mode is rwd, read, write, delete', 'rwd')
.option('-d, --deauthorize', 'deauthorizes user', false)
.action(function (orgname, projectname, options) {
if (orgname && projectname) {
authUserOrGroup(orgname, projectname, options);
} else {
mainDeferred.reject(new SyntaxError('orgname and projectname parameter are missing'));
}
})
.on('--help', function () {
console.log(' Organizations are authorized like users are authorized. See also: usermod_auth');
});
program
.command('usermod_organization_add <username> <organizationname>')
.description('adds a user to an existing organization')
.option('-m, --makeAdmin', 'make user admin', false)
.action(function (username, organizationname, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (username && organizationname) {
auth.addUserToOrganization(username, organizationname)
.then(function () {
if (options.makeAdmin) {
return auth.setAdminForUserInOrganization(username, organizationname, true);
}
})
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('username and organizationname parameter are missing'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js usermod_organization_add user23 organization123');
console.log(' $ node usermanager.js usermod_organization_add --makeAdmin user23 organization123');
console.log();
});
program
.command('usermod_organization_del <username> <organizationname>')
.description('removes a user from an existing organization')
.action(function (username, organizationname, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (username && organizationname) {
auth.removeUserFromOrganization(username, organizationname)
.then(function () {
return auth.setAdminForUserInOrganization(username, organizationname, false);
})
.then(mainDeferred.resolve)
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
mainDeferred.reject(new SyntaxError('username and organizationname parameter are missing'));
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js usermod_organization_del user23 organization123');
console.log();
});
program
.command('organizationlist [organizationname]')
.description('lists all organizations or the specified organization')
.action(function (organizationname, options) {
setupGMEAuth(options.parent.db, function (/*err*/) {
if (organizationname) {
auth.getOrganization(organizationname)
.then(function (organObject) {
// TODO: pretty print organObject
console.log(organObject);
mainDeferred.resolve();
})
.catch(mainDeferred.reject)
.finally(auth.unload);
} else {
auth.listOrganizations(null)
.then(function (organObject) {
// TODO: pretty print organObject
console.log(organObject);
mainDeferred.resolve();
})
.catch(mainDeferred.reject)
.finally(auth.unload);
}
});
})
.on('--help', function () {
console.log(' Examples:');
console.log();
console.log(' $ node usermanager.js organizationlist');
console.log(' $ node usermanager.js organizationlist organ23');
console.log();
});
program.parse(args);
return mainDeferred.promise;
};
module.exports = {
main: main
};
if (require.main === module) {
main(process.argv)
.then(function () {
'use strict';
console.log('Done');
})
.catch(function (err) {
'use strict';
console.error('ERROR : ' + err);
});
}