{"record":{"id":"fdf2c0a0ad991162","repo":"pentaho/pentaho-kettle","slug":"unable-to-get-object-information-for-object-with-id-objectid-fdf2c0","errorCode":null,"errorMessage":"Unable to get object information for object with id=\" + objectId","messagePattern":"Unable to get object information for object with id=\" \\+ objectId","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java","lineNumber":3168,"sourceCode":"\n        repositoryFileAcl = pur.getAcl( repositoryFile.getId() );\n\n      } finally {\n        readWriteLock.readLock().unlock();\n      }\n\n      String parentPath = getParentPath( repositoryFile.getPath() );\n      String name = repositoryFile.getTitle();\n      String description = repositoryFile.getDescription();\n      Date modifiedDate = repositoryFile.getLastModifiedDate();\n      // String creatorId = repositoryFile.getCreatorId();\n      String ownerName = repositoryFileAcl != null ? repositoryFileAcl.getOwner().getName() : \"\";\n      boolean deleted = isDeleted( repositoryFile );\n      RepositoryDirectoryInterface directory = findDirectory( parentPath );\n      return new RepositoryObject( objectId, name, directory, ownerName, modifiedDate, objectType, description,\n        deleted );\n    } catch ( Exception e ) {\n      throw new KettleException( \"Unable to get object information for object with id=\" + objectId, e );\n    }\n  }\n\n  @Override\n  public RepositoryDirectoryInterface findDirectory( String directory ) throws KettleException {\n    RepositoryDirectoryInterface repositoryDirectoryInterface = null;\n    // check if we have a rootRef cached\n    boolean usingRootDirCache = rootRef.getRef() != null;\n    repositoryDirectoryInterface = getRootDir().findDirectory( directory );\n    // if we are using a cached version of the repository interface, allow a reload if we do not find\n    if ( repositoryDirectoryInterface == null && usingRootDirCache ) {\n      repositoryDirectoryInterface = loadRepositoryDirectoryTree().findDirectory( directory );\n    }\n    return repositoryDirectoryInterface;\n  }\n\n  @Override\n  public RepositoryDirectoryInterface findDirectory( ObjectId directory ) throws KettleException {","sourceCodeStart":3150,"sourceCodeEnd":3186,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java#L3150-L3186","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Grant the missing permissions to the user/role in the Pentaho Administration perspective","Log in as a user with the required role (e.g. Administrator) for the operation","Check the object's and parent folder's ACLs (repository.getPermissionsAcl) and adjust","Confirm you are connected to the intended repository/security tenant"],"exampleFix":"// before\nrepo.save(jobMeta, \"v1\"); // throws KettleSecurityException ERROR_0005\n// after\nif (repo.getSecurityUser() != null && hasWriteAccess(repo, jobMeta.getRepositoryDirectory())) {\n  repo.save(jobMeta, \"v1\");\n} else {\n  throw new KettleSecurityException(\"User lacks WRITE permission on \" + jobMeta.getRepositoryDirectory().getPath());\n}","handlingStrategy":"try-catch","validationCode":"if (objectId == null || objectId.getId() == null) {\n  throw new IllegalArgumentException(\"objectId required\");\n}\nif (!repo.isConnected()) repo.connect(\"user\", \"pass\");","typeGuard":"boolean isResolvableId(ObjectId id) {\n  return id != null && id.getId() != null && !id.getId().isEmpty();\n}","tryCatchPattern":"try {\n  RepositoryObject info = repo.getObjectInformation(id, null);\n} catch (KettleException e) {\n  if (!repo.exists(id)) {\n    // stale id — re-resolve from path\n  } else {\n    throw e; // permission or connectivity issue\n  }\n}","preventionTips":["Verify ids exist before metadata lookups","Refresh stale ids after external deletions","Check ACL read permissions for the user","Reconnect on suspected connection drops"],"tags":["pentaho-kettle","security","permissions","acl"],"backgroundTag":"insufficient-permissions","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}