{"record":{"id":"a45b105db1b178ba","repo":"passbolt/passbolt_api","slug":"missing-metadata-private-key","errorCode":null,"errorMessage":"Missing metadata private key.","messagePattern":"Missing metadata private key\\.","errorType":"http","errorClass":"NotFoundException","httpStatus":404,"severity":"error","filePath":"plugins/PassboltCe/Metadata/src/Command/ShareMetadataKeyCommand.php","lineNumber":204,"sourceCode":"                continue;\n            }\n\n            $this->success(\n                __('The metadata key {0} was shared with user {1}.', $missingMetadataKeyId, $user->username),\n                $io\n            );\n        }\n    }\n\n    /**\n     * @param string $missingMetadataKeyId Metadata key id to find.\n     * @param array $metadataKeys Metadata keys.\n     * @return \\Passbolt\\Metadata\\Model\\Entity\\MetadataPrivateKey\n     */\n    private function findMetadataPrivateKey(string $missingMetadataKeyId, array $metadataKeys): MetadataPrivateKey\n    {\n        if (empty($metadataKeys[$missingMetadataKeyId]['metadata_private_keys'])) {\n            throw new NotFoundException(__('Missing metadata private key.', $missingMetadataKeyId));\n        }\n\n        return $metadataKeys[$missingMetadataKeyId]['metadata_private_keys'][0];\n    }\n}\n","sourceCodeStart":186,"sourceCodeEnd":210,"githubUrl":"https://github.com/passbolt/passbolt_api/blob/31c1bbc10f32808a607fa9bd81891e898779c0bc/plugins/PassboltCe/Metadata/src/Command/ShareMetadataKeyCommand.php#L186-L210","documentation":"Thrown by ShareMetadataKeyCommand::findMetadataPrivateKey() when the metadata key identified by $missingMetadataKeyId has no associated metadata_private_keys entry in the fetched $metadataKeys array. The command cannot share a metadata key with users without its private key material, so it aborts with a 404-style NotFoundException.","triggerScenarios":"Running `passbolt share_metadata_key` when the targeted metadata key id has zero MetadataPrivateKey rows (key generated without the server's private-key share), or the id passed does not exist in the collected $metadataKeys array.","commonSituations":"Metadata keys migrated from another instance without copying metadata_private_keys, partially failed metadata key creation leaving the key without private-key rows, and mistyped metadata key IDs on the command line.","solutions":["Verify the metadata key id exists and has rows in metadata_private_keys (query the table directly)","Re-generate or restore the metadata private key for the affected key (e.g. via metadata key creation/rotation flow)","Ensure the metadata_private_keys data was migrated when moving between instances","Double-check the key id passed on the command line matches an existing metadata_keys.id"],"exampleFix":"// before\nbin/cake passbolt share_metadata_key 0a1b...  # key has no private key row -> 404\n// after\n# check first\nSELECT metadata_key_id FROM metadata_private_keys WHERE metadata_key_id = '0a1b...';\n# if empty, recreate the key or restore its private key before sharing","handlingStrategy":"validation","validationCode":"$key = $metadataKeysTable->find()\n    ->where(['id' => $metadataKeyId])\n    ->contain('MetadataPrivateKeys')\n    ->first();\nif (!$key || empty($key->metadata_private_keys)) {\n    throw new \\Cake\\Http\\Exception\\NotFoundException('No private key for metadata key ' . $metadataKeyId);\n}","typeGuard":"function hasMetadataPrivateKey(?array $metadataKeys, string $keyId): bool {\n    return isset($metadataKeys[$keyId]['metadata_private_keys'][0]);\n}","tryCatchPattern":"try {\n    $this->executeCommand(ShareMetadataKeyCommand::class, [$metadataKeyId]);\n} catch (\\Cake\\Http\\Exception\\NotFoundException $e) {\n    $io->error('Restore the metadata private key for ' . $metadataKeyId . ' first.');\n}","preventionTips":["Verify metadata_private_keys rows survived instance migrations","Validate the key id exists before running the share command","Monitor metadata key creation flows for partial failures","Keep backups of metadata_private_keys data"],"tags":["metadata","not-found","cli","gpg"],"backgroundTag":"resource-not-found","analyzedSha":"31c1bbc10f32808a607fa9bd81891e898779c0bc","analyzedAt":"2026-09-17T00:04:38.960Z","contentChangedAt":"2026-09-17T00:04:38.960Z","schemaVersion":2},"datasetVersion":"2026-09-21T04:17:39.646Z"}