2f9b589916b9bc6e28c0f50b945639f70cd31656
[oweals/peertube.git] / server / initializers / installer.ts
1 import { join } from 'path'
2 import * as config from 'config'
3 import { each, series } from 'async'
4 import * as mkdirp from 'mkdirp'
5 import * as passwordGenerator from 'password-generator'
6
7 import { database as db } from './database'
8 import { USER_ROLES, CONFIG, LAST_MIGRATION_VERSION } from './constants'
9 import { clientsExist, usersExist } from './checker'
10 import { logger, createCertsIfNotExist, root } 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(root(), 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       redirectUris: null
70     })
71
72     client.save().asCallback(function (err, createdClient) {
73       if (err) return callback(err)
74
75       logger.info('Client id: ' + createdClient.clientId)
76       logger.info('Client secret: ' + createdClient.clientSecret)
77
78       return callback(null)
79     })
80   })
81 }
82
83 function createOAuthAdminIfNotExist (callback) {
84   usersExist(function (err, exist) {
85     if (err) return callback(err)
86
87     // Nothing to do, users already exist
88     if (exist === true) return callback(null)
89
90     logger.info('Creating the administrator.')
91
92     const username = 'root'
93     const role = USER_ROLES.ADMIN
94     const email = CONFIG.ADMIN.EMAIL
95     const createOptions: { validate?: boolean } = {}
96     let password = ''
97
98     // Do not generate a random password for tests
99     if (process.env.NODE_ENV === 'test') {
100       password = 'test'
101
102       if (process.env.NODE_APP_INSTANCE) {
103         password += process.env.NODE_APP_INSTANCE
104       }
105
106       // Our password is weak so do not validate it
107       createOptions.validate = false
108     } else {
109       password = passwordGenerator(8, true)
110     }
111
112     const userData = {
113       username,
114       email,
115       password,
116       role
117     }
118
119     db.User.create(userData, createOptions).asCallback(function (err, createdUser) {
120       if (err) return callback(err)
121
122       logger.info('Username: ' + username)
123       logger.info('User password: ' + password)
124
125       logger.info('Creating Application table.')
126       db.Application.create({ migrationVersion: LAST_MIGRATION_VERSION }).asCallback(callback)
127     })
128   })
129 }