Skip to content

Fixes #: Activity feed creation API restrictions and UI JSON parsing crash#26679

Open
Copilot wants to merge 10 commits intomainfrom
copilot/fix-activity-feed-api-restrictions
Open

Fixes #: Activity feed creation API restrictions and UI JSON parsing crash#26679
Copilot wants to merge 10 commits intomainfrom
copilot/fix-activity-feed-api-restrictions

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Mar 23, 2026

The feed API accepted and stored tasks with plain-string values in suggestion/oldValue fields that must be JSON arrays (tag tasks), and allowed taskDetails on non-Task thread types. Stored corrupted payloads caused an unrecoverable full-page crash in the UI (Unexpected token 'h', "this is a d"... is not valid JSON).

Backend (FeedRepository.java)

  • validateTaskDetails(): for RequestTag/UpdateTag task types, rejects suggestion or oldValue that is not valid JSON (via JsonUtils.isValidJson())
  • createThread(): rejects any thread of type Conversation, Announcement, etc. that carries a non-null taskDetails

UI (TagsTask.tsx)

  • Extracted all JSON.parse(oldValue), JSON.parse(newValue), JSON.parse(suggestion) calls into individual useMemo hooks with try/catch, falling back to [] on parse failure — prevents the error boundary from catching a render-time exception on already-persisted bad data

Type of change:

  • Bug fix

