diff --git a/lib/dbi/ogs-mongoc.c b/lib/dbi/ogs-mongoc.c index c5dd87014..055eb5745 100644 --- a/lib/dbi/ogs-mongoc.c +++ b/lib/dbi/ogs-mongoc.c @@ -20,11 +20,9 @@ #include #include "ogs-dbi.h" -#include int __ogs_dbi_domain; -static char masked_db_uri[255]; static ogs_mongoc_t self; /* @@ -50,28 +48,32 @@ ogs_mongoc_mongoc_client_get_server_status (mongoc_client_t *client, /* IN */ return ret; } -const char* ogs_mask_db_uri(const char *db_uri) +static char *masked_db_uri(const char *db_uri) { - bzero(masked_db_uri, sizeof(masked_db_uri)); - if (strnlen(db_uri, sizeof(masked_db_uri)) == sizeof(masked_db_uri)) { - return db_uri; - } + char *tmp; + char *array[2], *saveptr = NULL; + char *masked = NULL; - char *token = strtok((char *)db_uri, "@"); - if (strlen(token) > 1) { - strcpy((char *)masked_db_uri, "mongodb://*****:*****@"); - while (token != NULL) { - token = strtok(NULL, "@"); - if (token != NULL) { - strcat((char *)masked_db_uri, token); - } - } + ogs_assert(db_uri); + + tmp = ogs_strdup(db_uri); + + memset(array, 0, sizeof(array)); + array[0] = strtok_r(tmp, "@", &saveptr); + if (array[0]) + array[1] = strtok_r(NULL, "@", &saveptr); + + if (array[1]) { + masked = ogs_msprintf("mongodb://*****:*****@%s", array[1]); + ogs_assert(masked); } else { - // no credentials provided, no need to mask anything - return db_uri; + masked = ogs_strdup(array[0]); + ogs_assert(masked); } - return masked_db_uri; + ogs_free(tmp); + + return masked; } int ogs_mongoc_init(const char *db_uri) @@ -89,13 +91,15 @@ int ogs_mongoc_init(const char *db_uri) memset(&self, 0, sizeof(ogs_mongoc_t)); + self.masked_db_uri = masked_db_uri(db_uri); + mongoc_init(); self.initialized = true; self.client = mongoc_client_new(db_uri); if (!self.client) { - ogs_error("Failed to parse DB URI [%s]", ogs_mask_db_uri(db_uri)); + ogs_error("Failed to parse DB URI [%s]", self.masked_db_uri); return OGS_ERROR; } @@ -114,7 +118,7 @@ int ogs_mongoc_init(const char *db_uri) if (!ogs_mongoc_mongoc_client_get_server_status( self.client, NULL, &reply, &error)) { - ogs_warn("Failed to connect to server [%s]", ogs_mask_db_uri(db_uri)); + ogs_warn("Failed to connect to server [%s]", self.masked_db_uri); return OGS_RETRY; } @@ -122,7 +126,7 @@ int ogs_mongoc_init(const char *db_uri) bson_destroy(&reply); - ogs_info("MongoDB URI: '%s'", ogs_mask_db_uri(db_uri)); + ogs_info("MongoDB URI: '%s'", self.masked_db_uri); return OGS_OK; } @@ -137,6 +141,10 @@ void ogs_mongoc_final(void) mongoc_client_destroy(self.client); self.client = NULL; } + if (self.masked_db_uri) { + ogs_free(self.masked_db_uri); + self.masked_db_uri = NULL; + } if (self.initialized) { mongoc_cleanup(); diff --git a/lib/dbi/ogs-mongoc.h b/lib/dbi/ogs-mongoc.h index 8b2808324..9e3b4515b 100644 --- a/lib/dbi/ogs-mongoc.h +++ b/lib/dbi/ogs-mongoc.h @@ -37,12 +37,13 @@ typedef struct ogs_mongoc_s { void *client; void *database; + char *masked_db_uri; + struct { void *subscriber; } collection; } ogs_mongoc_t; -const char* ogs_mask_db_uri(const char *db_uri); int ogs_mongoc_init(const char *db_uri); void ogs_mongoc_final(void); ogs_mongoc_t *ogs_mongoc(void);