config.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. const fs = require('fs');
  2. const NodeRSA = require('node-rsa');
  3. const logger = require('../logger').global;
  4. const keysFile = '/data/keys.json';
  5. let instance = null;
  6. // 1. Load from config file first (not recommended anymore)
  7. // 2. Use config env variables next
  8. const configure = () => {
  9. const filename = (process.env.NODE_CONFIG_DIR || './config') + '/' + (process.env.NODE_ENV || 'default') + '.json';
  10. if (fs.existsSync(filename)) {
  11. let configData;
  12. try {
  13. configData = require(filename);
  14. } catch (err) {
  15. // do nothing
  16. }
  17. if (configData && configData.database) {
  18. logger.info(`Using configuration from file: ${filename}`);
  19. instance = configData;
  20. return;
  21. }
  22. }
  23. const envMysqlHost = process.env.DB_MYSQL_HOST || null;
  24. const envMysqlUser = process.env.DB_MYSQL_USER || null;
  25. const envMysqlName = process.env.DB_MYSQL_NAME || null;
  26. if (envMysqlHost && envMysqlUser && envMysqlName) {
  27. // we have enough mysql creds to go with mysql
  28. logger.info('Using MySQL configuration');
  29. instance = {
  30. database: {
  31. engine: 'mysql',
  32. host: envMysqlHost,
  33. port: process.env.DB_MYSQL_PORT || 3306,
  34. user: envMysqlUser,
  35. password: process.env.DB_MYSQL_PASSWORD,
  36. name: envMysqlName,
  37. }
  38. };
  39. return;
  40. }
  41. const envSqliteFile = process.env.DB_SQLITE_FILE || '/data/database.sqlite';
  42. logger.info(`Using Sqlite: ${envSqliteFile}`);
  43. instance = {
  44. database: {
  45. engine: 'knex-native',
  46. knex: {
  47. client: 'sqlite3',
  48. connection: {
  49. filename: envSqliteFile
  50. },
  51. useNullAsDefault: true
  52. }
  53. }
  54. };
  55. // Get keys from file
  56. if (!fs.existsSync(keysFile)) {
  57. generateKeys();
  58. } else if (process.env.DEBUG) {
  59. logger.info('Keys file exists OK');
  60. }
  61. try {
  62. instance.keys = require(keysFile);
  63. } catch (err) {
  64. logger.error('Could not read JWT key pair from config file: ' + keysFile, err);
  65. process.exit(1);
  66. }
  67. logger.debug('Configuration: ' + JSON.stringify(instance, null, 2));
  68. };
  69. const generateKeys = () => {
  70. logger.info('Creating a new JWT key pair...');
  71. // Now create the keys and save them in the config.
  72. const key = new NodeRSA({ b: 2048 });
  73. key.generateKeyPair();
  74. const keys = {
  75. key: key.exportKey('private').toString(),
  76. pub: key.exportKey('public').toString(),
  77. };
  78. // Write keys config
  79. try {
  80. fs.writeFileSync(keysFile, JSON.stringify(keys, null, 2));
  81. } catch (err) {
  82. logger.error('Could not write JWT key pair to config file: ' + keysFile + ': ' . err.message);
  83. process.exit(1);
  84. }
  85. logger.info('Wrote JWT key pair to config file: ' + keysFile);
  86. };
  87. module.exports = {
  88. /**
  89. *
  90. * @param {string} key ie: 'database' or 'database.engine'
  91. * @returns {boolean}
  92. */
  93. has: function(key) {
  94. instance === null && configure();
  95. const keys = key.split('.');
  96. let level = instance;
  97. let has = true;
  98. keys.forEach((keyItem) =>{
  99. if (typeof level[keyItem] === 'undefined') {
  100. has = false;
  101. } else {
  102. level = level[keyItem];
  103. }
  104. });
  105. return has;
  106. },
  107. /**
  108. * Gets a specific key from the top level
  109. *
  110. * @param {string} key
  111. * @returns {*}
  112. */
  113. get: function (key) {
  114. instance === null && configure();
  115. if (key && typeof instance[key] !== 'undefined') {
  116. return instance[key];
  117. }
  118. return instance;
  119. },
  120. /**
  121. * Is this a sqlite configuration?
  122. *
  123. * @returns {boolean}
  124. */
  125. isSqlite: function () {
  126. instance === null && configure();
  127. return instance.database.knex && instance.database.knex.client === 'sqlite3';
  128. },
  129. /**
  130. * Are we running in debug mdoe?
  131. *
  132. * @returns {boolean}
  133. */
  134. debug: function () {
  135. return !!process.env.DEBUG;
  136. },
  137. /**
  138. * Returns a public key
  139. *
  140. * @returns {string}
  141. */
  142. getPublicKey: function () {
  143. instance === null && configure();
  144. return instance.keys.pub;
  145. },
  146. /**
  147. * Returns a private key
  148. *
  149. * @returns {string}
  150. */
  151. getPrivateKey: function () {
  152. instance === null && configure();
  153. return instance.keys.key;
  154. },
  155. /**
  156. * @returns {boolean}
  157. */
  158. useLetsencryptStaging: function () {
  159. return !!process.env.LE_STAGING;
  160. }
  161. };