Checklist:

  • I have read the CONTRIBUTING document.
  • My PR title is Fixes <issue-number>: <short explanation>
  • I have commented on my code, particularly in hard-to-understand areas.
  • For JSON Schema changes: I updated the migration scripts or explained why it is not needed.
  • I have added a test that covers the exact scenario we are fixing. For complex issues, comment the issue number in the test for future reference.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • repository.apache.org
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.13/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.13/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.13 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.13/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service org.codehaus.plexus.classworlds.launcher.Launcher spotless:check -q (dns block)
  • s3.amazonaws.com
    • Triggering command: /usr/lib/jvm/temurin-21-jdk-amd64/bin/java /usr/lib/jvm/temurin-21-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -classpath /usr/share/apache-maven-3.9.13/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.13/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.13 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.13/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/OpenMetadata/OpenMetadata/openmetadata-service org.codehaus.plexus.classworlds.launcher.Launcher spotless:check -q (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>Activity feed creation API restrictions missing</issue_title>
<issue_description>The feed API accepts and stores a corrupted Json object thereafter. As such when retrieving the tasks associated with the corrupted payload, it now results in a non-recoverable crash in the UI. This is with two taks type values RequestApproval and Conversation

example data:

{
"message": "this is a test, I am a very good programmer",
"from": "TestUser",
"about": "<#E::table::testTable::columns::location_id>",
"type": "Task",
"taskDetails": {
"type": "RequestApproval",
"assignees": [
{
"id": "ce782180-36f6-4d4a-9fbe-ee6103d4146f",
"type": "user",
"name": "string",
"fullyQualifiedName": "string",
"description": "this is a description of the task",
"displayName": "string",
"deleted": false,
"inherited": false,
"href": "http://example.com/ (http://example.com/)"
}
],
"oldValue": "this is a test suggestion",
"suggestion": "this is a different test suggestion2"
},
"domains": [
"19cf92da-baa0-7685-84a1-3b8b25da8d01"
]
}
Image

Expectations:

  • Backend should restrict the feed/task creation with a wrong JSON object.
  • UI should not be broken in case of failure in JSON parsing.</issue_description>

Comments on the Issue (you are @copilot in this section)


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI changed the title [WIP] Fix activity feed creation API to handle corrupted Json correctly Fixes #: Activity feed creation API restrictions and UI JSON parsing crash Mar 23, 2026
Copilot AI requested a review from aniketkatkar97 March 23, 2026 06:19
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 2, 2026

Hi there 👋 Thanks for your contribution!

The OpenMetadata team will review the PR shortly! Once it has been labeled as safe to test, the CI workflows
will start executing and we'll be able to make sure everything is working as expected.

Let us know if you need any help!

@sonika-shah sonika-shah marked this pull request as ready for review April 5, 2026 13:29
@sonika-shah sonika-shah requested a review from a team as a code owner April 5, 2026 13:29
Copilot AI review requested due to automatic review settings April 5, 2026 13:30
@sonika-shah sonika-shah added safe to test Add this label to run secure Github workflows on PRs backend labels Apr 5, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR tightens backend validation for activity feed thread creation and hardens the UI against previously-persisted corrupted tag-task payloads that could crash the Tasks UI during render.

Changes:

  • Backend: Rejects taskDetails on non-Task thread types and introduces validateTaskDetails() checks for tag-task JSON fields.
  • UI: Wraps oldValue / newValue / suggestion JSON parsing in useMemo with try/catch fallbacks to prevent render-time crashes.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java Adds taskDetails restrictions by thread type and validates tag-task JSON payload inputs during thread creation.
openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/shared/TagsTask.tsx Adds safe parsing for persisted tag-task JSON fields to avoid UI crashes when encountering bad data.

Comment thread openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/shared/TagsTask.tsx Outdated
Comment thread openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/shared/TagsTask.tsx Outdated
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 5, 2026

Jest test Coverage

UI tests summary

Lines Statements Branches Functions
Coverage: 63%
63.73% (59652/93596) 43.64% (31380/71894) 46.75% (9437/20186)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 5, 2026

🟡 Playwright Results — all passed (26 flaky)

✅ 3659 passed · ❌ 0 failed · 🟡 26 flaky · ⏭️ 89 skipped

Shard Passed Failed Flaky Skipped
🟡 Shard 1 476 0 4 4
🟡 Shard 2 647 0 4 7
🟡 Shard 3 653 0 7 1
🟡 Shard 4 630 0 4 27
🟡 Shard 5 610 0 1 42
🟡 Shard 6 643 0 6 8
🟡 26 flaky test(s) (passed on retry)
  • Features/DataAssetRulesDisabled.spec.ts › Verify the Chart entity item action after rules disabled (shard 1, 2 retries)
  • Features/DataAssetRulesDisabled.spec.ts › Verify the SearchIndex Service entity item action after rules disabled (shard 1, 1 retry)
  • Flow/Tour.spec.ts › Tour should work from help section (shard 1, 1 retry)
  • Pages/UserCreationWithPersona.spec.ts › Create user with persona and verify on profile (shard 1, 1 retry)
  • Features/BulkEditEntity.spec.ts › Glossary (shard 2, 1 retry)
  • Features/ChangeSummaryBadge.spec.ts › AI badge should NOT appear for manually-edited descriptions (shard 2, 1 retry)
  • Features/DataQuality/DataQuality.spec.ts › Table test case (shard 2, 1 retry)
  • Features/Glossary/GlossaryWorkflow.spec.ts › should inherit reviewers from glossary when term is created (shard 2, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 2 retries)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 2 retries)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RestoreEntityInheritedFields.spec.ts › Validate restore with Inherited domain and data products assigned (shard 3, 1 retry)
  • Features/RTL.spec.ts › Verify Following widget functionality (shard 3, 1 retry)
  • Features/Table.spec.ts › Tags term should be consistent for search (shard 3, 1 retry)
  • Pages/Customproperties-part2.spec.ts › entityReferenceList shows item count, scrollable list, no expand toggle (shard 4, 1 retry)
  • Pages/DataContractInheritance.spec.ts › Delete Button Disabled - Fully inherited contracts cannot be deleted (shard 4, 1 retry)
  • Pages/DataContracts.spec.ts › Create Data Contract and validate for Spreadsheet (shard 4, 1 retry)
  • Pages/Entity.spec.ts › Announcement create, edit & delete (shard 4, 1 retry)
  • Pages/EntityDataConsumer.spec.ts › Tier Add, Update and Remove (shard 5, 1 retry)
  • Pages/Lineage/LineageFilters.spec.ts › Verify lineage schema filter selection (shard 6, 1 retry)
  • Pages/Lineage/LineageRightPanel.spec.ts › Verify custom properties tab IS visible for supported type: searchIndex (shard 6, 1 retry)
  • Pages/Lineage/PlatformLineage.spec.ts › Verify domain platform view (shard 6, 1 retry)
  • Pages/Users.spec.ts › Permissions for table details page for Data Consumer (shard 6, 1 retry)
  • Pages/Users.spec.ts › Check permissions for Data Steward (shard 6, 1 retry)
  • VersionPages/GlossaryVersionPage.spec.ts › GlossaryTerm (shard 6, 1 retry)

