@@ -87,10 +87,7 @@ auth::UserManager::UserManager(application_features::ApplicationServer& server)
87
87
: _server(server), _globalVersion(1 ), _internalVersion(0 ) {}
88
88
#else
89
89
auth::UserManager::UserManager (application_features::ApplicationServer& server)
90
- : _server(server),
91
- _globalVersion(1 ),
92
- _internalVersion(0 ),
93
- _authHandler(nullptr ) {}
90
+ : _server(server), _globalVersion(1 ), _internalVersion(0 ), _authHandler(nullptr ) {}
94
91
95
92
auth::UserManager::UserManager (application_features::ApplicationServer& server,
96
93
std::unique_ptr<auth::Handler> handler)
@@ -129,7 +126,8 @@ static std::shared_ptr<VPackBuilder> QueryAllUsers(application_features::Applica
129
126
if (vocbase == nullptr ) {
130
127
LOG_TOPIC (" b8c47" , DEBUG, arangodb::Logger::AUTHENTICATION)
131
128
<< " system database is unknown" ;
132
- THROW_ARANGO_EXCEPTION_MESSAGE (TRI_ERROR_INTERNAL, " system database is unknown" );
129
+ THROW_ARANGO_EXCEPTION_MESSAGE (TRI_ERROR_INTERNAL,
130
+ " system database is unknown" );
133
131
}
134
132
135
133
// we cannot set this execution context, otherwise the transaction
@@ -138,8 +136,8 @@ static std::shared_ptr<VPackBuilder> QueryAllUsers(application_features::Applica
138
136
std::string const queryStr (" FOR user IN _users RETURN user" );
139
137
auto emptyBuilder = std::make_shared<VPackBuilder>();
140
138
arangodb::aql::Query query (transaction::StandaloneContext::Create (*vocbase),
141
- arangodb::aql::QueryString (queryStr),
142
- emptyBuilder, emptyBuilder );
139
+ arangodb::aql::QueryString (queryStr), emptyBuilder,
140
+ emptyBuilder);
143
141
144
142
query.queryOptions ().cache = false ;
145
143
query.queryOptions ().ttl = 30 ;
@@ -156,7 +154,8 @@ static std::shared_ptr<VPackBuilder> QueryAllUsers(application_features::Applica
156
154
THROW_ARANGO_EXCEPTION (TRI_ERROR_REQUEST_CANCELED);
157
155
}
158
156
THROW_ARANGO_EXCEPTION_MESSAGE (queryResult.result .errorNumber (),
159
- " Error executing user query: " + queryResult.result .errorMessage ());
157
+ " Error executing user query: " +
158
+ queryResult.result .errorMessage ());
160
159
}
161
160
162
161
VPackSlice usersSlice = queryResult.data ->slice ();
@@ -200,6 +199,13 @@ void auth::UserManager::loadFromDB() {
200
199
return ;
201
200
}
202
201
202
+ TRI_IF_FAILURE (" UserManager::performDBLookup" ) {
203
+ // Used in GTest. It is used to identify
204
+ // if the UserManager would have updated it's
205
+ // cache in a specific situation.
206
+ THROW_ARANGO_EXCEPTION (TRI_ERROR_DEBUG);
207
+ }
208
+
203
209
try {
204
210
std::shared_ptr<VPackBuilder> builder = QueryAllUsers (_server);
205
211
if (builder) {
@@ -325,7 +331,7 @@ Result auth::UserManager::storeUserInternal(auth::User const& entry, bool replac
325
331
// user was outdated, we should trigger a reload
326
332
triggerLocalReload ();
327
333
LOG_TOPIC (" cf922" , DEBUG, Logger::AUTHENTICATION)
328
- << " Cannot update user : '" << res.errorMessage () << " '" ;
334
+ << " Cannot update user : '" << res.errorMessage () << " '" ;
329
335
}
330
336
}
331
337
return res;
@@ -343,7 +349,8 @@ void auth::UserManager::createRootUser() {
343
349
WRITE_LOCKER (writeGuard, _userCacheLock); // must be second
344
350
UserMap::iterator const & it = _userCache.find (" root" );
345
351
if (it != _userCache.end ()) {
346
- LOG_TOPIC (" bbc97" , TRACE, Logger::AUTHENTICATION) << " \" root\" already exists" ;
352
+ LOG_TOPIC (" bbc97" , TRACE, Logger::AUTHENTICATION)
353
+ << " \" root\" already exists" ;
347
354
return ;
348
355
}
349
356
TRI_ASSERT (_userCache.empty ());
@@ -368,7 +375,8 @@ void auth::UserManager::createRootUser() {
368
375
<< " unable to create user \" root\" : " << ex.what ();
369
376
} catch (...) {
370
377
// No action
371
- LOG_TOPIC (" 268eb" , ERR, Logger::AUTHENTICATION) << " unable to create user \" root\" " ;
378
+ LOG_TOPIC (" 268eb" , ERR, Logger::AUTHENTICATION)
379
+ << " unable to create user \" root\" " ;
372
380
}
373
381
374
382
triggerGlobalReload ();
@@ -490,20 +498,20 @@ Result auth::UserManager::enumerateUsers(std::function<bool(auth::User&)>&& func
490
498
}
491
499
}
492
500
}
493
-
501
+
494
502
bool triggerUpdate = !toUpdate.empty ();
495
-
503
+
496
504
Result res;
497
505
do {
498
506
auto it = toUpdate.begin ();
499
- while (it != toUpdate.end ()) {
507
+ while (it != toUpdate.end ()) {
500
508
WRITE_LOCKER (writeGuard, _userCacheLock);
501
- res = storeUserInternal (*it, /* replace*/ true );
502
-
509
+ res = storeUserInternal (*it, /* replace*/ true );
510
+
503
511
if (res.is (TRI_ERROR_ARANGO_CONFLICT) && retryOnConflict) {
504
512
res.reset ();
505
513
writeGuard.unlock ();
506
- loadFromDB (); // should be noop iff nothing changed
514
+ loadFromDB (); // should be noop iff nothing changed
507
515
writeGuard.lock ();
508
516
UserMap::iterator it2 = _userCache.find (it->username ());
509
517
if (it2 != _userCache.end ()) {
@@ -715,7 +723,8 @@ bool auth::UserManager::checkPassword(std::string const& username, std::string c
715
723
AuthenticationFeature* af = AuthenticationFeature::instance ();
716
724
if (it != _userCache.end () && (it->second .source () == auth::Source::Local)) {
717
725
if (af != nullptr && !af->localAuthentication ()) {
718
- LOG_TOPIC (" d3220" , DEBUG, Logger::AUTHENTICATION) << " Local users are forbidden" ;
726
+ LOG_TOPIC (" d3220" , DEBUG, Logger::AUTHENTICATION)
727
+ << " Local users are forbidden" ;
719
728
return false ;
720
729
}
721
730
auth::User const & user = it->second ;
@@ -799,10 +808,12 @@ auth::Level auth::UserManager::collectionAuthLevel(std::string const& user,
799
808
return level;
800
809
}
801
810
811
+ #ifdef ARANGODB_USE_GOOGLE_TESTS
802
812
// / Only used for testing
803
813
void auth::UserManager::setAuthInfo (auth::UserMap const & newMap) {
804
814
MUTEX_LOCKER (guard, _loadFromDBLock); // must be first
805
815
WRITE_LOCKER (writeGuard, _userCacheLock); // must be second
806
816
_userCache = newMap;
807
817
_internalVersion.store (_globalVersion.load ());
808
818
}
819
+ #endif
0 commit comments