/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Text;
using MongoDB.Bson;
namespace MongoDB.Driver
{
///
/// Various static utility methods.
///
public static class MongoUtils
{
// public static methods
///
/// Gets the MD5 hash of a string.
///
/// The string to get the MD5 hash of.
/// The MD5 hash.
public static string Hash(string text)
{
using (var md5 = MD5.Create())
{
var hash = md5.ComputeHash(Encoding.UTF8.GetBytes(text));
return BsonUtils.ToHexString(hash);
}
}
///
/// Creates a TimeSpan from microseconds.
///
/// The microseconds.
/// The TimeSpan.
public static TimeSpan TimeSpanFromMicroseconds(long microseconds)
{
return TimeSpan.FromTicks(microseconds * 10); // there are 10 ticks in a microsecond
}
///
/// Converts a string to camel case by lower casing the first letter (only the first letter is modified).
///
/// The string to camel case.
/// The camel cased string.
public static string ToCamelCase(string value)
{
return value.Length == 0 ? "" : value.Substring(0, 1).ToLower() + value.Substring(1);
}
// internal methods
///
/// Should only be used when the safety of the data cannot be guaranteed. For instance,
/// when the secure string is a password used in a plain text protocol.
///
/// The secure string.
/// The CLR string.
internal static string ToInsecureString(SecureString secureString)
{
if (secureString == null || secureString.Length == 0)
{
return "";
}
else
{
#if NET452
var secureStringIntPtr = Marshal.SecureStringToGlobalAllocUnicode(secureString);
#else
var secureStringIntPtr = SecureStringMarshal.SecureStringToGlobalAllocUnicode(secureString);
#endif
try
{
return Marshal.PtrToStringUni(secureStringIntPtr, secureString.Length);
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(secureStringIntPtr);
}
}
}
}
}