Skip to content

Hidden issues

Serena Fang requested to merge issue-hidden-attribute into master

What does this MR do?

Epic: &5741

Issue: #327355 (closed)

Malicious actors create many issues in public projects/groups for spam. We need a way to be able to hide their issues until they can be reviewed and deemed safe. So we've introduced the ability for admins to ban users, which blocks the user and hides their contributions.

The plan: !64728 (comment 623492866)

  1. Create banned_users table. !64728 (comment 623492866)
  2. Update the app so that when user is banned new record is inserted in banned_users (and the opposite - when user is un-banned, the record is removed). !64728 (comment 623492866)
  3. Update issues finder to exclude results from banned users. Put this change behind feature flag. (this MR)
  4. Enable the feature flag. #330667 (closed)
  5. Monitor performance (e.g. visualization in Grafana).
  6. Continue work towards updating issues.hidden with background worker, and filter using this column. It's important not to ignore this step, so that we are not caught by surprise when banned_users gets to a size that will affect performance.

This MR adds a without_hidden scope to models/issue.rb, which returns a list of issues not authored by banned users, aka hidden issues. Hidden issues cannot be accessed by non-admins. Admin users can still see the hidden issues so they can review the issues' contents.

Note: Sidebar issue counts are currently inaccurate, and currently include hidden issues in the issue count. Ideally, non-admins would see the issue count not including hidden issues. Created a follow-up MR to address this: !67379 (merged)

DB:

exec INSERT INTO banned_users SELECT NOW(), NOW(), id FROM users WHERE id > (SELECT id FROM USERS ORDER BY id DESC OFFSET 1000 LIMIT 1) AND (floor(random() * 100)::int > 80)
explain SELECT "issues".* FROM "issues" WHERE "issues"."id" IN (SELECT "issues"."id" FROM "issues" LEFT JOIN banned_users ON banned_users.user_id = issues.author_id WHERE banned_users.user_id IS NULL) AND ( issues.confidential IS NOT TRUE OR (issues.confidential = TRUE AND (issues.author_id = 33100 OR EXISTS (SELECT TRUE FROM issue_assignees WHERE user_id = 33100 AND issue_id = issues.id) OR EXISTS (SELECT 1 FROM "project_authorizations" WHERE "project_authorizations"."user_id" = 33100 AND (project_authorizations.project_id = issues.project_id) AND (project_authorizations.access_level >= 20))))) AND "issues"."project_id" = 278964 AND ("issues"."state_id" IN (1)) AND "issues"."issue_type" IN (0, 1) ORDER BY "issues"."created_at" DESC, "issues"."id" DESC LIMIT 20 OFFSET 0

https://postgres.ai/console/gitlab/gitlab-production-tunnel-pg12/sessions/5910/commands/19970

Screenshots or Screencasts (strongly suggested)

As admin:

image

As project member:

image

When following a link to a hidden issue:

image

Not signed in:

image

When following a link to a hidden issue, also does not show the issue.

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

Does this MR contain changes to processing or storing of credentials or tokens, authorization and authentication methods or other items described in the security review guidelines? If not, then delete this Security section.

  • [-] Label as security and @ mention @gitlab-com/gl-security/appsec
  • [-] The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • [-] Security reports checked/validated by a reviewer from the AppSec team
Edited by Mayra Cabrera

Merge request reports