Skip to content

Commit 392553b

Browse files
committed
Merged in JDCMT-208-resolve-security-hotspots (pull request #45)
JDCMT-208 resolved security hotspots + code coverage on new code * JDCMT-208 resolved security hotspots * JDCMT-208 unit-tests for new code * JDCMT-208 resolved code smells * JDCMT-208 resolved code smells #2 Approved-by: Volodymyr Batrukh
1 parent 706904c commit 392553b

File tree

11 files changed

+275
-15
lines changed

11 files changed

+275
-15
lines changed

src/MicrosoftTeamsIntegration.Artifacts/Bots/Middleware/ConsoleOutputMiddleware.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ namespace MicrosoftTeamsIntegration.Artifacts.Bots.Middleware
99
{
1010
public class ConsoleOutputMiddleware : IMiddleware
1111
{
12-
public async Task OnTurnAsync(ITurnContext context, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
12+
public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
1313
{
14-
LogActivity(string.Empty, context.Activity);
15-
context.OnSendActivities(OnSendActivitiesAsync);
14+
LogActivity(string.Empty, turnContext.Activity);
15+
turnContext.OnSendActivities(OnSendActivitiesAsync);
1616

1717
await next(cancellationToken).ConfigureAwait(false);
1818
}

src/MicrosoftTeamsIntegration.Artifacts/Bots/Middleware/SetLocaleMiddleware.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ public SetLocaleMiddleware(string defaultLocale)
1515
_defaultLocale = defaultLocale ?? throw new ArgumentNullException(nameof(defaultLocale));
1616
}
1717

18-
public async Task OnTurnAsync(ITurnContext context, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
18+
public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
1919
{
20-
var cultureInfo = !string.IsNullOrWhiteSpace(context.Activity.Locale) ? new CultureInfo(context.Activity.Locale) : new CultureInfo(this._defaultLocale);
20+
var cultureInfo = !string.IsNullOrWhiteSpace(turnContext.Activity.Locale) ? new CultureInfo(turnContext.Activity.Locale) : new CultureInfo(this._defaultLocale);
2121

2222
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture = cultureInfo;
2323

src/MicrosoftTeamsIntegration.Jira/ClientApp/src/app/components/issues/create-comment-dialog/create-comment-dialog.component.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { Component, OnInit, Input } from '@angular/core';
22
import { FormGroup, FormControl, Validators, AbstractControl } from '@angular/forms';
3-
import { MatDialogConfig, MatDialog } from '@angular/material/dialog';
43
import { ActivatedRoute } from '@angular/router';
54
import { ListKeyManager, ListKeyManagerOption } from '@angular/cdk/a11y';
65
import { UP_ARROW, DOWN_ARROW, ENTER, TAB } from '@angular/cdk/keycodes';
@@ -41,7 +40,6 @@ export class CreateCommentDialogComponent implements OnInit {
4140
private apiService: ApiService,
4241
private commentService: IssueCommentService,
4342
private route: ActivatedRoute,
44-
public dialog: MatDialog,
4543
private utilService: UtilService,
4644
private appInsightsService: AppInsightsService,
4745
private errorService: ErrorService,
@@ -220,10 +218,6 @@ export class CreateCommentDialogComponent implements OnInit {
220218
this.disableActiveListItem();
221219
}
222220

223-
private handleListMouseover() {
224-
this.disableActiveListItem();
225-
}
226-
227221
private disableActiveListItem() {
228222
this.activeIssue = null;
229223
}

src/MicrosoftTeamsIntegration.Jira/ClientApp/src/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
<app-root></app-root>
3131

3232
<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.17/js/adal.min.js"></script>
33-
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.5/bluebird.min.js"></script>
34-
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/3.0.0/fetch.min.js"></script>
33+
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.5/bluebird.min.js" integrity="sha384-MQm/RB2S9xe8tOzJOxm1tStfq3axjZGrhVNWMjblO5fJcgn/gVhx4W5gxzvrcmOl" crossorigin="anonymous"></script>
34+
<script src="https://cdnjs.cloudflare.com/ajax/libs/fetch/3.0.0/fetch.min.js" integrity="sha384-5B8/4F9AQqp/HCHReGLSOWbyAOwnJsPrvx6C0+VPUr44Olzi99zYT1xbVh+ZanQJ" crossorigin="anonymous"></script>
3535

3636
<!-- cookie consent -->
3737
<script type="text/javascript">

src/MicrosoftTeamsIntegration.Jira/ClientApp/src/loginResult.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="utf-8" />
55
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
66
<title>Jira for Microsoft Teams - Login Result</title>
7-
<script src="https://statics.teams.microsoft.com/sdk/v1.5.2/js/MicrosoftTeams.min.js"></script>
7+
<script src="https://statics.teams.microsoft.com/sdk/v1.5.2/js/MicrosoftTeams.min.js" integrity="sha384-TJ2M0tW5fxu25/LwZie10M5O53iP1Q5FweiXk5rvfTHmvA7x2a6I9+KKi2pjAk6k" crossorigin="anonymous"></script>
88
<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.17/js/adal.min.js"></script>
99
<link rel="stylesheet" href="https://aui-cdn.atlassian.com/aui-adg/6.0.9/css/aui.min.css">
1010
</head>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
using System;
2+
using System.Runtime.Serialization;
23

34
namespace MicrosoftTeamsIntegration.Jira.Exceptions
45
{
6+
[Serializable]
57
public class BadRequestException : Exception
68
{
79
public BadRequestException(string message)
810
: base(message)
911
{
1012
}
13+
14+
protected BadRequestException(SerializationInfo serializationInfo, StreamingContext streamingContext)
15+
: base(serializationInfo, streamingContext)
16+
{
17+
}
1118
}
1219
}

src/MicrosoftTeamsIntegration.Jira/Services/BotMessagesService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ public async Task SendAuthorizationCard(ITurnContext turnContext, string jiraUrl
222222
await turnContext.SendToDirectConversationAsync(message, cancellationToken: cancellationToken);
223223
}
224224

225-
private async Task SendWelcomeCard(ITurnContext turnContext, IConnectorClient connectorClient, Activity activity, bool isGroupConversation, CancellationToken cancellationToken)
225+
private static async Task SendWelcomeCard(ITurnContext turnContext, IConnectorClient connectorClient, Activity activity, bool isGroupConversation, CancellationToken cancellationToken)
226226
{
227227
string welcomeText =
228228
"- **View your work** in a tab via a Jira filter or see issues that are assigned to, reported by or watched by you.\n- **Search** for Jira issues right within message extension or bot command\n- **Update issues** or **add comments** right in your conversation with a bot so you can focus on your work and avoid context switching between your web browser and Teams";
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using Microsoft.Bot.Builder;
4+
using Microsoft.Bot.Schema;
5+
using MicrosoftTeamsIntegration.Artifacts.Bots.Middleware;
6+
using Moq;
7+
using Xunit;
8+
9+
namespace MicrosoftTeamsIntegration.Jira.Tests.Bots.Middleware;
10+
11+
public class ConsoleOutputMiddlewareTests
12+
{
13+
[Fact]
14+
public async Task OnTurnAsync_Should_LogMessageActivity_And_CallNext()
15+
{
16+
const string testMessage = "Test message";
17+
var mockTurnContext = new Mock<ITurnContext>();
18+
var mockNextDelegate = new Mock<NextDelegate>();
19+
var activity = new Activity(ActivityTypes.Message) { Text = testMessage };
20+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
21+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
22+
var middleware = new ConsoleOutputMiddleware();
23+
24+
using (var consoleOutput = new ConsoleOutput())
25+
{
26+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
27+
28+
var output = consoleOutput.GetOutput();
29+
Assert.Contains(testMessage, output);
30+
}
31+
32+
mockTurnContext.Verify(c => c.Activity, Times.Once);
33+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
34+
}
35+
36+
[Fact]
37+
public async Task OnTurnAsync_Should_LogEventActivity_And_CallNext()
38+
{
39+
const string testEvent = "Test event";
40+
var mockTurnContext = new Mock<ITurnContext>();
41+
var mockNextDelegate = new Mock<NextDelegate>();
42+
var activity = new Activity(ActivityTypes.Event) { Name = testEvent };
43+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
44+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
45+
var middleware = new ConsoleOutputMiddleware();
46+
47+
using (var consoleOutput = new ConsoleOutput())
48+
{
49+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
50+
51+
var output = consoleOutput.GetOutput();
52+
Assert.Contains(testEvent, output);
53+
}
54+
55+
mockTurnContext.Verify(c => c.Activity, Times.Once);
56+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
57+
}
58+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
using System.Threading;
2+
using System.Threading.Tasks;
3+
using Microsoft.Bot.Builder;
4+
using Microsoft.Bot.Schema;
5+
using MicrosoftTeamsIntegration.Artifacts.Bots.Middleware;
6+
using Moq;
7+
using Newtonsoft.Json;
8+
using Newtonsoft.Json.Linq;
9+
using Xunit;
10+
11+
namespace MicrosoftTeamsIntegration.Jira.Tests.Bots.Middleware;
12+
13+
public class EventDebuggerMiddlewareTests
14+
{
15+
[Fact]
16+
public async Task OnTurnAsync_Should_ConvertMessageToEvent_When_TextStartsWithEvent()
17+
{
18+
var mockTurnContext = new Mock<ITurnContext>();
19+
var mockNextDelegate = new Mock<NextDelegate>();
20+
var json = JsonConvert.SerializeObject(new { Name = "testEvent", Text = "testText", Value = "testValue" });
21+
var activity = new Activity(ActivityTypes.Message) { Text = $"/event:{json}" };
22+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
23+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
24+
var middleware = new EventDebuggerMiddleware();
25+
26+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
27+
28+
Assert.Equal(ActivityTypes.Event, activity.Type);
29+
Assert.Equal("testEvent", activity.Name);
30+
Assert.Equal("testText", activity.Text);
31+
Assert.Equal("testValue", activity.Value);
32+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
33+
}
34+
35+
[Fact]
36+
public async Task OnTurnAsync_Should_ConvertMessageToEvent_When_ValueContainsEvent()
37+
{
38+
var mockTurnContext = new Mock<ITurnContext>();
39+
var mockNextDelegate = new Mock<NextDelegate>();
40+
var value = new JObject
41+
{
42+
["event"] = true,
43+
["name"] = "testEvent",
44+
["text"] = "testText",
45+
["value"] = "testValue"
46+
};
47+
var activity = new Activity(ActivityTypes.Message) { Value = value.ToString(), Text = "some text" };
48+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
49+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
50+
var middleware = new EventDebuggerMiddleware();
51+
52+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
53+
54+
Assert.Equal(ActivityTypes.Event, activity.Type);
55+
Assert.Equal("testEvent", activity.Name);
56+
Assert.Equal("testText", activity.Text);
57+
Assert.Equal("testValue", activity.Value);
58+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
59+
}
60+
61+
[Fact]
62+
public async Task OnTurnAsync_Should_NotConvertMessageToEvent_When_TextDoesNotStartWithEvent()
63+
{
64+
var mockTurnContext = new Mock<ITurnContext>();
65+
var mockNextDelegate = new Mock<NextDelegate>();
66+
var activity = new Activity(ActivityTypes.Message) { Text = "regular text message" };
67+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
68+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
69+
var middleware = new EventDebuggerMiddleware();
70+
71+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
72+
73+
Assert.Equal(ActivityTypes.Message, activity.Type);
74+
Assert.Equal("regular text message", activity.Text);
75+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
76+
}
77+
78+
[Fact]
79+
public async Task OnTurnAsync_Should_NotConvertMessageToEvent_When_ValueDoesNotContainEvent()
80+
{
81+
var mockTurnContext = new Mock<ITurnContext>();
82+
var mockNextDelegate = new Mock<NextDelegate>();
83+
var value = new JObject
84+
{
85+
["name"] = "testEvent",
86+
["text"] = "testText",
87+
["value"] = "testValue"
88+
};
89+
var activity = new Activity(ActivityTypes.Message) { Value = value.ToString() };
90+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
91+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
92+
var middleware = new EventDebuggerMiddleware();
93+
94+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
95+
96+
Assert.Equal(ActivityTypes.Message, activity.Type);
97+
Assert.Equal(value.ToString(), activity.Value);
98+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
99+
}
100+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Microsoft.Bot.Builder;
5+
using Microsoft.Bot.Schema;
6+
using MicrosoftTeamsIntegration.Artifacts.Bots.Middleware;
7+
using Moq;
8+
using Xunit;
9+
10+
namespace MicrosoftTeamsIntegration.Jira.Tests.Bots.Middleware;
11+
12+
public class SetLocaleMiddlewareTests
13+
{
14+
[Fact]
15+
public void Constructor_Should_ThrowArgumentNullException_When_DefaultLocaleIsNull()
16+
{
17+
Assert.Throws<ArgumentNullException>(() => new SetLocaleMiddleware(null));
18+
}
19+
20+
[Fact]
21+
public async Task OnTurnAsync_Should_SetCultureInfoToActivityLocale()
22+
{
23+
const string defaultLocale = "en-US";
24+
var middleware = new SetLocaleMiddleware(defaultLocale);
25+
var mockTurnContext = new Mock<ITurnContext>();
26+
var mockNextDelegate = new Mock<NextDelegate>();
27+
var activity = new Activity { Locale = "fr-FR" };
28+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
29+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
30+
31+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
32+
33+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
34+
}
35+
36+
[Fact]
37+
public async Task OnTurnAsync_Should_SetCultureInfoToDefaultLocale_When_ActivityLocaleIsNullOrWhiteSpace()
38+
{
39+
const string defaultLocale = "en-US";
40+
var middleware = new SetLocaleMiddleware(defaultLocale);
41+
var mockTurnContext = new Mock<ITurnContext>();
42+
var mockNextDelegate = new Mock<NextDelegate>();
43+
var activity = new Activity { Locale = string.Empty };
44+
mockTurnContext.Setup(c => c.Activity).Returns(activity);
45+
mockNextDelegate.Setup(nd => nd(It.IsAny<CancellationToken>())).Returns(Task.CompletedTask);
46+
47+
await middleware.OnTurnAsync(mockTurnContext.Object, mockNextDelegate.Object);
48+
49+
mockNextDelegate.Verify(nd => nd(It.IsAny<CancellationToken>()), Times.Once);
50+
}
51+
}

0 commit comments

Comments
 (0)