pentaho/pentaho-kettle · error · KettleException

Unable to get object information for object with id=" +…

Error message

Unable to get object information for object with id=" + objectId

What it means

PurRepository throws ERROR_0005_INCORRECT_PERMISSION when the current user lacks the permissions the repository requires for an operation. It builds a localized KettleSecurityException listing the missing permissions in a [perm1, perm2] format.

Solutions

  1. Grant the missing permissions to the user/role in the Pentaho Administration perspective
  2. Log in as a user with the required role (e.g. Administrator) for the operation
  3. Check the object's and parent folder's ACLs (repository.getPermissionsAcl) and adjust
  4. Confirm you are connected to the intended repository/security tenant

Example fix

// before
repo.save(jobMeta, "v1"); // throws KettleSecurityException ERROR_0005
// after
if (repo.getSecurityUser() != null && hasWriteAccess(repo, jobMeta.getRepositoryDirectory())) {
  repo.save(jobMeta, "v1");
} else {
  throw new KettleSecurityException("User lacks WRITE permission on " + jobMeta.getRepositoryDirectory().getPath());
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (objectId == null || objectId.getId() == null) {
  throw new IllegalArgumentException("objectId required");
}
if (!repo.isConnected()) repo.connect("user", "pass");

Type guard

boolean isResolvableId(ObjectId id) {
  return id != null && id.getId() != null && !id.getId().isEmpty();
}

Try / catch

try {
  RepositoryObject info = repo.getObjectInformation(id, null);
} catch (KettleException e) {
  if (!repo.exists(id)) {
    // stale id — re-resolve from path
  } else {
    throw e; // permission or connectivity issue
  }
}

Prevention

When it happens

Trigger: Calling repository operations (e.g. save, delete, create) when the authenticated Pentaho user's effective ACL on the target folder/file lacks required permissions such as READ, WRITE, DELETE, or ADMINISTER.

Common situations: User account not granted the right Pentaho security role; object owner changed; repository permissions tightened after an upgrade; trying to write into a read-only shared folder.

Understand the failure class

Background: "You do not have permission" / 403 Forbidden errors: authenticated but not allowed — causes and fixes across open-source libraries — this error's family across 31 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/fdf2c0a0ad991162. Report an issue: GitHub.

Appendix: source

Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java:3168

        repositoryFileAcl = pur.getAcl( repositoryFile.getId() );

      } finally {
        readWriteLock.readLock().unlock();
      }

      String parentPath = getParentPath( repositoryFile.getPath() );
      String name = repositoryFile.getTitle();
      String description = repositoryFile.getDescription();
      Date modifiedDate = repositoryFile.getLastModifiedDate();
      // String creatorId = repositoryFile.getCreatorId();
      String ownerName = repositoryFileAcl != null ? repositoryFileAcl.getOwner().getName() : "";
      boolean deleted = isDeleted( repositoryFile );
      RepositoryDirectoryInterface directory = findDirectory( parentPath );
      return new RepositoryObject( objectId, name, directory, ownerName, modifiedDate, objectType, description,
        deleted );
    } catch ( Exception e ) {
      throw new KettleException( "Unable to get object information for object with id=" + objectId, e );
    }
  }

  @Override
  public RepositoryDirectoryInterface findDirectory( String directory ) throws KettleException {
    RepositoryDirectoryInterface repositoryDirectoryInterface = null;
    // check if we have a rootRef cached
    boolean usingRootDirCache = rootRef.getRef() != null;
    repositoryDirectoryInterface = getRootDir().findDirectory( directory );
    // if we are using a cached version of the repository interface, allow a reload if we do not find
    if ( repositoryDirectoryInterface == null && usingRootDirCache ) {
      repositoryDirectoryInterface = loadRepositoryDirectoryTree().findDirectory( directory );
    }
    return repositoryDirectoryInterface;
  }

  @Override
  public RepositoryDirectoryInterface findDirectory( ObjectId directory ) throws KettleException {

View on GitHub (pinned to f3058517a1)