cd1404d48ded2383b2153b21a7a27741a6411a2a
[oweals/peertube.git] / server / initializers / installer.ts
1 import { join } from 'path'
2 import config = require('config')
3 import { each, series } from 'async'
4 import mkdirp = require('mkdirp')
5 import passwordGenerator = require('password-generator')
6
7 const db = require('./database')
8 import { USER_ROLES, CONFIG, LAST_MIGRATION_VERSION } from './constants'
9 import { clientsExist, usersExist } from './checker'
10 import { logger, createCertsIfNotExist } from '../helpers'
11
12 function installApplication (callback) {
13   series([
14     function createDatabase (callbackAsync) {
15       db.sequelize.sync().asCallback(callbackAsync)
16       // db.sequelize.sync({ force: true }).asCallback(callbackAsync)
17     },
18
19     function createDirectories (callbackAsync) {
20       createDirectoriesIfNotExist(callbackAsync)
21     },
22
23     function createCertificates (callbackAsync) {
24       createCertsIfNotExist(callbackAsync)
25     },
26
27     function createOAuthClient (callbackAsync) {
28       createOAuthClientIfNotExist(callbackAsync)
29     },
30
31     function createOAuthUser (callbackAsync) {
32       createOAuthAdminIfNotExist(callbackAsync)
33     }
34   ], callback)
35 }
36
37 // ---------------------------------------------------------------------------
38
39 export {
40   installApplication
41 }
42
43 // ---------------------------------------------------------------------------
44
45 function createDirectoriesIfNotExist (callback) {
46   const storages = config.get('storage')
47
48   each(Object.keys(storages), function (key, callbackEach) {
49     const dir = storages[key]
50     mkdirp(join(__dirname, '..', '..', dir), callbackEach)
51   }, callback)
52 }
53
54 function createOAuthClientIfNotExist (callback) {
55   clientsExist(function (err, exist) {
56     if (err) return callback(err)
57
58     // Nothing to do, clients already exist
59     if (exist === true) return callback(null)
60
61     logger.info('Creating a default OAuth Client.')
62
63     const id = passwordGenerator(32, false, /[a-z0-9]/)
64     const secret = passwordGenerator(32, false, /[a-zA-Z0-9]/)
65     const client = db.OAuthClient.build({
66       clientId: id,
67       clientSecret: secret,
68       grants: [ 'password', 'refresh_token' ]
69     })
70
71     client.save().asCallback(function (err, createdClient) {
72       if (err) return callback(err)
73
74       logger.info('Client id: ' + createdClient.clientId)
75       logger.info('Client secret: ' + createdClient.clientSecret)
76
77       return callback(null)
78     })
79   })
80 }
81
82 function createOAuthAdminIfNotExist (callback) {
83   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     const role = USER_ROLES.ADMIN
93     const email = CONFIG.ADMIN.EMAIL
94     const createOptions: { validate?: boolean } = {}
95     let password = ''
96
97     // Do not generate a random password for tests
98     if (process.env.NODE_ENV === 'test') {
99       password = 'test'
100
101       if (process.env.NODE_APP_INSTANCE) {
102         password += process.env.NODE_APP_INSTANCE
103       }
104
105       // Our password is weak so do not validate it
106       createOptions.validate = false
107     } else {
108       password = passwordGenerator(8, true)
109     }
110
111     const userData = {
112       username,
113       email,
114       password,
115       role
116     }
117
118     db.User.create(userData, createOptions).asCallback(function (err, createdUser) {
119       if (err) return callback(err)
120
121       logger.info('Username: ' + username)
122       logger.info('User password: ' + password)
123
124       logger.info('Creating Application table.')
125       db.Application.create({ migrationVersion: LAST_MIGRATION_VERSION }).asCallback(callback)
126     })
127   })
128 }