Skip to content

Commit 0a15a0f

Browse files
mikewestDevtools-frontend LUCI CQ
authored andcommitted
Refactor SRIMessageSignatureIssue.
This CL doesn't introduce any behavioral change, but simply reworks the implementation of `SRIMessageSignatureIssue` for clarity and concision. Bug: 381044049 Change-Id: I726aa4e5f9249f1d2f1992f64c1b9821cf3ac8c0 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6395499 Commit-Queue: Mike West <[email protected]> Reviewed-by: Simon Zünd <[email protected]>
1 parent 7de602a commit 0a15a0f

File tree

1 file changed

+37
-265
lines changed

1 file changed

+37
-265
lines changed

front_end/models/issues_manager/SRIMessageSignatureIssue.ts

Lines changed: 37 additions & 265 deletions
Original file line numberDiff line numberDiff line change
@@ -25,94 +25,9 @@ const UIStrings = {
2525
} as const;
2626
const str_ = i18n.i18n.registerUIStrings('models/issues_manager/SRIMessageSignatureIssue.ts', UIStrings);
2727
const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
28-
const specLinks = [
29-
{
30-
link: 'https://www.rfc-editor.org/rfc/rfc9421.html',
31-
linkTitle: i18nLazyString(UIStrings.httpMessageSignatures),
32-
},
33-
{
34-
link: 'https://wicg.github.io/signature-based-sri/',
35-
linkTitle: i18nLazyString(UIStrings.signatureBasedIntegrity),
36-
}
37-
];
38-
39-
export const enum IssueCode {
40-
MISSING_SIGNATURE_HEADER = 'SRIMessageSignatureIssue::MissingSignatureHeader',
41-
MISSING_SIGNATURE_INPUT_HEADER = 'SRIMessageSignatureIssue::MissingSignatureInputHeader',
42-
INVALID_SIGNATURE_HEADER = 'SRIMessageSignatureIssue::InvalidSignatureHeader',
43-
INVALID_SIGNATURE_INPUT_HEADER = 'SRIMessageSignatureIssue::InvalidSignatureInputHeader',
44-
SIGNATURE_HEADER_VALUE_IS_NOT_BYTE_SEQUENCE = 'SRIMessageSignatureIssue::SignatureHeaderValueIsNotByteSequence',
45-
SIGNATURE_HEADER_VALUE_IS_PARAMETERIZED = 'SRIMessageSignatureIssue::SignatureHeaderValueIsParameterized',
46-
SIGNATURE_HEADER_VALUE_IS_INCORRECT_LENGTH = 'SRIMessageSignatureIssue::SignatureHeaderValueIsIncorrectLength',
47-
SIGNATURE_INPUT_HEADER_MISSING_LABEL = 'SRIMessageSignatureIssue::SignatureInputHeaderMissingLabel',
48-
SIGNATURE_INPUT_HEADER_VALUE_NOT_INNER_LIST = 'SRIMessageSignatureIssue::SignatureInputHeaderValueNotInnerList',
49-
SIGNATURE_INPUT_HEADER_VALUE_MISSING_COMPONENTS =
50-
'SRIMessageSignatureIssue::SignatureInputHeaderValueMissingComponents',
51-
SIGNATURE_INPUT_HEADER_INVALID_COMPONENT_TYPE = 'SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentType',
52-
SIGNATURE_INPUT_HEADER_INVALID_COMPONENT_NAME = 'SRIMessageSignatureIssue::SignatureInputHeaderInvalidComponentName',
53-
SIGNATURE_INPUT_HEADER_INVALID_HEADER_COMPONENT_PARAMETER =
54-
'SRIMessageSignatureIssue::SignatureInputHeaderInvalidHeaderComponentParameter',
55-
SIGNATURE_INPUT_HEADER_INVALID_DERIVED_COMPONENT_PARAMETER =
56-
'SRIMessageSignatureIssue::SignatureInputHeaderInvalidDerivedComponentParameter',
57-
SIGNATURE_INPUT_HEADER_KEY_ID_LENGTH = 'SRIMessageSignatureIssue::SignatureInputHeaderKeyIdLength',
58-
SIGNATURE_INPUT_HEADER_INVALID_PARAMETER = 'SRIMessageSignatureIssue::SignatureInputHeaderInvalidParameter',
59-
SIGNATURE_INPUT_HEADER_MISSING_REQUIRED_PARAMETERS =
60-
'SRIMessageSignatureIssue::SignatureInputHeaderMissingRequiredParameters',
61-
VALIDATION_FAILED_SIGNATURE_EXPIRED = 'SRIMessageSignatureIssue::ValidationFailedSignatureExpired',
62-
VALIDATION_FAILED_INVALID_LENGTH = 'SRIMessageSignatureIssue::ValidationFailedInvalidLength',
63-
VALIDATION_FAILED_SIGNATURE_MISMATCH = 'SRIMessageSignatureIssue::ValidationFailedSignatureMismatch',
64-
VALIDATION_FAILED_INTEGRITY_MISMATCH = 'SRIMessageSignatureIssue::ValidationFailedIntegrityMismatch',
65-
}
66-
67-
function errorToIssueCode(details: Protocol.Audits.SRIMessageSignatureIssueDetails): IssueCode {
68-
switch (details.error) {
69-
case Protocol.Audits.SRIMessageSignatureError.MissingSignatureHeader:
70-
return IssueCode.MISSING_SIGNATURE_HEADER;
71-
case Protocol.Audits.SRIMessageSignatureError.MissingSignatureInputHeader:
72-
return IssueCode.MISSING_SIGNATURE_INPUT_HEADER;
73-
case Protocol.Audits.SRIMessageSignatureError.InvalidSignatureHeader:
74-
return IssueCode.INVALID_SIGNATURE_HEADER;
75-
case Protocol.Audits.SRIMessageSignatureError.InvalidSignatureInputHeader:
76-
return IssueCode.INVALID_SIGNATURE_INPUT_HEADER;
77-
case Protocol.Audits.SRIMessageSignatureError.SignatureHeaderValueIsNotByteSequence:
78-
return IssueCode.SIGNATURE_HEADER_VALUE_IS_NOT_BYTE_SEQUENCE;
79-
case Protocol.Audits.SRIMessageSignatureError.SignatureHeaderValueIsParameterized:
80-
return IssueCode.SIGNATURE_HEADER_VALUE_IS_PARAMETERIZED;
81-
case Protocol.Audits.SRIMessageSignatureError.SignatureHeaderValueIsIncorrectLength:
82-
return IssueCode.SIGNATURE_HEADER_VALUE_IS_INCORRECT_LENGTH;
83-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderMissingLabel:
84-
return IssueCode.SIGNATURE_INPUT_HEADER_MISSING_LABEL;
85-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderValueNotInnerList:
86-
return IssueCode.SIGNATURE_INPUT_HEADER_VALUE_NOT_INNER_LIST;
87-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderValueMissingComponents:
88-
return IssueCode.SIGNATURE_INPUT_HEADER_VALUE_MISSING_COMPONENTS;
89-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidComponentType:
90-
return IssueCode.SIGNATURE_INPUT_HEADER_INVALID_COMPONENT_TYPE;
91-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidComponentName:
92-
return IssueCode.SIGNATURE_INPUT_HEADER_INVALID_COMPONENT_NAME;
93-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidHeaderComponentParameter:
94-
return IssueCode.SIGNATURE_INPUT_HEADER_INVALID_HEADER_COMPONENT_PARAMETER;
95-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidDerivedComponentParameter:
96-
return IssueCode.SIGNATURE_INPUT_HEADER_INVALID_DERIVED_COMPONENT_PARAMETER;
97-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderKeyIdLength:
98-
return IssueCode.SIGNATURE_INPUT_HEADER_KEY_ID_LENGTH;
99-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidParameter:
100-
return IssueCode.SIGNATURE_INPUT_HEADER_INVALID_PARAMETER;
101-
case Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderMissingRequiredParameters:
102-
return IssueCode.SIGNATURE_INPUT_HEADER_MISSING_REQUIRED_PARAMETERS;
103-
case Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureExpired:
104-
return IssueCode.VALIDATION_FAILED_SIGNATURE_EXPIRED;
105-
case Protocol.Audits.SRIMessageSignatureError.ValidationFailedInvalidLength:
106-
return IssueCode.VALIDATION_FAILED_INVALID_LENGTH;
107-
case Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch:
108-
return IssueCode.VALIDATION_FAILED_SIGNATURE_MISMATCH;
109-
case Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch:
110-
return IssueCode.VALIDATION_FAILED_INTEGRITY_MISMATCH;
111-
}
112-
}
11328

