00001 // security.h 00002 00019 #pragma once 00020 00021 #include "nonce.h" 00022 #include "concurrency.h" 00023 #include "security_key.h" 00024 00025 namespace mongo { 00026 00027 /* for a particular db */ 00028 struct Auth { 00029 Auth() { level = 0; } 00030 int level; 00031 }; 00032 00033 class AuthenticationInfo : boost::noncopyable { 00034 mongo::mutex _lock; 00035 map<string, Auth> m; // dbname -> auth 00036 static int warned; 00037 public: 00038 bool isLocalHost; 00039 AuthenticationInfo() : _lock("AuthenticationInfo") { isLocalHost = false; } 00040 ~AuthenticationInfo() { 00041 } 00042 void logout(const string& dbname ) { 00043 scoped_lock lk(_lock); 00044 m.erase(dbname); 00045 } 00046 void authorize(const string& dbname ) { 00047 scoped_lock lk(_lock); 00048 m[dbname].level = 2; 00049 } 00050 void authorizeReadOnly(const string& dbname) { 00051 scoped_lock lk(_lock); 00052 m[dbname].level = 1; 00053 } 00054 bool isAuthorized(const string& dbname) { return _isAuthorized( dbname, 2 ); } 00055 bool isAuthorizedReads(const string& dbname) { return _isAuthorized( dbname, 1 ); } 00056 bool isAuthorizedForLock(const string& dbname, int lockType ) { return _isAuthorized( dbname , lockType > 0 ? 2 : 1 ); } 00057 00058 void print(); 00059 00060 protected: 00061 bool _isAuthorized(const string& dbname, int level) { 00062 if( m[dbname].level >= level ) return true; 00063 if( noauth ) return true; 00064 if( m["admin"].level >= level ) return true; 00065 if( m["local"].level >= level ) return true; 00066 return _isAuthorizedSpecialChecks( dbname ); 00067 } 00068 00069 bool _isAuthorizedSpecialChecks( const string& dbname ); 00070 }; 00071 00072 } // namespace mongo