debug-server-next
Version:
Dev server for hippy-core.
228 lines (227 loc) • 11.5 kB
JavaScript
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as i18n from '../../core/i18n/i18n.js';
import { Issue, IssueCategory, IssueKind } from './Issue.js';
const UIStrings = {
/**
*@description Label for the link for CORS private network issues
*/
corsForPrivateNetworksRfc: 'CORS for private networks (RFC1918)',
/**
*@description Label for the link for CORS network issues
*/
CORS: 'Cross-Origin Resource Sharing (`CORS`)',
};
const str_ = i18n.i18n.registerUIStrings('models/issues_manager/CorsIssue.ts', UIStrings);
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
// TODO(crbug.com/1167717): Make this a const enum again
// eslint-disable-next-line rulesdir/const_enum
export var IssueCode;
(function (IssueCode) {
IssueCode["InsecurePrivateNetwork"] = "CorsIssue::InsecurePrivateNetwork";
IssueCode["InsecurePrivateNetworkPreflight"] = "CorsIssue::InsecurePrivateNetworkPreflight";
IssueCode["InvalidHeaderValues"] = "CorsIssue::InvalidHeaders";
IssueCode["WildcardOriginNotAllowed"] = "CorsIssue::WildcardOriginWithCredentials";
IssueCode["PreflightResponseInvalid"] = "CorsIssue::PreflightResponseInvalid";
IssueCode["OriginMismatch"] = "CorsIssue::OriginMismatch";
IssueCode["AllowCredentialsRequired"] = "CorsIssue::AllowCredentialsRequired";
IssueCode["MethodDisallowedByPreflightResponse"] = "CorsIssue::MethodDisallowedByPreflightResponse";
IssueCode["HeaderDisallowedByPreflightResponse"] = "CorsIssue::HeaderDisallowedByPreflightResponse";
IssueCode["RedirectContainsCredentials"] = "CorsIssue::RedirectContainsCredentials";
IssueCode["DisallowedByMode"] = "CorsIssue::DisallowedByMode";
IssueCode["CorsDisabledScheme"] = "CorsIssue::CorsDisabledScheme";
IssueCode["PreflightMissingAllowExternal"] = "CorsIssue::PreflightMissingAllowExternal";
IssueCode["PreflightInvalidAllowExternal"] = "CorsIssue::PreflightInvalidAllowExternal";
IssueCode["InvalidResponse"] = "CorsIssue::InvalidResponse";
IssueCode["NoCorsRedirectModeNotFollow"] = "CorsIssue::NoCorsRedirectModeNotFollow";
})(IssueCode || (IssueCode = {}));
function getIssueCode(details) {
switch (details.corsErrorStatus.corsError) {
case "InvalidAllowMethodsPreflightResponse" /* InvalidAllowMethodsPreflightResponse */:
case "InvalidAllowHeadersPreflightResponse" /* InvalidAllowHeadersPreflightResponse */:
case "PreflightMissingAllowOriginHeader" /* PreflightMissingAllowOriginHeader */:
case "PreflightMultipleAllowOriginValues" /* PreflightMultipleAllowOriginValues */:
case "PreflightInvalidAllowOriginValue" /* PreflightInvalidAllowOriginValue */:
case "MissingAllowOriginHeader" /* MissingAllowOriginHeader */:
case "MultipleAllowOriginValues" /* MultipleAllowOriginValues */:
case "InvalidAllowOriginValue" /* InvalidAllowOriginValue */:
return IssueCode.InvalidHeaderValues;
case "PreflightWildcardOriginNotAllowed" /* PreflightWildcardOriginNotAllowed */:
case "WildcardOriginNotAllowed" /* WildcardOriginNotAllowed */:
return IssueCode.WildcardOriginNotAllowed;
case "PreflightInvalidStatus" /* PreflightInvalidStatus */:
case "PreflightDisallowedRedirect" /* PreflightDisallowedRedirect */:
return IssueCode.PreflightResponseInvalid;
case "AllowOriginMismatch" /* AllowOriginMismatch */:
case "PreflightAllowOriginMismatch" /* PreflightAllowOriginMismatch */:
return IssueCode.OriginMismatch;
case "InvalidAllowCredentials" /* InvalidAllowCredentials */:
case "PreflightInvalidAllowCredentials" /* PreflightInvalidAllowCredentials */:
return IssueCode.AllowCredentialsRequired;
case "MethodDisallowedByPreflightResponse" /* MethodDisallowedByPreflightResponse */:
return IssueCode.MethodDisallowedByPreflightResponse;
case "HeaderDisallowedByPreflightResponse" /* HeaderDisallowedByPreflightResponse */:
return IssueCode.HeaderDisallowedByPreflightResponse;
case "RedirectContainsCredentials" /* RedirectContainsCredentials */:
return IssueCode.RedirectContainsCredentials;
case "DisallowedByMode" /* DisallowedByMode */:
return IssueCode.DisallowedByMode;
case "CorsDisabledScheme" /* CorsDisabledScheme */:
return IssueCode.CorsDisabledScheme;
case "PreflightMissingAllowExternal" /* PreflightMissingAllowExternal */:
return IssueCode.PreflightMissingAllowExternal;
case "PreflightInvalidAllowExternal" /* PreflightInvalidAllowExternal */:
return IssueCode.PreflightInvalidAllowExternal;
case "InvalidResponse" /* InvalidResponse */:
return IssueCode.InvalidResponse;
case "InsecurePrivateNetwork" /* InsecurePrivateNetwork */:
return details.clientSecurityState?.initiatorIsSecureContext ? IssueCode.InsecurePrivateNetworkPreflight :
IssueCode.InsecurePrivateNetwork;
case "NoCorsRedirectModeNotFollow" /* NoCorsRedirectModeNotFollow */:
return IssueCode.NoCorsRedirectModeNotFollow;
}
}
export class CorsIssue extends Issue {
issueDetails;
constructor(issueDetails, issuesModel, issueId) {
super(getIssueCode(issueDetails), issuesModel, issueId);
this.issueDetails = issueDetails;
}
getCategory() {
return IssueCategory.Cors;
}
details() {
return this.issueDetails;
}
getDescription() {
switch (getIssueCode(this.issueDetails)) {
case IssueCode.InsecurePrivateNetwork:
return {
file: 'corsInsecurePrivateNetwork.md',
links: [{
link: 'https://developer.chrome.com/blog/private-network-access-update',
linkTitle: i18nString(UIStrings.corsForPrivateNetworksRfc),
}],
};
case IssueCode.InsecurePrivateNetworkPreflight:
return {
file: 'corsInsecurePrivateNetworkPreflight.md',
links: [{
link: 'https://developer.chrome.com/blog/private-network-access-update',
linkTitle: i18nString(UIStrings.corsForPrivateNetworksRfc),
}],
};
case IssueCode.InvalidHeaderValues:
return {
file: 'corsInvalidHeaderValues.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.WildcardOriginNotAllowed:
return {
file: 'corsWildcardOriginNotAllowed.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.PreflightResponseInvalid:
return {
file: 'corsPreflightResponseInvalid.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.OriginMismatch:
return {
file: 'corsOriginMismatch.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.AllowCredentialsRequired:
return {
file: 'corsAllowCredentialsRequired.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.MethodDisallowedByPreflightResponse:
return {
file: 'corsMethodDisallowedByPreflightResponse.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.HeaderDisallowedByPreflightResponse:
return {
file: 'corsHeaderDisallowedByPreflightResponse.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.RedirectContainsCredentials:
return {
file: 'corsRedirectContainsCredentials.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.DisallowedByMode:
return {
file: 'corsDisallowedByMode.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.CorsDisabledScheme:
return {
file: 'corsDisabledScheme.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.NoCorsRedirectModeNotFollow:
return {
file: 'corsNoCorsRedirectModeNotFollow.md',
links: [{
link: 'https://web.dev/cross-origin-resource-sharing',
linkTitle: i18nString(UIStrings.CORS),
}],
};
case IssueCode.PreflightMissingAllowExternal:
case IssueCode.PreflightInvalidAllowExternal:
case IssueCode.InvalidResponse:
return null;
}
}
primaryKey() {
return JSON.stringify(this.issueDetails);
}
getKind() {
if (this.issueDetails.isWarning &&
this.issueDetails.corsErrorStatus.corsError === "InsecurePrivateNetwork" /* InsecurePrivateNetwork */) {
return IssueKind.BreakingChange;
}
return IssueKind.PageError;
}
static fromInspectorIssue(issuesModel, inspectorIssue) {
const corsIssueDetails = inspectorIssue.details.corsIssueDetails;
if (!corsIssueDetails) {
console.warn('Cors issue without details received.');
return [];
}
return [new CorsIssue(corsIssueDetails, issuesModel, inspectorIssue.issueId)];
}
}