📦 Download artifacts

How to debug locally
# Download playwright-test-results-<shard> artifact and unzip
npx playwright show-trace path/to/trace.zip    # view trace

);
}
}, [oldValue, newValue]);
}, [oldValue, newValue, parsedOldValue, parsedNewValue]);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Quality: useMemo deps include both raw and parsed values redundantly

The diffView and suggestionDiff useMemo hooks at lines 92 and 112 list both the raw values (oldValue, newValue, suggestion) AND the parsed memoized values (parsedOldValue, parsedNewValue, parsedSuggestion) as dependencies. Since the parsed values are themselves derived from the raw values via useMemo, including both is redundant — the parsed values will always change when raw values change. The dependency arrays should only include the parsed values, since those are the only variables actually used inside the memo callbacks.

Suggested fix:

Change the dependency arrays to only include the parsed values:
// line 92
}, [parsedOldValue, parsedNewValue]);
// line 112
}, [parsedOldValue, parsedSuggestion]);

Was this helpful? React with 👍 / 👎 | Reply gitar fix to apply this suggestion

Copilot AI review requested due to automatic review settings April 13, 2026 20:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

Comment on lines 502 to 514
private Thread createThread(ThreadContext threadContext) {
Thread thread = threadContext.getThread();
if (thread.getType() == ThreadType.Task) {
validateTaskDetails(thread);
validateAssignee(thread);
thread.getTask().withId(getNextTaskId());
} else if (thread.getType() == ThreadType.Announcement) {
// Validate start and end time for announcement
validateAnnouncement(thread);
} else if (thread.getTask() != null) {
throw new IllegalArgumentException(
"taskDetails can only be provided for threads of type Task");
}
Copy link

Copilot AI Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

createThread currently rejects taskDetails for non-Task threads only in the final else if branch. If a client posts an Announcement thread with non-null taskDetails, it will hit the Announcement branch and bypass the rejection, so corrupted task payloads can still be persisted on announcements. Consider checking thread.getTask() != null for all non-ThreadType.Task threads (including Announcement) before the type-specific branches, or add the same rejection inside the Announcement branch.

Copilot uses AI. Check for mistakes.
"taskDetails can only be provided for threads of type Task");
}

@Test
Copy link

Copilot AI Apr 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new integration coverage validates that Conversation threads with non-null taskDetails are rejected, but it doesn’t cover Announcement threads carrying taskDetails. Since createThread has a dedicated Announcement branch, adding a similar 400 test for ThreadType.Announcement would help prevent regressions where announcements accidentally accept and persist task payloads.

Suggested change
@Test
@Test
void post_announcementThreadWithTaskDetails_400(TestNamespace ns) throws Exception {
Table table = createTestTable(ns);
String about = String.format("<#E::table::%s>", table.getFullyQualifiedName());
User assigneeUser = SdkClients.adminClient().users().getByName("admin");
EntityReference assignee = assigneeUser.getEntityReference();
CreateTaskDetails taskDetails =
new CreateTaskDetails()
.withType(TaskType.RequestDescription)
.withAssignees(List.of(assignee))
.withOldValue("old")
.withSuggestion("new");
AnnouncementDetails announcementDetails =
new AnnouncementDetails()
.withStartTime(LocalDateTime.now(ZoneOffset.UTC).plusMinutes(1))
.withEndTime(LocalDateTime.now(ZoneOffset.UTC).plusMinutes(2));
CreateThread createThread =
new CreateThread()
.withFrom(ADMIN_USER)
.withMessage("Announcement with task payload")
.withAbout(about)
.withType(ThreadType.Announcement)
.withAnnouncementDetails(announcementDetails)
.withTaskDetails(taskDetails);
assertThrows(
Exception.class,
() -> createThread(createThread),
"taskDetails can only be provided for threads of type Task");
}
@Test

