OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 30 matching lines...) Expand all Loading... |
41 | 41 |
42 struct ResourceLoaderOptions; | 42 struct ResourceLoaderOptions; |
43 class ResourceRequest; | 43 class ResourceRequest; |
44 class ResourceResponse; | 44 class ResourceResponse; |
45 class SecurityOrigin; | 45 class SecurityOrigin; |
46 | 46 |
47 class CrossOriginAccessControl { | 47 class CrossOriginAccessControl { |
48 STATIC_ONLY(CrossOriginAccessControl); | 48 STATIC_ONLY(CrossOriginAccessControl); |
49 | 49 |
50 public: | 50 public: |
51 // Given the new request URL, returns true if | 51 // Enumerating the error conditions that the CORS |
| 52 // access control check can report, including success. |
| 53 // |
| 54 // See |checkAccess()| and |accessControlErrorString()| which respectively |
| 55 // produce and consume these error values, for precise meaning. |
| 56 enum AccessStatus { |
| 57 kAccessAllowed, |
| 58 kInvalidResponse, |
| 59 kAllowOriginMismatch, |
| 60 kSubOriginMismatch, |
| 61 kWildcardOriginNotAllowed, |
| 62 kMissingAllowOriginHeader, |
| 63 kMultipleAllowOriginValues, |
| 64 kInvalidAllowOriginValue, |
| 65 kDisallowCredentialsNotSetToTrue, |
| 66 }; |
| 67 |
| 68 // Enumerating the error conditions that CORS preflight |
| 69 // can report, including success. |
| 70 // |
| 71 // See |checkPreflight()| methods and |preflightErrorString()| which |
| 72 // respectively produce and consume these error values, for precise meaning. |
| 73 enum PreflightStatus { |
| 74 kPreflightSuccess, |
| 75 kPreflightInvalidStatus, |
| 76 // "Access-Control-Allow-External:" |
| 77 // ( https://wicg.github.io/cors-rfc1918/#headers ) specific error |
| 78 // conditions: |
| 79 kPreflightMissingAllowExternal, |
| 80 kPreflightInvalidAllowExternal, |
| 81 }; |
| 82 |
| 83 // Enumerating the error conditions that CORS redirect target URL |
| 84 // checks can report, including success. |
| 85 // |
| 86 // See |checkRedirectLocation()| methods and |redirectErrorString()| which |
| 87 // respectively produce and consume these error values, for precise meaning. |
| 88 enum RedirectStatus { |
| 89 kRedirectSuccess, |
| 90 kRedirectDisallowedScheme, |
| 91 kRedirectContainsCredentials, |
| 92 }; |
| 93 |
| 94 // Perform a CORS access check on the response. Returns |kAccessAllowed| if |
| 95 // access is allowed. Use |accessControlErrorString()| to construct a |
| 96 // user-friendly error message for any of the other (error) conditions. |
| 97 static AccessStatus checkAccess(const ResourceResponse&, |
| 98 StoredCredentials, |
| 99 const SecurityOrigin*); |
| 100 |
| 101 // Perform the required CORS checks on the response to a preflight request. |
| 102 // Returns |kPreflightSuccess| if preflight response was successful. |
| 103 // Use |preflightErrorString()| to construct a user-friendly error message |
| 104 // for any of the other (error) conditions. |
| 105 static PreflightStatus checkPreflight(const ResourceResponse&); |
| 106 |
| 107 // Error checking for the currently experimental |
| 108 // "Access-Control-Allow-External:" header. Shares error conditions with |
| 109 // standard preflight checking. |
| 110 static PreflightStatus checkExternalPreflight(const ResourceResponse&); |
| 111 |
| 112 // Given a redirected-to URL, check if the location is allowed |
| 113 // according to CORS. That is: |
52 // - the URL has a CORS supported scheme and | 114 // - the URL has a CORS supported scheme and |
53 // - the URL does not contain the userinfo production. | 115 // - the URL does not contain the userinfo production. |
54 static bool isLegalRedirectLocation(const KURL&, String& errorDescription); | 116 // |
| 117 // Returns |kRedirectSuccess| in all other cases. Use |
| 118 // |redirectErrorString()| to construct a user-friendly error |
| 119 // message for any of the error conditions. |
| 120 static RedirectStatus checkRedirectLocation(const KURL&); |
| 121 |
55 static bool handleRedirect(PassRefPtr<SecurityOrigin>, | 122 static bool handleRedirect(PassRefPtr<SecurityOrigin>, |
56 ResourceRequest&, | 123 ResourceRequest&, |
57 const ResourceResponse&, | 124 const ResourceResponse&, |
58 StoredCredentials, | 125 StoredCredentials, |
59 ResourceLoaderOptions&, | 126 ResourceLoaderOptions&, |
60 String&); | 127 String&); |
| 128 |
| 129 // Stringify errors from CORS access checks, preflight or redirect checks. |
| 130 static void accessControlErrorString(StringBuilder&, |
| 131 AccessStatus, |
| 132 const ResourceResponse&, |
| 133 const SecurityOrigin*, |
| 134 WebURLRequest::RequestContext); |
| 135 static void preflightErrorString(StringBuilder&, |
| 136 PreflightStatus, |
| 137 const ResourceResponse&); |
| 138 static void redirectErrorString(StringBuilder&, RedirectStatus, const KURL&); |
61 }; | 139 }; |
62 | 140 |
| 141 // TODO: also migrate these into the above static class. |
63 CORE_EXPORT bool isOnAccessControlResponseHeaderWhitelist(const String&); | 142 CORE_EXPORT bool isOnAccessControlResponseHeaderWhitelist(const String&); |
64 | 143 |
65 CORE_EXPORT ResourceRequest | 144 CORE_EXPORT ResourceRequest |
66 createAccessControlPreflightRequest(const ResourceRequest&, | 145 createAccessControlPreflightRequest(const ResourceRequest&, |
67 const SecurityOrigin*); | 146 const SecurityOrigin*); |
68 | 147 |
69 bool passesAccessControlCheck(const ResourceResponse&, | |
70 StoredCredentials, | |
71 const SecurityOrigin*, | |
72 String& errorDescription, | |
73 WebURLRequest::RequestContext requestType); | |
74 bool passesPreflightStatusCheck(const ResourceResponse&, | |
75 String& errorDescription); | |
76 bool passesExternalPreflightCheck(const ResourceResponse&, | |
77 String& errorDescription); | |
78 CORE_EXPORT void parseAccessControlExposeHeadersAllowList( | 148 CORE_EXPORT void parseAccessControlExposeHeadersAllowList( |
79 const String& headerValue, | 149 const String& headerValue, |
80 HTTPHeaderSet&); | 150 HTTPHeaderSet&); |
81 CORE_EXPORT void extractCorsExposedHeaderNamesList(const ResourceResponse&, | 151 CORE_EXPORT void extractCorsExposedHeaderNamesList(const ResourceResponse&, |
82 HTTPHeaderSet&); | 152 HTTPHeaderSet&); |
83 | 153 |
84 } // namespace blink | 154 } // namespace blink |
85 | 155 |
86 #endif // CrossOriginAccessControl_h | 156 #endif // CrossOriginAccessControl_h |
OLD | NEW |