adonis-mongorito icon indicating copy to clipboard operation
adonis-mongorito copied to clipboard

Support for SSL options

Open duartealexf opened this issue 8 years ago • 1 comments

I needed to set up a connection to mongo using the SSL options to authenticate. Based on options available from http://mongodb.github.io/node-mongodb-native/2.2/tutorials/connect/ssl/ here's how i've done it:

Relevant .env part:

MONGO_HOST=localhost
MONGO_PORT=27017
MONGO_USER=root
MONGO_PASS=123456
MONGO_DATABASE=test

MONGO_VERIFY_HOSTNAME=false

MONGO_SSL=true
MONGO_CRT=/etc/ssl/certs/mongo-pem
MONGO_KEY=/etc/ssl/certs/mongo-pem
MONGO_CA=/etc/ssl/certs/mongo-ca

All config/mongo.js:

'use strict'

const fs = require('fs')

const Env = use('Env')

let ssl    = Env.get('MONGO_SSL', false);
let crt    = Env.get('MONGO_CRT', '');
let key    = Env.get('MONGO_KEY', '');
let ca     = Env.get('MONGO_CA', '');

if (ssl) {
  if (crt && fs.existsSync(crt)) {
    crt = fs.readFileSync(crt)
  }

  if (key && fs.existsSync(key)) {
    key = fs.readFileSync(key)
  }

  if (ca && fs.existsSync(ca)) {
    ca = [fs.readFileSync(ca)]
  }
}

module.exports = {
  host:   Env.get('MONGO_HOST'),
  port:   Env.get('MONGO_PORT'),
  user:   Env.get('MONGO_USER', ''),
  pass:   Env.get('MONGO_PASS', ''),
  db:     Env.get('MONGO_DATABASE'),
  verify: Env.get('MONGO_VERIFY_HOSTNAME', false),
  ssl:    ssl,
  crt:    crt,
  key:    key,
  ca:     ca
}

and I had to change MongoritoProvider.js file, MongoritoProvider class declaration only:

class MongoritoProvider extends ServiceProvider {

  * register () {
    this.app.singleton('Adonis/Addons/MongoritoModel', function (app) {
      let Config = app.use('Adonis/Src/Config')

      const mongoHost = Config.get('mongo.host')
      const mongoPort = Config.get('mongo.port')
      const mongoUser = Config.get('mongo.user')
      const mongoPass = Config.get('mongo.pass')

      let mongoDb = Config.get('mongo.db')
      let mongoVerify = Config.get('mongo.verify')

      let mongoSSL = Config.get('mongo.ssl')
      let mongoKey = Config.get('mongo.key')
      let mongoCrt = Config.get('mongo.crt')
      let mongoCa = Config.get('mongo.ca')

      let options = { server: {} }

      if (mongoSSL) {
        mongoDb = `${mongoDb}?ssl=true`

        options.server.sslValidate = true;
        options.server.sslKey      = mongoKey;
        options.server.sslCert     = mongoCrt;
        options.server.sslCA       = mongoCa;
      }

      options.server.checkServerIdentity = mongoVerify;

      const connectUri = `${mongoHost}:${mongoPort}/${mongoDb}`
      const connectionString = (mongoUser !== '' || mongoPass !== '') ? `${mongoUser}:${mongoPass}@${connectUri}` : connectUri

      logger.verbose('connection string %s', connectionString)
      Mongorito.connect(connectionString, options)

      return MongoritoModel
    })
  }
}

I don't wanna lose my changes on the MongoritoProvider next time I run npm update. So how can we arranged so this gets fixed? Do I submit a PR? Or would you change it?

duartealexf avatar Jan 17 '17 15:01 duartealexf

@duartealexf you can submit a PR. I will test it, and merge if its ok :)

allanfreitas avatar Jan 17 '17 22:01 allanfreitas