metadata: { organization: "organization-name",
group: "group-name", // ... additional context
}
{ action: "CREATE" | "READ" | "UPDATE" | "DELETE",
author: string, // Who performed the action
date: Date,
mechanism: "API" | "WEB" | "SCHEDULER" | "TASK" | "MIGRATION" | "JIRA" | "FORCES" | "MELTS" | "RETRIEVES" | "FIXES",
metadata: Record<string, unknown>, // MUST include organization & group if applicable object: string, // What was affected
objectId: string // Unique identifier within object type scope }
import { Tracks } from "@fluidattacks/tracks";
const client = new Tracks();
client.event.create({
action: "CREATE",
author: "user@example.com",
date: new Date(),
mechanism: "WEB",
metadata: {
organization: "org-name",
group: "group-name",
description: "New vulnerability created"
},
object: "Vulnerability",
objectId: "vuln-id"
});
from fluidattacks_tracks import Tracks
from fluidattacks_tracks.resources.event import Event
client = Tracks()
client.event.create(
Event(
action="CREATE", author="user@example.com",
date=datetime.now(UTC),
mechanism="WEB",
metadata={
organization: "org-name", group: "group-name",
description: "New vulnerability created"
},
object="Vulnerability", objectId="vuln-id"
)
)
object
field, providing flexibility for different use cases. However, Fluid Attacks applications follow two specific naming patterns to ensure consistency across the platform:objectId
:object: "Vulnerability" objectId: "vuln-id" object: "Group"
objectId: "unittesting" object: "Group.Findings"
objectId: "unittesting" object: "Organization"
objectId: "okada" object: "Organization.Analytics.AcceptedVulnerabilitiesBySeverity"
objectId: "okada" object: "Group.Integrations.Connect.Jira"
objectId: "testgroup"
object: "Login"
objectId: "Microsoft"
object: "Autoenroll.Welcome"
objectId: "unknown"
object: "UploadGroupFile"
objectId: "repo_nickname/group_name"
object: "HelpDeskMenu"
objectId: "unknown"
organization
field is included in metadata (when applicable)group
field is included in metadata (when applicable)object
follows naming conventionauthor
is properly identifiedmechanism
matches the contextobjectId
is unique and meaningfulconst metadata: Record<string, unknown> = {};
if (groupName) metadata.group = groupName;
if (organizationName) metadata.organization = organizationName;
// Includes all required context
metadata: {
organization: "org-name",
group: "group-name",
state: {
source: "ANALYST",
status: "VULNERABLE",
severity: "HIGH" }
}
// Conditional inclusion
const metadata: Record<string, unknown> = {};
if (groupName) metadata.group = groupName;
if (organizationName) metadata.organization = organizationName;
// Inconsistent naming metadata: { org: "org-name", groupName: "group-name" } // Including undefined values metadata: { group: groupName, // Could be undefined organization: organizationName // Could be undefined
}