Copilot uses AI. Check for mistakes.
Comment on lines +1201 to +1211
switch (task.getType()) {
case RequestTag, UpdateTag -> {
validateTagLabelArray(task.getOldValue(), "oldValue", task.getType());
validateTagLabelArray(task.getSuggestion(), "suggestion", task.getType());
}
case RequestTestCaseFailureResolution, RecognizerFeedbackApproval -> {
rejectField(task.getOldValue(), "oldValue", task.getType());
rejectField(task.getSuggestion(), "suggestion", task.getType());
}
case RequestDescription, UpdateDescription, RequestApproval, Generic -> {}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Edge Case: Switch on TaskType lacks default branch for future enum values

The switch at line 1201 explicitly lists all 8 current TaskType values, but has no default branch. If a new TaskType is added to the enum in the future, it will silently pass through validateTaskDetails without any validation — the same class of bug this PR is fixing. Adding a default branch that either throws or logs a warning would make this future-proof.

Suggested fix:

switch (task.getType()) {
  case RequestTag, UpdateTag -> {
    validateTagLabelArray(task.getOldValue(), "oldValue", task.getType());
    validateTagLabelArray(task.getSuggestion(), "suggestion", task.getType());
  }
  case RequestTestCaseFailureResolution, RecognizerFeedbackApproval -> {
    rejectField(task.getOldValue(), "oldValue", task.getType());
    rejectField(task.getSuggestion(), "suggestion", task.getType());
  }
  case RequestDescription, UpdateDescription, RequestApproval, Generic -> {}
  default -> LOG.warn("No field validation defined for task type: {}", task.getType());
}

Was this helpful? React with 👍 / 👎 | Reply gitar fix to apply this suggestion

@gitar-bot
Copy link
Copy Markdown

gitar-bot bot commented Apr 17, 2026

Code Review 👍 Approved with suggestions 3 resolved / 5 findings

Fixes activity feed creation API restrictions and UI JSON parsing crash by addressing validation gaps and redundant field checks. Consider removing redundant dependencies in useMemo hooks and adding a default branch to the TaskType switch for future enum values.

💡 Quality: useMemo deps include both raw and parsed values redundantly

📄 openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/shared/TagsTask.tsx:92 📄 openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/shared/TagsTask.tsx:112

The diffView and suggestionDiff useMemo hooks at lines 92 and 112 list both the raw values (oldValue, newValue, suggestion) AND the parsed memoized values (parsedOldValue, parsedNewValue, parsedSuggestion) as dependencies. Since the parsed values are themselves derived from the raw values via useMemo, including both is redundant — the parsed values will always change when raw values change. The dependency arrays should only include the parsed values, since those are the only variables actually used inside the memo callbacks.

Suggested fix
Change the dependency arrays to only include the parsed values:
// line 92
}, [parsedOldValue, parsedNewValue]);
// line 112
}, [parsedOldValue, parsedSuggestion]);
💡 Edge Case: Switch on TaskType lacks default branch for future enum values

📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1201-1211

The switch at line 1201 explicitly lists all 8 current TaskType values, but has no default branch. If a new TaskType is added to the enum in the future, it will silently pass through validateTaskDetails without any validation — the same class of bug this PR is fixing. Adding a default branch that either throws or logs a warning would make this future-proof.

Suggested fix
switch (task.getType()) {
  case RequestTag, UpdateTag -> {
    validateTagLabelArray(task.getOldValue(), "oldValue", task.getType());
    validateTagLabelArray(task.getSuggestion(), "suggestion", task.getType());
  }
  case RequestTestCaseFailureResolution, RecognizerFeedbackApproval -> {
    rejectField(task.getOldValue(), "oldValue", task.getType());
    rejectField(task.getSuggestion(), "suggestion", task.getType());
  }
  case RequestDescription, UpdateDescription, RequestApproval, Generic -> {}
  default -> LOG.warn("No field validation defined for task type: {}", task.getType());
}
✅ 3 resolved
Bug: isValidJson allows non-array JSON, UI expects TagLabel[]

📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1201-1211 📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1205 📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1209 📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1219-1233
The new validateTaskDetails() calls JsonUtils.isValidJson() which accepts any valid JSON value — including plain strings ("hello"), numbers (42), booleans, and objects. However, the UI (TagsTask.tsx) and the backend task resolution (resolveTagTaskMessageJsonUtils.readObjects) both expect these fields to be JSON arrays of TagLabel objects.

