Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4.10.2] address unsafe-eval CSP issues, additional cleanup #2753

Merged
merged 3 commits into from
Sep 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@
/libraries/botframework-streaming/** @microsoft/bf-streaming

# BotBuilder Dialogs
/libraries/botbuilder-Dialogs/** @microsoft/bf-dialogs
/tests/botbuilder-Dialogs/** @microsoft/bf-dialogs
/libraries/botbuilder-dialogs/** @microsoft/bf-dialogs
/tests/botbuilder-dialogs/** @microsoft/bf-dialogs

# Swagger
/libraries/swagger/** @axelsrz @EricDahlvang
Expand Down Expand Up @@ -92,7 +92,7 @@
/libraries/botframework-schema/src/teams/** @microsoft/bf-teams
/libraries/botframework-connector/src/teams/** @microsoft/bf-teams
/libraries/botbuilder/tests/**/teams*.js @microsoft/bf-teams
/lbiraries/teams-scenarios/** @microsoft/bf-teams
/libraries/teams-scenarios/** @microsoft/bf-teams

# Ownership by specific files or file types
# This section MUST stay at the bottom of the CODEOWNERS file. For more information, see
Expand Down
4 changes: 2 additions & 2 deletions build/yaml/js-analysis-steps.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ steps:
versionSpec: $(NodeVersion)

- task: Npm@1
displayName: 'npm install eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-only-warn eslint-plugin-jsdoc'
displayName: 'npm install eslint typescript@3.5.3 @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-only-warn eslint-plugin-jsdoc'
inputs:
command: custom
verbose: false
customCommand: 'install eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-only-warn eslint-plugin-jsdoc'
customCommand: 'install eslint typescript@3.5.3 @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-only-warn eslint-plugin-jsdoc'

- task: Npm@1
displayName: 'npm run eslint'
Expand Down
2 changes: 1 addition & 1 deletion libraries/botframework-streaming/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
"scripts": {
"build": "tsc -p tsconfig.json && tsc -p tsconfig-browser.json",
"build:rollup": "npm run clean && npm run build && api-extractor run --verbose --local",
"clean": "erase /q /s .\\lib .\\browser",
"clean": "rmdir /q /s lib browser",
"eslint": "eslint ./src/*.ts ./src/**/*.ts",
"eslint-fix": "eslint ./src/*.ts ./src/**/*.ts --fix",
"set-version": "npm version --allow-same-version ${Version}",
Expand Down
3 changes: 1 addition & 2 deletions libraries/botframework-streaming/src/index-browser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,5 @@ export { StreamingResponse } from './streamingResponse';
export { SubscribableStream } from './subscribableStream';
export {
BrowserWebSocket,
WebSocketClient,
WebSocketServer
WebSocketClient
} from './webSocket/index-browser';
1 change: 0 additions & 1 deletion libraries/botframework-streaming/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ export { StreamingRequest } from './streamingRequest';
export { StreamingResponse } from './streamingResponse';
export { SubscribableStream } from './subscribableStream';
export {
BrowserWebSocket,
NodeWebSocket,
NodeWebSocketFactory,
NodeWebSocketFactoryBase,
Expand Down

This file was deleted.

This file was deleted.

2 changes: 0 additions & 2 deletions libraries/botframework-streaming/src/utilities/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,4 @@
* Licensed under the MIT License.
*/

export * from './doesGlobalFileReaderExist';
export * from './doesGlobalWebSocketExist';
export * from './protocol-base';
28 changes: 5 additions & 23 deletions libraries/botframework-streaming/src/webSocket/browserWebSocket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,6 @@
* Licensed under the MIT License.
*/
import { IBrowserFileReader, IBrowserWebSocket, ISocket, INodeBuffer } from '../interfaces';
import { doesGlobalFileReaderExist, doesGlobalWebSocketExist } from '../utilities';

const createWebSocket = function(url: string): IBrowserWebSocket {
if (!url) {
throw new TypeError('Unable to create WebSocket without url.');
}
if (doesGlobalWebSocketExist()) {
return new Function(`return new WebSocket('${ url }');`)();
}
throw new ReferenceError('Unable to find global.WebSocket which is required for constructing a BrowserWebSocket.');
};

const createFileReader = function(): IBrowserFileReader {
if (doesGlobalFileReaderExist()) {
return new Function(`return new FileReader();`)();
}
throw new ReferenceError('Unable to find global.FileReader. Unable to create FileReader for BrowserWebSocket.');
};

export class BrowserWebSocket implements ISocket {
private webSocket: IBrowserWebSocket;
Expand All @@ -49,7 +31,7 @@ export class BrowserWebSocket implements ISocket {
let rejector;

if (!this.webSocket) {
this.webSocket = createWebSocket(serverAddress);
this.webSocket = new WebSocket(serverAddress);
}

this.webSocket.onerror = (e): void => {
Expand Down Expand Up @@ -95,13 +77,13 @@ export class BrowserWebSocket implements ISocket {
*/
public setOnMessageHandler(handler: (x: any) => void): void {
const bufferKey: string = 'buffer';
let packets = [];
const packets = [];
this.webSocket.onmessage = (evt): void => {
let fileReader = createFileReader();
let queueEntry = {buffer: null};
const fileReader = new FileReader();
const queueEntry = { buffer: null };
packets.push(queueEntry);
fileReader.onload = (e): void => {
let t = e.target as IBrowserFileReader;
const t = e.target as unknown as IBrowserFileReader;
queueEntry[bufferKey] = t.result;
if (packets[0] === queueEntry) {
while(0 < packets.length && packets[0][bufferKey]) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/**
* @module botframework-streaming
*/
/**
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/

import { ProtocolAdapter } from '../protocolAdapter';
import { RequestHandler } from '../requestHandler';
import { StreamingRequest } from '../streamingRequest';
import { RequestManager } from '../payloads';
import {
PayloadReceiver,
PayloadSender,
TransportDisconnectedEvent
} from '../payloadTransport';
import { BrowserWebSocket } from './browserWebSocket';
import { WebSocketTransport } from './webSocketTransport';
import { IStreamingTransportClient, IReceiveResponse } from '../interfaces';

/**
* Web socket based client to be used as streaming transport.
*/
export class WebSocketClient implements IStreamingTransportClient {
private readonly _url: string;
private readonly _requestHandler: RequestHandler;
private readonly _sender: PayloadSender;
private readonly _receiver: PayloadReceiver;
private readonly _requestManager: RequestManager;
private readonly _protocolAdapter: ProtocolAdapter;
private readonly _disconnectionHandler: (message: string) => void;

/**
* Creates a new instance of the [WebSocketClient](xref:botframework-streaming.WebSocketClient) class.
*
* @param url The URL of the remote server to connect to.
* @param requestHandler Optional [RequestHandler](xref:botframework-streaming.RequestHandler) to process incoming messages received by this server.
* @param disconnectionHandler Optional function to handle the disconnection message.
*/
public constructor({ url, requestHandler, disconnectionHandler = null}) {
this._url = url;
this._requestHandler = requestHandler;
this._disconnectionHandler = disconnectionHandler;

this._requestManager = new RequestManager();

this._sender = new PayloadSender();
this._sender.disconnected = this.onConnectionDisconnected.bind(this);
this._receiver = new PayloadReceiver();
this._receiver.disconnected = this.onConnectionDisconnected.bind(this);

this._protocolAdapter = new ProtocolAdapter(this._requestHandler, this._requestManager, this._sender, this._receiver);
}

/**
* Establish a connection with no custom headers.
*
* @returns A promise that will not resolve until the client stops listening for incoming messages.
*/
public async connect(): Promise<void> {
const ws = new BrowserWebSocket();
await ws.connect(this._url);
const transport = new WebSocketTransport(ws);
this._sender.connect(transport);
this._receiver.connect(transport);
}

/**
* Stop this client from listening.
*/
public disconnect(): void {
this._sender.disconnect(new TransportDisconnectedEvent('Disconnect was called.'));
this._receiver.disconnect(new TransportDisconnectedEvent('Disconnect was called.'));
}

/**
* Task used to send data over this client connection.
*
* @param request The streaming request to send.
* @returns A promise that will produce an instance of receive response on completion of the send operation.
*/
public async send(request: StreamingRequest): Promise<IReceiveResponse> {
return this._protocolAdapter.sendRequest(request);
}

private onConnectionDisconnected(sender: object, args: any): void {
if (this._disconnectionHandler != null) {
this._disconnectionHandler('Disconnected');
return;
}

throw new Error(`Unable to re-connect client to transport for url ${ this._url }. Sender: '${ JSON.stringify(sender) }'. Args:' ${ JSON.stringify(args) }`);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
*/

export { BrowserWebSocket } from './browserWebSocket';
export { WebSocketClient } from './webSocketClient';
export { WebSocketServer } from './webSocketServer';
export { WebSocketClient } from './browserWebSocketClient';
/** @internal */
export { WebSocketTransport } from './webSocketTransport';
12 changes: 6 additions & 6 deletions libraries/botframework-streaming/src/webSocket/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
* Licensed under the MIT License.
*/

export * from './browserWebSocket';
export * from './factories';
export * from './nodeWebSocket';
export * from './webSocketClient';
export * from './webSocketServer';
export * from './webSocketTransport';
export { NodeWebSocketFactory, NodeWebSocketFactoryBase } from './factories';
export { NodeWebSocket } from './nodeWebSocket';
export { WebSocketClient } from './nodeWebSocketClient';
export { WebSocketServer } from './webSocketServer';
/** @internal */
export { WebSocketTransport } from './webSocketTransport';
Loading