Skip to content

Commit 75bc164

Browse files
Merge pull request #15043 from vikram-raj/cherry-pick-devconsole-proxy
[release-4.18] OCPBUGS-55991: Remove the devconsole backend common internet proxy and replace it with dedicated ones
2 parents fd45b42 + 451059a commit 75bc164

File tree

28 files changed

+1086
-508
lines changed

28 files changed

+1086
-508
lines changed

cmd/bridge/main.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,9 @@ func main() {
317317
srv.GOOS = runtime.GOOS
318318
}
319319

320+
// Blacklisted headers
321+
srv.ProxyHeaderDenyList = []string{"Cookie", "X-CSRFToken", "X-CSRF-Token"}
322+
320323
if *fLogLevel != "" {
321324
klog.Warningf("DEPRECATED: --log-level is now deprecated, use verbosity flag --v=Level instead")
322325
}
@@ -353,7 +356,7 @@ func main() {
353356

354357
srv.K8sProxyConfig = &proxy.Config{
355358
TLSClientConfig: tlsConfig,
356-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
359+
HeaderBlacklist: srv.ProxyHeaderDenyList,
357360
Endpoint: k8sEndpoint,
358361
}
359362

@@ -384,41 +387,41 @@ func main() {
384387

385388
srv.ThanosProxyConfig = &proxy.Config{
386389
TLSClientConfig: serviceProxyTLSConfig,
387-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
390+
HeaderBlacklist: srv.ProxyHeaderDenyList,
388391
Endpoint: &url.URL{Scheme: "https", Host: openshiftThanosHost, Path: "/api"},
389392
}
390393
srv.ThanosTenancyProxyConfig = &proxy.Config{
391394
TLSClientConfig: serviceProxyTLSConfig,
392-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
395+
HeaderBlacklist: srv.ProxyHeaderDenyList,
393396
Endpoint: &url.URL{Scheme: "https", Host: openshiftThanosTenancyHost, Path: "/api"},
394397
}
395398
srv.ThanosTenancyProxyForRulesConfig = &proxy.Config{
396399
TLSClientConfig: serviceProxyTLSConfig,
397-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
400+
HeaderBlacklist: srv.ProxyHeaderDenyList,
398401
Endpoint: &url.URL{Scheme: "https", Host: openshiftThanosTenancyForRulesHost, Path: "/api"},
399402
}
400403

401404
srv.AlertManagerProxyConfig = &proxy.Config{
402405
TLSClientConfig: serviceProxyTLSConfig,
403-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
406+
HeaderBlacklist: srv.ProxyHeaderDenyList,
404407
Endpoint: &url.URL{Scheme: "https", Host: openshiftAlertManagerHost, Path: "/api"},
405408
}
406409
srv.AlertManagerUserWorkloadProxyConfig = &proxy.Config{
407410
TLSClientConfig: serviceProxyTLSConfig,
408-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
411+
HeaderBlacklist: srv.ProxyHeaderDenyList,
409412
Endpoint: &url.URL{Scheme: "https", Host: *fAlertmanagerUserWorkloadHost, Path: "/api"},
410413
}
411414
srv.AlertManagerTenancyProxyConfig = &proxy.Config{
412415
TLSClientConfig: serviceProxyTLSConfig,
413-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
416+
HeaderBlacklist: srv.ProxyHeaderDenyList,
414417
Endpoint: &url.URL{Scheme: "https", Host: *fAlertmanagerTenancyHost, Path: "/api"},
415418
}
416419
srv.TerminalProxyTLSConfig = serviceProxyTLSConfig
417420
srv.PluginsProxyTLSConfig = serviceProxyTLSConfig
418421

419422
srv.GitOpsProxyConfig = &proxy.Config{
420423
TLSClientConfig: serviceProxyTLSConfig,
421-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
424+
HeaderBlacklist: srv.ProxyHeaderDenyList,
422425
Endpoint: &url.URL{Scheme: "https", Host: openshiftGitOpsHost},
423426
}
424427
}
@@ -448,7 +451,7 @@ func main() {
448451

449452
srv.K8sProxyConfig = &proxy.Config{
450453
TLSClientConfig: serviceProxyTLSConfig,
451-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
454+
HeaderBlacklist: srv.ProxyHeaderDenyList,
452455
Endpoint: k8sEndpoint,
453456
UseProxyFromEnvironment: true,
454457
}
@@ -469,17 +472,17 @@ func main() {
469472
offClusterThanosURL.Path += "/api"
470473
srv.ThanosTenancyProxyConfig = &proxy.Config{
471474
TLSClientConfig: serviceProxyTLSConfig,
472-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
475+
HeaderBlacklist: srv.ProxyHeaderDenyList,
473476
Endpoint: offClusterThanosURL,
474477
}
475478
srv.ThanosTenancyProxyForRulesConfig = &proxy.Config{
476479
TLSClientConfig: serviceProxyTLSConfig,
477-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
480+
HeaderBlacklist: srv.ProxyHeaderDenyList,
478481
Endpoint: offClusterThanosURL,
479482
}
480483
srv.ThanosProxyConfig = &proxy.Config{
481484
TLSClientConfig: serviceProxyTLSConfig,
482-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
485+
HeaderBlacklist: srv.ProxyHeaderDenyList,
483486
Endpoint: offClusterThanosURL,
484487
}
485488
}
@@ -491,17 +494,17 @@ func main() {
491494
offClusterAlertManagerURL.Path += "/api"
492495
srv.AlertManagerProxyConfig = &proxy.Config{
493496
TLSClientConfig: serviceProxyTLSConfig,
494-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
497+
HeaderBlacklist: srv.ProxyHeaderDenyList,
495498
Endpoint: offClusterAlertManagerURL,
496499
}
497500
srv.AlertManagerTenancyProxyConfig = &proxy.Config{
498501
TLSClientConfig: serviceProxyTLSConfig,
499-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
502+
HeaderBlacklist: srv.ProxyHeaderDenyList,
500503
Endpoint: offClusterAlertManagerURL,
501504
}
502505
srv.AlertManagerUserWorkloadProxyConfig = &proxy.Config{
503506
TLSClientConfig: serviceProxyTLSConfig,
504-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
507+
HeaderBlacklist: srv.ProxyHeaderDenyList,
505508
Endpoint: offClusterAlertManagerURL,
506509
}
507510
}
@@ -515,7 +518,7 @@ func main() {
515518

516519
srv.GitOpsProxyConfig = &proxy.Config{
517520
TLSClientConfig: serviceProxyTLSConfig,
518-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
521+
HeaderBlacklist: srv.ProxyHeaderDenyList,
519522
Endpoint: offClusterGitOpsURL,
520523
}
521524
}
@@ -535,7 +538,7 @@ func main() {
535538
}
536539
srv.ClusterManagementProxyConfig = &proxy.Config{
537540
TLSClientConfig: oscrypto.SecureTLSConfig(&tls.Config{}),
538-
HeaderBlacklist: []string{"Cookie", "X-CSRFToken"},
541+
HeaderBlacklist: srv.ProxyHeaderDenyList,
539542
Endpoint: clusterManagementURL,
540543
}
541544

frontend/__tests__/reducers/features.spec.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ describe('featureReducer', () => {
5353
CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED: undefined,
5454
CONSOLE_CAPABILITY_GETTINGSTARTEDBANNER_IS_ENABLED: undefined,
5555
LIGHTSPEED_IS_AVAILABLE_TO_INSTALL: undefined,
56+
DEVCONSOLE_PROXY: true,
5657
}),
5758
);
5859
});

