ReferrerPolicy.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #ifndef ReferrerPolicy_h__
  5. #define ReferrerPolicy_h__
  6. #include "nsStringGlue.h"
  7. #include "nsIHttpChannel.h"
  8. #include "nsUnicharUtils.h"
  9. namespace mozilla { namespace net {
  10. enum ReferrerPolicy {
  11. /* spec tokens: never no-referrer */
  12. RP_No_Referrer = nsIHttpChannel::REFERRER_POLICY_NO_REFERRER,
  13. /* spec tokens: origin */
  14. RP_Origin = nsIHttpChannel::REFERRER_POLICY_ORIGIN,
  15. /* spec tokens: default no-referrer-when-downgrade */
  16. RP_No_Referrer_When_Downgrade = nsIHttpChannel::REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE,
  17. RP_Default = nsIHttpChannel::REFERRER_POLICY_DEFAULT,
  18. /* spec tokens: origin-when-cross-origin */
  19. RP_Origin_When_Crossorigin = nsIHttpChannel::REFERRER_POLICY_ORIGIN_WHEN_XORIGIN,
  20. /* spec tokens: always unsafe-url */
  21. RP_Unsafe_URL = nsIHttpChannel::REFERRER_POLICY_UNSAFE_URL,
  22. /* spec tokens: same-origin */
  23. RP_Same_Origin = nsIHttpChannel::REFERRER_POLICY_SAME_ORIGIN,
  24. /* spec tokens: strict-origin */
  25. RP_Strict_Origin = nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN,
  26. /* spec tokens: strict-origin-when-cross-origin */
  27. RP_Strict_Origin_When_Cross_Origin = nsIHttpChannel::REFERRER_POLICY_STRICT_ORIGIN_WHEN_XORIGIN,
  28. /* spec tokens: empty string */
  29. /* The empty string "" corresponds to no referrer policy, or unset policy */
  30. RP_Unset = nsIHttpChannel::REFERRER_POLICY_UNSET,
  31. };
  32. /* spec tokens: never no-referrer */
  33. const char kRPS_Never[] = "never";
  34. const char kRPS_No_Referrer[] = "no-referrer";
  35. /* spec tokens: origin */
  36. const char kRPS_Origin[] = "origin";
  37. /* spec tokens: default no-referrer-when-downgrade */
  38. const char kRPS_Default[] = "default";
  39. const char kRPS_No_Referrer_When_Downgrade[] = "no-referrer-when-downgrade";
  40. /* spec tokens: origin-when-cross-origin */
  41. const char kRPS_Origin_When_Cross_Origin[] = "origin-when-cross-origin";
  42. const char kRPS_Origin_When_Crossorigin[] = "origin-when-crossorigin";
  43. /* spec tokens: same-origin */
  44. const char kRPS_Same_Origin[] = "same-origin";
  45. /* spec tokens: strict-origin */
  46. const char kRPS_Strict_Origin[] = "strict-origin";
  47. /* spec tokens: strict-origin-when-cross-origin */
  48. const char kRPS_Strict_Origin_When_Cross_Origin[] = "strict-origin-when-cross-origin";
  49. /* spec tokens: always unsafe-url */
  50. const char kRPS_Always[] = "always";
  51. const char kRPS_Unsafe_URL[] = "unsafe-url";
  52. inline ReferrerPolicy
  53. ReferrerPolicyFromString(const nsAString& content)
  54. {
  55. if (content.IsEmpty()) {
  56. return RP_No_Referrer;
  57. }
  58. nsString lowerContent(content);
  59. ToLowerCase(lowerContent);
  60. // This is implemented step by step as described in the Referrer Policy
  61. // specification, section "Determine token's Policy".
  62. if (lowerContent.EqualsLiteral(kRPS_Never) ||
  63. lowerContent.EqualsLiteral(kRPS_No_Referrer)) {
  64. return RP_No_Referrer;
  65. }
  66. if (lowerContent.EqualsLiteral(kRPS_Origin)) {
  67. return RP_Origin;
  68. }
  69. if (lowerContent.EqualsLiteral(kRPS_Default) ||
  70. lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)) {
  71. return RP_No_Referrer_When_Downgrade;
  72. }
  73. if (lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin) ||
  74. lowerContent.EqualsLiteral(kRPS_Origin_When_Crossorigin)) {
  75. return RP_Origin_When_Crossorigin;
  76. }
  77. if (lowerContent.EqualsLiteral(kRPS_Same_Origin)) {
  78. return RP_Same_Origin;
  79. }
  80. if (lowerContent.EqualsLiteral(kRPS_Strict_Origin)) {
  81. return RP_Strict_Origin;
  82. }
  83. if (lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)) {
  84. return RP_Strict_Origin_When_Cross_Origin;
  85. }
  86. if (lowerContent.EqualsLiteral(kRPS_Always) ||
  87. lowerContent.EqualsLiteral(kRPS_Unsafe_URL)) {
  88. return RP_Unsafe_URL;
  89. }
  90. // Spec says if none of the previous match, use empty string.
  91. return RP_Unset;
  92. }
  93. inline bool
  94. IsValidReferrerPolicy(const nsAString& content)
  95. {
  96. if (content.IsEmpty()) {
  97. return true;
  98. }
  99. nsString lowerContent(content);
  100. ToLowerCase(lowerContent);
  101. return lowerContent.EqualsLiteral(kRPS_Never)
  102. || lowerContent.EqualsLiteral(kRPS_No_Referrer)
  103. || lowerContent.EqualsLiteral(kRPS_Origin)
  104. || lowerContent.EqualsLiteral(kRPS_Default)
  105. || lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)
  106. || lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin)
  107. || lowerContent.EqualsLiteral(kRPS_Origin_When_Crossorigin)
  108. || lowerContent.EqualsLiteral(kRPS_Same_Origin)
  109. || lowerContent.EqualsLiteral(kRPS_Strict_Origin)
  110. || lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)
  111. || lowerContent.EqualsLiteral(kRPS_Always)
  112. || lowerContent.EqualsLiteral(kRPS_Unsafe_URL);
  113. }
  114. inline ReferrerPolicy
  115. AttributeReferrerPolicyFromString(const nsAString& content)
  116. {
  117. // Specs : https://html.spec.whatwg.org/multipage/infrastructure.html#referrer-policy-attribute
  118. // Spec says the empty string "" corresponds to no referrer policy, or RP_Unset
  119. if (content.IsEmpty()) {
  120. return RP_Unset;
  121. }
  122. nsString lowerContent(content);
  123. ToLowerCase(lowerContent);
  124. if (lowerContent.EqualsLiteral(kRPS_No_Referrer)) {
  125. return RP_No_Referrer;
  126. }
  127. if (lowerContent.EqualsLiteral(kRPS_Origin)) {
  128. return RP_Origin;
  129. }
  130. if (lowerContent.EqualsLiteral(kRPS_No_Referrer_When_Downgrade)) {
  131. return RP_No_Referrer_When_Downgrade;
  132. }
  133. if (lowerContent.EqualsLiteral(kRPS_Origin_When_Cross_Origin)) {
  134. return RP_Origin_When_Crossorigin;
  135. }
  136. if (lowerContent.EqualsLiteral(kRPS_Unsafe_URL)) {
  137. return RP_Unsafe_URL;
  138. }
  139. if (lowerContent.EqualsLiteral(kRPS_Strict_Origin)) {
  140. return RP_Strict_Origin;
  141. }
  142. if (lowerContent.EqualsLiteral(kRPS_Same_Origin)) {
  143. return RP_Same_Origin;
  144. }
  145. if (lowerContent.EqualsLiteral(kRPS_Strict_Origin_When_Cross_Origin)) {
  146. return RP_Strict_Origin_When_Cross_Origin;
  147. }
  148. // Spec says invalid value default is empty string state
  149. // So, return RP_Unset if none of the previous match, return RP_Unset
  150. return RP_Unset;
  151. }
  152. } // namespace net
  153. } // namespace mozilla
  154. #endif