11429
function generateGroupingIssueCode(details: Protocol.Audits.SRIMessageSignatureIssueDetails): string {
115-
const issueCode = errorToIssueCode(details);
30+
const issueCode = `${Protocol.Audits.InspectorIssueCode.SRIMessageSignatureIssue}::${details.error}`;
11631
if (details.error === Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch) {
11732
// Signature mismatch errors should be grouped by "signature base".
11833
return issueCode + details.signatureBase;
@@ -126,60 +41,67 @@ function generateGroupingIssueCode(details: Protocol.Audits.SRIMessageSignatureI
12641
return issueCode;
12742
}
12843

129-
export class SRIMessageSignatureIssue extends Issue {
44+
export class SRIMessageSignatureIssue extends Issue<string> {
13045
readonly #issueDetails: Protocol.Audits.SRIMessageSignatureIssueDetails;
13146

13247
constructor(issueDetails: Protocol.Audits.SRIMessageSignatureIssueDetails, issuesModel: SDK.IssuesModel.IssuesModel) {
13348
super(
13449
{
13550
code: generateGroupingIssueCode(issueDetails),
136-
umaCode: [
137-
Protocol.Audits.InspectorIssueCode.SRIMessageSignatureIssue,
138-
issueDetails.error,
139-
].join('::'),
51+
umaCode: `${Protocol.Audits.InspectorIssueCode.SRIMessageSignatureIssue}::${issueDetails.error}`,
14052
},
14153
issuesModel);
14254
this.#issueDetails = issueDetails;
14355
}
14456

145-
override requests(): Iterable<Protocol.Audits.AffectedRequest> {
146-
if (this.#issueDetails.request) {
147-
return [this.#issueDetails.request];
148-
}
149-
return [];
150-
}
151-
152-
getCategory(): IssueCategory {
153-
return IssueCategory.OTHER;
154-
}
155-
15657
details(): Protocol.Audits.SRIMessageSignatureIssueDetails {
15758
return this.#issueDetails;
15859
}
15960

160-
getDescription(): MarkdownIssueDescription|null {
161-
const description = issueDescriptions.get(this.#issueDetails.error);
162-
if (!description) {
163-
return null;
61+
// Overriding `Issue<String>`:
62+
override primaryKey(): string {
63+
return JSON.stringify(this.details());
64+
}
65+
66+
override getDescription(): MarkdownIssueDescription|null {
67+
const description: LazyMarkdownIssueDescription = {
68+
file: `sri${this.details().error}.md`,
69+
links: [
70+
{
71+
link: 'https://www.rfc-editor.org/rfc/rfc9421.html',
72+
linkTitle: i18nLazyString(UIStrings.httpMessageSignatures),
73+
},
74+
{
75+
link: 'https://wicg.github.io/signature-based-sri/',
76+
linkTitle: i18nLazyString(UIStrings.signatureBasedIntegrity),
77+
}
78+
],
79+
substitutions: new Map()
80+
};
81+
if (this.#issueDetails.error === Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch) {
82+
description.substitutions?.set('PLACEHOLDER_signatureBase', () => this.#issueDetails.signatureBase);
16483
}
165-
if (this.#issueDetails.signatureBase !== '') {
166-
description.substitutions = new Map([['PLACEHOLDER_signatureBase', () => this.#issueDetails.signatureBase]]);
167-
} else if (this.#issueDetails.integrityAssertions.length) {
168-
description.substitutions = new Map([
169-
['PLACEHOLDER_integrityAssertions', () => '\n<li>' + this.#issueDetails.integrityAssertions.join('\n<li>')]
170-
]);
84+
if (this.#issueDetails.error === Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch) {
85+
description.substitutions?.set('PLACEHOLDER_integrityAssertions', () => {
86+
const prefix = '\n<li>';
87+
return prefix + this.details().integrityAssertions.join(prefix);
88+
});
17189
}
17290
return resolveLazyDescription(description);
17391
}
17492

175-
primaryKey(): string {
176-
return JSON.stringify(this.#issueDetails);
93+
override getCategory(): IssueCategory {
94+
return IssueCategory.OTHER;
17795
}
17896

179-
getKind(): IssueKind {
97+
override getKind(): IssueKind {
18098
return IssueKind.PAGE_ERROR;
18199
}
182100

101+
override requests(): Iterable<Protocol.Audits.AffectedRequest> {
102+
return this.details().request ? [this.details().request] : [];
103+
}
104+
183105
static fromInspectorIssue(issuesModel: SDK.IssuesModel.IssuesModel, inspectorIssue: Protocol.Audits.InspectorIssue):
184106
SRIMessageSignatureIssue[] {
185107
const details = inspectorIssue.details.sriMessageSignatureIssueDetails;
@@ -190,153 +112,3 @@ export class SRIMessageSignatureIssue extends Issue {
190112
return [new SRIMessageSignatureIssue(details, issuesModel)];
191113
}
192114
}
193-
194-
const issueDescriptions = new Map<Protocol.Audits.SRIMessageSignatureError, LazyMarkdownIssueDescription>([
195-
[
196-
Protocol.Audits.SRIMessageSignatureError.MissingSignatureHeader,
197-
{
198-
file: 'sriMissingSignatureHeader.md',
199-
links: specLinks,
200-
},
201-
],
202-
[
203-
Protocol.Audits.SRIMessageSignatureError.MissingSignatureInputHeader,
204-
{
205-
file: 'sriMissingSignatureInputHeader.md',
206-
links: specLinks,
207-
},
208-
],
209-
[
210-
Protocol.Audits.SRIMessageSignatureError.InvalidSignatureHeader,
211-
{
212-
file: 'sriInvalidSignatureHeader.md',
213-
links: specLinks,
214-
},
215-
],
216-
[
217-
Protocol.Audits.SRIMessageSignatureError.InvalidSignatureInputHeader,
218-
{
219-
file: 'sriInvalidSignatureInputHeader.md',
220-
links: specLinks,
221-
},
222-
],
223-
[
224-
Protocol.Audits.SRIMessageSignatureError.SignatureHeaderValueIsNotByteSequence,
225-
{
226-
file: 'sriSignatureHeaderValueIsNotByteSequence.md',
227-
links: specLinks,
228-
},
229-
],
230-
[
231-
Protocol.Audits.SRIMessageSignatureError.SignatureHeaderValueIsParameterized,
232-
{
233-
file: 'sriSignatureHeaderValueIsParameterized.md',
234-
links: specLinks,
235-
},
236-
],
237-
[
238-
Protocol.Audits.SRIMessageSignatureError.SignatureHeaderValueIsIncorrectLength,
239-
{
240-
file: 'sriSignatureHeaderValueIsIncorrectLength.md',
241-
links: specLinks,
242-
},
243-
],
244-
[
245-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderMissingLabel,
246-
{
247-
file: 'sriSignatureInputHeaderMissingLabel.md',
248-
links: specLinks,
249-
},
250-
],
251-
[
252-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderValueNotInnerList,
253-
{
254-
file: 'sriSignatureInputHeaderValueNotInnerList.md',
255-
links: specLinks,
256-
},
257-
],
258-
[
259-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderValueMissingComponents,
260-
{
261-
file: 'sriSignatureInputHeaderValueMissingComponents.md',
262-
links: specLinks,
263-
},
264-
],
265-
[
266-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidComponentType,
267-
{
268-
file: 'sriSignatureInputHeaderInvalidComponentType.md',
269-
links: specLinks,
270-
},
271-
],
272-
[
273-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidComponentName,
274-
{
275-
file: 'sriSignatureInputHeaderInvalidComponentName.md',
276-
links: specLinks,
277-
},
278-
],
279-
[
280-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidHeaderComponentParameter,
281-
{
282-
file: 'sriSignatureInputHeaderInvalidHeaderComponentParameter.md',
283-
links: specLinks,
284-
},
285-
],
286-
[
287-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidDerivedComponentParameter,
288-
{
289-
file: 'sriSignatureInputHeaderInvalidDerivedComponentParameter.md',
290-
links: specLinks,
291-
},
292-
],
293-
[
294-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderKeyIdLength,
295-
{
296-
file: 'sriSignatureInputHeaderKeyIdLength.md',
297-
links: specLinks,
298-
},
299-
],
300-
[
301-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderInvalidParameter,
302-
{
303-
file: 'sriSignatureInputHeaderInvalidParameter.md',
304-
links: specLinks,
305-
},
306-
],
307-
[
308-
Protocol.Audits.SRIMessageSignatureError.SignatureInputHeaderMissingRequiredParameters,
309-
{
310-
file: 'sriSignatureInputHeaderMissingRequiredParameters.md',
311-
links: specLinks,
312-
},
313-
],
314-
[
315-
Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureExpired,
316-
{
317-
file: 'sriValidationFailedSignatureExpired.md',
318-
links: specLinks,
319-
},
320-
],
321-
[
322-
Protocol.Audits.SRIMessageSignatureError.ValidationFailedInvalidLength,
323-
{
324-
file: 'sriValidationFailedInvalidLength.md',
325-
links: specLinks,
326-
},
327-
],
328-
[
329-
Protocol.Audits.SRIMessageSignatureError.ValidationFailedIntegrityMismatch,
330-
{
331-
file: 'sriValidationFailedIntegrityMismatch.md',
332-
links: specLinks,
333-
},
334-
],
335-
[
336-
Protocol.Audits.SRIMessageSignatureError.ValidationFailedSignatureMismatch,
337-
{
338-
file: 'sriValidationFailedSignatureMismatch.md',
339-
links: specLinks,
340-
},
341-
],
342-
]);

0 commit comments

Comments
 (0)