OAuth/User models refractoring -> use mongoose api
[oweals/peertube.git] / server / initializers / installer.js
1 'use strict'
2
3 const async = require('async')
4 const config = require('config')
5 const mkdirp = require('mkdirp')
6 const mongoose = require('mongoose')
7 const passwordGenerator = require('password-generator')
8 const path = require('path')
9
10 const checker = require('./checker')
11 const logger = require('../helpers/logger')
12 const peertubeCrypto = require('../helpers/peertubeCrypto')
13
14 const Client = mongoose.model('OAuthClient')
15 const User = mongoose.model('User')
16
17 const installer = {
18   installApplication: installApplication
19 }
20
21 function installApplication (callback) {
22   async.series([
23     function createDirectories (callbackAsync) {
24       createDirectoriesIfNotExist(callbackAsync)
25     },
26
27     function createCertificates (callbackAsync) {
28       peertubeCrypto.createCertsIfNotExist(callbackAsync)
29     },
30
31     function createOAuthClient (callbackAsync) {
32       createOAuthClientIfNotExist(callbackAsync)
33     },
34
35     function createOAuthUser (callbackAsync) {
36       createOAuthUserIfNotExist(callbackAsync)
37     }
38   ], callback)
39 }
40
41 // ---------------------------------------------------------------------------
42
43 module.exports = installer
44
45 // ---------------------------------------------------------------------------
46
47 function createDirectoriesIfNotExist (callback) {
48   const storages = config.get('storage')
49
50   async.each(Object.keys(storages), function (key, callbackEach) {
51     const dir = storages[key]
52     mkdirp(path.join(__dirname, '..', '..', dir), callbackEach)
53   }, callback)
54 }
55
56 function createOAuthClientIfNotExist (callback) {
57   checker.clientsExist(function (err, exist) {
58     if (err) return callback(err)
59
60     // Nothing to do, clients already exist
61     if (exist === true) return callback(null)
62
63     logger.info('Creating a default OAuth Client.')
64
65     const secret = passwordGenerator(32, false)
66     const client = new Client({
67       clientSecret: secret,
68       grants: [ 'password' ]
69     })
70
71     client.save(function (err, createdClient) {
72       if (err) return callback(err)
73
74       logger.info('Client id: ' + createdClient._id)
75       logger.info('Client secret: ' + createdClient.clientSecret)
76
77       return callback(null)
78     })
79   })
80 }
81
82 function createOAuthUserIfNotExist (callback) {
83   checker.usersExist(function (err, exist) {
84     if (err) return callback(err)
85
86     // Nothing to do, users already exist
87     if (exist === true) return callback(null)
88
89     logger.info('Creating the administrator.')
90
91     const username = 'root'
92     let password = ''
93
94     // Do not generate a random password for tests
95     if (process.env.NODE_ENV === 'test') {
96       password = 'test'
97
98       if (process.env.NODE_APP_INSTANCE) {
99         password += process.env.NODE_APP_INSTANCE
100       }
101     } else {
102       password = passwordGenerator(8, true)
103     }
104
105     const user = new User({
106       username: username,
107       password: password
108     })
109
110     user.save(function (err, createdUser) {
111       if (err) return callback(err)
112
113       logger.info('Username: ' + createdUser.username)
114       logger.info('User password: ' + createdUser.password)
115
116       return callback(null)
117     })
118   })
119 }