{"record":{"id":"2f233ac4c9d812b3","repo":"passbolt/passbolt_api","slug":"folder-can-not-be-shared","errorCode":null,"errorMessage":"Folder can not be shared","messagePattern":"Folder can not be shared","errorType":"validation","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"plugins/PassboltCe/Metadata/src/Model/Dto/MetadataFolderDto.php","lineNumber":111,"sourceCode":"    }\n\n    /**\n     * @return void\n     * @throws \\Cake\\Http\\Exception\\BadRequestException If folder's metadata key type is not shared_key\n     */\n    public function assertShareable(): void\n    {\n        if (!$this->isFeaturePluginEnabled(MetadataPlugin::class)) {\n            // no check if metadata plugin is not enabled\n            return;\n        }\n\n        if (!$this->isV5()) {\n            return;\n        }\n\n        if ($this->metadataKeyType !== MetadataKey::TYPE_SHARED_KEY) {\n            throw new BadRequestException(__('Folder can not be shared'));\n        }\n    }\n\n    /**\n     * @return array\n     */\n    public function toArray(): array\n    {\n        return [\n            'name' => $this->name,\n            'folder_parent_id' => $this->folderParentId,\n            'metadata' => $this->metadata,\n            'metadata_key_id' => $this->metadataKeyId,\n            'metadata_key_type' => $this->metadataKeyType,\n        ];\n    }\n\n    /**","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/passbolt/passbolt_api/blob/31c1bbc10f32808a607fa9bd81891e898779c0bc/plugins/PassboltCe/Metadata/src/Model/Dto/MetadataFolderDto.php#L93-L129","documentation":"MetadataFolderDto.assertShareable() enforces that a v5 (metadata-based) folder payload carries a shared metadata key; if the folder is v5 but its metadataKeyType is not TYPE_SHARED_KEY, it throws this 400 BadRequestException because folders must be encrypted with a shared key to remain shareable.","triggerScenarios":"Creating/updating a folder with v5 metadata whose key type is 'user_key' instead of 'shared_key'; moving a personal-key-encrypted item into a shared folder context.","commonSituations":"Clients reusing the personal metadata key for folders; migrated v4 folders re-encrypted with a user key; mixing folder/resource key-type rules.","solutions":["Re-encrypt the folder metadata with the shared metadata key (metadata_key_type = 'shared_key').","Use the correct shared key id in the folder's metadata payload.","Keep personal (user) keys for personal items only; folders always use shared keys."],"exampleFix":"// before\n{folder: {metadata_key_id: userKeyId, metadata_key_type: 'user_key', ...}}\n// after\n{folder: {metadata_key_id: sharedKeyId, metadata_key_type: 'shared_key', ...}}","handlingStrategy":"validation","validationCode":"const meta = JSON.parse(decrypt(folder.metadata));\nif (meta.object_type === 'FOLDER' && meta.metadata_key_type !== 'shared_key') throw new Error('folders require shared_key metadata');","typeGuard":"const isShareableFolderMeta = (m) => m.object_type === 'FOLDER' && m.metadata_key_type === 'shared_key';","tryCatchPattern":"try { await api.put(`/folders/${id}`, payload); } catch (e) { if (e.response?.status === 400 && String(e.message).includes('Folder can not be shared')) { return reEncryptFolderWithSharedKey(folder); } throw e; }","preventionTips":["Always encrypt folder metadata with the shared metadata key.","Audit migrated folders for user_key encryption.","Keep key-type logic in one shared client helper."],"tags":["metadata","folders","validation","v5"],"backgroundTag":"invalid-enum-value","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"}