Skip to content

Commit

Permalink
Use username & password (from env vars) for Mongo (#336)
Browse files Browse the repository at this point in the history
Mongo connections can now use a username and password, specified by
environment variables. If the environment variables are not present or
are empty, then no authentication parameters are sent to Mongo.
  • Loading branch information
rmunn authored May 20, 2024
1 parent 51b8ad7 commit 025f6b6
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/LfMerge.Core/LanguageDepotProject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public LanguageDepotProject(LfMergeSettings settings, ILogger logger)
public void Initialize(string lfProjectCode)
{
// TODO: This should use the MongoConnection class instead
MongoClient client = new MongoClient("mongodb://" + Settings.MongoDbHostNameAndPort);
MongoClient client = new MongoClient("mongodb://" + Settings.MongoDbHostPortAndAuth);
IMongoDatabase database = client.GetDatabase("scriptureforge");
IMongoCollection<BsonDocument> projectCollection = database.GetCollection<BsonDocument>("projects");
//var userCollection = database.GetCollection<BsonDocument>("users");
Expand Down
3 changes: 3 additions & 0 deletions src/LfMerge.Core/MagicStrings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ static MagicStrings()
public const string SettingsEnvVar_TemplatesDir = "LFMERGE_TEMPLATES_DIR";
public const string SettingsEnvVar_MongoHostname = "LFMERGE_MONGO_HOSTNAME";
public const string SettingsEnvVar_MongoPort = "LFMERGE_MONGO_PORT";
public const string SettingsEnvVar_MongoAuthSource = "LFMERGE_MONGO_AUTHSOURCE";
public const string SettingsEnvVar_MongoUsername = "LFMERGE_MONGO_USER";
public const string SettingsEnvVar_MongoPassword = "LFMERGE_MONGO_PASS";
public const string SettingsEnvVar_MongoMainDatabaseName = "LFMERGE_MONGO_MAIN_DB_NAME";
public const string SettingsEnvVar_MongoDatabaseNamePrefix = "LFMERGE_MONGO_DB_NAME_PREFIX";
public const string SettingsEnvVar_VerboseProgress = "LFMERGE_VERBOSE_PROGRESS";
Expand Down
7 changes: 6 additions & 1 deletion src/LfMerge.Core/MongoConnector/MongoConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public enum MongoDbSelector {

public class MongoConnection : IMongoConnection
{
private string connectionString;
private string mainDatabaseName;
private Lazy<IMongoClient> client;
// Since calling GetDatabase() too often creates a new connection, we memoize the databases in this dictionary.
Expand Down Expand Up @@ -72,14 +73,18 @@ public MongoConnection(LfMergeSettings settings, ILogger logger)
{
_settings = settings;
_logger = logger;
connectionString = string.Format(
"mongodb://{0}?authSource={1}",
Settings.MongoDbHostPortAndAuth,
Settings.MongoAuthSource);
mainDatabaseName = Settings.MongoMainDatabaseName;
client = new Lazy<IMongoClient>(GetNewConnection);
dbs = new ConcurrentDictionary<string, IMongoDatabase>();
}

private MongoClient GetNewConnection()
{
var clientSettings = new MongoClientSettings();
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
// clientSettings.WriteConcern = WriteConcern.WMajority; // If increasing the wait queue size still doesn't help, try this as well
clientSettings.WaitQueueSize = 50000;
clientSettings.Server = new MongoServerAddress(Settings.MongoHostname, Settings.MongoPort);
Expand Down
4 changes: 4 additions & 0 deletions src/LfMerge.Core/Settings/DefaultLfMergeSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ public static class DefaultLfMergeSettings
public const int MongoPort = 27017;
public const string MongoMainDatabaseName = "scriptureforge";
public const string MongoDatabaseNamePrefix = "sf_";
public const string MongoAuthSource = "admin";
// Mongo username and password defaults should be *empty*
public const string MongoUsername = "";
public const string MongoPassword = "";
public const bool VerboseProgress = false;
public const string LanguageDepotRepoUri = ""; // optional, usually not set
}
Expand Down
9 changes: 9 additions & 0 deletions src/LfMerge.Core/Settings/LfMergeSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ public int MongoPort {
}
}

public string MongoAuthSource => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoAuthSource) ?? DefaultLfMergeSettings.MongoAuthSource;
public string MongoUsername => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoUsername) ?? DefaultLfMergeSettings.MongoUsername;
public string MongoPassword => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoPassword) ?? DefaultLfMergeSettings.MongoPassword;
private string EncodedUsername => Uri.EscapeUriString(MongoUsername);
private string EncodedPassword => Uri.EscapeUriString(MongoPassword);

public string MongoMainDatabaseName => Environment.GetEnvironmentVariable(MagicStrings.SettingsEnvVar_MongoMainDatabaseName) ?? DefaultLfMergeSettings.MongoMainDatabaseName;

/// <summary>
Expand All @@ -65,6 +71,9 @@ public bool VerboseProgress {
public bool CommitWhenDone { get; internal set; }

public string MongoDbHostNameAndPort { get { return String.Format("{0}:{1}", MongoHostname, MongoPort.ToString()); } }
public string MongoDbHostPortAndAuth => string.IsNullOrEmpty(MongoUsername) || string.IsNullOrEmpty(MongoPassword)
? string.Format("{0}:{1}", MongoHostname, MongoPort.ToString())
: string.Format("{0}:{1}@{2}:{3}", EncodedUsername, EncodedPassword, MongoHostname, MongoPort.ToString());

private string QueueDirectory { get; set; }

Expand Down

0 comments on commit 025f6b6

Please sign in to comment.