Skip to content

Commit 893e52a

Browse files
Agent Task Message - Add html sanitization by default (#5365)
#### Summary This PR adds html sanitization by default to agent task messages. This was identified as a potential security risk and is already applied to SOA. #### Work Item(s) Fixes [AB#610530](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/610530) --------- Co-authored-by: Sotiris Dragonas <sodragon@microsoft.com>
1 parent e0e273b commit 893e52a

File tree

5 files changed

+46
-4
lines changed

5 files changed

+46
-4
lines changed

src/System Application/App/Agent/Interaction/AgentTaskBuilder.Codeunit.al

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ codeunit 4315 "Agent Task Builder"
9595
/// </summary>
9696
/// <param name="From">The sender of the message.</param>
9797
/// <param name="MessageText">The message text.</param>
98-
/// <param name="AgentTaskMessageBuilder">The agent task message builder.</param>
9998
/// <returns>This instance of the Agent Task Builder.</returns>
10099
procedure AddTaskMessage(From: Text[250]; MessageText: Text): codeunit "Agent Task Builder"
101100
begin

src/System Application/App/Agent/Interaction/AgentTaskMessageBuilder.Codeunit.al

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,21 @@ codeunit 4316 "Agent Task Message Builder"
7070
exit(this);
7171
end;
7272

73+
/// <summary>
74+
/// Set whether to sanitize the message text.
75+
/// When set to false, message sanitization will be bypassed.
76+
/// The default value is true.
77+
/// </summary>
78+
/// <param name="SkipSanitizeMessage">Specifies if the message sanitization should be skipped.</param>
79+
/// <returns>This instance of the Agent Task Message Builder.</returns>
80+
[Scope('OnPrem')]
81+
procedure SetSkipMessageSanitization(SkipSanitizeMessage: Boolean): codeunit "Agent Task Message Builder"
82+
begin
83+
FeatureAccessManagement.AgentTaskManagementPreviewEnabled(true);
84+
AgentTaskMsgBuilderImpl.SetSkipMessageSanitization(SkipSanitizeMessage);
85+
exit(this);
86+
end;
87+
7388
/// <summary>
7489
/// Set the external ID of the task.
7590
/// </summary>

src/System Application/App/Agent/Interaction/Internal/AgentTaskBuilderImpl.Codeunit.al

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ codeunit 4310 "Agent Task Builder Impl."
6262
procedure AddTaskMessage(From: Text[250]; MessageText: Text): codeunit "Agent Task Builder Impl."
6363
begin
6464
GlobalAgentTaskMessageBuilder.Initialize(From, MessageText);
65+
MessageSet := true;
6566
exit(this);
6667
end;
6768

src/System Application/App/Agent/Interaction/Internal/AgentTaskMsgBuilderImpl.Codeunit.al

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
namespace System.Agents;
77

8+
using System;
9+
810
codeunit 4311 "Agent Task Msg. Builder Impl."
911
{
1012
Access = Internal;
@@ -21,6 +23,7 @@ codeunit 4311 "Agent Task Msg. Builder Impl."
2123
GlobalMessageText: Text;
2224
GlobalRequiresReview: Boolean;
2325
GlobalIgnoreAttachment: Boolean;
26+
GlobalSkipSanitizeMessage: Boolean;
2427

2528
[Scope('OnPrem')]
2629
procedure Initialize(MessageText: Text): codeunit "Agent Task Msg. Builder Impl."
@@ -34,10 +37,10 @@ codeunit 4311 "Agent Task Msg. Builder Impl."
3437
[Scope('OnPrem')]
3538
procedure Initialize(From: Text[250]; MessageText: Text): codeunit "Agent Task Msg. Builder Impl."
3639
begin
37-
GlobalFrom := From;
38-
GlobalMessageText := MessageText;
3940
GlobalRequiresReview := true;
4041
GlobalIgnoreAttachment := false;
42+
GlobalFrom := From;
43+
GlobalMessageText := MessageText;
4144
exit(this);
4245
end;
4346

@@ -55,6 +58,13 @@ codeunit 4311 "Agent Task Msg. Builder Impl."
5558
exit(this);
5659
end;
5760

61+
[Scope('OnPrem')]
62+
procedure SetSkipMessageSanitization(SkipSanitizeMessage: Boolean): codeunit "Agent Task Msg. Builder Impl."
63+
begin
64+
GlobalSkipSanitizeMessage := SkipSanitizeMessage;
65+
exit(this);
66+
end;
67+
5868
[Scope('OnPrem')]
5969
procedure SetMessageExternalID(ExternalId: Text[2048]): codeunit "Agent Task Msg. Builder Impl."
6070
begin
@@ -85,9 +95,12 @@ codeunit 4311 "Agent Task Msg. Builder Impl."
8595
AgentTaskImpl: Codeunit "Agent Task Impl.";
8696
AgentMessageImpl: Codeunit "Agent Message Impl.";
8797
IgnoreAttachment: Boolean;
98+
MessageText: Text;
8899
begin
89100
VerifyMandatoryFieldsSet();
90-
GlobalAgentTaskMessage := AgentTaskImpl.AddMessage(GlobalFrom, GlobalMessageText, GlobalMessageExternalID, GlobalAgentTask, GlobalRequiresReview);
101+
102+
MessageText := GlobalSkipSanitizeMessage ? GlobalMessageText : SanitizeMessage(GlobalMessageText);
103+
GlobalAgentTaskMessage := AgentTaskImpl.AddMessage(GlobalFrom, MessageText, GlobalMessageExternalID, GlobalAgentTask, GlobalRequiresReview);
91104
TempAgentTaskFileToAttach.Reset();
92105
TempAgentTaskFileToAttach.SetAutoCalcFields(Content);
93106
if TempAgentTaskFileToAttach.FindSet() then
@@ -259,4 +272,12 @@ codeunit 4311 "Agent Task Msg. Builder Impl."
259272
exit('text/plain');
260273
exit('');
261274
end;
275+
276+
internal procedure SanitizeMessage(MessageBody: Text): Text
277+
var
278+
AppHTMLSanitizer: DotNet AppHtmlSanitizer;
279+
begin
280+
AppHTMLSanitizer := AppHTMLSanitizer.AppHtmlSanitizer();
281+
exit(AppHTMLSanitizer.SanitizeEmail(MessageBody));
282+
end;
262283
}

src/System Application/App/Agent/app.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@
5050
"name": "User Settings",
5151
"publisher": "Microsoft",
5252
"version": "28.0.0.0"
53+
},
54+
{
55+
"id": "7e3b999e-1182-45d2-8b82-d5127ddba9b2",
56+
"name": "DotNet Aliases",
57+
"publisher": "Microsoft",
58+
"version": "28.0.0.0"
5359
}
5460
],
5561
"propagateDependencies": true,

0 commit comments

Comments
 (0)