SEXP R_mongo_client_new(SEXP uri_string) { mongoc_client_t *client = mongoc_client_new (translateCharUTF8(asChar(uri_string))); if(!client) stop("Invalid uri_string. Try mongodb://localhost"); //set ssl certificates here if (mongoc_uri_get_ssl (mongoc_client_get_uri(client))) { mongoc_client_set_ssl_opts(client, mongoc_ssl_opt_get_default()); } //verify that server is online //can fail if user has limited priv /* bson_error_t err; if(!mongoc_client_get_server_status(client, NULL, NULL, &err)){ mongoc_client_destroy(client); stop(err.message); } */ return client2r(client); }
static bool hippo_mongo_driver_manager_apply_ssl_opts(mongoc_client_t *client, const Array options) { mongoc_ssl_opt_t ssl_opt = { NULL, NULL, NULL, NULL, NULL, true }; Array ssl; bool apply_ssl = false; if (!mongoc_uri_get_ssl(mongoc_client_get_uri(client))) { return 0; } if (options.exists(s_MongoDBDriverManager_context)) { Array context; if (!options[s_MongoDBDriverManager_context].isResource()) { return 0; } #if HIPPO_HHVM_VERSION >= 30900 req::ptr<StreamContext> sc; #else SmartPtr<StreamContext> sc; #endif sc = cast<StreamContext>(options[s_MongoDBDriverManager_context]); context = sc->getOptions(); if (!context.exists(s_MongoDBDriverManager_context_ssl)) { return 0; } if (!context[s_MongoDBDriverManager_context_ssl].isArray()) { return 0; } ssl = context[s_MongoDBDriverManager_context_ssl].toArray(); } else { ssl = options; } if (ssl.exists(s_MongoDBDriverManager_context_ssl_allow_self_signed) && ssl[s_MongoDBDriverManager_context_ssl_allow_self_signed].isBoolean()) { apply_ssl = true; ssl_opt.weak_cert_validation = (bool)true;//ssl[s_MongoDBDriverManager_context_ssl_allow_self_signed].toBoolean(); } if (ssl.exists(s_MongoDBDriverManager_context_ssl_local_cert) && ssl[s_MongoDBDriverManager_context_ssl_local_cert].isString()) { apply_ssl = true; ssl_opt.pem_file = ssl[s_MongoDBDriverManager_context_ssl_local_cert].toString().c_str(); } if (ssl.exists(s_MongoDBDriverManager_context_ssl_passphrase) && ssl[s_MongoDBDriverManager_context_ssl_passphrase].isString()) { apply_ssl = true; ssl_opt.pem_pwd = ssl[s_MongoDBDriverManager_context_ssl_passphrase].toString().c_str(); } if (ssl.exists(s_MongoDBDriverManager_context_ssl_cafile) && ssl[s_MongoDBDriverManager_context_ssl_cafile].isString()) { apply_ssl = true; ssl_opt.ca_file = ssl[s_MongoDBDriverManager_context_ssl_cafile].toString().c_str(); } if (ssl.exists(s_MongoDBDriverManager_context_ssl_capath) && ssl[s_MongoDBDriverManager_context_ssl_capath].isString()) { apply_ssl = true; ssl_opt.ca_dir = ssl[s_MongoDBDriverManager_context_ssl_capath].toString().c_str(); } if (apply_ssl) { mongoc_client_set_ssl_opts(client, &ssl_opt); } return 1; }