frontend/packages/console-shared/src/constants/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ export enum FLAGS {
9292
CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED = 'CONSOLE_CAPABILITY_LIGHTSPEEDBUTTON_IS_ENABLED',
9393
CONSOLE_CAPABILITY_GETTINGSTARTEDBANNER_IS_ENABLED = 'CONSOLE_CAPABILITY_GETTINGSTARTEDBANNER_IS_ENABLED',
9494
LIGHTSPEED_IS_AVAILABLE_TO_INSTALL = 'LIGHTSPEED_IS_AVAILABLE_TO_INSTALL',
95+
DEVCONSOLE_PROXY = 'DEVCONSOLE_PROXY',
9596
}
9697

9798
export const CONFIG_STORAGE_CONSOLE = 'console';
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export type DevConsoleEndpointResponse = {
2+
statusCode: number;
3+
headers: Record<string, string[]>;
4+
body: string;
5+
};

frontend/packages/console-shared/src/types/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export * from './pod';
22
export * from './resource';
33
export * from './route-params';
44
export * from './tableColumn';
5+
export * from './backend-api';

frontend/packages/console-shared/src/utils/proxy.ts

Lines changed: 0 additions & 62 deletions
This file was deleted.

frontend/packages/git-service/src/services/bitbucket-service.ts

