{"record":{"id":"960a3ba3e4014925","repo":"invoke-ai/InvokeAI","slug":"queue-user-is-not-authorized-to-save-images-to-thi","errorCode":null,"errorMessage":"Queue user is not authorized to save images to this board","messagePattern":"Queue user is not authorized to save images to this board","errorType":"exception","errorClass":"PermissionError","httpStatus":null,"severity":"error","filePath":"invokeai/app/services/shared/invocation_context.py","lineNumber":247,"sourceCode":"        if board_id:\n            board_id_ = board_id\n        elif isinstance(self._data.invocation, WithBoard) and self._data.invocation.board:\n            board_id_ = self._data.invocation.board.board_id\n\n        if self._services.configuration.multiuser:\n            user = self._services.users.get(self._data.queue_item.user_id)\n            # A deactivated or deleted account must not save outputs, even\n            # uncategorized ones — deactivation revokes queue-time privileges.\n            if user is None or not user.is_active:\n                raise PermissionError(\"Queue user is not authorized to save images\")\n            if board_id_ is not None:\n                board = self._services.boards.get_dto(board_id_)\n                if (\n                    not user.is_admin\n                    and board.user_id != self._data.queue_item.user_id\n                    and board.board_visibility != BoardVisibility.Public\n                ):\n                    raise PermissionError(\"Queue user is not authorized to save images to this board\")\n\n        workflow_ = None\n        if self._data.queue_item.workflow:\n            workflow_ = self._data.queue_item.workflow.model_dump_json()\n\n        graph_ = None\n        if self._data.queue_item.session.graph:\n            graph_ = self._data.queue_item.session.graph.model_dump_json()\n\n        return self._services.images.create(\n            image=image,\n            is_intermediate=self._data.invocation.is_intermediate,\n            image_category=image_category,\n            board_id=board_id_,\n            metadata=metadata_,\n            image_origin=ResourceOrigin.INTERNAL,\n            workflow=workflow_,\n            graph=graph_,","sourceCodeStart":229,"sourceCodeEnd":265,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/services/shared/invocation_context.py#L229-L265","documentation":"ImagesInterface.save throws PermissionError when a non-admin queue user tries to save to a board they neither own nor that is Public. Board ownership and visibility determine who may write images to it.","triggerScenarios":"images.save(image, board_id=X) where the queue user is not admin, board X's user_id differs from queue_item.user_id, and board X's board_visibility is not Public.","commonSituations":"Workflow hardcoded with another user's board id; team deployments pointing shared workflows at a private admin board; copying board ids between user sessions.","solutions":["Save to a board owned by the queue user (omit board_id to auto-create/own it)","Use a Public board as the destination","Have an admin run the workflow if the target board must stay private to its owner","Catch PermissionError and fall back to saving without board_id"],"exampleFix":"# before\ncontext.images.save(image, board_id=admins_private_board)\n# after\nuser = services.users.get(context.queue_item.user_id)\nboard = services.boards.get_dto(board_id)\nif user.is_admin or board.user_id == user.id or board.board_visibility == BoardVisibility.Public:\n    context.images.save(image, board_id=board_id)\nelse:\n    context.images.save(image)","handlingStrategy":"validation","validationCode":"board = services.boards.get_dto(board_id)\nuser = services.users.get(queue_item.user_id)\nif not (user.is_admin or board.user_id == queue_item.user_id or board.board_visibility == BoardVisibility.Public):\n    raise SkipSave(\"board not writable by queue user\")","typeGuard":"def can_write_board(services, queue_item, board_id: str) -> bool:\n    user = services.users.get(queue_item.user_id)\n    board = services.boards.get_dto(board_id)\n    return bool(user and user.is_active) and (\n        user.is_admin\n        or board.user_id == queue_item.user_id\n        or board.board_visibility == BoardVisibility.Public\n    )","tryCatchPattern":"try:\n    context.images.save(image, board_id=board_id)\nexcept PermissionError:\n    context.images.save(image)  # save without restricted board","preventionTips":["Use board ids owned by the queue user","Prefer Public boards for shared workflow destinations","Never hardcode another user's board id in workflows","Fall back to uncategorized save on PermissionError"],"tags":["permissions","multiuser","invokeai","boards"],"backgroundTag":"permission-denied","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}