summaryrefslogtreecommitdiff
path: root/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp')
-rw-r--r--cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp37
1 files changed, 36 insertions, 1 deletions
diff --git a/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp b/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp
index 9bc1ea38a5c..e3387c4667d 100644
--- a/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp
+++ b/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp
@@ -18,6 +18,8 @@
#if defined(__GLIBC__) || defined(_AIX)
# include <crypt.h>
+#elif defined(__FreeBSD__)
+# include <unistd.h>
#elif defined(__APPLE__)
# include <CoreFoundation/CoreFoundation.h>
# include <Security/Security.h>
@@ -34,6 +36,34 @@ using namespace Glacier2;
namespace
{
+#if defined(__FreeBSD__) && !defined(__GLIBC__)
+
+//
+// FreeBSD crypt is no reentrat we use this global mutex
+// to serialize access.
+//
+IceUtil::Mutex* _staticMutex = 0;
+
+class Init
+{
+public:
+
+ Init()
+ {
+ _staticMutex = new IceUtil::Mutex;
+ }
+
+ ~Init()
+ {
+ delete _staticMutex;
+ _staticMutex = 0;
+ }
+};
+
+Init init;
+#endif
+
+
class CryptPermissionsVerifierI : public PermissionsVerifier
{
public:
@@ -142,7 +172,7 @@ CryptPermissionsVerifierI::checkPermissions(const string& userId, const string&
{
return false;
}
-#if defined(__GLIBC__)
+#if defined(__GLIBC__) || defined(__FreeBSD__)
size_t i = p->second.rfind('$');
string salt;
if(i == string::npos)
@@ -164,9 +194,14 @@ CryptPermissionsVerifierI::checkPermissions(const string& userId, const string&
return false;
}
}
+# if defined(__GLIBC__)
struct crypt_data data;
data.initialized = 0;
return p->second == crypt_r(password.c_str(), salt.c_str(), &data);
+# else
+ IceUtilInternal::MutexPtrLock<IceUtil::Mutex> lock(_staticMutex);
+ return p->second == crypt(password.c_str(), salt.c_str())
+# endif
#elif defined(__APPLE__) || defined(_WIN32)
//
// Pbkdf2 string format: