pentaho/pentaho-kettle · error · KettleDatabaseException
UserInfo.Error.UserNotFound
Error message
UserInfo.Error.UserNotFound
What it means
Thrown inside loadUserInfo() when no repository user row matches the supplied login: either the query returned no rows or the user row exists but is invalid, raising KettleDatabaseException with UserInfo.Error.UserNotFound. That exception is then caught and re-wrapped as UserInfo.Error.UserNotLoaded in a KettleException, so the user-facing message is UserNotLoaded with UserNotFound as the cause.
Solutions
- Verify the login exists: query R_USER for the NAME value
- Check you are connected to the intended repository database/schema
- Create the user via UserRepository/rep.getUserInfo or the repository user-management UI
- Confirm the exact case and spelling of the login string
Example fix
// before
UserInfo user = rep.loadUserInfo("adimn"); // typo
// after
UserInfo user = rep.loadUserInfo("admin"); // verify login in R_USER first
if (user == null || !user.isEnabled()) {
throw new KettleException("User 'admin' missing or disabled in repository");
} Defensive patterns
Strategy: validation
Validate before calling
// Java: check the login exists before loadUserInfo
// SELECT COUNT(*) FROM R_USER WHERE LOWER(NAME) = LOWER(?)
boolean userExists = rep.getUserManager() != null
&& Arrays.stream(rep.getUserManager().getUsers())
.anyMatch(u -> u.getLogin().equalsIgnoreCase(login));
if (!userExists) throw new IllegalArgumentException("Unknown repository user: " + login); Try / catch
try {
UserInfo user = rep.loadUserInfo(login);
} catch (KettleException e) {
log.error("Repository user not found: " + login, e);
throw new IllegalArgumentException("Unknown user: " + login, e);
} Prevention
- Validate logins against the user list before authentication
- Normalize login case consistently (Kettle compares as stored)
- Confirm which repository database you are connected to before user lookups
- Provision users through the repository UI/API so R_USER stays consistent
When it happens
Trigger: Calling loadUserInfo(login) (or verifyLogin which calls it) with a login that has no row in R_USER, or where the row query returns no usable record.
Common situations: Typo in the username, authenticating against the wrong repository database, user deleted by an admin, or case-sensitivity mismatch in the login value.
Understand the failure class
Background: "User not found", "Invalid user", and "does not exist": what missing-user lookup errors mean across Rocket.Chat, LiteLLM, Phabricator, rustfs, and pnpm — this error's family across 10 libraries.
Related errors
- UserInfo.Error.UserNotLoaded
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AccessInputMeta.Exception.ErrorReadingRepository
- AddSequenceMeta.Exception.UnableToReadStepInfo
- AddSequenceMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/66397ce3840b860b.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/repository/kdr/delegates/KettleDatabaseRepositoryUserDelegate.java:66
quoteTable( KettleDatabaseRepository.TABLE_R_USER ), quote( KettleDatabaseRepository.FIELD_USER_ID_USER ),
quote( KettleDatabaseRepository.FIELD_USER_LOGIN ), login );
}
// Load user with login from repository, don't verify password...
public IUser loadUserInfo( IUser userInfo, String login ) throws KettleException {
try {
userInfo.setObjectId( getUserID( login ) );
if ( userInfo.getObjectId() != null ) {
RowMetaAndData r = getUser( userInfo.getObjectId() );
if ( r != null ) {
userInfo.setLogin( r.getString( "LOGIN", null ) );
userInfo.setPassword( Encr.decryptPassword( r.getString( "PASSWORD", null ) ) );
userInfo.setUsername( r.getString( "NAME", null ) );
userInfo.setDescription( r.getString( "DESCRIPTION", null ) );
userInfo.setEnabled( r.getBoolean( "ENABLED", false ) );
return userInfo;
} else {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "UserInfo.Error.UserNotFound", login ) );
}
} else {
throw new KettleDatabaseException( BaseMessages.getString( PKG, "UserInfo.Error.UserNotFound", login ) );
}
} catch ( KettleDatabaseException dbe ) {
throw new KettleException( BaseMessages.getString( PKG, "UserInfo.Error.UserNotLoaded", login, "" ), dbe );
}
}
/**
* Load user with login from repository and verify the password...
*
* @param rep
* @param login
* @param passwd
* @throws KettleException
*/
public IUser loadUserInfo( IUser userInfo, String login, String passwd ) throws KettleException {View on GitHub (pinned to f3058517a1)