{"record":{"id":"c98414c6484ca4d7","repo":"actualbudget/actual","slug":"fileaccesserror-requirefileowner-denial","errorCode":null,"errorMessage":"fileAccessError (requireFileOwner denial)","messagePattern":"fileAccessError \\(requireFileOwner denial\\)","errorType":"http","errorClass":null,"httpStatus":403,"severity":"error","filePath":"packages/sync-server/src/app-sync.ts","lineNumber":244,"sourceCode":"      salt: file.encryptSalt,\n      test: file.encryptTest,\n    },\n  });\n});\n\napp.post('/user-create-key', (req, res) => {\n  const { fileId, keyId, keySalt, testContent } = req.body || {};\n\n  const filesService = new FilesService(getAccountDb());\n  const file = verifyFileExists(fileId, filesService, res, 'file-not-found');\n\n  if (!file) {\n    return;\n  }\n\n  const fileAccessError = requireFileOwner(file, res.locals.user_id);\n  if (fileAccessError) {\n    res.status(403);\n    res.send(fileAccessError);\n    return;\n  }\n\n  filesService.update(\n    file.id,\n    new FileUpdate({\n      encryptSalt: keySalt,\n      encryptKeyId: keyId,\n      encryptTest: testContent,\n    }),\n  );\n\n  res.send(OK_RESPONSE);\n});\n\napp.post('/reset-user-file', async (req, res) => {\n  const { fileId } = req.body || {};","sourceCodeStart":226,"sourceCodeEnd":262,"githubUrl":"https://github.com/actualbudget/actual/blob/d4334cb6e6123f4d3bcea1ad6166608884c7e658/packages/sync-server/src/app-sync.ts#L226-L262","documentation":"Error \"fileAccessError (requireFileOwner denial)\" thrown in actualbudget/actual.","triggerScenarios":"Thrown at packages/sync-server/src/app-sync.ts:244 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"d4334cb6e6123f4d3bcea1ad6166608884c7e658","analyzedAt":"2026-08-29T01:02:11.213Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}