setup.js 3.9 KB

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