Skip to content

Commit 70861ae

Browse files
[backend/frontend] Improve http client and proxy management (#6185)
1 parent c5f7905 commit 70861ae

16 files changed

+156
-156
lines changed

opencti-platform/opencti-front/src/private/components/data/ingestionCsv/IngestionCsvCreation.tsx

+2-4
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ const IngestionCsvCreation: FunctionComponent<IngestionCsvCreationProps> = ({ pa
9999
} else if (values.authentication_type === 'certificate') {
100100
authenticationValue = `${values.cert}:${values.key}:${values.ca}`;
101101
}
102-
const userId = typeof values.user_id === 'string' ? values.user_id : values.user_id.value;
103102
const input = {
104103
name: values.name,
105104
description: values.description,
@@ -108,7 +107,7 @@ const IngestionCsvCreation: FunctionComponent<IngestionCsvCreationProps> = ({ pa
108107
authentication_type: values.authentication_type,
109108
authentication_value: authenticationValue,
110109
current_state_date: values.current_state_date,
111-
user_id: userId,
110+
user_id: typeof values.user_id === 'string' ? values.user_id : values.user_id.value,
112111
};
113112
commit({
114113
variables: {
@@ -330,8 +329,7 @@ const IngestionCsvCreation: FunctionComponent<IngestionCsvCreationProps> = ({ pa
330329
<IngestionCsvMapperTestDialog
331330
open={open}
332331
onClose={() => setOpen(false)}
333-
uri={values.uri}
334-
csvMapperId={values.csv_mapper_id}
332+
values={values}
335333
setIsCreateDisabled={setIsCreateDisabled}
336334
/>
337335
</Form>

opencti-platform/opencti-front/src/private/components/data/ingestionCsv/IngestionCsvEdition.tsx

+1-2
Original file line numberDiff line numberDiff line change
@@ -361,8 +361,7 @@ const IngestionCsvEdition: FunctionComponent<IngestionCsvEditionProps> = ({
361361
<IngestionCsvMapperTestDialog
362362
open={open}
363363
onClose={() => setOpen(false)}
364-
uri={values.uri}
365-
csvMapperId={values.csv_mapper_id}
364+
values={values}
366365
/>
367366
</Form>
368367
)}

opencti-platform/opencti-front/src/private/components/data/ingestionCsv/IngestionCsvMapperTestDialog.tsx

+49-53
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
1-
import { graphql } from 'react-relay';
1+
import { graphql, useMutation } from 'react-relay';
22
import React, { FunctionComponent, useState } from 'react';
33
import Dialog from '@mui/material/Dialog';
44
import DialogTitle from '@mui/material/DialogTitle';
55
import DialogContent from '@mui/material/DialogContent';
66
import Button from '@mui/material/Button';
77
import Box from '@mui/material/Box';
88
import CodeBlock from '@components/common/CodeBlock';
9-
import { IngestionCsvMapperTestDialogQuery$data } from '@components/data/ingestionCsv/__generated__/IngestionCsvMapperTestDialogQuery.graphql';
10-
import { Option } from '@components/common/form/ReferenceField';
11-
import TextField from '@mui/material/TextField';
129
import Alert from '@mui/material/Alert';
10+
import { Option } from '@components/common/form/ReferenceField';
11+
import { IngestionCsvMapperTestDialogMutation$data } from '@components/data/ingestionCsv/__generated__/IngestionCsvMapperTestDialogMutation.graphql';
1312
import Loader, { LoaderVariant } from '../../../../components/Loader';
1413
import { useFormatter } from '../../../../components/i18n';
15-
import { fetchQuery, handleError } from '../../../../relay/environment';
14+
import { handleError } from '../../../../relay/environment';
1615

17-
const ingestionCsvMapperTestQuery = graphql`
18-
query IngestionCsvMapperTestDialogQuery($uri: String!, $csv_mapper_id: String!) {
19-
test_mapper(uri: $uri, csv_mapper_id: $csv_mapper_id) {
16+
const ingestionCsvMapperTestMutation = graphql`
17+
mutation IngestionCsvMapperTestDialogMutation($input: IngestionCsvAddInput!) {
18+
ingestionCsvTester(input: $input) {
2019
nbEntities
2120
nbRelationships
2221
objects
@@ -27,76 +26,73 @@ const ingestionCsvMapperTestQuery = graphql`
2726
interface IngestionCsvMapperTestDialogProps {
2827
open: boolean
2928
onClose: () => void
30-
uri: string
31-
csvMapperId: string | Option
29+
values: {
30+
name: string,
31+
description?: string | null,
32+
authentication_type: string,
33+
authentication_value?: string | null,
34+
current_state_date: Date | null,
35+
uri: string,
36+
ingestion_running?: boolean | null,
37+
csv_mapper_id: string | Option,
38+
user_id: string | Option
39+
}
3240
setIsCreateDisabled?: React.Dispatch<React.SetStateAction<boolean>>
3341
}
3442

3543
const IngestionCsvMapperTestDialog: FunctionComponent<IngestionCsvMapperTestDialogProps> = ({
3644
open,
3745
onClose,
38-
uri,
39-
csvMapperId,
46+
values,
4047
setIsCreateDisabled,
4148
}) => {
4249
const { t_i18n } = useFormatter();
43-
const [result, setResult] = useState<IngestionCsvMapperTestDialogQuery$data | undefined>(undefined);
50+
const [result, setResult] = useState<IngestionCsvMapperTestDialogMutation$data | undefined>(undefined);
51+
const [commitTest] = useMutation(ingestionCsvMapperTestMutation);
4452
const [loading, setLoading] = useState<boolean>(false);
4553

4654
const handleClose = () => {
4755
setResult(undefined);
4856
onClose();
4957
};
5058

51-
const onTest = (url: string, csv_mapper_id: string) => {
59+
const onTest = () => {
5260
setLoading(true);
53-
fetchQuery(ingestionCsvMapperTestQuery, { uri: url, csv_mapper_id })
54-
.toPromise()
55-
.then((data) => {
56-
const resultTest = (data as IngestionCsvMapperTestDialogQuery$data)
57-
.test_mapper;
61+
commitTest({
62+
variables: {
63+
input: {
64+
name: values.name,
65+
description: values.description,
66+
authentication_type: values.authentication_type,
67+
authentication_value: values.authentication_value,
68+
current_state_date: values.current_state_date,
69+
uri: values.uri,
70+
ingestion_running: values.ingestion_running,
71+
user_id: typeof values.user_id === 'string' ? values.user_id : values.user_id.value,
72+
csv_mapper_id: typeof values.csv_mapper_id === 'string' ? values.csv_mapper_id : values.csv_mapper_id.value,
73+
},
74+
},
75+
onCompleted: (data) => {
76+
const resultTest = (data as IngestionCsvMapperTestDialogMutation$data);
5877
if (resultTest) {
59-
setResult({
60-
test_mapper: {
61-
...resultTest,
62-
},
63-
});
78+
setResult(resultTest);
6479
if (setIsCreateDisabled) {
65-
setIsCreateDisabled(resultTest.nbEntities === 0);
80+
setIsCreateDisabled(resultTest.ingestionCsvTester?.nbEntities === 0);
6681
}
6782
}
6883
setLoading(false);
69-
}).catch((error) => {
84+
},
85+
onError: (error) => {
7086
handleError(error);
7187
setLoading(false);
72-
});
88+
},
89+
});
7390
};
7491

7592
return (
7693
<Dialog open={open} onClose={handleClose} PaperProps={{ elevation: 1 }}>
7794
<DialogTitle>{t_i18n('Testing csv mapper')}</DialogTitle>
7895
<DialogContent>
79-
<Box
80-
sx={{ marginBottom: '12px' }}
81-
>
82-
<TextField
83-
label="CSV feed URL"
84-
defaultValue={uri}
85-
InputProps={{
86-
readOnly: true,
87-
}}
88-
fullWidth
89-
sx={{ marginBottom: '12px' }}
90-
/>
91-
<TextField
92-
label="CSV mapper"
93-
defaultValue={typeof csvMapperId === 'string' ? csvMapperId : csvMapperId.label}
94-
InputProps={{
95-
readOnly: true,
96-
}}
97-
fullWidth
98-
/>
99-
</Box>
10096
<Box>
10197
<div style={{ width: '100%', marginTop: 10 }}>
10298
<Alert
@@ -113,8 +109,8 @@ const IngestionCsvMapperTestDialog: FunctionComponent<IngestionCsvMapperTestDial
113109
>
114110
<Button
115111
variant="contained"
116-
color={result?.test_mapper?.nbEntities ? 'primary' : 'secondary'}
117-
onClick={() => onTest(uri, typeof csvMapperId === 'string' ? csvMapperId : csvMapperId.value)}
112+
color={result?.ingestionCsvTester?.nbEntities ? 'primary' : 'secondary'}
113+
onClick={() => onTest()}
118114
>
119115
{t_i18n('Test')}
120116
</Button>
@@ -135,14 +131,14 @@ const IngestionCsvMapperTestDialog: FunctionComponent<IngestionCsvMapperTestDial
135131
}}
136132
>
137133
<span>{t_i18n('Objects found')} : </span>
138-
<span><strong>{result?.test_mapper?.nbEntities} </strong> {t_i18n('Entities')}</span>
139-
<span><strong>{result?.test_mapper?.nbRelationships}</strong> {t_i18n('Relationships')}</span>
134+
<span><strong>{result?.ingestionCsvTester?.nbEntities} </strong> {t_i18n('Entities')}</span>
135+
<span><strong>{result?.ingestionCsvTester?.nbRelationships}</strong> {t_i18n('Relationships')}</span>
140136
</Box>
141137
}
142138
</Box>
143139
<Box sx={{ marginTop: '8px' }}>
144140
<CodeBlock
145-
code={result?.test_mapper?.objects || t_i18n('You will find here the result in JSON format.')}
141+
code={result?.ingestionCsvTester?.objects || t_i18n('You will find here the result in JSON format.')}
146142
language={'json'}
147143
/>
148144
</Box>

opencti-platform/opencti-front/src/private/components/data/ingestionTaxii/IngestionTaxiiLine.jsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class IngestionTaxiiLineLineComponent extends Component {
107107
className={classes.bodyItem}
108108
style={{ width: dataColumns.added_after_start.width }}
109109
>
110-
<code>{node.added_after_start}</code>
110+
<code>{node.added_after_start || node.current_state_cursor}</code>
111111
</div>
112112
</div>
113113
}
@@ -144,6 +144,7 @@ const IngestionTaxiiLineFragment = createFragmentContainer(
144144
version
145145
ingestion_running
146146
added_after_start
147+
current_state_cursor
147148
}
148149
`,
149150
},

opencti-platform/opencti-front/src/schema/relay.schema.graphql

+2-1
Original file line numberDiff line numberDiff line change
@@ -7375,7 +7375,6 @@ type Query {
73757375
ingestionTaxiis(first: Int, after: ID, orderBy: IngestionTaxiiOrdering, orderMode: OrderingMode, filters: FilterGroup, includeAuthorities: Boolean, search: String): IngestionTaxiiConnection
73767376
ingestionCsv(id: String!): IngestionCsv
73777377
ingestionCsvs(first: Int, after: ID, orderBy: IngestionCsvOrdering, orderMode: OrderingMode, filters: FilterGroup, includeAuthorities: Boolean, search: String): IngestionCsvConnection
7378-
test_mapper(uri: String!, csv_mapper_id: String!): CsvMapperTestResult
73797378
indicator(id: String!): Indicator
73807379
indicators(first: Int, after: ID, orderBy: IndicatorsOrdering, orderMode: OrderingMode, filters: FilterGroup, search: String): IndicatorConnection
73817380
indicatorsTimeSeries(objectId: String, field: String!, operation: StatsOperation!, startDate: DateTime!, endDate: DateTime!, interval: String!, filters: FilterGroup): [TimeSeries]
@@ -8125,6 +8124,7 @@ type Mutation {
81258124
ingestionTaxiiAdd(input: IngestionTaxiiAddInput!): IngestionTaxii
81268125
ingestionTaxiiDelete(id: ID!): ID
81278126
ingestionTaxiiFieldPatch(id: ID!, input: [EditInput!]!): IngestionTaxii
8127+
ingestionCsvTester(input: IngestionCsvAddInput!): CsvMapperTestResult
81288128
ingestionCsvAdd(input: IngestionCsvAddInput!): IngestionCsv
81298129
ingestionCsvDelete(id: ID!): ID
81308130
ingestionCsvFieldPatch(id: ID!, input: [EditInput!]!): IngestionCsv
@@ -10593,6 +10593,7 @@ type IngestionTaxii implements InternalObject & BasicObject {
1059310593
authentication_value: String
1059410594
user_id: String
1059510595
user: Creator
10596+
current_state_cursor: String
1059610597
added_after_start: DateTime
1059710598
ingestion_running: Boolean
1059810599
}

opencti-platform/opencti-graphql/src/database/rabbitmq.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,16 @@ export const metrics = async (context, user) => {
103103
const metricApi = async () => {
104104
const ssl = USE_SSL_MGMT ? 's' : '';
105105
const baseURL = `http${ssl}://${HOSTNAME_MGMT}:${PORT_MGMT}`;
106-
const httpClient = getHttpClient({
106+
const httpClientOptions = {
107107
baseURL,
108108
responseType: 'json',
109109
rejectUnauthorized: RABBITMQ_MGMT_REJECT_UNAUTHORIZED,
110110
auth: {
111111
username: USERNAME,
112112
password: PASSWORD,
113113
},
114-
});
114+
};
115+
const httpClient = getHttpClient(httpClientOptions);
115116
const overview = await httpClient.get('/api/overview').then((response) => response.data);
116117
const queues = await httpClient.get(`/api/queues${VHOST_PATH}`).then((response) => response.data);
117118
// Compute number of push queues

opencti-platform/opencti-graphql/src/domain/connector.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ export const fetchRemoteStreams = async (context, user, { uri, token, ssl_verify
207207
const httpClientOptions = { headers, rejectUnauthorized: ssl_verify ?? false, responseType: 'json' };
208208
const httpClient = getHttpClient(httpClientOptions);
209209
const remoteUri = `${uri.endsWith('/') ? uri.slice(0, -1) : uri}/graphql`;
210-
const { data } = await httpClient.post(remoteUri, { query }, { withCredentials: true });
210+
const { data } = await httpClient.post(remoteUri, { query });
211211
return data.data.streamCollections.edges.map((e) => e.node);
212212
} catch (e) {
213213
throw ValidationError('uri', { message: 'Error getting the streams from remote OpenCTI', cause: e });

opencti-platform/opencti-graphql/src/generated/graphql.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -9911,6 +9911,7 @@ export type IngestionTaxii = BasicObject & InternalObject & {
99119911
authentication_value?: Maybe<Scalars['String']['output']>;
99129912
collection: Scalars['String']['output'];
99139913
created_at?: Maybe<Scalars['DateTime']['output']>;
9914+
current_state_cursor?: Maybe<Scalars['String']['output']>;
99149915
description?: Maybe<Scalars['String']['output']>;
99159916
entity_type: Scalars['String']['output'];
99169917
id: Scalars['ID']['output'];
@@ -12264,6 +12265,7 @@ export type Mutation = {
1226412265
ingestionCsvAdd?: Maybe<IngestionCsv>;
1226512266
ingestionCsvDelete?: Maybe<Scalars['ID']['output']>;
1226612267
ingestionCsvFieldPatch?: Maybe<IngestionCsv>;
12268+
ingestionCsvTester?: Maybe<CsvMapperTestResult>;
1226712269
ingestionRssAdd?: Maybe<IngestionRss>;
1226812270
ingestionRssDelete?: Maybe<Scalars['ID']['output']>;
1226912271
ingestionRssFieldPatch?: Maybe<IngestionRss>;
@@ -13194,6 +13196,11 @@ export type MutationIngestionCsvFieldPatchArgs = {
1319413196
};
1319513197

1319613198

13199+
export type MutationIngestionCsvTesterArgs = {
13200+
input: IngestionCsvAddInput;
13201+
};
13202+
13203+
1319713204
export type MutationIngestionRssAddArgs = {
1319813205
input: IngestionRssAddInput;
1319913206
};
@@ -17692,7 +17699,6 @@ export type Query = {
1769217699
tasks?: Maybe<TaskConnection>;
1769317700
taxiiCollection?: Maybe<TaxiiCollection>;
1769417701
taxiiCollections?: Maybe<TaxiiCollectionConnection>;
17695-
test_mapper?: Maybe<CsvMapperTestResult>;
1769617702
threatActor?: Maybe<ThreatActor>;
1769717703
threatActorGroup?: Maybe<ThreatActorGroup>;
1769817704
threatActorIndividual?: Maybe<ThreatActorIndividual>;
@@ -19943,12 +19949,6 @@ export type QueryTaxiiCollectionsArgs = {
1994319949
};
1994419950

1994519951

19946-
export type QueryTest_MapperArgs = {
19947-
csv_mapper_id: Scalars['String']['input'];
19948-
uri: Scalars['String']['input'];
19949-
};
19950-
19951-
1995219952
export type QueryThreatActorArgs = {
1995319953
id?: InputMaybe<Scalars['String']['input']>;
1995419954
};
@@ -32600,6 +32600,7 @@ export type IngestionTaxiiResolvers<ContextType = any, ParentType extends Resolv
3260032600
authentication_value?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
3260132601
collection?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3260232602
created_at?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>;
32603+
current_state_cursor?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
3260332604
description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
3260432605
entity_type?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
3260532606
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
@@ -33587,6 +33588,7 @@ export type MutationResolvers<ContextType = any, ParentType extends ResolversPar
3358733588
ingestionCsvAdd?: Resolver<Maybe<ResolversTypes['IngestionCsv']>, ParentType, ContextType, RequireFields<MutationIngestionCsvAddArgs, 'input'>>;
3358833589
ingestionCsvDelete?: Resolver<Maybe<ResolversTypes['ID']>, ParentType, ContextType, RequireFields<MutationIngestionCsvDeleteArgs, 'id'>>;
3358933590
ingestionCsvFieldPatch?: Resolver<Maybe<ResolversTypes['IngestionCsv']>, ParentType, ContextType, RequireFields<MutationIngestionCsvFieldPatchArgs, 'id' | 'input'>>;
33591+
ingestionCsvTester?: Resolver<Maybe<ResolversTypes['CsvMapperTestResult']>, ParentType, ContextType, RequireFields<MutationIngestionCsvTesterArgs, 'input'>>;
3359033592
ingestionRssAdd?: Resolver<Maybe<ResolversTypes['IngestionRss']>, ParentType, ContextType, RequireFields<MutationIngestionRssAddArgs, 'input'>>;
3359133593
ingestionRssDelete?: Resolver<Maybe<ResolversTypes['ID']>, ParentType, ContextType, RequireFields<MutationIngestionRssDeleteArgs, 'id'>>;
3359233594
ingestionRssFieldPatch?: Resolver<Maybe<ResolversTypes['IngestionRss']>, ParentType, ContextType, RequireFields<MutationIngestionRssFieldPatchArgs, 'id' | 'input'>>;
@@ -35082,7 +35084,6 @@ export type QueryResolvers<ContextType = any, ParentType extends ResolversParent
3508235084
tasks?: Resolver<Maybe<ResolversTypes['TaskConnection']>, ParentType, ContextType, Partial<QueryTasksArgs>>;
3508335085
taxiiCollection?: Resolver<Maybe<ResolversTypes['TaxiiCollection']>, ParentType, ContextType, RequireFields<QueryTaxiiCollectionArgs, 'id'>>;
3508435086
taxiiCollections?: Resolver<Maybe<ResolversTypes['TaxiiCollectionConnection']>, ParentType, ContextType, Partial<QueryTaxiiCollectionsArgs>>;
35085-
test_mapper?: Resolver<Maybe<ResolversTypes['CsvMapperTestResult']>, ParentType, ContextType, RequireFields<QueryTest_MapperArgs, 'csv_mapper_id' | 'uri'>>;
3508635087
threatActor?: Resolver<Maybe<ResolversTypes['ThreatActor']>, ParentType, ContextType, Partial<QueryThreatActorArgs>>;
3508735088
threatActorGroup?: Resolver<Maybe<ResolversTypes['ThreatActorGroup']>, ParentType, ContextType, Partial<QueryThreatActorGroupArgs>>;
3508835089
threatActorIndividual?: Resolver<Maybe<ResolversTypes['ThreatActorIndividual']>, ParentType, ContextType, RequireFields<QueryThreatActorIndividualArgs, 'id'>>;

0 commit comments

Comments
 (0)