Skip to content

Commit fd0248a

Browse files
ellahathawayYuliiaKovalova
authored andcommittedMar 20, 2025
[SignCheck] Output results to an xml file (#15591)
1 parent 6fe2380 commit fd0248a

File tree

9 files changed

+116
-4
lines changed

9 files changed

+116
-4
lines changed
 

‎src/Microsoft.DotNet.Arcade.Sdk/tools/SdkTasks/SigningValidation.proj

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<SignCheckInputDir>$(PackageBasePath)</SignCheckInputDir>
3333
<SignCheckLog Condition="'$(SignCheckLog)' == ''">$(ArtifactsLogDir)\signcheck.log</SignCheckLog>
3434
<SignCheckErrorLog Condition="'$(SignCheckErrorLog)' == ''">$(ArtifactsLogDir)\signcheck.errors.log</SignCheckErrorLog>
35+
<SignCheckResultsXmlFile Condition="'$(SignCheckResultsXmlFile)' == ''">$(ArtifactsLogDir)\signcheck.xml</SignCheckResultsXmlFile>
3536
<InputFiles Condition="'$(BuildManifestFile)' == ''">$(SignCheckInputDir)</InputFiles>
3637
<InputFiles Condition="'$(BuildManifestFile)' != ''">@(ItemsToSign)</InputFiles>
3738
</PropertyGroup>
@@ -50,6 +51,7 @@
5051
VerifyStrongName="$(EnableStrongNameCheck)"
5152
LogFile="$(SignCheckLog)"
5253
ErrorLogFile="$(SignCheckErrorLog)"
54+
ResultsXmlFile="$(SignCheckResultsXmlFile)"
5355
ArtifactFolder="$(SignCheckInputDir)"/>
5456

5557
<Error

‎src/SignCheck/Microsoft.SignCheck/Logging/ConsoleLogger.cs

+10
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,16 @@ public void WriteError(LogVerbosity verbosity, string message, params object[] v
5858
}
5959
}
6060

61+
public void WriteStartResult(string fileName, string resultType, string error = null)
62+
{
63+
throw new NotImplementedException("ConsoleLogger does not support WriteStartResult.");
64+
}
65+
66+
public void WriteEndResult()
67+
{
68+
throw new NotImplementedException("ConsoleLogger does not support WriteEndResult.");
69+
}
70+
6171
public void WriteLine()
6272
{
6373
Console.WriteLine();

‎src/SignCheck/Microsoft.SignCheck/Logging/FileLogger.cs

+52-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.IO;
6+
using System.Xml;
67

78
namespace Microsoft.SignCheck.Logging
89
{
@@ -20,13 +21,19 @@ internal StreamWriter MessageWriter
2021
set;
2122
}
2223

24+
internal XmlWriter ResultsWriter
25+
{
26+
get;
27+
set;
28+
}
29+
2330
internal long Lines
2431
{
2532
get;
2633
set;
2734
}
2835

29-
public FileLogger(LogVerbosity verbosity, string messageFile, string errorFile) : base(verbosity)
36+
public FileLogger(LogVerbosity verbosity, string messageFile, string errorFile, string resultsFile) : base(verbosity)
3037
{
3138
if (!String.IsNullOrEmpty(messageFile))
3239
{
@@ -47,6 +54,22 @@ public FileLogger(LogVerbosity verbosity, string messageFile, string errorFile)
4754
ErrorWriter.AutoFlush = true;
4855
}
4956

57+
if (!String.IsNullOrEmpty(resultsFile))
58+
{
59+
if (!Directory.Exists(resultsFile))
60+
{
61+
Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(resultsFile)));
62+
}
63+
ResultsWriter = XmlWriter.Create(resultsFile, new XmlWriterSettings()
64+
{
65+
Indent = true,
66+
IndentChars = "\t",
67+
OmitXmlDeclaration = true
68+
});
69+
ResultsWriter.WriteStartDocument();
70+
ResultsWriter.WriteStartElement("SignCheckResults");
71+
}
72+
5073
Lines = 0;
5174
}
5275

@@ -63,6 +86,12 @@ public override void Close()
6386
ErrorWriter.Flush();
6487
ErrorWriter.Close();
6588
}
89+
90+
if (ResultsWriter != null)
91+
{
92+
ResultsWriter.WriteEndElement();
93+
ResultsWriter.Close();
94+
}
6695
}
6796

6897
public void WriteMessage(string message)
@@ -134,5 +163,27 @@ public void WriteLine()
134163
}
135164
}
136165
}
166+
167+
public void WriteStartResult(string fileName, string resultType, string error = null)
168+
{
169+
if (ResultsWriter != null)
170+
{
171+
ResultsWriter.WriteStartElement("File");
172+
ResultsWriter.WriteAttributeString("Name", fileName);
173+
ResultsWriter.WriteAttributeString("ResultType", resultType);
174+
if (!String.IsNullOrEmpty(error))
175+
{
176+
ResultsWriter.WriteAttributeString("Error", error);
177+
}
178+
}
179+
}
180+
181+
public void WriteEndResult()
182+
{
183+
if (ResultsWriter != null)
184+
{
185+
ResultsWriter.WriteEndElement();
186+
}
187+
}
137188
}
138189
}

‎src/SignCheck/Microsoft.SignCheck/Logging/ILogger.cs

+4
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,9 @@ bool HasLoggedErrors
2525
void WriteError(LogVerbosity verbosity, string message);
2626

2727
void WriteError(LogVerbosity verbosity, string message, params object[] values);
28+
29+
void WriteStartResult(string fileName, string resultType, string error = null);
30+
31+
void WriteEndResult();
2832
}
2933
}

