From 18a49f8ddea97f0823ccab4be78ec43e31669560 Mon Sep 17 00:00:00 2001 From: Jeremy Cloarec Date: Wed, 22 Oct 2025 16:51:39 +0200 Subject: [PATCH 1/7] [worker] add new thread pool dedicated to internal queues --- opencti-worker/src/worker.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/opencti-worker/src/worker.py b/opencti-worker/src/worker.py index fa94cd461ba1..58a59fd5b415 100644 --- a/opencti-worker/src/worker.py +++ b/opencti-worker/src/worker.py @@ -42,6 +42,10 @@ ) +def is_internal_connector(connector_type: str) -> bool: + return connector_type == "INTERNAL_INGESTION" or connector_type == "internal" + + @dataclass(unsafe_hash=True) class Worker: # pylint: disable=too-few-public-methods, too-many-instance-attributes consumers: Dict[str, MessageQueueConsumer] = field(default_factory=dict, hash=False) @@ -79,6 +83,13 @@ def __post_init__(self) -> None: True, default=5, ) + self.opencti_internal_pool_size = get_config_variable( + "OPENCTI_INTERNAL_EXECUTION_POOL_SIZE", + ["opencti", "internal_execution_pool_size"], + config, + True, + default=5, + ) self.listen_pool_size = get_config_variable( "WORKER_LISTEN_POOL_SIZE", ["worker", "listen_pool_size"], @@ -206,6 +217,7 @@ def stop(self) -> None: # Start the main loop def start(self) -> None: push_execution_pool = ThreadPoolExecutor(max_workers=self.opencti_pool_size) + internal_push_execution_pool = ThreadPoolExecutor(max_workers=self.opencti_internal_pool_size) listen_execution_pool = ThreadPoolExecutor(max_workers=self.listen_pool_size) while not self.exit_event.is_set(): @@ -250,12 +262,15 @@ def start(self) -> None: bundles_processing_time_gauge, self.objects_max_refs, ) + execution_pool = push_execution_pool + if is_internal_connector(connector["connector_type"]): + execution_pool = internal_push_execution_pool self.consumers[push_queue] = MessageQueueConsumer( self.worker_logger, "push", push_queue, pika_parameters, - push_execution_pool, + execution_pool, push_handler.handle_message, ) From 0f32a689b34aa95379bfef08966499aa0b9acc63 Mon Sep 17 00:00:00 2001 From: Jeremy Cloarec Date: Thu, 23 Oct 2025 18:25:05 +0200 Subject: [PATCH 2/7] [backend/worker] add connector_priority_group to connector and handle is_priority_connector REALTIME in separate threadpool in worker --- .../src/schema/relay.schema.graphql | 6 + .../config/schema/opencti.graphql | 6 + .../src/connector/internalConnector.d.ts | 2 + .../src/database/repository.js | 3 + .../opencti-graphql/src/domain/connector.ts | 113 ++++++++++++------ .../opencti-graphql/src/generated/graphql.ts | 8 ++ .../internalObject-registrationAttributes.ts | 2 + .../draftWorkspace-connector.ts | 2 + .../src/modules/form/form-domain.ts | 77 +++++++----- .../src/resolvers/connector.js | 2 + opencti-worker/src/worker.py | 16 +-- 11 files changed, 159 insertions(+), 78 deletions(-) diff --git a/opencti-platform/opencti-front/src/schema/relay.schema.graphql b/opencti-platform/opencti-front/src/schema/relay.schema.graphql index 236023f79c3f..cf072f842896 100644 --- a/opencti-platform/opencti-front/src/schema/relay.schema.graphql +++ b/opencti-platform/opencti-front/src/schema/relay.schema.graphql @@ -2300,6 +2300,11 @@ type ManagerContractExcerpt { slug: String! } +enum ConnectorPriorityGroup { + REALTIME + DEFAULT +} + type Connector implements BasicObject & InternalObject { id: ID! standard_id: String! @@ -2324,6 +2329,7 @@ type Connector implements BasicObject & InternalObject { connector_user: User connector_queue_details: ConnectorQueueDetails! connector_info: ConnectorInfo + connector_priority_group: ConnectorPriorityGroup! updated_at: DateTime refreshed_at: DateTime created_at: DateTime diff --git a/opencti-platform/opencti-graphql/config/schema/opencti.graphql b/opencti-platform/opencti-graphql/config/schema/opencti.graphql index 97ab8c8980f6..16f27bc3788b 100644 --- a/opencti-platform/opencti-graphql/config/schema/opencti.graphql +++ b/opencti-platform/opencti-graphql/config/schema/opencti.graphql @@ -2204,6 +2204,11 @@ type ManagerContractExcerpt { slug: String! } +enum ConnectorPriorityGroup { + REALTIME + DEFAULT +} + type Connector implements BasicObject & InternalObject { id: ID! # internal_id standard_id: String! @@ -2229,6 +2234,7 @@ type Connector implements BasicObject & InternalObject { connector_user: User connector_queue_details: ConnectorQueueDetails! connector_info: ConnectorInfo + connector_priority_group: ConnectorPriorityGroup! updated_at: DateTime refreshed_at: DateTime created_at: DateTime diff --git a/opencti-platform/opencti-graphql/src/connector/internalConnector.d.ts b/opencti-platform/opencti-graphql/src/connector/internalConnector.d.ts index d48db7cf2d4a..5b0b119d52ba 100644 --- a/opencti-platform/opencti-graphql/src/connector/internalConnector.d.ts +++ b/opencti-platform/opencti-graphql/src/connector/internalConnector.d.ts @@ -1,5 +1,6 @@ import type { AuthContext, AuthUser } from '../types/user'; import { BasicStoreEntityCsvMapper } from '../modules/internal/csvMapper/csvMapper-types'; +import type { ConnectorPriorityGroup } from '../generated/graphql'; /** * This is the type for internal connector like import CSV. @@ -22,6 +23,7 @@ export interface Connector { auto: boolean connector_scope: string; connector_type: string; + connector_priority_group?: ConnectorPriorityGroup name: string; built_in: boolean; connector_schema_runtime_fn?: (context: AuthContext, user: AuthUser) => Promise; diff --git a/opencti-platform/opencti-graphql/src/database/repository.js b/opencti-platform/opencti-graphql/src/database/repository.js index 2808a5ad4fe3..e9dde6050755 100644 --- a/opencti-platform/opencti-graphql/src/database/repository.js +++ b/opencti-platform/opencti-graphql/src/database/repository.js @@ -14,6 +14,9 @@ import { ENTITY_TYPE_PIR } from '../modules/pir/pir-types'; import { getEntitiesMapFromCache } from './cache'; import { SYSTEM_USER } from '../utils/access'; import { logApp } from '../config/conf'; +import { ConnectorPriorityGroup } from '../generated/graphql'; + +export const CONNECTOR_PRIORITY_GROUP_VALUES = Object.values(ConnectorPriorityGroup); export const completeConnector = (connector) => { if (connector) { diff --git a/opencti-platform/opencti-graphql/src/domain/connector.ts b/opencti-platform/opencti-graphql/src/domain/connector.ts index 763827c7d725..8fbd39499054 100644 --- a/opencti-platform/opencti-graphql/src/domain/connector.ts +++ b/opencti-platform/opencti-graphql/src/domain/connector.ts @@ -1,38 +1,67 @@ -import { v5 as uuidv5 } from 'uuid'; -import { createEntity, deleteElementById, internalDeleteElementById, patchAttribute, updateAttribute } from '../database/middleware'; -import { type GetHttpClient, getHttpClient } from '../utils/http-client'; -import { completeConnector, connector, connectors, connectorsFor } from '../database/repository'; -import { getConnectorQueueDetails, purgeConnectorQueues, registerConnectorQueues, unregisterConnector, unregisterExchanges } from '../database/rabbitmq'; -import { ENTITY_TYPE_CONNECTOR, ENTITY_TYPE_CONNECTOR_MANAGER, ENTITY_TYPE_SYNC, ENTITY_TYPE_USER, ENTITY_TYPE_WORK } from '../schema/internalObject'; -import { FunctionalError, UnsupportedError, ValidationError } from '../config/errors'; -import { validateFilterGroupForStixMatch } from '../utils/filtering/filtering-stix/stix-filtering'; -import { isFilterGroupNotEmpty } from '../utils/filtering/filtering-utils'; -import { now } from '../utils/format'; -import { elLoadById } from '../database/engine'; -import { isEmptyField, READ_INDEX_HISTORY } from '../database/utils'; -import { ABSTRACT_INTERNAL_OBJECT, CONNECTOR_INTERNAL_EXPORT_FILE, OPENCTI_NAMESPACE } from '../schema/general'; -import { isUserHasCapability, SETTINGS_SET_ACCESSES, SYSTEM_USER } from '../utils/access'; +import {v5 as uuidv5} from 'uuid'; import { + createEntity, + deleteElementById, + internalDeleteElementById, + patchAttribute, + updateAttribute +} from '../database/middleware'; +import {type GetHttpClient, getHttpClient} from '../utils/http-client'; +import {completeConnector, connector, connectors, connectorsFor} from '../database/repository'; +import { + getConnectorQueueDetails, + purgeConnectorQueues, + registerConnectorQueues, + unregisterConnector, + unregisterExchanges +} from '../database/rabbitmq'; +import { + ENTITY_TYPE_CONNECTOR, + ENTITY_TYPE_CONNECTOR_MANAGER, + ENTITY_TYPE_SYNC, + ENTITY_TYPE_USER, + ENTITY_TYPE_WORK +} from '../schema/internalObject'; +import {FunctionalError, UnsupportedError, ValidationError} from '../config/errors'; +import {validateFilterGroupForStixMatch} from '../utils/filtering/filtering-stix/stix-filtering'; +import {isFilterGroupNotEmpty} from '../utils/filtering/filtering-utils'; +import {now} from '../utils/format'; +import {elLoadById} from '../database/engine'; +import {isEmptyField, READ_INDEX_HISTORY} from '../database/utils'; +import {ABSTRACT_INTERNAL_OBJECT, CONNECTOR_INTERNAL_EXPORT_FILE, OPENCTI_NAMESPACE} from '../schema/general'; +import {isUserHasCapability, SETTINGS_SET_ACCESSES, SYSTEM_USER} from '../utils/access'; +import { + type ConnectorHealthMetrics, delEditContext, notify, + redisGetConnectorHealthMetrics, redisGetWork, - redisSetConnectorLogs, - setEditContext, redisSetConnectorHealthMetrics, - redisGetConnectorHealthMetrics, - type ConnectorHealthMetrics + redisSetConnectorLogs, + setEditContext } from '../database/redis'; -import { internalLoadById, fullEntitiesList, pageEntitiesConnection, storeLoadById } from '../database/middleware-loader'; -import { completeContextDataForEntity, publishUserAction, type UserImportActionContextData } from '../listener/UserActionListener'; -import type { AuthContext, AuthUser } from '../types/user'; -import type { BasicStoreEntityConnector, BasicStoreEntityConnectorManager, BasicStoreEntitySynchronizer, ConnectorInfo } from '../types/connector'; +import {fullEntitiesList, internalLoadById, pageEntitiesConnection, storeLoadById} from '../database/middleware-loader'; +import { + completeContextDataForEntity, + publishUserAction, + type UserImportActionContextData +} from '../listener/UserActionListener'; +import type {AuthContext, AuthUser} from '../types/user'; +import type { + BasicStoreEntityConnector, + BasicStoreEntityConnectorManager, + BasicStoreEntitySynchronizer, + ConnectorInfo +} from '../types/connector'; import { type AddManagedConnectorInput, + ConnectorPriorityGroup, ConnectorType, type CurrentConnectorStatusInput, type EditContext, type EditInput, type EditManagedConnectorInput, + type HealthConnectorStatusInput, IngestionAuthType, type LogsConnectorStatusInput, type MutationSynchronizerTestArgs, @@ -42,22 +71,25 @@ import { type SynchronizerAddInput, type SynchronizerFetchInput, type UpdateConnectorManagerStatusInput, - type HealthConnectorStatusInput, - ValidationMode, + ValidationMode } from '../generated/graphql'; -import { BUS_TOPICS, logApp } from '../config/conf'; -import { deleteWorkForConnector } from './work'; -import { testSync as testSyncUtils } from './connector-utils'; -import { defaultValidationMode, loadFile, uploadJobImport } from '../database/file-storage'; -import { controlUserConfidenceAgainstElement } from '../utils/confidence-level'; -import { extractEntityRepresentativeName } from '../database/entity-representative'; -import type { BasicStoreCommon } from '../types/store'; -import type { Connector } from '../connector/internalConnector'; -import { addWorkbenchDraftConvertionCount, addWorkbenchValidationCount, addConnectorDeployedCount } from '../manager/telemetryManager'; -import { computeConnectorTargetContract, getSupportedContractsByImage } from '../modules/catalog/catalog-domain'; -import { getEntitiesMapFromCache } from '../database/cache'; -import { removeAuthenticationCredentials } from '../modules/ingestion/ingestion-common'; -import { createOnTheFlyUser } from '../modules/user/user-domain'; +import {BUS_TOPICS, logApp} from '../config/conf'; +import {deleteWorkForConnector} from './work'; +import {testSync as testSyncUtils} from './connector-utils'; +import {defaultValidationMode, loadFile, uploadJobImport} from '../database/file-storage'; +import {controlUserConfidenceAgainstElement} from '../utils/confidence-level'; +import {extractEntityRepresentativeName} from '../database/entity-representative'; +import type {BasicStoreCommon} from '../types/store'; +import type {Connector} from '../connector/internalConnector'; +import { + addConnectorDeployedCount, + addWorkbenchDraftConvertionCount, + addWorkbenchValidationCount +} from '../manager/telemetryManager'; +import {computeConnectorTargetContract, getSupportedContractsByImage} from '../modules/catalog/catalog-domain'; +import {getEntitiesMapFromCache} from '../database/cache'; +import {removeAuthenticationCredentials} from '../modules/ingestion/ingestion-common'; +import {createOnTheFlyUser} from '../modules/user/user-domain'; // Sanitize name for K8s/Docker const sanitizeContainerName = (label: string): string => { @@ -160,7 +192,8 @@ export const resetStateConnector = async (context: AuthContext, user: AuthUser, interface RegisterOptions { built_in?: boolean active?: boolean - connector_user_id?: string | null + connector_user_id?: string | null, + connector_priority_group?: ConnectorPriorityGroup, } export const registerConnectorsManager = async (context: AuthContext, user: AuthUser, input: RegisterConnectorsManagerInput) => { @@ -344,6 +377,7 @@ export const registerConnector = async ( connector_user_id: opts.connector_user_id ?? user.id, connector_state_timestamp: now(), built_in: opts.built_in ?? false, + connector_priority_group: opts.connector_priority_group ?? ConnectorPriorityGroup.Default, }; if (opts.active !== undefined) { connectorToCreate.active = opts.active; @@ -474,7 +508,8 @@ interface ConnectorIngestionInput { type: 'RSS' | 'CSV' | 'TAXII' | 'TAXII-PUSH' | 'JSON' | 'FORM', name: string, connector_user_id?: string | null, - is_running: boolean + is_running: boolean, + connector_priority_group?: ConnectorPriorityGroup, } export const connectorIdFromIngestId = (id: string) => uuidv5(id, OPENCTI_NAMESPACE); export const registerConnectorForIngestion = async (context: AuthContext, input: ConnectorIngestionInput) => { diff --git a/opencti-platform/opencti-graphql/src/generated/graphql.ts b/opencti-platform/opencti-graphql/src/generated/graphql.ts index 1339aa85014c..37d0d355e4ee 100644 --- a/opencti-platform/opencti-graphql/src/generated/graphql.ts +++ b/opencti-platform/opencti-graphql/src/generated/graphql.ts @@ -3956,6 +3956,7 @@ export type Connector = BasicObject & InternalObject & { config?: Maybe; configurations?: Maybe>; connector_info?: Maybe; + connector_priority_group: ConnectorPriorityGroup; connector_queue_details: ConnectorQueueDetails; connector_schema?: Maybe; connector_schema_ui?: Maybe; @@ -4076,6 +4077,11 @@ export type ConnectorMetadata = { configuration: Scalars['String']['output']; }; +export enum ConnectorPriorityGroup { + Default = 'DEFAULT', + Realtime = 'REALTIME' +} + export type ConnectorQueueDetails = { __typename?: 'ConnectorQueueDetails'; messages_number: Scalars['Float']['output']; @@ -34060,6 +34066,7 @@ export type ResolversTypes = ResolversObject<{ ConnectorInfoInput: ConnectorInfoInput; ConnectorManager: ResolverTypeWrapper; ConnectorMetadata: ResolverTypeWrapper; + ConnectorPriorityGroup: ConnectorPriorityGroup; ConnectorQueueDetails: ResolverTypeWrapper; ConnectorRequestStatus: ConnectorRequestStatus; ConnectorType: ConnectorType; @@ -37122,6 +37129,7 @@ export type ConnectorResolvers, ParentType, ContextType>; configurations?: Resolver>, ParentType, ContextType>; connector_info?: Resolver, ParentType, ContextType>; + connector_priority_group?: Resolver; connector_queue_details?: Resolver; connector_schema?: Resolver, ParentType, ContextType>; connector_schema_ui?: Resolver, ParentType, ContextType>; diff --git a/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts b/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts index 24964a501af2..6496e3679a40 100644 --- a/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts +++ b/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts @@ -44,6 +44,7 @@ import { EVENT_ACCESS_VALUES, EVENT_SCOPE_VALUES, EVENT_STATUS_VALUES, EVENT_TYP import { RETENTION_SCOPE_VALUES, RETENTION_UNIT_VALUES } from '../../manager/retentionManager'; import { ENTITY_TYPE_PIR } from '../pir/pir-types'; import { computeAccountStatusChoices } from '../../config/conf'; +import {CONNECTOR_PRIORITY_GROUP_VALUES} from "../../database/repository"; const HistoryDefinition: AttributeDefinition[] = [ { name: 'event_type', label: 'Event type', type: 'string', format: 'enum', values: EVENT_TYPE_VALUES, editDefault: false, mandatoryType: 'internal', multiple: false, upsert: false, isFilterable: true }, @@ -410,6 +411,7 @@ const internalObjectsAttributes: { [k: string]: Array } = { { name: 'connector_scope', label: 'Connector scope', type: 'string', format: 'short', mandatoryType: 'external', editDefault: false, multiple: false, upsert: false, isFilterable: true }, { name: 'connector_state', label: 'Connector state', type: 'string', format: 'json', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: true }, { name: 'connector_state_reset', label: 'State reset', type: 'boolean', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: true }, + { name: 'connector_priority_group', label: 'Priority group', type: 'string', format: 'enum', values: CONNECTOR_PRIORITY_GROUP_VALUES, mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: false }, { name: 'connector_state_timestamp', label: 'State reset timestamp', type: 'date', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: true }, { name: 'connector_trigger_filters', label: 'Connector trigger filters', type: 'string', format: 'text', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: false }, { name: 'connector_user_id', label: 'Connector user id', type: 'string', format: 'short', mandatoryType: 'no', editDefault: false, multiple: false, upsert: false, isFilterable: false }, diff --git a/opencti-platform/opencti-graphql/src/modules/draftWorkspace/draftWorkspace-connector.ts b/opencti-platform/opencti-graphql/src/modules/draftWorkspace/draftWorkspace-connector.ts index 18728699b55a..21d012d1791a 100644 --- a/opencti-platform/opencti-graphql/src/modules/draftWorkspace/draftWorkspace-connector.ts +++ b/opencti-platform/opencti-graphql/src/modules/draftWorkspace/draftWorkspace-connector.ts @@ -2,6 +2,7 @@ import type { Connector, ConnectorConfig } from '../../connector/internalConnect import { CONNECTOR_INTERNAL_INGESTION } from '../../schema/general'; import { logApp } from '../../config/conf'; import { registerConnectorQueues } from '../../database/rabbitmq'; +import { ConnectorPriorityGroup } from '../../generated/graphql'; export const DRAFT_VALIDATION_CONNECTOR_ID = 'c194e700-afb6-4c4e-ad1b-d4a00590e735'; @@ -12,6 +13,7 @@ export const DRAFT_VALIDATION_CONNECTOR: Connector = { auto: false, connector_scope: 'draft', connector_type: CONNECTOR_INTERNAL_INGESTION, + connector_priority_group: ConnectorPriorityGroup.Realtime, name: '[DRAFT] Draft validation', built_in: true, }; diff --git a/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts b/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts index 6d7fb1222385..4f1b9dfdf94d 100644 --- a/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts +++ b/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts @@ -1,35 +1,49 @@ -import { v4 as uuidv4 } from 'uuid'; +import {v4 as uuidv4} from 'uuid'; import Ajv from 'ajv'; -import type { FileHandle } from 'fs/promises'; -import { createEntity, deleteElementById, patchAttribute, updateAttribute } from '../../database/middleware'; -import { fullEntitiesList, internalLoadById, pageEntitiesConnection, storeLoadById } from '../../database/middleware-loader'; -import type { BasicStoreEntityForm, FormFieldDefinition, FormSchemaDefinition, StoreEntityForm } from './form-types'; -import { ENTITY_TYPE_FORM, FormSchemaDefinitionSchema } from './form-types'; -import type { AuthContext, AuthUser } from '../../types/user'; -import { FunctionalError } from '../../config/errors'; -import { connectorIdFromIngestId, registerConnectorForIngestion, unregisterConnectorForIngestion } from '../../domain/connector'; -import { publishUserAction } from '../../listener/UserActionListener'; -import { generateStandardId } from '../../schema/identifier'; -import { logApp } from '../../config/conf'; -import { pushToWorkerForConnector } from '../../database/rabbitmq'; -import { createWork, updateExpectationsNumber } from '../../domain/work'; -import { ConnectorType, FilterMode, type FormSubmissionInput } from '../../generated/graphql'; -import { now, nowTime } from '../../utils/format'; -import { SYSTEM_USER } from '../../utils/access'; -import { convertStoreToStix } from '../../database/stix-2-1-converter'; -import { addDraftWorkspace } from '../draftWorkspace/draftWorkspace-domain'; -import type { BasicStoreEntity, StoreEntity } from '../../types/store'; -import type { StixId } from '../../types/stix-2-1-common'; -import { isEmptyField, isNotEmptyField } from '../../database/utils'; -import { ENTITY_TYPE_MALWARE, isStixDomainObject, isStixDomainObjectContainer } from '../../schema/stixDomainObject'; -import type { StixRelation } from '../../types/stix-2-1-sro'; -import type { StixContainer } from '../../types/stix-2-1-sdo'; -import { ENTITY_TYPE_CONTAINER_GROUPING } from '../grouping/grouping-types'; -import { detectObservableType } from '../../utils/observable'; -import { createStixPattern } from '../../python/pythonBridge'; +import type {FileHandle} from 'fs/promises'; +import {createEntity, deleteElementById, patchAttribute, updateAttribute} from '../../database/middleware'; +import { + fullEntitiesList, + internalLoadById, + pageEntitiesConnection, + storeLoadById +} from '../../database/middleware-loader'; +import type {BasicStoreEntityForm, FormFieldDefinition, FormSchemaDefinition, StoreEntityForm} from './form-types'; +import {ENTITY_TYPE_FORM, FormSchemaDefinitionSchema} from './form-types'; +import type {AuthContext, AuthUser} from '../../types/user'; +import {FunctionalError} from '../../config/errors'; +import { + connectorIdFromIngestId, + registerConnectorForIngestion, + unregisterConnectorForIngestion +} from '../../domain/connector'; +import {publishUserAction} from '../../listener/UserActionListener'; +import {generateStandardId} from '../../schema/identifier'; +import {logApp} from '../../config/conf'; +import {pushToWorkerForConnector} from '../../database/rabbitmq'; +import {createWork, updateExpectationsNumber} from '../../domain/work'; +import {ConnectorPriorityGroup, ConnectorType, FilterMode, type FormSubmissionInput} from '../../generated/graphql'; +import {now, nowTime} from '../../utils/format'; +import {SYSTEM_USER} from '../../utils/access'; +import {convertStoreToStix} from '../../database/stix-2-1-converter'; +import {addDraftWorkspace} from '../draftWorkspace/draftWorkspace-domain'; +import type {BasicStoreEntity, StoreEntity} from '../../types/store'; +import type {StixId} from '../../types/stix-2-1-common'; +import {isEmptyField, isNotEmptyField} from '../../database/utils'; +import {ENTITY_TYPE_MALWARE, isStixDomainObject, isStixDomainObjectContainer} from '../../schema/stixDomainObject'; +import type {StixRelation} from '../../types/stix-2-1-sro'; +import type {StixContainer} from '../../types/stix-2-1-sdo'; +import {ENTITY_TYPE_CONTAINER_GROUPING} from '../grouping/grouping-types'; +import {detectObservableType} from '../../utils/observable'; +import {createStixPattern} from '../../python/pythonBridge'; import pjson from '../../../package.json'; -import { extractContentFrom } from '../../utils/fileToContent'; -import { addFormIntakeCreatedCount, addFormIntakeDeletedCount, addFormIntakeSubmittedCount, addFormIntakeUpdatedCount } from '../../manager/telemetryManager'; +import {extractContentFrom} from '../../utils/fileToContent'; +import { + addFormIntakeCreatedCount, + addFormIntakeDeletedCount, + addFormIntakeSubmittedCount, + addFormIntakeUpdatedCount +} from '../../manager/telemetryManager'; const ajv = new Ajv(); const validateSchema = ajv.compile(FormSchemaDefinitionSchema); @@ -90,7 +104,8 @@ export const addForm = async ( type: 'FORM', name: element.name, is_running: element.active ?? false, - connector_user_id: user.id + connector_user_id: user.id, + connector_priority_group: ConnectorPriorityGroup.Realtime, }); await publishUserAction({ diff --git a/opencti-platform/opencti-graphql/src/resolvers/connector.js b/opencti-platform/opencti-graphql/src/resolvers/connector.js index 25681bd0be32..c2d9cc08640b 100644 --- a/opencti-platform/opencti-graphql/src/resolvers/connector.js +++ b/opencti-platform/opencti-graphql/src/resolvers/connector.js @@ -65,6 +65,7 @@ import { import { getConnectorQueueSize } from '../database/rabbitmq'; import { redisGetConnectorLogs } from '../database/redis'; import pjson from '../../package.json'; +import { ConnectorPriorityGroup } from '../generated/graphql'; export const PLATFORM_VERSION = pjson.version; @@ -92,6 +93,7 @@ const connectorResolvers = { Connector: { works: (cn, args, context) => worksForConnector(context, context.user, cn.id, args), connector_queue_details: (cn) => queueDetails(cn.id), + connector_priority_group: (cn) => { return cn.connector_priority_group ?? ConnectorPriorityGroup.DEFAULT; }, connector_user: (cn, _, context) => connectorUser(context, context.user, cn.connector_user_id), manager_connector_logs: (cn) => redisGetConnectorLogs(cn.id), manager_health_metrics: (cn, _, context) => connectorGetHealth(context, context.user, cn.id), diff --git a/opencti-worker/src/worker.py b/opencti-worker/src/worker.py index 58a59fd5b415..a4a33876928a 100644 --- a/opencti-worker/src/worker.py +++ b/opencti-worker/src/worker.py @@ -42,8 +42,8 @@ ) -def is_internal_connector(connector_type: str) -> bool: - return connector_type == "INTERNAL_INGESTION" or connector_type == "internal" +def is_priority_connector(connector_priority_group: str) -> bool: + return connector_priority_group == "REALTIME" @dataclass(unsafe_hash=True) @@ -83,9 +83,9 @@ def __post_init__(self) -> None: True, default=5, ) - self.opencti_internal_pool_size = get_config_variable( - "OPENCTI_INTERNAL_EXECUTION_POOL_SIZE", - ["opencti", "internal_execution_pool_size"], + self.opencti_realtime_pool_size = get_config_variable( + "OPENCTI_REALTIME_EXECUTION_POOL_SIZE", + ["opencti", "realtime_execution_pool_size"], config, True, default=5, @@ -217,7 +217,7 @@ def stop(self) -> None: # Start the main loop def start(self) -> None: push_execution_pool = ThreadPoolExecutor(max_workers=self.opencti_pool_size) - internal_push_execution_pool = ThreadPoolExecutor(max_workers=self.opencti_internal_pool_size) + realtime_push_execution_pool = ThreadPoolExecutor(max_workers=self.opencti_realtime_pool_size) listen_execution_pool = ThreadPoolExecutor(max_workers=self.listen_pool_size) while not self.exit_event.is_set(): @@ -263,8 +263,8 @@ def start(self) -> None: self.objects_max_refs, ) execution_pool = push_execution_pool - if is_internal_connector(connector["connector_type"]): - execution_pool = internal_push_execution_pool + if is_priority_connector(connector["connector_priority_group"]): + execution_pool = realtime_push_execution_pool self.consumers[push_queue] = MessageQueueConsumer( self.worker_logger, "push", From df9aedf4daec87532bc0494632d81e332398f38a Mon Sep 17 00:00:00 2001 From: Jeremy Cloarec Date: Thu, 23 Oct 2025 18:26:25 +0200 Subject: [PATCH 3/7] [client] lint --- opencti-worker/src/worker.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/opencti-worker/src/worker.py b/opencti-worker/src/worker.py index a4a33876928a..19b0f4cf4d10 100644 --- a/opencti-worker/src/worker.py +++ b/opencti-worker/src/worker.py @@ -217,7 +217,9 @@ def stop(self) -> None: # Start the main loop def start(self) -> None: push_execution_pool = ThreadPoolExecutor(max_workers=self.opencti_pool_size) - realtime_push_execution_pool = ThreadPoolExecutor(max_workers=self.opencti_realtime_pool_size) + realtime_push_execution_pool = ThreadPoolExecutor( + max_workers=self.opencti_realtime_pool_size + ) listen_execution_pool = ThreadPoolExecutor(max_workers=self.listen_pool_size) while not self.exit_event.is_set(): From 7ccf18f2126cc56822eb4b72ccc5712c6bf70dcd Mon Sep 17 00:00:00 2001 From: Jeremy Cloarec Date: Fri, 24 Oct 2025 09:21:51 +0200 Subject: [PATCH 4/7] [backend] build fix --- opencti-platform/opencti-front/lang/back/de.json | 1 + opencti-platform/opencti-front/lang/back/en.json | 1 + opencti-platform/opencti-front/lang/back/es.json | 1 + opencti-platform/opencti-front/lang/back/fr.json | 1 + opencti-platform/opencti-front/lang/back/it.json | 1 + opencti-platform/opencti-front/lang/back/ja.json | 1 + opencti-platform/opencti-front/lang/back/ko.json | 1 + opencti-platform/opencti-front/lang/back/ru.json | 1 + opencti-platform/opencti-front/lang/back/zh.json | 1 + .../modules/attributes/internalObject-registrationAttributes.ts | 2 +- 10 files changed, 10 insertions(+), 1 deletion(-) diff --git a/opencti-platform/opencti-front/lang/back/de.json b/opencti-platform/opencti-front/lang/back/de.json index 6550ae38719c..c653ee4676e3 100644 --- a/opencti-platform/opencti-front/lang/back/de.json +++ b/opencti-platform/opencti-front/lang/back/de.json @@ -700,6 +700,7 @@ "Primary motivation": "Primäre Motivation", "Print date": "Druckdatum", "Priority": "Priorität", + "Priority group": "Vorrangige Gruppe", "Private key usage not after": "Verwendung des privaten Schlüssels nicht nach", "Private key usage not before": "Verwendung privater Schlüssel nicht vor", "Privileged": "Privilegiert", diff --git a/opencti-platform/opencti-front/lang/back/en.json b/opencti-platform/opencti-front/lang/back/en.json index 52c8b8d55651..8be389e2da69 100644 --- a/opencti-platform/opencti-front/lang/back/en.json +++ b/opencti-platform/opencti-front/lang/back/en.json @@ -700,6 +700,7 @@ "Primary motivation": "Primary motivation", "Print date": "Print date", "Priority": "Priority", + "Priority group": "Priority group", "Private key usage not after": "Private key usage not after", "Private key usage not before": "Private key usage not before", "Privileged": "Privileged", diff --git a/opencti-platform/opencti-front/lang/back/es.json b/opencti-platform/opencti-front/lang/back/es.json index d9fafff5fa61..43a75e82b7fd 100644 --- a/opencti-platform/opencti-front/lang/back/es.json +++ b/opencti-platform/opencti-front/lang/back/es.json @@ -700,6 +700,7 @@ "Primary motivation": "Motivación principal", "Print date": "Fecha de impresión", "Priority": "Prioridad", + "Priority group": "Grupo prioritario", "Private key usage not after": "Uso de clave privada no después", "Private key usage not before": "Uso de clave privada no antes", "Privileged": "Privilegiado", diff --git a/opencti-platform/opencti-front/lang/back/fr.json b/opencti-platform/opencti-front/lang/back/fr.json index 6223aa27b14a..0ce8ba013e90 100644 --- a/opencti-platform/opencti-front/lang/back/fr.json +++ b/opencti-platform/opencti-front/lang/back/fr.json @@ -700,6 +700,7 @@ "Primary motivation": "Motivation primaire", "Print date": "Date d'impression", "Priority": "Priorité", + "Priority group": "Groupe prioritaire", "Private key usage not after": "Utilisation de la clé privée pas après", "Private key usage not before": "Utilisation de la clé privée pas avant", "Privileged": "Privilégié", diff --git a/opencti-platform/opencti-front/lang/back/it.json b/opencti-platform/opencti-front/lang/back/it.json index c6d127632b3f..d9311098d2a5 100644 --- a/opencti-platform/opencti-front/lang/back/it.json +++ b/opencti-platform/opencti-front/lang/back/it.json @@ -700,6 +700,7 @@ "Primary motivation": "Motivazione primaria", "Print date": "Data di stampa", "Priority": "Priorità", + "Priority group": "Gruppo prioritario", "Private key usage not after": "Utilizzo della chiave privata non oltre", "Private key usage not before": "Utilizzo della chiave privata non prima", "Privileged": "Privilegiato", diff --git a/opencti-platform/opencti-front/lang/back/ja.json b/opencti-platform/opencti-front/lang/back/ja.json index a0e9c30f25d1..1951890d83e4 100644 --- a/opencti-platform/opencti-front/lang/back/ja.json +++ b/opencti-platform/opencti-front/lang/back/ja.json @@ -700,6 +700,7 @@ "Primary motivation": "二次的動機", "Print date": "アップロード日", "Priority": "優先度", + "Priority group": "優先グループ", "Private key usage not after": "秘密鍵の使用は", "Private key usage not before": "秘密鍵の使用", "Privileged": "特権", diff --git a/opencti-platform/opencti-front/lang/back/ko.json b/opencti-platform/opencti-front/lang/back/ko.json index e98b8b1ad33e..4d53cdb47486 100644 --- a/opencti-platform/opencti-front/lang/back/ko.json +++ b/opencti-platform/opencti-front/lang/back/ko.json @@ -700,6 +700,7 @@ "Primary motivation": "주요 동기", "Print date": "인쇄 날짜", "Priority": "우선순위", + "Priority group": "우선순위 그룹", "Private key usage not after": "개인 키 사용 종료 날짜", "Private key usage not before": "개인 키 사용 시작 날짜", "Privileged": "특권", diff --git a/opencti-platform/opencti-front/lang/back/ru.json b/opencti-platform/opencti-front/lang/back/ru.json index b37fb862510d..2ccf3b593c2e 100644 --- a/opencti-platform/opencti-front/lang/back/ru.json +++ b/opencti-platform/opencti-front/lang/back/ru.json @@ -700,6 +700,7 @@ "Primary motivation": "Основная мотивация", "Print date": "Дата печати", "Priority": "Приоритет", + "Priority group": "Приоритетная группа", "Private key usage not after": "Использование закрытого ключа не после", "Private key usage not before": "Использование закрытого ключа не ранее", "Privileged": "Привилегированный", diff --git a/opencti-platform/opencti-front/lang/back/zh.json b/opencti-platform/opencti-front/lang/back/zh.json index 979db934355c..d9932438f68b 100644 --- a/opencti-platform/opencti-front/lang/back/zh.json +++ b/opencti-platform/opencti-front/lang/back/zh.json @@ -700,6 +700,7 @@ "Primary motivation": "主要动机", "Print date": "打印日期", "Priority": "优先级", + "Priority group": "优先群体", "Private key usage not after": "之后不允许使用私钥", "Private key usage not before": "之前不允许使用私钥", "Privileged": "特权", diff --git a/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts b/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts index 6496e3679a40..981b144c78e9 100644 --- a/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts +++ b/opencti-platform/opencti-graphql/src/modules/attributes/internalObject-registrationAttributes.ts @@ -44,7 +44,7 @@ import { EVENT_ACCESS_VALUES, EVENT_SCOPE_VALUES, EVENT_STATUS_VALUES, EVENT_TYP import { RETENTION_SCOPE_VALUES, RETENTION_UNIT_VALUES } from '../../manager/retentionManager'; import { ENTITY_TYPE_PIR } from '../pir/pir-types'; import { computeAccountStatusChoices } from '../../config/conf'; -import {CONNECTOR_PRIORITY_GROUP_VALUES} from "../../database/repository"; +import { CONNECTOR_PRIORITY_GROUP_VALUES } from '../../database/repository'; const HistoryDefinition: AttributeDefinition[] = [ { name: 'event_type', label: 'Event type', type: 'string', format: 'enum', values: EVENT_TYPE_VALUES, editDefault: false, mandatoryType: 'internal', multiple: false, upsert: false, isFilterable: true }, From ec667faffd35640c9d9a0d363609287bd37f61ac Mon Sep 17 00:00:00 2001 From: Jeremy Cloarec Date: Fri, 24 Oct 2025 09:26:22 +0200 Subject: [PATCH 5/7] [backend] build fix --- .../opencti-graphql/src/domain/connector.ts | 93 +++++++------------ .../src/modules/form/form-domain.ts | 74 ++++++--------- 2 files changed, 61 insertions(+), 106 deletions(-) diff --git a/opencti-platform/opencti-graphql/src/domain/connector.ts b/opencti-platform/opencti-graphql/src/domain/connector.ts index 8fbd39499054..9b25111e3736 100644 --- a/opencti-platform/opencti-graphql/src/domain/connector.ts +++ b/opencti-platform/opencti-graphql/src/domain/connector.ts @@ -1,35 +1,17 @@ -import {v5 as uuidv5} from 'uuid'; -import { - createEntity, - deleteElementById, - internalDeleteElementById, - patchAttribute, - updateAttribute -} from '../database/middleware'; -import {type GetHttpClient, getHttpClient} from '../utils/http-client'; -import {completeConnector, connector, connectors, connectorsFor} from '../database/repository'; -import { - getConnectorQueueDetails, - purgeConnectorQueues, - registerConnectorQueues, - unregisterConnector, - unregisterExchanges -} from '../database/rabbitmq'; -import { - ENTITY_TYPE_CONNECTOR, - ENTITY_TYPE_CONNECTOR_MANAGER, - ENTITY_TYPE_SYNC, - ENTITY_TYPE_USER, - ENTITY_TYPE_WORK -} from '../schema/internalObject'; -import {FunctionalError, UnsupportedError, ValidationError} from '../config/errors'; -import {validateFilterGroupForStixMatch} from '../utils/filtering/filtering-stix/stix-filtering'; -import {isFilterGroupNotEmpty} from '../utils/filtering/filtering-utils'; -import {now} from '../utils/format'; -import {elLoadById} from '../database/engine'; -import {isEmptyField, READ_INDEX_HISTORY} from '../database/utils'; -import {ABSTRACT_INTERNAL_OBJECT, CONNECTOR_INTERNAL_EXPORT_FILE, OPENCTI_NAMESPACE} from '../schema/general'; -import {isUserHasCapability, SETTINGS_SET_ACCESSES, SYSTEM_USER} from '../utils/access'; +import { v5 as uuidv5 } from 'uuid'; +import { createEntity, deleteElementById, internalDeleteElementById, patchAttribute, updateAttribute } from '../database/middleware'; +import { type GetHttpClient, getHttpClient } from '../utils/http-client'; +import { completeConnector, connector, connectors, connectorsFor } from '../database/repository'; +import { getConnectorQueueDetails, purgeConnectorQueues, registerConnectorQueues, unregisterConnector, unregisterExchanges } from '../database/rabbitmq'; +import { ENTITY_TYPE_CONNECTOR, ENTITY_TYPE_CONNECTOR_MANAGER, ENTITY_TYPE_SYNC, ENTITY_TYPE_USER, ENTITY_TYPE_WORK } from '../schema/internalObject'; +import { FunctionalError, UnsupportedError, ValidationError } from '../config/errors'; +import { validateFilterGroupForStixMatch } from '../utils/filtering/filtering-stix/stix-filtering'; +import { isFilterGroupNotEmpty } from '../utils/filtering/filtering-utils'; +import { now } from '../utils/format'; +import { elLoadById } from '../database/engine'; +import { isEmptyField, READ_INDEX_HISTORY } from '../database/utils'; +import { ABSTRACT_INTERNAL_OBJECT, CONNECTOR_INTERNAL_EXPORT_FILE, OPENCTI_NAMESPACE } from '../schema/general'; +import { isUserHasCapability, SETTINGS_SET_ACCESSES, SYSTEM_USER } from '../utils/access'; import { type ConnectorHealthMetrics, delEditContext, @@ -40,19 +22,10 @@ import { redisSetConnectorLogs, setEditContext } from '../database/redis'; -import {fullEntitiesList, internalLoadById, pageEntitiesConnection, storeLoadById} from '../database/middleware-loader'; -import { - completeContextDataForEntity, - publishUserAction, - type UserImportActionContextData -} from '../listener/UserActionListener'; -import type {AuthContext, AuthUser} from '../types/user'; -import type { - BasicStoreEntityConnector, - BasicStoreEntityConnectorManager, - BasicStoreEntitySynchronizer, - ConnectorInfo -} from '../types/connector'; +import { fullEntitiesList, internalLoadById, pageEntitiesConnection, storeLoadById } from '../database/middleware-loader'; +import { completeContextDataForEntity, publishUserAction, type UserImportActionContextData } from '../listener/UserActionListener'; +import type { AuthContext, AuthUser } from '../types/user'; +import type { BasicStoreEntityConnector, BasicStoreEntityConnectorManager, BasicStoreEntitySynchronizer, ConnectorInfo } from '../types/connector'; import { type AddManagedConnectorInput, ConnectorPriorityGroup, @@ -73,23 +46,19 @@ import { type UpdateConnectorManagerStatusInput, ValidationMode } from '../generated/graphql'; -import {BUS_TOPICS, logApp} from '../config/conf'; -import {deleteWorkForConnector} from './work'; -import {testSync as testSyncUtils} from './connector-utils'; -import {defaultValidationMode, loadFile, uploadJobImport} from '../database/file-storage'; -import {controlUserConfidenceAgainstElement} from '../utils/confidence-level'; -import {extractEntityRepresentativeName} from '../database/entity-representative'; -import type {BasicStoreCommon} from '../types/store'; -import type {Connector} from '../connector/internalConnector'; -import { - addConnectorDeployedCount, - addWorkbenchDraftConvertionCount, - addWorkbenchValidationCount -} from '../manager/telemetryManager'; -import {computeConnectorTargetContract, getSupportedContractsByImage} from '../modules/catalog/catalog-domain'; -import {getEntitiesMapFromCache} from '../database/cache'; -import {removeAuthenticationCredentials} from '../modules/ingestion/ingestion-common'; -import {createOnTheFlyUser} from '../modules/user/user-domain'; +import { BUS_TOPICS, logApp } from '../config/conf'; +import { deleteWorkForConnector } from './work'; +import { testSync as testSyncUtils } from './connector-utils'; +import { defaultValidationMode, loadFile, uploadJobImport } from '../database/file-storage'; +import { controlUserConfidenceAgainstElement } from '../utils/confidence-level'; +import { extractEntityRepresentativeName } from '../database/entity-representative'; +import type { BasicStoreCommon } from '../types/store'; +import type { Connector } from '../connector/internalConnector'; +import { addConnectorDeployedCount, addWorkbenchDraftConvertionCount, addWorkbenchValidationCount } from '../manager/telemetryManager'; +import { computeConnectorTargetContract, getSupportedContractsByImage } from '../modules/catalog/catalog-domain'; +import { getEntitiesMapFromCache } from '../database/cache'; +import { removeAuthenticationCredentials } from '../modules/ingestion/ingestion-common'; +import { createOnTheFlyUser } from '../modules/user/user-domain'; // Sanitize name for K8s/Docker const sanitizeContainerName = (label: string): string => { diff --git a/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts b/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts index 4f1b9dfdf94d..2f5f93df2e50 100644 --- a/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts +++ b/opencti-platform/opencti-graphql/src/modules/form/form-domain.ts @@ -1,49 +1,35 @@ -import {v4 as uuidv4} from 'uuid'; +import { v4 as uuidv4 } from 'uuid'; import Ajv from 'ajv'; -import type {FileHandle} from 'fs/promises'; -import {createEntity, deleteElementById, patchAttribute, updateAttribute} from '../../database/middleware'; -import { - fullEntitiesList, - internalLoadById, - pageEntitiesConnection, - storeLoadById -} from '../../database/middleware-loader'; -import type {BasicStoreEntityForm, FormFieldDefinition, FormSchemaDefinition, StoreEntityForm} from './form-types'; -import {ENTITY_TYPE_FORM, FormSchemaDefinitionSchema} from './form-types'; -import type {AuthContext, AuthUser} from '../../types/user'; -import {FunctionalError} from '../../config/errors'; -import { - connectorIdFromIngestId, - registerConnectorForIngestion, - unregisterConnectorForIngestion -} from '../../domain/connector'; -import {publishUserAction} from '../../listener/UserActionListener'; -import {generateStandardId} from '../../schema/identifier'; -import {logApp} from '../../config/conf'; -import {pushToWorkerForConnector} from '../../database/rabbitmq'; -import {createWork, updateExpectationsNumber} from '../../domain/work'; -import {ConnectorPriorityGroup, ConnectorType, FilterMode, type FormSubmissionInput} from '../../generated/graphql'; -import {now, nowTime} from '../../utils/format'; -import {SYSTEM_USER} from '../../utils/access'; -import {convertStoreToStix} from '../../database/stix-2-1-converter'; -import {addDraftWorkspace} from '../draftWorkspace/draftWorkspace-domain'; -import type {BasicStoreEntity, StoreEntity} from '../../types/store'; -import type {StixId} from '../../types/stix-2-1-common'; -import {isEmptyField, isNotEmptyField} from '../../database/utils'; -import {ENTITY_TYPE_MALWARE, isStixDomainObject, isStixDomainObjectContainer} from '../../schema/stixDomainObject'; -import type {StixRelation} from '../../types/stix-2-1-sro'; -import type {StixContainer} from '../../types/stix-2-1-sdo'; -import {ENTITY_TYPE_CONTAINER_GROUPING} from '../grouping/grouping-types'; -import {detectObservableType} from '../../utils/observable'; -import {createStixPattern} from '../../python/pythonBridge'; +import type { FileHandle } from 'fs/promises'; +import { createEntity, deleteElementById, patchAttribute, updateAttribute } from '../../database/middleware'; +import { fullEntitiesList, internalLoadById, pageEntitiesConnection, storeLoadById } from '../../database/middleware-loader'; +import type { BasicStoreEntityForm, FormFieldDefinition, FormSchemaDefinition, StoreEntityForm } from './form-types'; +import { ENTITY_TYPE_FORM, FormSchemaDefinitionSchema } from './form-types'; +import type { AuthContext, AuthUser } from '../../types/user'; +import { FunctionalError } from '../../config/errors'; +import { connectorIdFromIngestId, registerConnectorForIngestion, unregisterConnectorForIngestion } from '../../domain/connector'; +import { publishUserAction } from '../../listener/UserActionListener'; +import { generateStandardId } from '../../schema/identifier'; +import { logApp } from '../../config/conf'; +import { pushToWorkerForConnector } from '../../database/rabbitmq'; +import { createWork, updateExpectationsNumber } from '../../domain/work'; +import { ConnectorPriorityGroup, ConnectorType, FilterMode, type FormSubmissionInput } from '../../generated/graphql'; +import { now, nowTime } from '../../utils/format'; +import { SYSTEM_USER } from '../../utils/access'; +import { convertStoreToStix } from '../../database/stix-2-1-converter'; +import { addDraftWorkspace } from '../draftWorkspace/draftWorkspace-domain'; +import type { BasicStoreEntity, StoreEntity } from '../../types/store'; +import type { StixId } from '../../types/stix-2-1-common'; +import { isEmptyField, isNotEmptyField } from '../../database/utils'; +import { ENTITY_TYPE_MALWARE, isStixDomainObject, isStixDomainObjectContainer } from '../../schema/stixDomainObject'; +import type { StixRelation } from '../../types/stix-2-1-sro'; +import type { StixContainer } from '../../types/stix-2-1-sdo'; +import { ENTITY_TYPE_CONTAINER_GROUPING } from '../grouping/grouping-types'; +import { detectObservableType } from '../../utils/observable'; +import { createStixPattern } from '../../python/pythonBridge'; import pjson from '../../../package.json'; -import {extractContentFrom} from '../../utils/fileToContent'; -import { - addFormIntakeCreatedCount, - addFormIntakeDeletedCount, - addFormIntakeSubmittedCount, - addFormIntakeUpdatedCount -} from '../../manager/telemetryManager'; +import { extractContentFrom } from '../../utils/fileToContent'; +import { addFormIntakeCreatedCount, addFormIntakeDeletedCount, addFormIntakeSubmittedCount, addFormIntakeUpdatedCount } from '../../manager/telemetryManager'; const ajv = new Ajv(); const validateSchema = ajv.compile(FormSchemaDefinitionSchema); From de754d5cbc6e43fab99dfdb95bf88f00333a6212 Mon Sep 17 00:00:00 2001 From: Jeremy Cloarec Date: Fri, 24 Oct 2025 09:34:21 +0200 Subject: [PATCH 6/7] [backend] build fix --- opencti-platform/opencti-graphql/src/resolvers/connector.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencti-platform/opencti-graphql/src/resolvers/connector.js b/opencti-platform/opencti-graphql/src/resolvers/connector.js index c2d9cc08640b..ef9ee9572b43 100644 --- a/opencti-platform/opencti-graphql/src/resolvers/connector.js +++ b/opencti-platform/opencti-graphql/src/resolvers/connector.js @@ -93,7 +93,7 @@ const connectorResolvers = { Connector: { works: (cn, args, context) => worksForConnector(context, context.user, cn.id, args), connector_queue_details: (cn) => queueDetails(cn.id), - connector_priority_group: (cn) => { return cn.connector_priority_group ?? ConnectorPriorityGroup.DEFAULT; }, + connector_priority_group: (cn) => { return cn.connector_priority_group ?? ConnectorPriorityGroup.Default; }, connector_user: (cn, _, context) => connectorUser(context, context.user, cn.connector_user_id), manager_connector_logs: (cn) => redisGetConnectorLogs(cn.id), manager_health_metrics: (cn, _, context) => connectorGetHealth(context, context.user, cn.id), From 0dede55640e0461f8c6d0e02eb47cc67a08b290d Mon Sep 17 00:00:00 2001 From: Jeremy Cloarec Date: Fri, 24 Oct 2025 14:29:43 +0200 Subject: [PATCH 7/7] [backend] change fr translation --- opencti-platform/opencti-front/lang/back/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opencti-platform/opencti-front/lang/back/fr.json b/opencti-platform/opencti-front/lang/back/fr.json index 0ce8ba013e90..3ae073d8b1e3 100644 --- a/opencti-platform/opencti-front/lang/back/fr.json +++ b/opencti-platform/opencti-front/lang/back/fr.json @@ -700,7 +700,7 @@ "Primary motivation": "Motivation primaire", "Print date": "Date d'impression", "Priority": "Priorité", - "Priority group": "Groupe prioritaire", + "Priority group": "Groupe de priorité", "Private key usage not after": "Utilisation de la clé privée pas après", "Private key usage not before": "Utilisation de la clé privée pas avant", "Privileged": "Privilégié",