{"record":{"id":"35e13bda0a553b39","repo":"theonedev/onedev","slug":"please-login-to-perform-this-query-35e13b","errorCode":null,"errorMessage":"Please login to perform this query","messagePattern":"Please login to perform this query","errorType":"http","errorClass":"NotAcceptableException","httpStatus":406,"severity":"error","filePath":"server-core/src/main/java/io/onedev/server/search/entity/pullrequest/ApprovedByMeCriteria.java","lineNumber":34,"sourceCode":"import io.onedev.server.util.ProjectScope;\nimport io.onedev.server.util.criteria.Criteria;\n\npublic class ApprovedByMeCriteria extends ApprovedByCriteria {\n\n\tprivate static final long serialVersionUID = 1L;\n\n\t@Override\n\tpublic User getUser() {\n\t\treturn SecurityUtils.getUser();\n\t}\n\n\t@Override\n\tpublic Predicate getPredicate(@Nullable ProjectScope projectScope, CriteriaQuery<?> query, From<PullRequest, PullRequest> from, CriteriaBuilder builder) {\n\t\tvar user = User.get();\n\t\tif (user != null) \n\t\t\treturn getCriteria(user).getPredicate(projectScope, query, from, builder);\n\t\telse \n\t\t\tthrow new NotAcceptableException(_T(\"Please login to perform this query\"));\n\t}\n\n\t@Override\n\tpublic boolean matches(PullRequest request) {\n\t\tvar user = User.get();\n\t\tif (user != null) \n\t\t\treturn getCriteria(user).matches(request);\n\t\telse \n\t\t\tthrow new NotAcceptableException(_T(\"Please login to perform this query\"));\n\t}\n\t\n\tprivate Criteria<PullRequest> getCriteria(User user) {\n\t\treturn new ApprovedByUserCriteria(user);\n\t}\n\n\t@Override\n\tpublic String toStringWithoutParens() {\n\t\treturn PullRequestQuery.getRuleName(PullRequestQueryLexer.ApprovedByMe);","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/theonedev/onedev/blob/d44925c47c37992c828ea673a5f9620539bc3ff2/server-core/src/main/java/io/onedev/server/search/entity/pullrequest/ApprovedByMeCriteria.java#L16-L52","documentation":"ApprovedByMeCriteria.getPredicate resolves 'me' via User.get(); on an unauthenticated or non-web thread it throws NotAcceptableException('Please login to perform this query') instead of building a JPA predicate for the pull-request query.","triggerScenarios":"Evaluating a pull-request query containing 'approved by me' (getPredicate) while anonymous: unauthenticated REST/GraphQL calls, scheduled jobs, or message handlers without a bound user.","commonSituations":"CI scripts querying pull requests with 'approved by me' using no token; webhooks/background processing evaluating user-relative queries; tests missing user setup.","solutions":["Authenticate the call (login session or access token) before running the query.","Use 'approved by \"<username>\"' (ApprovedByUserCriteria) for headless contexts.","Wrap evaluation in a block that establishes the intended user context.","Catch NotAcceptableException and prompt the client to log in."],"exampleFix":"// before\nquery = \"approved by me\" // anonymous -> 406\n// after\nquery = \"approved by \\\"alice\\\"\" with Authorization header","handlingStrategy":"try-catch","validationCode":"if (SecurityUtils.getUser() == null && queryText.contains(\"approved by me\")) promptLogin();","typeGuard":"User u = User.get(); if (u != null) { /* safe */ }","tryCatchPattern":"try { requests = pullRequestQueryService.query(...); } catch (NotAcceptableException e) { requireAuth(); }","preventionTips":["Attach API tokens to all pull-request query calls","Rewrite 'me' queries with explicit usernames for automation","Bind a user context in background jobs","Treat HTTP 406 as login-required"],"tags":["authentication","pull-request","search"],"backgroundTag":"authentication-required","analyzedSha":"d44925c47c37992c828ea673a5f9620539bc3ff2","analyzedAt":"2026-09-06T07:18:27.995Z","contentChangedAt":"2026-09-06T07:18:27.995Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}