setup.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. const fs = require('fs');
  2. const NodeRSA = require('node-rsa');
  3. const config = require('config');
  4. const logger = require('./logger').setup;
  5. const userModel = require('./models/user');
  6. const userPermissionModel = require('./models/user_permission');
  7. const authModel = require('./models/auth');
  8. const settingModel = require('./models/setting');
  9. const debug_mode = process.env.NODE_ENV !== 'production' || !!process.env.DEBUG;
  10. /**
  11. * Creates a new JWT RSA Keypair if not alread set on the config
  12. *
  13. * @returns {Promise}
  14. */
  15. const setupJwt = () => {
  16. return new Promise((resolve, reject) => {
  17. // Now go and check if the jwt gpg keys have been created and if not, create them
  18. if (!config.has('jwt') || !config.has('jwt.key') || !config.has('jwt.pub')) {
  19. logger.info('Creating a new JWT key pair...');
  20. // jwt keys are not configured properly
  21. const filename = config.util.getEnv('NODE_CONFIG_DIR') + '/' + (config.util.getEnv('NODE_ENV') || 'default') + '.json';
  22. let config_data = {};
  23. try {
  24. config_data = require(filename);
  25. } catch (err) {
  26. // do nothing
  27. if (debug_mode) {
  28. logger.debug(filename + ' config file could not be required');
  29. }
  30. }
  31. // Now create the keys and save them in the config.
  32. let key = new NodeRSA({ b: 2048 });
  33. key.generateKeyPair();
  34. config_data.jwt = {
  35. key: key.exportKey('private').toString(),
  36. pub: key.exportKey('public').toString(),
  37. };
  38. // Write config
  39. fs.writeFile(filename, JSON.stringify(config_data, null, 2), (err) => {
  40. if (err) {
  41. logger.error('Could not write JWT key pair to config file: ' + filename);
  42. reject(err);
  43. } else {
  44. logger.info('Wrote JWT key pair to config file: ' + filename);
  45. logger.warn('Restarting interface to apply new configuration');
  46. process.exit(0);
  47. }
  48. });
  49. } else {
  50. // JWT key pair exists
  51. if (debug_mode) {
  52. logger.debug('JWT Keypair already exists');
  53. }
  54. resolve();
  55. }
  56. });
  57. };
  58. /**
  59. * Creates a default admin users if one doesn't already exist in the database
  60. *
  61. * @returns {Promise}
  62. */
  63. const setupDefaultUser = () => {
  64. return userModel
  65. .query()
  66. .select(userModel.raw('COUNT(`id`) as `count`'))
  67. .where('is_deleted', 0)
  68. .first()
  69. .then((row) => {
  70. if (!row.count) {
  71. // Create a new user and set password
  72. logger.info('Creating a new user: [email protected] with password: changeme');
  73. let data = {
  74. is_deleted: 0,
  75. email: '[email protected]',
  76. name: 'Administrator',
  77. nickname: 'Admin',
  78. avatar: '',
  79. roles: ['admin'],
  80. };
  81. return userModel
  82. .query()
  83. .insertAndFetch(data)
  84. .then((user) => {
  85. return authModel
  86. .query()
  87. .insert({
  88. user_id: user.id,
  89. type: 'password',
  90. secret: 'changeme',
  91. meta: {},
  92. })
  93. .then(() => {
  94. return userPermissionModel.query().insert({
  95. user_id: user.id,
  96. visibility: 'all',
  97. proxy_hosts: 'manage',
  98. redirection_hosts: 'manage',
  99. dead_hosts: 'manage',
  100. streams: 'manage',
  101. access_lists: 'manage',
  102. certificates: 'manage',
  103. });
  104. });
  105. })
  106. .then(() => {
  107. logger.info('Initial admin setup completed');
  108. });
  109. } else if (debug_mode) {
  110. logger.debug('Admin user setup not required');
  111. }
  112. });
  113. };
  114. /**
  115. * Creates default settings if they don't already exist in the database
  116. *
  117. * @returns {Promise}
  118. */
  119. const setupDefaultSettings = () => {
  120. return settingModel
  121. .query()
  122. .select(settingModel.raw('COUNT(`id`) as `count`'))
  123. .where({id: 'default-site'})
  124. .first()
  125. .then((row) => {
  126. if (!row.count) {
  127. settingModel
  128. .query()
  129. .insert({
  130. id: 'default-site',
  131. name: 'Default Site',
  132. description: 'What to show when Nginx is hit with an unknown Host',
  133. value: 'congratulations',
  134. meta: {},
  135. })
  136. .then(() => {
  137. logger.info('Default settings added');
  138. });
  139. }
  140. if (debug_mode) {
  141. logger.debug('Default setting setup not required');
  142. }
  143. });
  144. };
  145. module.exports = function () {
  146. return setupJwt()
  147. .then(setupDefaultUser)
  148. .then(setupDefaultSettings);
  149. };