Skip to content

Commit

Permalink
move request handler to its own class
Browse files Browse the repository at this point in the history
Signed-off-by: Tianle Huang <[email protected]>
  • Loading branch information
tianleh committed Dec 27, 2023
1 parent 6ae5618 commit a2e9d37
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 46 deletions.
50 changes: 50 additions & 0 deletions src/plugins/csp_configuration_provider/server/csp_handlers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import { CoreSetup, OnPreResponseHandler, OpenSearchClient } from '../../../core/server';
import { CspClient } from './types';

const OPENSEARCH_DASHBOARDS_CONFIG_INDEX_NAME = '.opensearch_dashboards_config';
const OPENSEARCH_DASHBOARDS_CONFIG_DOCUMENT_NAME = 'csp.rules';

export function createCspRulesPreResponseHandler(
core: CoreSetup,
getCspClient: (inputOpenSearchClient: OpenSearchClient) => CspClient
): OnPreResponseHandler {
return async (request, response, toolkit) => {
const shouldCheckDest = ['document', 'frame', 'iframe', 'embed', 'object'];

const currentDest = request.headers['sec-fetch-dest'];

if (!shouldCheckDest.includes(currentDest)) {
return toolkit.next({});
}

const [coreStart] = await core.getStartServices();

const myClient = getCspClient(coreStart.opensearch.client.asInternalUser);

const existsData = await myClient.exists(OPENSEARCH_DASHBOARDS_CONFIG_INDEX_NAME);

let header;
const defaultHeader = core.http.csp.header;

if (!existsData) {
header = defaultHeader;
} else {
const data = await myClient.get(
OPENSEARCH_DASHBOARDS_CONFIG_INDEX_NAME,
OPENSEARCH_DASHBOARDS_CONFIG_DOCUMENT_NAME
);
header = data || defaultHeader;
}

const additionalHeaders = {
['content-security-policy']: header,
};

return toolkit.next({ headers: additionalHeaders });
};
}
54 changes: 8 additions & 46 deletions src/plugins/csp_configuration_provider/server/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
import {
PluginInitializerContext,
CoreSetup,
CoreStart,
Plugin,
Logger,
OnPreResponseHandler,
OpenSearchClient,
Plugin,
PluginInitializerContext,
} from '../../../core/server';

import { createCspRulesPreResponseHandler } from './csp_handlers';
import { OpenSearchCspClient } from './provider';
import { defineRoutes } from './routes';
import {
CspClient,
CspConfigurationProviderPluginSetup,
CspConfigurationProviderPluginStart,
} from './types';
import { defineRoutes } from './routes';
import { OpenSearchCspClient } from './provider';

const OPENSEARCH_DASHBOARDS_CONFIG_INDEX_NAME = '.opensearch_dashboards_config';
const OPENSEARCH_DASHBOARDS_CONFIG_DOCUMENT_NAME = 'csp.rules';

export class CspConfigurationProviderPlugin
implements Plugin<CspConfigurationProviderPluginSetup, CspConfigurationProviderPluginStart> {
Expand Down Expand Up @@ -47,7 +44,9 @@ export class CspConfigurationProviderPlugin
// Register server side APIs
defineRoutes(router);

core.http.registerOnPreResponse(this.createCspRulesPreResponseHandler(core));
core.http.registerOnPreResponse(
createCspRulesPreResponseHandler(core, this.getCspClient.bind(this))
);

return {
setCspClient: this.setCspClient.bind(this),
Expand All @@ -60,41 +59,4 @@ export class CspConfigurationProviderPlugin
}

public stop() {}

private createCspRulesPreResponseHandler(core: CoreSetup): OnPreResponseHandler {
return async (request, response, toolkit) => {
const shouldCheckDest = ['document', 'frame', 'iframe', 'embed', 'object'];

const currentDest = request.headers['sec-fetch-dest'];

if (!shouldCheckDest.includes(currentDest)) {
return toolkit.next({});
}

const [coreStart] = await core.getStartServices();

const myClient = this.getCspClient(coreStart.opensearch.client.asInternalUser);

const existsData = await myClient.exists(OPENSEARCH_DASHBOARDS_CONFIG_INDEX_NAME);

let header;
const defaultHeader = core.http.csp.header;

if (!existsData) {
header = defaultHeader;
} else {
const data = await myClient.get(
OPENSEARCH_DASHBOARDS_CONFIG_INDEX_NAME,
OPENSEARCH_DASHBOARDS_CONFIG_DOCUMENT_NAME
);
header = data || defaultHeader;
}

const additionalHeaders = {
['content-security-policy']: header,
};

return toolkit.next({ headers: additionalHeaders });
};
}
}

0 comments on commit a2e9d37

Please sign in to comment.