diff --git a/opencti-platform/opencti-front/lang/front/de.json b/opencti-platform/opencti-front/lang/front/de.json index 0c072ec5509e..55320d386f03 100644 --- a/opencti-platform/opencti-front/lang/front/de.json +++ b/opencti-platform/opencti-front/lang/front/de.json @@ -90,7 +90,9 @@ "Add indicators": "Indikatoren hinzufügen", "Add individual": "Einzelperson hinzufügen", "Add locations": "Standorte hinzufügen", + "Add new assignees": "Neue Referenten hinzufügen", "Add new labels": "Neue Labels hinzufügen", + "Add new participants": "Neue Teilnehmer hinzufügen", "Add new specific access": "Neuen spezifischen Zugang hinzufügen", "Add notes": "Notizen hinzufügen", "Add observable": "Observable hinzufügen", @@ -2596,6 +2598,7 @@ "The rule has been disabled, clean-up launched...": "Die Regel wurde deaktiviert, Bereinigung eingeleitet...", "The rule has been enabled, rescan of platform data launched...": "Die Regel wurde aktiviert, erneuter Scan der Plattformdaten gestartet...", "The scenario has been correctly generated in your OpenBAS platform": "Das Szenario wurde korrekt in Ihrer OpenBAS-Plattform generiert", + "The STIX ID has been removed": "Die STIX-ID wurde entfernt", "The tag has been added": "Das Tag wurde hinzugefügt", "The tag has been removed": "Das Tag wurde entfernt", "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.": "Das Token fehlt in der Konfiguration Ihrer Plattform. Bitten Sie Ihren Filigran-Vertreter, es Ihnen zur Verfügung zu stellen oder eine Anleitung für den Einsatz vor Ort zu geben. Sie können dazu ein Support-Ticket eröffnen.", diff --git a/opencti-platform/opencti-front/lang/front/en.json b/opencti-platform/opencti-front/lang/front/en.json index c5a9b05b3381..9c84f4b00aa8 100644 --- a/opencti-platform/opencti-front/lang/front/en.json +++ b/opencti-platform/opencti-front/lang/front/en.json @@ -90,7 +90,9 @@ "Add indicators": "Add indicators", "Add individual": "Add individual", "Add locations": "Add locations", + "Add new assignees": "Add new assignees", "Add new labels": "Add new labels", + "Add new participants": "Add new participants", "Add new specific access": "Add new specific access", "Add notes": "Add notes", "Add observable": "Add observable", @@ -2596,6 +2598,7 @@ "The rule has been disabled, clean-up launched...": "The rule has been disabled, clean-up launched...", "The rule has been enabled, rescan of platform data launched...": "The rule has been enabled, rescan of platform data launched...", "The scenario has been correctly generated in your OpenBAS platform": "The scenario has been correctly generated in your OpenBAS platform", + "The STIX ID has been removed": "The STIX ID has been removed", "The tag has been added": "The tag has been added", "The tag has been removed": "The tag has been removed", "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.": "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.", diff --git a/opencti-platform/opencti-front/lang/front/es.json b/opencti-platform/opencti-front/lang/front/es.json index 54b610c81ff1..014b6e227a07 100644 --- a/opencti-platform/opencti-front/lang/front/es.json +++ b/opencti-platform/opencti-front/lang/front/es.json @@ -90,7 +90,9 @@ "Add indicators": "Añadir indicadores", "Add individual": "Agregar individuo", "Add locations": "Añadir una localización", + "Add new assignees": "Agregar nuevos referentes", "Add new labels": "Añadir nuevas etiquetas", + "Add new participants": "Agregar nuevos participantes", "Add new specific access": "Agregar nuevo acceso específico", "Add notes": "Añadir notas", "Add observable": "Añadir un observable", @@ -2596,6 +2598,7 @@ "The rule has been disabled, clean-up launched...": "La regla ha sido desactivada, limpieza lanzada...", "The rule has been enabled, rescan of platform data launched...": "La regla ha sido activada, reescaneo de los datos de la plataforma lanzado...", "The scenario has been correctly generated in your OpenBAS platform": "El escenario se ha generado correctamente en su plataforma OpenBAS", + "The STIX ID has been removed": "El ID de STIX ha sido eliminado", "The tag has been added": "Se ha añadido la etiqueta", "The tag has been removed": "Se ha eliminado la etiqueta", "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.": "Falta el token en la configuración de su plataforma, por favor solicite a su representante de Filigran que se lo proporcione o las instrucciones de despliegue on-premise. Puede abrir un ticket de soporte para ello.", diff --git a/opencti-platform/opencti-front/lang/front/fr.json b/opencti-platform/opencti-front/lang/front/fr.json index 24da31c04594..bb0ca71e9df5 100644 --- a/opencti-platform/opencti-front/lang/front/fr.json +++ b/opencti-platform/opencti-front/lang/front/fr.json @@ -90,7 +90,9 @@ "Add indicators": "Ajouter des indicateurs", "Add individual": "Ajouter un individu", "Add locations": "Ajouter une localisation", + "Add new assignees": "Ajouter de nouveaux référents", "Add new labels": "Ajouter des labels", + "Add new participants": "Ajouter de nouveaux participants", "Add new specific access": "Ajouter un nouvel accès spécifique", "Add notes": "Ajouter des notes", "Add observable": "Ajouter un observable", @@ -2596,6 +2598,7 @@ "The rule has been disabled, clean-up launched...": "La règle a été déséactivée, purge lancée...", "The rule has been enabled, rescan of platform data launched...": "La règle a été activée, re-scan des données de la plateforme lancé...", "The scenario has been correctly generated in your OpenBAS platform": "Le scénario a été correctement généré dans votre plateforme OpenBAS", + "The STIX ID has been removed": "L'ID STIX a été supprimé", "The tag has been added": "La balise a été ajoutée", "The tag has been removed": "La balise a été supprimée", "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.": "Le token est manquant dans la configuration de votre plateforme, veuillez demander à votre représentant Filigran de vous le fournir ou de vous donner des instructions pour le déploiement sur site. Vous pouvez ouvrir un ticket de support pour ce faire.", diff --git a/opencti-platform/opencti-front/lang/front/ja.json b/opencti-platform/opencti-front/lang/front/ja.json index 24bda2de332e..cce613393cc0 100644 --- a/opencti-platform/opencti-front/lang/front/ja.json +++ b/opencti-platform/opencti-front/lang/front/ja.json @@ -90,7 +90,9 @@ "Add indicators": "インジケータの追加", "Add individual": "個人を追加", "Add locations": "ロケーションの追加", + "Add new assignees": "新しい担当者を追加", "Add new labels": "新しいラベルを作成", + "Add new participants": "新しい参加者を追加", "Add new specific access": "新しい特定のアクセス権を追加する", "Add notes": "ノートを追加", "Add observable": "観測結果の追加", @@ -2596,6 +2598,7 @@ "The rule has been disabled, clean-up launched...": "ルールは無効化され、クリーンアップが開始されました...", "The rule has been enabled, rescan of platform data launched...": "ルールが有効化され、プラットフォームデータの再スキャンが開始されました...", "The scenario has been correctly generated in your OpenBAS platform": "シナリオはOpenBASプラットフォームで正しく生成されました。", + "The STIX ID has been removed": "STIX ID が削除されました", "The tag has been added": "タグが追加されました", "The tag has been removed": "タグは削除されました", "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.": "お客様のプラットフォーム構成にトークンがありません。フィリグランの担当者にトークンの提供、またはオンプレミスでの展開方法をお問い合わせください。サポートチケットでお問い合わせください。", diff --git a/opencti-platform/opencti-front/lang/front/ko.json b/opencti-platform/opencti-front/lang/front/ko.json index 28fa5a73b10d..263e6cb18946 100644 --- a/opencti-platform/opencti-front/lang/front/ko.json +++ b/opencti-platform/opencti-front/lang/front/ko.json @@ -90,7 +90,9 @@ "Add indicators": "지표 추가", "Add individual": "개인 추가", "Add locations": "위치 추가", + "Add new assignees": "새로운 담당자를 추가", "Add new labels": "새 라벨 추가", + "Add new participants": "새로운 참가자를 추가", "Add new specific access": "새 특정 접근 추가", "Add notes": "노트 추가", "Add observable": "관찰 가능 항목 추가", @@ -2596,6 +2598,7 @@ "The rule has been disabled, clean-up launched...": "규칙이 비활성화되었습니다, 정리 시작...", "The rule has been enabled, rescan of platform data launched...": "규칙이 활성화되었습니다, 플랫폼 데이터 다시 스캔 시작...", "The scenario has been correctly generated in your OpenBAS platform": "시나리오가 OpenBAS 플랫폼에서 올바르게 생성되었습니다", + "The STIX ID has been removed": "STIX ID가 제거되었습니다", "The tag has been added": "태그가 추가되었습니다", "The tag has been removed": "태그가 제거되었습니다", "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.": "플랫폼 구성에 토큰이 누락되었습니다. Filigran 담당자에게 이를 제공하거나 온프레미스 배포 지침을 요청하십시오. 지원 티켓을 열 수 있습니다.", diff --git a/opencti-platform/opencti-front/lang/front/zh.json b/opencti-platform/opencti-front/lang/front/zh.json index 52f12558b58b..6a85f3386a30 100644 --- a/opencti-platform/opencti-front/lang/front/zh.json +++ b/opencti-platform/opencti-front/lang/front/zh.json @@ -90,7 +90,9 @@ "Add indicators": "添加指标", "Add individual": "添加个人", "Add locations": "添加位置", + "Add new assignees": "添加新的负责人", "Add new labels": "添加新的标签", + "Add new participants": "添加新的参与者", "Add new specific access": "添加新的特定访问权限", "Add notes": "添加注释", "Add observable": "添加可观测数据", @@ -2596,6 +2598,7 @@ "The rule has been disabled, clean-up launched...": "该规则已禁用,清理已启动", "The rule has been enabled, rescan of platform data launched...": "该规则已启用,平台数据的重新扫描已启动", "The scenario has been correctly generated in your OpenBAS platform": "场景已在 OpenBAS 平台正确生成", + "The STIX ID has been removed": "STIX ID 已被删除", "The tag has been added": "标签已添加", "The tag has been removed": "标签已删除", "The token is missing in your platform configuration, please ask your Filigran representative to provide you with it or with on-premise deployment instructions. Your can open a support ticket to do so.": "平台配置中缺少令牌,请要求 Filigran 代表提供令牌或内部部署说明。您可以打开支持票单进行申请。", diff --git a/opencti-platform/opencti-front/src/components/ItemAssignees.tsx b/opencti-platform/opencti-front/src/components/ItemAssignees.tsx index b0c965a0ae85..c7d9cebf1195 100644 --- a/opencti-platform/opencti-front/src/components/ItemAssignees.tsx +++ b/opencti-platform/opencti-front/src/components/ItemAssignees.tsx @@ -1,5 +1,14 @@ import React, { FunctionComponent } from 'react'; -import Button from '@mui/material/Button'; +import Chip from '@mui/material/Chip'; +import { CancelOutlined, PersonOutline } from '@mui/icons-material'; +import { useTheme } from '@mui/styles'; +import { stixDomainObjectMutation } from '@components/common/stix_domain_objects/StixDomainObjectHeader'; +import Tooltip from '@mui/material/Tooltip'; +import { truncate } from '../utils/String'; +import useGranted, { KNOWLEDGE_KNUPDATE } from '../utils/hooks/useGranted'; +import type { Theme } from './Theme'; +import FieldOrEmpty from './FieldOrEmpty'; +import { commitMutation, defaultCommitMutation } from '../relay/environment'; type Node = { readonly entity_type: string; @@ -9,25 +18,52 @@ type Node = { type Props = { assignees: ReadonlyArray; + stixDomainObjectId: string; }; -const ItemAssignees: FunctionComponent = ({ assignees }) => { +const ItemAssignees: FunctionComponent = ({ assignees, stixDomainObjectId }) => { + const theme = useTheme(); + const canUpdateKnowledge = useGranted([KNOWLEDGE_KNUPDATE]); + const handleRemoveAssignee = (removedId: string) => { + const values = assignees.filter((assignee) => assignee.id !== removedId); + const valuesIds = values.map((value) => value.id); + commitMutation({ + mutation: stixDomainObjectMutation, + variables: { + id: stixDomainObjectId, + input: { + key: 'objectAssignee', + value: valuesIds, + }, + }, + ...defaultCommitMutation, + }); + }; return ( -
- {assignees.length > 0 - ? assignees.map((assignee) => ( - - )) - : '-'} -
+ icon={} + label={truncate(assignee.name, 25).toUpperCase()} + style={{ + color: theme.palette.primary.main, + borderColor: theme.palette.primary.main, + margin: '0 7px 7px 0', + borderRadius: theme.borderRadius, + }} + onDelete={canUpdateKnowledge ? () => (handleRemoveAssignee(assignee.id)) : undefined} + deleteIcon={ + + } + /> + + ))} + ); }; diff --git a/opencti-platform/opencti-front/src/components/ItemParticipants.tsx b/opencti-platform/opencti-front/src/components/ItemParticipants.tsx index 180cdaf54bb6..2c718a2fef2b 100644 --- a/opencti-platform/opencti-front/src/components/ItemParticipants.tsx +++ b/opencti-platform/opencti-front/src/components/ItemParticipants.tsx @@ -1,6 +1,14 @@ import React, { FunctionComponent } from 'react'; -import Button from '@mui/material/Button'; +import { useTheme } from '@mui/styles'; +import { CancelOutlined, PersonOutline } from '@mui/icons-material'; +import Chip from '@mui/material/Chip'; +import { stixDomainObjectMutation } from '@components/common/stix_domain_objects/StixDomainObjectHeader'; +import Tooltip from '@mui/material/Tooltip'; import FieldOrEmpty from './FieldOrEmpty'; +import type { Theme } from './Theme'; +import useGranted, { KNOWLEDGE_KNUPDATE } from '../utils/hooks/useGranted'; +import { truncate } from '../utils/String'; +import { commitMutation, defaultCommitMutation } from '../relay/environment'; interface ItemParticipantsProps { participants: { @@ -8,21 +16,50 @@ interface ItemParticipantsProps { readonly id: string readonly name: string }[]; + stixDomainObjectId: string; } -const ItemParticipants: FunctionComponent = ({ participants }) => { +const ItemParticipants: FunctionComponent = ({ participants, stixDomainObjectId }) => { + const theme = useTheme(); + const canUpdateKnowledge = useGranted([KNOWLEDGE_KNUPDATE]); + const handleRemoveParticipant = (removedId: string) => { + const values = participants.filter((participant) => participant.id !== removedId); + const valuesIds = values.map((value) => value.id); + commitMutation({ + mutation: stixDomainObjectMutation, + variables: { + id: stixDomainObjectId, + input: { + key: 'objectParticipant', + value: valuesIds, + }, + }, + ...defaultCommitMutation, + }); + }; return ( {participants.map((participant) => ( - + + } + label={truncate(participant.name, 25).toUpperCase()} + style={{ + color: theme.palette.primary.main, + borderColor: theme.palette.primary.main, + margin: '0 7px 7px 0', + borderRadius: theme.borderRadius, + }} + onDelete={canUpdateKnowledge ? () => (handleRemoveParticipant(participant.id)) : undefined} + deleteIcon={ + + } + /> + ))} ); diff --git a/opencti-platform/opencti-front/src/private/components/cases/tasks/CaseTaskOverview.tsx b/opencti-platform/opencti-front/src/private/components/cases/tasks/CaseTaskOverview.tsx index 3d4555dfb853..db033a67e569 100644 --- a/opencti-platform/opencti-front/src/private/components/cases/tasks/CaseTaskOverview.tsx +++ b/opencti-platform/opencti-front/src/private/components/cases/tasks/CaseTaskOverview.tsx @@ -88,7 +88,7 @@ const CaseTaskOverview: FunctionComponent = ({ > {t_i18n('Assignees')} - + timer(1500))); - -export const objectAssigneeFieldMembersSearchQuery = graphql` - query ObjectAssigneeFieldMembersSearchQuery($search: String, $first: Int, $entityTypes: [MemberType!]) { - members(search: $search, first: $first, entityTypes: $entityTypes) { - edges { - node { - id - entity_type - name - } - } - } - } -`; - -export const objectAssigneeFieldAssigneesSearchQuery = graphql` - query ObjectAssigneeFieldAssigneesSearchQuery($entityTypes: [String!]) { - assignees(entityTypes: $entityTypes) { - edges { - node { - id - entity_type - name - } - } - } - } -`; - -const styles = (theme) => ({ - icon: { - paddingTop: 4, - display: 'inline-block', - color: theme.palette.primary.main, - }, - text: { - display: 'inline-block', - flexGrow: 1, - marginLeft: 10, - }, - autoCompleteIndicator: { - display: 'none', - }, -}); - -class ObjectAssigneeField extends Component { - constructor(props) { - super(props); - const { defaultObjectAssignee } = props; - this.state = { - keyword: '', - assignees: defaultObjectAssignee - ? [ - { - label: defaultObjectAssignee.name, - value: defaultObjectAssignee.id, - type: defaultObjectAssignee.entity_type, - entity: defaultObjectAssignee, - }, - ] - : [], - }; - } - - componentDidMount() { - this.subscription = SEARCH$.subscribe({ - next: () => this.searchAssignees(), - }); - } - - componentWillUnmount() { - this.subscription.unsubscribe(); - } - - handleSearch(event) { - if (event && event.target && event.target.value) { - this.setState({ keyword: event.target.value }); - SEARCH$.next({ action: 'Search' }); - } - } - - searchAssignees() { - fetchQuery(objectAssigneeFieldMembersSearchQuery, { - search: this.state.keyword, - entityTypes: ['User'], - first: 10, - }) - .toPromise() - .then((data) => { - const assignees = pipe( - pathOr([], ['members', 'edges']), - map((n) => ({ - label: n.node.name, - value: n.node.id, - type: n.node.entity_type, - entity: n.node, - })), - )(data); - this.setState({ assignees: union(this.state.assignees, assignees) }); - }); - } - - render() { - const { t, name, style, label, classes, onChange, helpertext, disabled } = this.props; - return ( - a.label.localeCompare(b.label))} - onInputChange={this.handleSearch.bind(this)} - onChange={typeof onChange === 'function' ? onChange.bind(this) : null} - renderOption={(props, option) => ( -
  • -
    - -
    -
    {option.label}
    -
  • - )} - classes={{ clearIndicator: classes.autoCompleteIndicator }} - /> - ); - } -} - -export default compose(inject18n, withStyles(styles))(ObjectAssigneeField); diff --git a/opencti-platform/opencti-front/src/private/components/common/form/ObjectAssigneeField.tsx b/opencti-platform/opencti-front/src/private/components/common/form/ObjectAssigneeField.tsx new file mode 100644 index 000000000000..2cec67606aef --- /dev/null +++ b/opencti-platform/opencti-front/src/private/components/common/form/ObjectAssigneeField.tsx @@ -0,0 +1,141 @@ +import React, { FunctionComponent, useContext, useState } from 'react'; +import { Field } from 'formik'; +import { graphql } from 'react-relay'; +import makeStyles from '@mui/styles/makeStyles'; +import { Option } from '@components/common/form/ReferenceField'; +import { ObjectAssigneeFieldMembersSearchQuery$data } from '@components/common/form/__generated__/ObjectAssigneeFieldMembersSearchQuery.graphql'; +import { fetchQuery } from '../../../../relay/environment'; +import AutocompleteField from '../../../../components/AutocompleteField'; +import { useFormatter } from '../../../../components/i18n'; +import ItemIcon from '../../../../components/ItemIcon'; +import type { Theme } from '../../../../components/Theme'; +import { UserContext } from '../../../../utils/hooks/useAuth'; + +export const objectAssigneeFieldMembersSearchQuery = graphql` + query ObjectAssigneeFieldMembersSearchQuery($search: String, $first: Int, $entityTypes: [MemberType!]) { + members(search: $search, first: $first, entityTypes: $entityTypes) { + edges { + node { + id + entity_type + name + } + } + } + } +`; + +export const objectAssigneeFieldAssigneesSearchQuery = graphql` + query ObjectAssigneeFieldAssigneesSearchQuery($entityTypes: [String!]) { + assignees(entityTypes: $entityTypes) { + edges { + node { + id + entity_type + name + } + } + } + } +`; + +// Deprecated - https://mui.com/system/styles/basics/ +// Do not use it for new code. +const useStyles = makeStyles((theme) => ({ + icon: { + paddingTop: 4, + display: 'inline-block', + color: theme.palette.primary.main, + }, + text: { + display: 'inline-block', + flexGrow: 1, + marginLeft: 10, + }, + autoCompleteIndicator: { + display: 'none', + }, +})); + +interface OptionAssignee extends Option { + type: string; +} +interface ObjectAssigneeFieldProps { + name: string; + onChange?: (name: string, values: OptionAssignee[]) => void; + style?: Record; + helpertext?: unknown; + label?: string, + disabled?: boolean, +} +const ObjectAssigneeField: FunctionComponent = ({ + name, + style, + label, + onChange, + helpertext, + disabled, +}) => { + const classes = useStyles(); + const { t_i18n } = useFormatter(); + const { me } = useContext((UserContext)); + const [assignees, setAssignees] = useState([]); + + const searchAssignees = (event: React.ChangeEvent) => { + fetchQuery(objectAssigneeFieldMembersSearchQuery, { + search: (event && event.target && event.target.value) ?? '', + entityTypes: ['User'], + first: 10, + }) + .toPromise() + .then((data) => { + const newAssignees = ( + (data as ObjectAssigneeFieldMembersSearchQuery$data)?.members?.edges ?? [] + ).map((n) => ({ + label: n.node.name, + value: n.node.id, + type: n.node.entity_type, + })).sort((a, b) => { + // Display first the current user + if (a.value === me?.id) return -1; + if (b.value === me?.id) return 1; + // Sort by alphabetic order + return a.label.localeCompare(b.label); + }); + setAssignees(newAssignees); + }); + }; + + return ( + , + option: { type: string; label: string }, + ) => ( +
  • +
    + +
    +
    {option.label}
    +
  • + )} + classes={{ clearIndicator: classes.autoCompleteIndicator }} + /> + ); +}; + +export default ObjectAssigneeField; diff --git a/opencti-platform/opencti-front/src/private/components/common/form/ObjectParticipantField.tsx b/opencti-platform/opencti-front/src/private/components/common/form/ObjectParticipantField.tsx index 2481d8ac7ec9..c9a81768e7d8 100644 --- a/opencti-platform/opencti-front/src/private/components/common/form/ObjectParticipantField.tsx +++ b/opencti-platform/opencti-front/src/private/components/common/form/ObjectParticipantField.tsx @@ -1,4 +1,4 @@ -import React, { FunctionComponent, useState } from 'react'; +import React, { FunctionComponent, useContext, useState } from 'react'; import { Field } from 'formik'; import { graphql } from 'react-relay'; import { makeStyles } from '@mui/styles'; @@ -9,6 +9,7 @@ import ItemIcon from '../../../../components/ItemIcon'; import type { Theme } from '../../../../components/Theme'; import { Option } from './ReferenceField'; import { ObjectParticipantFieldMembersSearchQuery$data } from './__generated__/ObjectParticipantFieldMembersSearchQuery.graphql'; +import { UserContext } from '../../../../utils/hooks/useAuth'; const objectParticipantFieldMembersSearchQuery = graphql` query ObjectParticipantFieldMembersSearchQuery($search: String, $first: Int, $entityTypes: [MemberType!]) { @@ -63,7 +64,7 @@ interface ObjectParticipantFieldProps { name: string; onChange?: (name: string, values: OptionParticipant[]) => void; style?: Record; - helpertext?: string; + helpertext?: unknown; label?: string, disabled?: boolean, } @@ -77,6 +78,7 @@ const ObjectParticipantField: FunctionComponent = ( }) => { const classes = useStyles(); const { t_i18n } = useFormatter(); + const { me } = useContext((UserContext)); const [participants, setParticipants] = useState([]); const searchParticipants = (event: React.ChangeEvent) => { @@ -93,7 +95,13 @@ const ObjectParticipantField: FunctionComponent = ( label: n.node.name, value: n.node.id, type: n.node.entity_type, - })).sort((a, b) => a.label.localeCompare(b.label)); + })).sort((a, b) => { + // Display first the current user + if (a.value === me?.id) return -1; + if (b.value === me?.id) return 1; + // Sort by alphabetic order + return a.label.localeCompare(b.label); + }); setParticipants(newParticipants); }); }; diff --git a/opencti-platform/opencti-front/src/private/components/common/stix_core_objects_or_stix_relationships/StixCoreObjectOrCoreRelationshipLabelsView.js b/opencti-platform/opencti-front/src/private/components/common/stix_core_objects_or_stix_relationships/StixCoreObjectOrCoreRelationshipLabelsView.js index 507bb5dc130b..950f25bffc4e 100644 --- a/opencti-platform/opencti-front/src/private/components/common/stix_core_objects_or_stix_relationships/StixCoreObjectOrCoreRelationshipLabelsView.js +++ b/opencti-platform/opencti-front/src/private/components/common/stix_core_objects_or_stix_relationships/StixCoreObjectOrCoreRelationshipLabelsView.js @@ -26,6 +26,7 @@ import { truncate } from '../../../../utils/String'; import useGranted, { KNOWLEDGE_KNUPDATE, SETTINGS_SETLABELS } from '../../../../utils/hooks/useGranted'; import CommitMessage from '../form/CommitMessage'; import Transition from '../../../../components/Transition'; +import FieldOrEmpty from '../../../../components/FieldOrEmpty'; // Deprecated - https://mui.com/system/styles/basics/ // Do not use it for new code. @@ -53,7 +54,6 @@ const StixCoreObjectOrCoreRelationshipLabelsView = (props) => { const { t_i18n } = useFormatter(); const { labels, - marginTop, mutationRelationsAdd, mutationRelationDelete, enableReferences = false, @@ -151,51 +151,54 @@ const StixCoreObjectOrCoreRelationshipLabelsView = (props) => { const onReset = () => setOpenAdd(false); return ( -
    - - {t_i18n('Labels')} - - - - - - -
    + <> +
    + + {t_i18n('Labels')} + + + + + + +
    - {map( - (label) => ( - - (enableReferences - ? handleOpenCommitDelete(label) - : handleRemoveLabel(label.id)) : undefined} - deleteIcon={ - - } - /> - - ), - (labels ?? []), - )} + + {map( + (label) => ( + + (enableReferences + ? handleOpenCommitDelete(label) + : handleRemoveLabel(label.id)) : undefined} + deleteIcon={ + + } + /> + + ), + (labels ?? []), + )} + {enableReferences && ( {({ submitForm, isSubmitting, setFieldValue, values }) => ( @@ -303,7 +306,7 @@ const StixCoreObjectOrCoreRelationshipLabelsView = (props) => { )} -
    + ); }; diff --git a/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectHeader.jsx b/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectHeader.jsx index 037fbc8f2384..d49d19621df8 100644 --- a/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectHeader.jsx +++ b/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectHeader.jsx @@ -75,6 +75,16 @@ export const stixDomainObjectMutation = graphql` references: $references ) { x_opencti_stix_ids + objectAssignee { + id + name + entity_type + } + objectParticipant { + id + name + entity_type + } ... on AttackPattern { aliases } diff --git a/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectOverview.jsx b/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectOverview.jsx index 9c5c73b88b17..19d55f5d3efc 100644 --- a/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectOverview.jsx +++ b/opencti-platform/opencti-front/src/private/components/common/stix_domain_objects/StixDomainObjectOverview.jsx @@ -1,7 +1,6 @@ -import React, { Component } from 'react'; +import React, { useState } from 'react'; import * as PropTypes from 'prop-types'; import * as R from 'ramda'; -import withStyles from '@mui/styles/withStyles'; import Paper from '@mui/material/Paper'; import Typography from '@mui/material/Typography'; import Grid from '@mui/material/Grid'; @@ -15,9 +14,13 @@ import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; import IconButton from '@mui/material/IconButton'; -import { BrushOutlined, Delete } from '@mui/icons-material'; +import { Add, BrushOutlined, Delete } from '@mui/icons-material'; import DialogActions from '@mui/material/DialogActions'; import Button from '@mui/material/Button'; +import { Formik } from 'formik'; +import makeStyles from '@mui/styles/makeStyles'; +import ObjectAssigneeField from '../form/ObjectAssigneeField'; +import ObjectParticipantField from '../form/ObjectParticipantField'; import StixCoreObjectOpinions from '../../analyses/opinions/StixCoreObjectOpinions'; import ItemMarkings from '../../../../components/ItemMarkings'; import ItemPatternType from '../../../../components/ItemPatternType'; @@ -26,7 +29,7 @@ import ItemBoolean from '../../../../components/ItemBoolean'; import ItemCreators from '../../../../components/ItemCreators'; import ItemConfidence from '../../../../components/ItemConfidence'; import ItemAuthor from '../../../../components/ItemAuthor'; -import inject18n from '../../../../components/i18n'; +import { useFormatter } from '../../../../components/i18n'; import { commitMutation, MESSAGING$ } from '../../../../relay/environment'; import { stixDomainObjectMutation } from './StixDomainObjectHeader'; import ItemStatus from '../../../../components/ItemStatus'; @@ -37,21 +40,16 @@ import ItemAssignees from '../../../../components/ItemAssignees'; import ItemOpenVocab from '../../../../components/ItemOpenVocab'; import ItemParticipants from '../../../../components/ItemParticipants'; import Transition from '../../../../components/Transition'; +import { fieldSpacingContainerStyle } from '../../../../utils/field'; -const styles = (theme) => ({ +// Deprecated - https://mui.com/system/styles/basics/ +// Do not use it for new code. +const useStyles = makeStyles((theme) => ({ paper: { marginTop: theme.spacing(1), padding: '15px', borderRadius: 4, }, - chip: { - fontSize: 12, - lineHeight: '12px', - backgroundColor: theme.palette.background.accent, - color: theme.palette.text.primary, - textTransform: 'uppercase', - borderRadius: 4, - }, standard_id: { padding: '5px 5px 5px 10px', fontFamily: 'Consolas, monaco, monospace', @@ -62,22 +60,78 @@ const styles = (theme) => ({ : 'rgba(255, 255, 255, 0.02)', lineHeight: '18px', }, -}); +})); + +const StixDomainObjectOverview = ({ + stixDomainObject, + withoutMarking, + withPattern = false, + displayAssignees, + displayParticipants, + displayConfidence = true, + displayReliability = true, +}) => { + const classes = useStyles(); + const { t_i18n, fldt } = useFormatter(); + const [openStixIds, setOpenStixIds] = useState(false); + const [openAddAssignee, setOpenAddAssignee] = useState(false); + const [openAddParticipant, setOpenAddParticipant] = useState(false); + + const handleToggleOpenStixIds = () => { + setOpenStixIds(!openStixIds); + }; + + const handleToggleAddAssignee = () => { + setOpenAddAssignee(!openAddAssignee); + }; + + const handleToggleAddParticipant = () => { + setOpenAddParticipant(!openAddParticipant); + }; -class StixDomainObjectOverview extends Component { - constructor(props) { - super(props); - this.state = { - openStixIds: false, - }; - } + const onSubmitAssignees = (values, { setSubmitting, resetForm }) => { + const currentAssigneesIds = stixDomainObject.objectAssignee.map((assignee) => assignee.id); + const valuesIds = values.objectAssignee.map((assignee) => assignee.value); + const allIds = [...new Set([...currentAssigneesIds, ...valuesIds])]; // 'new Set' to merge without duplicates + commitMutation({ + mutation: stixDomainObjectMutation, + variables: { + id: stixDomainObject.id, + input: { + key: 'objectAssignee', + value: allIds, + }, + }, + onCompleted: () => { + setSubmitting(false); + resetForm(); + handleToggleAddAssignee(); + }, + }); + }; - handleToggleOpenStixIds() { - this.setState({ openStixIds: !this.state.openStixIds }); - } + const onSubmitParticipant = (values, { setSubmitting, resetForm }) => { + const currentParticipantsIds = stixDomainObject.objectParticipant.map((participant) => participant.id); + const valuesIds = values.objectParticipant.map((participant) => participant.value); + const allIds = [...new Set([...currentParticipantsIds, ...valuesIds])]; // 'new Set' to merge without duplicates + commitMutation({ + mutation: stixDomainObjectMutation, + variables: { + id: stixDomainObject.id, + input: { + key: 'objectParticipant', + value: allIds, + }, + }, + onCompleted: () => { + setSubmitting(false); + resetForm(); + handleToggleAddParticipant(); + }, + }); + }; - deleteStixId(stixId) { - const { stixDomainObject } = this.props; + const deleteStixId = (stixId) => { const otherStixIds = stixDomainObject.x_opencti_stix_ids || []; const stixIds = R.filter( (n) => n !== stixDomainObject.standard_id && n !== stixId, @@ -86,298 +140,385 @@ class StixDomainObjectOverview extends Component { commitMutation({ mutation: stixDomainObjectMutation, variables: { - id: this.props.stixDomainObject.id, + id: stixDomainObject.id, input: { key: 'x_opencti_stix_ids', value: stixIds, }, }, - onCompleted: () => MESSAGING$.notifySuccess(this.props.t('The STIX ID has been removed')), + onCompleted: () => MESSAGING$.notifySuccess(t_i18n('The STIX ID has been removed')), }); - } + }; - render() { - const { - t, - fldt, - classes, - stixDomainObject, - withoutMarking, - withPattern, - displayAssignees, - displayParticipants, - displayConfidence = true, - displayReliability = true, - } = this.props; - const otherStixIds = stixDomainObject.x_opencti_stix_ids || []; - const stixIds = R.filter( - (n) => n !== stixDomainObject.standard_id, - otherStixIds, - ); - const isReliabilityOfSource = !stixDomainObject.x_opencti_reliability; - const reliability = isReliabilityOfSource - ? stixDomainObject.createdBy?.x_opencti_reliability - : stixDomainObject.x_opencti_reliability; - return ( - <> - - {t('Basic information')} - - - - - {stixDomainObject.objectMarking && ( - <> - - {t('Marking')} - - - - )} -
    - - {t('Author')} + const otherStixIds = stixDomainObject.x_opencti_stix_ids || []; + const stixIds = R.filter( + (n) => n !== stixDomainObject.standard_id, + otherStixIds, + ); + const isReliabilityOfSource = !stixDomainObject.x_opencti_reliability; + const reliability = isReliabilityOfSource + ? stixDomainObject.createdBy?.x_opencti_reliability + : stixDomainObject.x_opencti_reliability; + + return ( + <> + + {t_i18n('Basic information')} + + + + + {stixDomainObject.objectMarking && ( + <> + + {t_i18n('Marking')} - -
    - {(displayConfidence || displayReliability) && ( - - {displayReliability && ( - - - {t('Reliability')} - {isReliabilityOfSource && ( - - {' '} - ({t('of author')}) - - )} - - - - )} - {displayConfidence && ( - - - {t('Confidence level')} - - - - )} - - )} - - - {t('Original creation date')} - - {fldt(stixDomainObject.created)} - - {t('Modification date')} - - {fldt(stixDomainObject.modified)} -
    - - {withPattern && ( - <> - - {t('Pattern type')} - - - - )} + + )} +
    - {t('Processing status')} + {t_i18n('Author')} - - {displayAssignees && ( -
    +
    + {(displayConfidence || displayReliability) && ( + + {displayReliability && ( + + + {t_i18n('Reliability')} + {isReliabilityOfSource && ( + + {' '} + ({t_i18n('of author')}) + + )} + + + + )} + {displayConfidence && ( + + + {t_i18n('Confidence level')} + + + + )} + + )} + + + {t_i18n('Original creation date')} + + {fldt(stixDomainObject.created)} + + {t_i18n('Modification date')} + + {fldt(stixDomainObject.modified)} + + + {withPattern && ( + <> + + {t_i18n('Pattern type')} + + + + )} + + {t_i18n('Processing status')} + + + {displayAssignees && ( +
    +
    - {t('Assignees')} + {t_i18n('Assignees')} - + + + + +
    - )} - {displayParticipants && ( -
    + +
    + )} + {displayParticipants && ( +
    +
    - {t('Participants')} + {t_i18n('Participants')} - + + + + +
    - )} + +
    + )} + + {t_i18n('Revoked')} + + + + + {t_i18n('Platform creation date')} + + {fldt(stixDomainObject.created_at)} +
    - {t('Revoked')} + {t_i18n('Creators')} - - + +
    +
    - {t('Platform creation date')} + {t_i18n('Standard STIX ID')} - {fldt(stixDomainObject.created_at)} -
    - + - {t('Creators')} - - + +
    -
    - - {t('Standard STIX ID')} - -
    - +
    + - - -
    - -
    - - - -
    -
    -
    -
    - + +
    + +
    +
    +
    - +
    - - - {t('Other STIX IDs')} - - - {stixIds.map( - (stixId) => stixId.length > 0 && ( - - - - - - - - - ), - )} - - - - - - - - ); - } -} + + + + {t_i18n('Other STIX IDs')} + + + {stixIds.map( + (stixId) => stixId.length > 0 && ( + + + + deleteStixId(stixId)} + size="large" + > + + + + + ), + )} + + + + + + + + {({ submitForm, handleReset }) => ( + + {t_i18n('Add new assignees')} + + + + + + + + + )} + + + {({ submitForm }) => ( + + {t_i18n('Add new participants')} + + + + + + + + + )} + + + ); +}; StixDomainObjectOverview.propTypes = { stixDomainObject: PropTypes.object, @@ -391,7 +532,4 @@ StixDomainObjectOverview.propTypes = { displayReliability: PropTypes.bool, }; -export default R.compose( - inject18n, - withStyles(styles), -)(StixDomainObjectOverview); +export default StixDomainObjectOverview; diff --git a/opencti-platform/opencti-front/src/schema/relay.schema.graphql b/opencti-platform/opencti-front/src/schema/relay.schema.graphql index ad36f2e5342a..477ee262e864 100644 --- a/opencti-platform/opencti-front/src/schema/relay.schema.graphql +++ b/opencti-platform/opencti-front/src/schema/relay.schema.graphql @@ -2394,6 +2394,7 @@ interface StixDomainObject { modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile creators: [Creator!] toStix: String @@ -2488,6 +2489,7 @@ type AttackPattern implements BasicObject & StixObject & StixCoreObject & StixDo modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -2624,6 +2626,7 @@ type Campaign implements BasicObject & StixObject & StixCoreObject & StixDomainO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -2799,6 +2802,7 @@ type Note implements BasicObject & StixObject & StixCoreObject & StixDomainObjec modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile authorized_members: [MemberAccess!] currentUserAccessRight: String @@ -2928,6 +2932,7 @@ type ObservedData implements BasicObject & StixObject & StixCoreObject & StixDom modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile authorized_members: [MemberAccess!] currentUserAccessRight: String @@ -3032,6 +3037,7 @@ type Opinion implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile authorized_members: [MemberAccess!] currentUserAccessRight: String @@ -3269,6 +3275,7 @@ type CourseOfAction implements BasicObject & StixObject & StixCoreObject & StixD modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -3474,6 +3481,7 @@ type Individual implements BasicObject & StixObject & StixCoreObject & StixDomai modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile identity_class: String! name: String! @@ -3583,6 +3591,7 @@ type Sector implements BasicObject & StixObject & StixCoreObject & StixDomainObj modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile identity_class: String! name: String! @@ -3687,6 +3696,7 @@ type System implements BasicObject & StixObject & StixCoreObject & StixDomainObj modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile identity_class: String! name: String! @@ -3800,6 +3810,7 @@ type Infrastructure implements BasicObject & StixObject & StixCoreObject & StixD modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! aliases: [String] @@ -3906,6 +3917,7 @@ type IntrusionSet implements BasicObject & StixObject & StixCoreObject & StixDom modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4117,6 +4129,7 @@ type Position implements BasicObject & StixObject & StixCoreObject & StixDomainO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4224,6 +4237,7 @@ type City implements BasicObject & StixObject & StixCoreObject & StixDomainObjec modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4326,6 +4340,7 @@ type Country implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4426,6 +4441,7 @@ type Region implements BasicObject & StixObject & StixCoreObject & StixDomainObj modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4535,6 +4551,7 @@ type Malware implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4653,6 +4670,7 @@ interface ThreatActor implements BasicObject & StixObject & StixCoreObject & Sti modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4727,6 +4745,7 @@ type ThreatActorGroup implements BasicObject & StixObject & StixCoreObject & Sti modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4845,6 +4864,7 @@ type Tool implements BasicObject & StixObject & StixCoreObject & StixDomainObjec modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -4950,6 +4970,7 @@ type Vulnerability implements BasicObject & StixObject & StixCoreObject & StixDo modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -8706,6 +8727,7 @@ type Channel implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -8806,6 +8828,7 @@ type Language implements BasicObject & StixCoreObject & StixDomainObject & StixO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! aliases: [String] @@ -8899,6 +8922,7 @@ type Event implements BasicObject & StixCoreObject & StixDomainObject & StixObje modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -9003,6 +9027,7 @@ type Grouping implements BasicObject & StixObject & StixCoreObject & StixDomainO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile authorized_members: [MemberAccess!] currentUserAccessRight: String @@ -9112,6 +9137,7 @@ type Narrative implements BasicObject & StixCoreObject & StixDomainObject & Stix modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -9375,6 +9401,7 @@ type DataComponent implements BasicObject & StixObject & StixCoreObject & StixDo modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile creators: [Creator!] toStix: String @@ -9473,6 +9500,7 @@ type DataSource implements BasicObject & StixObject & StixCoreObject & StixDomai modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile creators: [Creator!] toStix: String @@ -9689,6 +9717,7 @@ type AdministrativeArea implements BasicObject & StixCoreObject & StixDomainObje modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -10661,6 +10690,7 @@ type MalwareAnalysis implements BasicObject & StixCoreObject & StixDomainObject modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile creators: [Creator!] toStix: String @@ -10869,6 +10899,7 @@ type ThreatActorIndividual implements BasicObject & StixObject & StixCoreObject modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile name: String! description: String @@ -11324,6 +11355,7 @@ type Indicator implements BasicObject & StixObject & StixCoreObject & StixDomain modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile pattern_type: String pattern_version: String @@ -11480,6 +11512,7 @@ type Organization implements BasicObject & StixObject & StixCoreObject & StixDom modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile identity_class: String! name: String! diff --git a/opencti-platform/opencti-front/tests_e2e/incidentResponse/incidentResponse.spec.ts b/opencti-platform/opencti-front/tests_e2e/incidentResponse/incidentResponse.spec.ts index f9d2c158c129..1af82f9cbc42 100644 --- a/opencti-platform/opencti-front/tests_e2e/incidentResponse/incidentResponse.spec.ts +++ b/opencti-platform/opencti-front/tests_e2e/incidentResponse/incidentResponse.spec.ts @@ -152,19 +152,14 @@ test('Incident Response Creation', async ({ page }) => { const processingStatus = incidentResponseDetailsPage.getTextForHeading('Processing status', 'DISABLED'); await expect(processingStatus).toBeVisible(); - const assignees = incidentResponseDetailsPage.getTextForHeading('Assignees', 'ADMIN'); - await expect(assignees).toBeVisible(); - - const participants = incidentResponseDetailsPage.getTextForHeading('Participants', 'ADMIN'); - await expect(participants).toBeVisible(); + await expect(incidentResponseDetailsPage.overview.getAssignee('ADMIN')).toBeVisible(); + await expect(incidentResponseDetailsPage.overview.getParticipant('ADMIN')).toBeVisible(); const revoked = incidentResponseDetailsPage.getTextForHeading('Revoked', 'NO'); await expect(revoked).toBeVisible(); - let labelCampaign = incidentResponseDetailsPage.getTextForHeading('Labels', 'campaign'); - await expect(labelCampaign).toBeVisible(); - let labelReport = incidentResponseDetailsPage.getTextForHeading('Labels', 'report'); - await expect(labelReport).toBeVisible(); + await expect( incidentResponseDetailsPage.overview.getLabel('campaign')).toBeVisible(); + await expect( incidentResponseDetailsPage.overview.getLabel('report')).toBeVisible(); const creators = incidentResponseDetailsPage.getTextForHeading('Creators', 'ADMIN'); await expect(creators).toBeVisible(); @@ -264,12 +259,9 @@ test('Incident Response Creation', async ({ page }) => { await incidentResponseDetailsPage.openLabelsSelect(); await incidentResponseDetailsPage.labelsSelect.selectOption('covid-19'); await incidentResponseDetailsPage.addLabels(); - labelCampaign = incidentResponseDetailsPage.getTextForHeading('Labels', 'campaign'); - await expect(labelCampaign).toBeVisible(); - labelReport = incidentResponseDetailsPage.getTextForHeading('Labels', 'report'); - await expect(labelReport).toBeVisible(); - const labelCovid = incidentResponseDetailsPage.getTextForHeading('Labels', 'covid-19'); - await expect(labelCovid).toBeVisible(); + await expect(incidentResponseDetailsPage.overview.getLabel('campaign')).toBeVisible(); + await expect(incidentResponseDetailsPage.overview.getLabel('report')).toBeVisible(); + await expect(incidentResponseDetailsPage.overview.getLabel('covid-19')).toBeVisible(); // --------- // endregion @@ -374,8 +366,7 @@ test('Incident response live entities creation and relationships', async ({ page const author = incidentResponseDetailsPage.getTextForHeading('Author', 'Jeanne Mitchel'); await expect(author).toBeVisible(); - const labelCampaign = incidentResponseDetailsPage.getTextForHeading('Labels', 'threat'); - await expect(labelCampaign).toBeVisible(); + await expect(incidentResponseDetailsPage.overview.getLabel('threat')).toBeVisible(); // --------- // endregion diff --git a/opencti-platform/opencti-front/tests_e2e/model/SDOOverview.pageModel.ts b/opencti-platform/opencti-front/tests_e2e/model/SDOOverview.pageModel.ts new file mode 100644 index 000000000000..a0a604842f4e --- /dev/null +++ b/opencti-platform/opencti-front/tests_e2e/model/SDOOverview.pageModel.ts @@ -0,0 +1,25 @@ +import { Page } from '@playwright/test'; + +/** + * Common page for all components in Overview tab. + */ +export default class SDOOverview { + constructor(private page: Page) {} + + getAssignee(assignee: string) { + return this.page.getByTestId('sdo-overview-assignees').getByLabel(assignee); + } + + getLabel(label: string) { + return this.page + .getByRole('heading', { name: 'Labels' }) + .locator('..') + .locator('..') + .getByLabel(label); + } + + getParticipant(participant: string) { + return this.page.getByTestId('sdo-overview-participants').getByLabel(participant); + } + +} diff --git a/opencti-platform/opencti-front/tests_e2e/model/incidentResponseDetails.pageModel.ts b/opencti-platform/opencti-front/tests_e2e/model/incidentResponseDetails.pageModel.ts index 5ea361e7ffc8..aacea3d1d651 100644 --- a/opencti-platform/opencti-front/tests_e2e/model/incidentResponseDetails.pageModel.ts +++ b/opencti-platform/opencti-front/tests_e2e/model/incidentResponseDetails.pageModel.ts @@ -1,8 +1,10 @@ import { Page } from '@playwright/test'; import AutocompleteFieldPageModel from './field/AutocompleteField.pageModel'; +import SDOOverview from './SDOOverview.pageModel'; export default class IncidentResponseDetailsPage { labelsSelect = new AutocompleteFieldPageModel(this.page, 'Labels', true); + overview = new SDOOverview(this.page); constructor(private page: Page) {} diff --git a/opencti-platform/opencti-front/tests_e2e/model/reportDetails.pageModel.ts b/opencti-platform/opencti-front/tests_e2e/model/reportDetails.pageModel.ts index b9e7ec12e556..d5dfba887bb1 100644 --- a/opencti-platform/opencti-front/tests_e2e/model/reportDetails.pageModel.ts +++ b/opencti-platform/opencti-front/tests_e2e/model/reportDetails.pageModel.ts @@ -1,10 +1,12 @@ import { Page } from '@playwright/test'; import AutocompleteFieldPageModel from './field/AutocompleteField.pageModel'; import SDOTabs from './SDOTabs.pageModel'; +import SDOOverview from './SDOOverview.pageModel'; export default class ReportDetailsPage { labelsSelect = new AutocompleteFieldPageModel(this.page, 'Labels', true); tabs = new SDOTabs(this.page); + overview = new SDOOverview(this.page); constructor(private page: Page) {} diff --git a/opencti-platform/opencti-front/tests_e2e/report/report.spec.ts b/opencti-platform/opencti-front/tests_e2e/report/report.spec.ts index b2a828adaeec..2115a4a01f00 100644 --- a/opencti-platform/opencti-front/tests_e2e/report/report.spec.ts +++ b/opencti-platform/opencti-front/tests_e2e/report/report.spec.ts @@ -160,19 +160,14 @@ test('Report CRUD', { tag: ['@report', '@knowledge', '@mutation'] }, async ({ pa let processingStatus = reportDetailsPage.getTextForHeading('Processing status', 'NEW'); await expect(processingStatus).toBeVisible(); - const assignees = reportDetailsPage.getTextForHeading('Assignees', 'ADMIN'); - await expect(assignees).toBeVisible(); - - const participants = reportDetailsPage.getTextForHeading('Participants', 'ADMIN'); - await expect(participants).toBeVisible(); + await expect(reportDetailsPage.overview.getAssignee('ADMIN')).toBeVisible(); + await expect(reportDetailsPage.overview.getParticipant('ADMIN')).toBeVisible(); const revoked = reportDetailsPage.getTextForHeading('Revoked', 'NO'); await expect(revoked).toBeVisible(); - let labelCampaign = reportDetailsPage.getTextForHeading('Labels', 'campaign'); - await expect(labelCampaign).toBeVisible(); - let labelReport = reportDetailsPage.getTextForHeading('Labels', 'report'); - await expect(labelReport).toBeVisible(); + await expect(reportDetailsPage.overview.getLabel('campaign')).toBeVisible(); + await expect(reportDetailsPage.overview.getLabel('report')).toBeVisible(); const creators = reportDetailsPage.getTextForHeading('Creators', 'ADMIN'); await expect(creators).toBeVisible(); @@ -275,12 +270,9 @@ test('Report CRUD', { tag: ['@report', '@knowledge', '@mutation'] }, async ({ pa await reportDetailsPage.openLabelsSelect(); await reportDetailsPage.labelsSelect.selectOption('covid-19'); await reportDetailsPage.addLabels(); - labelCampaign = reportDetailsPage.getTextForHeading('Labels', 'campaign'); - await expect(labelCampaign).toBeVisible(); - labelReport = reportDetailsPage.getTextForHeading('Labels', 'report'); - await expect(labelReport).toBeVisible(); - const labelCovid = reportDetailsPage.getTextForHeading('Labels', 'covid-19'); - await expect(labelCovid).toBeVisible(); + await expect(reportDetailsPage.overview.getLabel('campaign')).toBeVisible(); + await expect(reportDetailsPage.overview.getLabel('report')).toBeVisible(); + await expect(reportDetailsPage.overview.getLabel('covid-19')).toBeVisible(); // --------- // endregion @@ -385,8 +377,7 @@ test('Report live entities creation and relationships', { tag: ['@report', '@kno const author = reportDetailsPage.getTextForHeading('Author', 'Jeanne Mitchel'); await expect(author).toBeVisible(); - const labelCampaign = reportDetailsPage.getTextForHeading('Labels', 'threat'); - await expect(labelCampaign).toBeVisible(); + await expect(reportDetailsPage.overview.getLabel('threat')).toBeVisible(); const externalReference = reportDetailsPage.getTextForHeading('EXTERNAL REFERENCES', 'external ref (report.test.pdf)'); await expect(externalReference).toBeVisible(); diff --git a/opencti-platform/opencti-graphql/config/schema/opencti.graphql b/opencti-platform/opencti-graphql/config/schema/opencti.graphql index a39bdfd744ed..33d38935b652 100644 --- a/opencti-platform/opencti-graphql/config/schema/opencti.graphql +++ b/opencti-platform/opencti-graphql/config/schema/opencti.graphql @@ -2476,6 +2476,7 @@ interface StixDomainObject { modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Technical creators: [Creator!] @@ -2641,6 +2642,7 @@ type AttackPattern implements BasicObject & StixObject & StixCoreObject & StixDo modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # AttackPattern name: String! @@ -2866,6 +2868,7 @@ type Campaign implements BasicObject & StixObject & StixCoreObject & StixDomainO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Campaign name: String! @@ -3188,6 +3191,7 @@ type Note implements BasicObject & StixObject & StixCoreObject & StixDomainObjec modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Container authorized_members: [MemberAccess!] @@ -3407,6 +3411,7 @@ type ObservedData implements BasicObject & StixObject & StixCoreObject & StixDom modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Container authorized_members: [MemberAccess!] @@ -3602,6 +3607,7 @@ type Opinion implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Container authorized_members: [MemberAccess!] @@ -4020,6 +4026,7 @@ type CourseOfAction implements BasicObject & StixObject & StixCoreObject & StixD modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # CourseOfAction name: String! @@ -4367,6 +4374,7 @@ type Individual implements BasicObject & StixObject & StixCoreObject & StixDomai modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Identity identity_class: String! @@ -4549,6 +4557,7 @@ type Sector implements BasicObject & StixObject & StixCoreObject & StixDomainObj modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Identity identity_class: String! @@ -4726,6 +4735,7 @@ type System implements BasicObject & StixObject & StixCoreObject & StixDomainObj modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Identity identity_class: String! @@ -4912,6 +4922,7 @@ type Infrastructure implements BasicObject & StixObject & StixCoreObject & StixD modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Infrastructure name: String! @@ -5090,6 +5101,7 @@ type IntrusionSet implements BasicObject & StixObject & StixCoreObject & StixDom modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # IntrusionSet name: String! @@ -5444,6 +5456,7 @@ type Position implements BasicObject & StixObject & StixCoreObject & StixDomainO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Location name: String! @@ -5624,6 +5637,7 @@ type City implements BasicObject & StixObject & StixCoreObject & StixDomainObjec modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Location name: String! @@ -5798,6 +5812,7 @@ type Country implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Location name: String! @@ -5971,6 +5986,7 @@ type Region implements BasicObject & StixObject & StixCoreObject & StixDomainObj modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Location name: String! @@ -6153,6 +6169,7 @@ type Malware implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Malware name: String! @@ -6345,6 +6362,7 @@ interface ThreatActor implements BasicObject & StixObject & StixCoreObject & Sti modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # ThreatActorGroup name: String! @@ -6494,6 +6512,7 @@ type ThreatActorGroup implements BasicObject & StixObject & StixCoreObject & Sti modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # ThreatActorGroup name: String! @@ -6685,6 +6704,7 @@ type Tool implements BasicObject & StixObject & StixCoreObject & StixDomainObjec modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Tool name: String! @@ -6862,6 +6882,7 @@ type Vulnerability implements BasicObject & StixObject & StixCoreObject & StixDo modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Vulnerability name: String! diff --git a/opencti-platform/opencti-graphql/src/generated/graphql.ts b/opencti-platform/opencti-graphql/src/generated/graphql.ts index af3c9f9c57a7..4906f08d9370 100644 --- a/opencti-platform/opencti-graphql/src/generated/graphql.ts +++ b/opencti-platform/opencti-graphql/src/generated/graphql.ts @@ -103,6 +103,7 @@ export type AdministrativeArea = BasicObject & Location & StixCoreObject & StixD objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -631,6 +632,7 @@ export type AttackPattern = BasicObject & StixCoreObject & StixDomainObject & St objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parentAttackPatterns?: Maybe; @@ -1586,6 +1588,7 @@ export type Campaign = BasicObject & StixCoreObject & StixDomainObject & StixObj objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; objective?: Maybe; observedData?: Maybe; opinions?: Maybe; @@ -3082,6 +3085,7 @@ export type Channel = BasicObject & StixCoreObject & StixDomainObject & StixObje objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -3340,6 +3344,7 @@ export type City = BasicObject & Location & StixCoreObject & StixDomainObject & objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -3997,6 +4002,7 @@ export type Country = BasicObject & Location & StixCoreObject & StixDomainObject objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -4262,6 +4268,7 @@ export type CourseOfAction = BasicObject & StixCoreObject & StixDomainObject & S objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -5279,6 +5286,7 @@ export type DataComponent = BasicObject & StixCoreObject & StixDomainObject & St objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -5520,6 +5528,7 @@ export type DataSource = BasicObject & StixCoreObject & StixDomainObject & StixO objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -7092,6 +7101,7 @@ export type Event = BasicObject & StixCoreObject & StixDomainObject & StixObject objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -8102,6 +8112,7 @@ export type Grouping = BasicObject & Container & StixCoreObject & StixDomainObje objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; objects?: Maybe; observedData?: Maybe; opinions?: Maybe; @@ -9794,6 +9805,7 @@ export type Indicator = BasicObject & StixCoreObject & StixDomainObject & StixOb objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observables?: Maybe; observedData?: Maybe; opinions?: Maybe; @@ -10087,6 +10099,7 @@ export type Individual = BasicObject & Identity & StixCoreObject & StixDomainObj objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; organizations?: Maybe; @@ -10386,6 +10399,7 @@ export type Infrastructure = BasicObject & StixCoreObject & StixDomainObject & S objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -10868,6 +10882,7 @@ export type IntrusionSet = BasicObject & StixCoreObject & StixDomainObject & Sti objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -11312,6 +11327,7 @@ export type Language = BasicObject & StixCoreObject & StixDomainObject & StixObj objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -12099,6 +12115,7 @@ export type Malware = BasicObject & StixCoreObject & StixDomainObject & StixObje objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -12345,6 +12362,7 @@ export type MalwareAnalysis = BasicObject & StixCoreObject & StixDomainObject & objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; operatingSystem?: Maybe; opinions?: Maybe; @@ -15623,6 +15641,7 @@ export type Narrative = BasicObject & StixCoreObject & StixDomainObject & StixOb objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parentNarratives?: Maybe; @@ -16086,6 +16105,7 @@ export type Note = BasicObject & Container & StixCoreObject & StixDomainObject & objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; objects?: Maybe; observedData?: Maybe; opinions?: Maybe; @@ -16544,6 +16564,7 @@ export type ObservedData = BasicObject & Container & StixCoreObject & StixDomain objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; objects?: Maybe; observedData?: Maybe; opinions?: Maybe; @@ -16862,6 +16883,7 @@ export type Opinion = BasicObject & Container & StixCoreObject & StixDomainObjec objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; objects?: Maybe; observedData?: Maybe; opinion: Scalars['String']['output']; @@ -17195,6 +17217,7 @@ export type Organization = BasicObject & Identity & StixCoreObject & StixDomainO objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parentOrganizations?: Maybe; @@ -18214,6 +18237,7 @@ export type Position = BasicObject & Location & StixCoreObject & StixDomainObjec objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -21709,6 +21733,7 @@ export type Region = BasicObject & Location & StixCoreObject & StixDomainObject objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parentRegions?: Maybe; @@ -22547,6 +22572,7 @@ export type Sector = BasicObject & Identity & StixCoreObject & StixDomainObject objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parentSectors?: Maybe; @@ -24179,6 +24205,7 @@ export type StixDomainObject = { objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -25668,6 +25695,7 @@ export type System = BasicObject & Identity & StixCoreObject & StixDomainObject objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; organizations?: Maybe; @@ -26511,6 +26539,7 @@ export type ThreatActor = { objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -26728,6 +26757,7 @@ export type ThreatActorGroup = BasicObject & StixCoreObject & StixDomainObject & objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -27020,6 +27050,7 @@ export type ThreatActorIndividual = BasicObject & StixCoreObject & StixDomainObj objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -27319,6 +27350,7 @@ export type Tool = BasicObject & StixCoreObject & StixDomainObject & StixObject objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -28840,6 +28872,7 @@ export type Vulnerability = BasicObject & StixCoreObject & StixDomainObject & St objectLabel?: Maybe>; objectMarking?: Maybe>; objectOrganization?: Maybe>; + objectParticipant?: Maybe>; observedData?: Maybe; opinions?: Maybe; parent_types: Array>; @@ -31623,6 +31656,7 @@ export type AdministrativeAreaResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -31810,6 +31844,7 @@ export type AttackPatternResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parentAttackPatterns?: Resolver, ParentType, ContextType, Partial>; @@ -32129,6 +32164,7 @@ export type CampaignResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; objective?: Resolver, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; @@ -32555,6 +32591,7 @@ export type ChannelResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -32623,6 +32660,7 @@ export type CityResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -32878,6 +32916,7 @@ export type CountryResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -32956,6 +32995,7 @@ export type CourseOfActionResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -33276,6 +33316,7 @@ export type DataComponentResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -33343,6 +33384,7 @@ export type DataSourceResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -33902,6 +33944,7 @@ export type EventResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -34276,6 +34319,7 @@ export type GroupingResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; objects?: Resolver, ParentType, ContextType, Partial>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; @@ -34726,6 +34770,7 @@ export type IndicatorResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observables?: Resolver, ParentType, ContextType, Partial>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; @@ -34812,6 +34857,7 @@ export type IndividualResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; organizations?: Resolver, ParentType, ContextType>; @@ -34910,6 +34956,7 @@ export type InfrastructureResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -35110,6 +35157,7 @@ export type IntrusionSetResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -35277,6 +35325,7 @@ export type LanguageResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -35529,6 +35578,7 @@ export type MalwareResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -35589,6 +35639,7 @@ export type MalwareAnalysisResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; operatingSystem?: Resolver, ParentType, ContextType>; opinions?: Resolver, ParentType, ContextType, Partial>; @@ -36331,6 +36382,7 @@ export type NarrativeResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parentNarratives?: Resolver, ParentType, ContextType>; @@ -36457,6 +36509,7 @@ export type NoteResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; objects?: Resolver, ParentType, ContextType, Partial>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; @@ -36641,6 +36694,7 @@ export type ObservedDataResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; objects?: Resolver, ParentType, ContextType, Partial>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; @@ -36729,6 +36783,7 @@ export type OpinionResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; objects?: Resolver, ParentType, ContextType, Partial>; observedData?: Resolver, ParentType, ContextType, Partial>; opinion?: Resolver; @@ -36813,6 +36868,7 @@ export type OrganizationResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parentOrganizations?: Resolver, ParentType, ContextType>; @@ -37160,6 +37216,7 @@ export type PositionResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -37738,6 +37795,7 @@ export type RegionResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parentRegions?: Resolver, ParentType, ContextType>; @@ -38055,6 +38113,7 @@ export type SectorResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parentSectors?: Resolver, ParentType, ContextType>; @@ -38570,6 +38629,7 @@ export type StixDomainObjectResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -39156,6 +39216,7 @@ export type SystemResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; organizations?: Resolver, ParentType, ContextType>; @@ -39411,6 +39472,7 @@ export type ThreatActorResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -39487,6 +39549,7 @@ export type ThreatActorGroupResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -39583,6 +39646,7 @@ export type ThreatActorIndividualResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -39663,6 +39727,7 @@ export type ToolResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; @@ -40121,6 +40186,7 @@ export type VulnerabilityResolvers>, ParentType, ContextType>; objectMarking?: Resolver>, ParentType, ContextType>; objectOrganization?: Resolver>, ParentType, ContextType>; + objectParticipant?: Resolver>, ParentType, ContextType>; observedData?: Resolver, ParentType, ContextType, Partial>; opinions?: Resolver, ParentType, ContextType, Partial>; parent_types?: Resolver>, ParentType, ContextType>; diff --git a/opencti-platform/opencti-graphql/src/modules/administrativeArea/administrativeArea.graphql b/opencti-platform/opencti-graphql/src/modules/administrativeArea/administrativeArea.graphql index 1e5a758a5288..a53e470a6129 100644 --- a/opencti-platform/opencti-graphql/src/modules/administrativeArea/administrativeArea.graphql +++ b/opencti-platform/opencti-graphql/src/modules/administrativeArea/administrativeArea.graphql @@ -91,6 +91,7 @@ type AdministrativeArea implements BasicObject & StixCoreObject & StixDomainObje modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Location name: String! diff --git a/opencti-platform/opencti-graphql/src/modules/channel/channel.graphql b/opencti-platform/opencti-graphql/src/modules/channel/channel.graphql index 0093cd54c419..01e8154182d4 100644 --- a/opencti-platform/opencti-graphql/src/modules/channel/channel.graphql +++ b/opencti-platform/opencti-graphql/src/modules/channel/channel.graphql @@ -92,6 +92,7 @@ type Channel implements BasicObject & StixObject & StixCoreObject & StixDomainOb modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Channel name: String! diff --git a/opencti-platform/opencti-graphql/src/modules/dataComponent/dataComponent.graphql b/opencti-platform/opencti-graphql/src/modules/dataComponent/dataComponent.graphql index 946af74370c1..4db789677d58 100644 --- a/opencti-platform/opencti-graphql/src/modules/dataComponent/dataComponent.graphql +++ b/opencti-platform/opencti-graphql/src/modules/dataComponent/dataComponent.graphql @@ -93,6 +93,7 @@ type DataComponent implements BasicObject & StixObject & StixCoreObject & StixDo modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Technical creators: [Creator!] diff --git a/opencti-platform/opencti-graphql/src/modules/dataSource/dataSource.graphql b/opencti-platform/opencti-graphql/src/modules/dataSource/dataSource.graphql index 523647ae471c..a45e2dabc5f5 100644 --- a/opencti-platform/opencti-graphql/src/modules/dataSource/dataSource.graphql +++ b/opencti-platform/opencti-graphql/src/modules/dataSource/dataSource.graphql @@ -93,6 +93,7 @@ type DataSource implements BasicObject & StixObject & StixCoreObject & StixDomai modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Technical creators: [Creator!] diff --git a/opencti-platform/opencti-graphql/src/modules/event/event.graphql b/opencti-platform/opencti-graphql/src/modules/event/event.graphql index 914766f3e173..ef5259318bc2 100644 --- a/opencti-platform/opencti-graphql/src/modules/event/event.graphql +++ b/opencti-platform/opencti-graphql/src/modules/event/event.graphql @@ -92,6 +92,7 @@ type Event implements BasicObject & StixCoreObject & StixDomainObject & StixObje modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Event name: String! diff --git a/opencti-platform/opencti-graphql/src/modules/grouping/grouping.graphql b/opencti-platform/opencti-graphql/src/modules/grouping/grouping.graphql index 856c0a7d1226..8f626a33cd8c 100644 --- a/opencti-platform/opencti-graphql/src/modules/grouping/grouping.graphql +++ b/opencti-platform/opencti-graphql/src/modules/grouping/grouping.graphql @@ -92,6 +92,7 @@ type Grouping implements BasicObject & StixObject & StixCoreObject & StixDomainO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Container authorized_members: [MemberAccess!] diff --git a/opencti-platform/opencti-graphql/src/modules/indicator/indicator.graphql b/opencti-platform/opencti-graphql/src/modules/indicator/indicator.graphql index f1aad61ad0db..d51f19d9314f 100644 --- a/opencti-platform/opencti-graphql/src/modules/indicator/indicator.graphql +++ b/opencti-platform/opencti-graphql/src/modules/indicator/indicator.graphql @@ -145,6 +145,7 @@ type Indicator implements BasicObject & StixObject & StixCoreObject & StixDomain modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Indicator pattern_type: String diff --git a/opencti-platform/opencti-graphql/src/modules/language/language.graphql b/opencti-platform/opencti-graphql/src/modules/language/language.graphql index eb7fcc8510de..243cec4b42e1 100644 --- a/opencti-platform/opencti-graphql/src/modules/language/language.graphql +++ b/opencti-platform/opencti-graphql/src/modules/language/language.graphql @@ -92,6 +92,7 @@ type Language implements BasicObject & StixCoreObject & StixDomainObject & StixO modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Language name: String! diff --git a/opencti-platform/opencti-graphql/src/modules/malwareAnalysis/malwareAnalysis.graphql b/opencti-platform/opencti-graphql/src/modules/malwareAnalysis/malwareAnalysis.graphql index 34e7917ae47a..37e5ad25136b 100644 --- a/opencti-platform/opencti-graphql/src/modules/malwareAnalysis/malwareAnalysis.graphql +++ b/opencti-platform/opencti-graphql/src/modules/malwareAnalysis/malwareAnalysis.graphql @@ -92,6 +92,7 @@ type MalwareAnalysis implements BasicObject & StixCoreObject & StixDomainObject modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Technical creators: [Creator!] diff --git a/opencti-platform/opencti-graphql/src/modules/narrative/narrative.graphql b/opencti-platform/opencti-graphql/src/modules/narrative/narrative.graphql index 91fb1a887c5b..eb94531360b1 100644 --- a/opencti-platform/opencti-graphql/src/modules/narrative/narrative.graphql +++ b/opencti-platform/opencti-graphql/src/modules/narrative/narrative.graphql @@ -92,6 +92,7 @@ type Narrative implements BasicObject & StixCoreObject & StixDomainObject & Stix modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Narrative name: String! diff --git a/opencti-platform/opencti-graphql/src/modules/organization/organization.graphql b/opencti-platform/opencti-graphql/src/modules/organization/organization.graphql index 7d45dd6fa288..c9d1f3689da0 100644 --- a/opencti-platform/opencti-graphql/src/modules/organization/organization.graphql +++ b/opencti-platform/opencti-graphql/src/modules/organization/organization.graphql @@ -92,6 +92,7 @@ type Organization implements BasicObject & StixObject & StixCoreObject & StixDom modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # Identity identity_class: String! diff --git a/opencti-platform/opencti-graphql/src/modules/threatActorIndividual/threatActorIndividual.graphql b/opencti-platform/opencti-graphql/src/modules/threatActorIndividual/threatActorIndividual.graphql index 695c287bdede..e60fdf7a018b 100644 --- a/opencti-platform/opencti-graphql/src/modules/threatActorIndividual/threatActorIndividual.graphql +++ b/opencti-platform/opencti-graphql/src/modules/threatActorIndividual/threatActorIndividual.graphql @@ -102,6 +102,7 @@ type ThreatActorIndividual implements BasicObject & StixObject & StixCoreObject modified: DateTime x_opencti_graph_data: String objectAssignee: [Assignee!] + objectParticipant: [Participant!] avatar: OpenCtiFile # ThreatActorIndividual name: String!