‎src/SignCheck/Microsoft.SignCheck/Logging/Log.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ public LogVerbosity Verbosity
2424
private set;
2525
}
2626

27-
public Log(string logFile, string errorFile, LogVerbosity verbosity)
27+
public Log(string logFile, string errorFile, string resultsFile, LogVerbosity verbosity)
2828
{
2929
_loggers = new List<ILogger>();
30-
Add(new FileLogger(verbosity, logFile, errorFile));
30+
Add(new FileLogger(verbosity, logFile, errorFile, resultsFile));
3131
Add(new ConsoleLogger(verbosity));
3232
Verbosity = verbosity;
3333
}
@@ -72,6 +72,16 @@ public void WriteLine()
7272
_loggers.ForEach(p => p.WriteLine());
7373
}
7474

75+
public void WriteStartResult(string fileName, string resultType, string error = null)
76+
{
77+
_loggers.OfType<FileLogger>().FirstOrDefault().WriteStartResult(fileName, resultType, error);
78+
}
79+
80+
public void WriteEndResult()
81+
{
82+
_loggers.OfType<FileLogger>().FirstOrDefault().WriteEndResult();
83+
}
84+
7585
public void Close()
7686
{
7787
_loggers.ForEach(p => p.Close());

‎src/SignCheck/Microsoft.SignCheck/Verification/SignatureVerificationResult.cs

+13
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,19 @@ public string ToString(string[] detailKeys)
260260
return sb.ToString();
261261
}
262262

263+
/// <summary>
264+
/// </summary>
265+
/// <param name="detailKey"></param>
266+
/// <returns></returns>
267+
public string ToString(string detailKey)
268+
{
269+
if (Detail.TryGetValue(detailKey, out string value))
270+
{
271+
return value;
272+
}
273+
return String.Empty;
274+
}
275+
263276
/// <summary>
264277
/// Creates a SignatureVerificationResult for an unsupported file type or file extension.
265278
/// </summary>

‎src/SignCheck/SignCheckTask/src/Options.cs

+8
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ public string LogFile
5858
set;
5959
}
6060

61+
[Option("results-xml-file",
62+
HelpText = "Output signing results to the specified XML log file. If the file already exists it will be overwritten.")]
63+
public string ResultsXmlFile
64+
{
65+
get;
66+
set;
67+
}
68+
6169
[Option('m', "verify-xml",
6270
HelpText = "Enable XML signature verification. By default, .xml files are not verified.")]
6371
public bool EnableXmlSignatureVerification

‎src/SignCheck/SignCheckTask/src/SignCheck.cs

+9-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ private void HandleOptions(Options options)
135135
{
136136
Options = options;
137137

138-
Log = new Log(options.LogFile, options.ErrorLogFile, options.Verbosity);
138+
Log = new Log(options.LogFile, options.ErrorLogFile, options.ResultsXmlFile, options.Verbosity);
139139

140140
if (Options.FileStatus.Count() > 0)
141141
{
@@ -308,29 +308,35 @@ private void ProcessResults(IEnumerable<SignatureVerificationResult> results, in
308308
foreach (SignatureVerificationResult result in results)
309309
{
310310
TotalFiles++;
311+
string resultType = "Unknown";
311312

312313
if (result.IsSigned && !result.IsExcluded)
313314
{
314315
TotalSignedFiles++;
316+
resultType = "Signed";
315317
}
316318
else if (!(result.IsExcluded || result.IsSkipped) && (!result.IsSigned && !result.IsDoNotSign))
317319
{
318320
TotalUnsignedFiles++;
321+
resultType = "Unsigned";
319322
}
320323

321324
if (result.IsExcluded || (!result.IsSigned && result.IsDoNotSign))
322325
{
323326
TotalExcludedFiles++;
327+
resultType = "Excluded";
324328
}
325329

326330
if (result.IsSkipped)
327331
{
328332
TotalSkippedFiles++;
333+
resultType = "Skipped";
329334
}
330335

331336
if (result.IsSkipped && result.IsExcluded)
332337
{
333338
TotalSkippedExcludedFiles++;
339+
resultType = "SkippedExcluded";
334340
}
335341

336342
// Regardless of the file status reporting settings, a container file like an MSI or NuGet package
@@ -352,10 +358,12 @@ private void ProcessResults(IEnumerable<SignatureVerificationResult> results, in
352358
NoSignIssues = false;
353359
}
354360

361+
Log.WriteStartResult(result.VirtualPath, resultType, result.ToString(DetailKeys.Error));
355362
if (result.NestedResults.Count > 0)
356363
{
357364
ProcessResults(result.NestedResults, indent + 2);
358365
}
366+
Log.WriteEndResult();
359367
}
360368
}
361369

‎src/SignCheck/SignCheckTask/src/SignCheckTask.cs

+6
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ public string ErrorLogFile
8686
get;
8787
set;
8888
}
89+
public string ResultsXmlFile
90+
{
91+
get;
92+
set;
93+
}
8994
public string Verbosity
9095
{
9196
get;
@@ -130,6 +135,7 @@ private bool ExecuteImpl()
130135
options.VerifyStrongName = VerifyStrongName;
131136
options.LogFile = LogFile;
132137
options.ErrorLogFile = ErrorLogFile;
138+
options.ResultsXmlFile = ResultsXmlFile;
133139

134140
List<string> inputFiles = new List<string>();
135141
if (InputFiles != null)

0 commit comments

Comments
 (0)
Please sign in to comment.