From 37dc07b292ae4b24011a99146150869bb9c17c65 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 21 Mar 2016 21:11:26 +0100 Subject: [PATCH] Create an "installer" module that create defaults clients/users... --- server.js | 14 +---- server/initializers/checker.js | 31 ++++++----- server/initializers/installer.js | 94 ++++++++++++++++++++++++++++++++ server/models/users.js | 10 ++++ 4 files changed, 123 insertions(+), 26 deletions(-) create mode 100644 server/initializers/installer.js diff --git a/server.js b/server.js index f9925eb24..b748a0242 100644 --- a/server.js +++ b/server.js @@ -21,15 +21,13 @@ if (miss.length !== 0) { throw new Error('Miss some configurations keys : ' + miss) } -checker.createDirectoriesIfNotExist() - // ----------- PeerTube modules ----------- var config = require('config') var constants = require('./server/initializers/constants') var customValidators = require('./server/helpers/customValidators') var database = require('./server/initializers/database') +var installer = require('./server/initializers/installer') var logger = require('./server/helpers/logger') -var peertubeCrypto = require('./server/helpers/peertubeCrypto') var poolRequests = require('./server/lib/poolRequests') var routes = require('./server/controllers') var utils = require('./server/helpers/utils') @@ -119,17 +117,9 @@ app.use(function (err, req, res, next) { res.sendStatus(err.status || 500) }) -// TODO: move into initializer -require('./server/models/users').createClient('coucou', [ 'password' ], function (err, id) { +installer.installApplication(function (err) { if (err) throw err - logger.info('Client id: ' + id) - require('./server/models/users').createUser('floflo', 'coucou', function () {}) -}) - -// ----------- Create the certificates if they don't already exist ----------- -peertubeCrypto.createCertsIfNotExist(function (err) { - if (err) throw err // Create/activate the webtorrent module webtorrent.create(function () { function cleanForExit () { diff --git a/server/initializers/checker.js b/server/initializers/checker.js index a21e54982..cb62fabf4 100644 --- a/server/initializers/checker.js +++ b/server/initializers/checker.js @@ -1,12 +1,13 @@ 'use strict' const config = require('config') -const mkdirp = require('mkdirp') -const path = require('path') + +const Users = require('../models/users') const checker = { checkConfig: checkConfig, - createDirectoriesIfNotExist: createDirectoriesIfNotExist + clientsExist: clientsExist, + usersExist: usersExist } // Check the config files @@ -27,18 +28,20 @@ function checkConfig () { return miss } -// Create directories for the storage if it doesn't exist -function createDirectoriesIfNotExist () { - const storages = config.get('storage') +function clientsExist (callback) { + Users.getClients(function (err, clients) { + if (err) return callback(err) - for (const key of Object.keys(storages)) { - const dir = storages[key] - try { - mkdirp.sync(path.join(__dirname, '..', '..', dir)) - } catch (error) { - throw new Error('Cannot create ' + path + ':' + error) - } - } + return callback(null, clients.length !== 0) + }) +} + +function usersExist (callback) { + Users.getUsers(function (err, users) { + if (err) return callback(err) + + return callback(null, users.length !== 0) + }) } // --------------------------------------------------------------------------- diff --git a/server/initializers/installer.js b/server/initializers/installer.js new file mode 100644 index 000000000..750eb2c59 --- /dev/null +++ b/server/initializers/installer.js @@ -0,0 +1,94 @@ +'use strict' + +const async = require('async') +const config = require('config') +const mkdirp = require('mkdirp') +const path = require('path') + +const checker = require('./checker') +const logger = require('../helpers/logger') +const peertubeCrypto = require('../helpers/peertubeCrypto') +const Users = require('../models/users') + +const installer = { + installApplication: installApplication +} + +function installApplication (callback) { + // Creates directories + createDirectoriesIfNotExist(function (err) { + if (err) return callback(err) + + // ----------- Create the certificates if they don't already exist ----------- + peertubeCrypto.createCertsIfNotExist(function (err) { + if (err) return callback(err) + + createOAuthClientIfNotExist(function (err) { + if (err) return callback(err) + + createOAuthUserIfNotExist(callback) + }) + }) + }) +} + +// --------------------------------------------------------------------------- + +module.exports = installer + +// --------------------------------------------------------------------------- + +function createDirectoriesIfNotExist (callback) { + const storages = config.get('storage') + + async.each(Object.keys(storages), function (key, callbackEach) { + const dir = storages[key] + mkdirp(path.join(__dirname, '..', '..', dir), callbackEach) + }, callback) +} + +function createOAuthClientIfNotExist (callback) { + checker.clientsExist(function (err, exist) { + if (err) return callback(err) + + // Nothing to do, clients already exist + if (exist === true) return callback(null) + + logger.info('Creating a default OAuth Client.') + + // TODO: generate password + const password = 'megustalabanana' + Users.createClient(password, [ 'password' ], function (err, id) { + if (err) return callback(err) + + logger.info('Client id: ' + id) + logger.info('Client password: ' + password) + + return callback(null) + }) + }) +} + +function createOAuthUserIfNotExist (callback) { + checker.usersExist(function (err, exist) { + if (err) return callback(err) + + // Nothing to do, users already exist + if (exist === true) return callback(null) + + logger.info('Creating the administrator.') + + // TODO: generate password + const username = 'admin' + const password = 'nomegustalabanana' + + Users.createUser(username, password, function (err) { + if (err) return callback(err) + + logger.info('Username: ' + username) + logger.info('User password: ' + password) + + return callback(null) + }) + }) +} diff --git a/server/models/users.js b/server/models/users.js index 355d991bd..367c206ab 100644 --- a/server/models/users.js +++ b/server/models/users.js @@ -34,8 +34,10 @@ const Users = { createUser: createUser, getAccessToken: getAccessToken, getClient: getClient, + getClients: getClients, getRefreshToken: getRefreshToken, getUser: getUser, + getUsers: getUsers, saveToken: saveToken } @@ -70,6 +72,10 @@ function getClient (clientId, clientSecret) { return OAuthClientsDB.findOne({ _id: mongo_id, clientSecret: clientSecret }) } +function getClients (callback) { + return OAuthClientsDB.find(callback) +} + function getRefreshToken (refreshToken) { logger.debug('Getting RefreshToken (refreshToken: ' + refreshToken + ').') @@ -81,6 +87,10 @@ function getUser (username, password) { return UsersDB.findOne({ username: username, password: password }) } +function getUsers (callback) { + return UsersDB.find(callback) +} + function saveToken (token, client, user) { logger.debug('Saving token for client ' + client.id + ' and user ' + user.id + '.')