A payload like {"suggestion": "42"} or {"suggestion": ""hello""} would pass the new validation but still cause a deserialization error on task resolution or produce unexpected behavior in the UI (the try/catch would silently swallow the error and show an empty tag list).

Consider validating that the value is a JSON array specifically, e.g. by attempting to deserialize it as a list of TagLabel.

Quality: Field-name validation is redundant with Jackson deserialization

📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1224-1232
The new TASK_DETAILS_FIELDS check serializes the already-deserialized TaskDetails POJO back to a JsonNode and then checks field names. Since the object was already deserialized by Jackson from the request, unknown fields would only appear if the POJO has extra Java fields not in the schema — which is a code bug, not a user input issue. If the goal is to reject unknown JSON properties in the API request, this should be done at the Jackson deserialization layer (e.g., @JsonIgnoreProperties(ignoreUnknown = false) or DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES). The current approach adds overhead (serialize-then-check) without catching the intended case.

Edge Case: Description tasks skip oldValue/suggestion validation entirely

📄 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1196-1210
In validateTaskDetails(), tag tasks validate that oldValue/suggestion are valid JSON arrays, and non-description/non-tag tasks reject these fields entirely. However, description tasks (RequestDescription, UpdateDescription) have no validation at all — any arbitrary string is accepted. While description tasks legitimately use plain strings for these fields (not JSON arrays), there's no length or content validation, meaning very large or malicious payloads could be stored. This is low risk since description values are rendered as plain text in the UI, but it's worth noting as a gap in the validation strategy.

🤖 Prompt for agents
Code Review: Fixes activity feed creation API restrictions and UI JSON parsing crash by addressing validation gaps and redundant field checks. Consider removing redundant dependencies in useMemo hooks and adding a default branch to the TaskType switch for future enum values.

1. 💡 Quality: useMemo deps include both raw and parsed values redundantly
   Files: openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/shared/TagsTask.tsx:92, openmetadata-ui/src/main/resources/ui/src/pages/TasksPage/shared/TagsTask.tsx:112

   The `diffView` and `suggestionDiff` useMemo hooks at lines 92 and 112 list both the raw values (`oldValue`, `newValue`, `suggestion`) AND the parsed memoized values (`parsedOldValue`, `parsedNewValue`, `parsedSuggestion`) as dependencies. Since the parsed values are themselves derived from the raw values via useMemo, including both is redundant — the parsed values will always change when raw values change. The dependency arrays should only include the parsed values, since those are the only variables actually used inside the memo callbacks.

   Suggested fix:
   Change the dependency arrays to only include the parsed values:
   // line 92
   }, [parsedOldValue, parsedNewValue]);
   // line 112
   }, [parsedOldValue, parsedSuggestion]);

2. 💡 Edge Case: Switch on TaskType lacks default branch for future enum values
   Files: openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/FeedRepository.java:1201-1211

   The switch at line 1201 explicitly lists all 8 current `TaskType` values, but has no `default` branch. If a new `TaskType` is added to the enum in the future, it will silently pass through `validateTaskDetails` without any validation — the same class of bug this PR is fixing. Adding a `default` branch that either throws or logs a warning would make this future-proof.

   Suggested fix:
   switch (task.getType()) {
     case RequestTag, UpdateTag -> {
       validateTagLabelArray(task.getOldValue(), "oldValue", task.getType());
       validateTagLabelArray(task.getSuggestion(), "suggestion", task.getType());
     }
     case RequestTestCaseFailureResolution, RecognizerFeedbackApproval -> {
       rejectField(task.getOldValue(), "oldValue", task.getType());
       rejectField(task.getSuggestion(), "suggestion", task.getType());
     }
     case RequestDescription, UpdateDescription, RequestApproval, Generic -> {}
     default -> LOG.warn("No field validation defined for task type: {}", task.getType());
   }

Options

Display: compact → Showing less information.

Comment with these commands to change:

Compact
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

@sonarqubecloud
Copy link
Copy Markdown

@sonarqubecloud
Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend safe to test Add this label to run secure Github workflows on PRs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Activity feed creation API restrictions missing

4 participants