Lines changed: 38 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@ import { Base64 } from 'js-base64';
22
import * as ParseBitbucketUrl from 'parse-bitbucket-url';
33
import 'whatwg-fetch';
44
import { consoleFetchJSON } from '@console/dynamic-plugin-sdk/src/lib-core';
5-
import {
6-
API_PROXY_URL,
7-
ProxyResponse,
8-
consoleProxyFetchJSON,
9-
convertHeaders,
10-
} from '@console/shared/src/utils/proxy';
5+
import { DevConsoleEndpointResponse } from '@console/shared/src';
116
import {
127
GitSource,
138
SecretType,
@@ -19,6 +14,24 @@ import {
1914
} from '../types';
2015
import { BaseService } from './base-service';
2116

17+
type BBWebhookBody = {
18+
url: string;
19+
events: string[];
20+
skip_cert_verification: boolean;
21+
active: boolean;
22+
};
23+
24+
type BitbucketWebhookRequest = {
25+
headers: Headers;
26+
isServer: boolean;
27+
baseURL: string;
28+
owner: string;
29+
repoName: string;
30+
body: BBWebhookBody;
31+
};
32+
33+
export const BITBUCKET_WEBHOOK_BACKEND_URL = '/api/dev-console/webhooks/bitbucket';
34+
2235
export class BitbucketService extends BaseService {
2336
private readonly metadata: RepoMetadata;
2437

@@ -61,15 +74,6 @@ export class BitbucketService extends BaseService {
6174
...headers,
6275
};
6376

64-
if (this.isServer) {
65-
return consoleProxyFetchJSON({
66-
url,
67-
method: requestMethod || 'GET',
68-
headers: convertHeaders(requestHeaders),
69-
...(body && { body: JSON.stringify(body) }),
70-
});
71-
}
72-
7377
const response = await fetch(url, {
7478
method: requestMethod || 'GET',
7579
headers: requestHeaders,
@@ -183,28 +187,33 @@ export class BitbucketService extends BaseService {
183187
webhookURL: string,
184188
sslVerification: boolean,
185189
): Promise<boolean> => {
186-
const headers = {
187-
'Content-Type': ['application/json'],
188-
Authorization: [`Basic ${token}`],
189-
};
190-
const body = {
190+
const headers = new Headers({
191+
'Content-Type': 'application/json',
192+
Authorization: `Basic ${token}`,
193+
});
194+
const body: BBWebhookBody = {
191195
url: webhookURL,
192196
events: ['repo:push', 'pullrequest:created', 'pullrequest:updated'],
193197
skip_cert_verification: !sslVerification,
194198
active: true,
195199
};
196-
const url = this.isServer
197-
? `${this.baseURL}/projects/${this.metadata.owner}/repos/${this.metadata.repoName}/hooks`
198-
: `${this.baseURL}/repositories/${this.metadata.owner}/${this.metadata.repoName}/hooks`;
199200

200-
/* Using DevConsole Proxy to create webhook as Bitbucket is giving CORS error */
201-
const webhookResponse: ProxyResponse = await consoleFetchJSON.post(API_PROXY_URL, {
202-
url,
203-
method: 'POST',
201+
const webhookRequestBody: BitbucketWebhookRequest = {
204202
headers,
205-
body: JSON.stringify(body),
206-
});
203+
isServer: this.isServer,
204+
baseURL: this.baseURL,
205+
owner: this.metadata.owner,
206+
repoName: this.metadata.repoName,
207+
body,
208+
};
207209

210+
const webhookResponse: DevConsoleEndpointResponse = await consoleFetchJSON.post(
211+
BITBUCKET_WEBHOOK_BACKEND_URL,
212+
webhookRequestBody,
213+
);
214+
if (!webhookResponse.statusCode) {
215+
throw new Error('Unexpected proxy response: Status code is missing!');
216+
}
208217
return webhookResponse.statusCode === 201;
209218
};
210219

0 commit comments

Comments
 (0)