| 1069 | |
| 1070 | private: |
| 1071 | class DbCache |
| 1072 | { |
| 1073 | public: |
| 1074 | DbCache(MemoryPool& p) |
| 1075 | : logins(p, userSql), |
| 1076 | roles(p, roleSql), |
| 1077 | pairs(p) |
| 1078 | { } |
| 1079 | |
| 1080 | bool getPrivileges(const string& name, const string* sqlRole, const string& trusted_role, |
| 1081 | UserId::Privileges& system_privileges) |
| 1082 | { |
| 1083 | system_privileges.clearAll(); |
| 1084 | if (!logins.getPrivileges(name, system_privileges)) |
| 1085 | return false; |
| 1086 | |
| 1087 | MAP_DEBUG(fprintf(stderr, "name=%s\n", name.c_str())); |
| 1088 | |
| 1089 | bool granted = false; |
| 1090 | if (!pairs.isRoleGranted(name, sqlRole, granted)) |
| 1091 | return false; |
| 1092 | |
| 1093 | MAP_DEBUG(fprintf(stderr, "granted=%d\n", granted)); |
| 1094 | return roles.getPrivileges((granted ? *sqlRole : trusted_role), system_privileges); |
| 1095 | } |
| 1096 | |
| 1097 | void populate(Mapping::DbHandle& iDb, const string& name, const string* sqlRole, |
| 1098 | const string& trusted_role) |
| 1099 | { |
| 1100 | logins.populate(name, iDb); |
| 1101 | roles.populate(trusted_role, iDb); |
| 1102 | if (sqlRole) |
| 1103 | roles.populate(*sqlRole, iDb); |
| 1104 | pairs.populate(name, sqlRole, iDb); |
| 1105 | } |
| 1106 | |
| 1107 | void invalidate() |
| 1108 | { |
| 1109 | logins.invalidate(); |
| 1110 | roles.invalidate(); |
| 1111 | pairs.invalidate(); |
| 1112 | } |
| 1113 | |
| 1114 | private: |
| 1115 | class NameCache : private GenericMap<Pair<Left<string, UserId::Privileges> > > |
| 1116 | { |
| 1117 | public: |
| 1118 | NameCache(MemoryPool& p, const char* s) |
| 1119 | : GenericMap(p), |
| 1120 | sql(s) |
| 1121 | { } |
| 1122 | |
| 1123 | bool getPrivileges(const string& key, UserId::Privileges& system_privileges) |
| 1124 | { |
| 1125 | if (!key.hasData()) |
| 1126 | return true; |
| 1127 | |
| 1128 | UserId::Privileges p; |