index.test.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. const express = require("express");
  2. const supertest = require("supertest");
  3. var http = require("http");
  4. const {
  5. isSameSiteNoneCompatible,
  6. shouldSendSameSiteNone
  7. } = require("./index");
  8. const negativeTestCases = {
  9. "Chrome 51":
  10. "Mozilla/5.0 doogiePIM/1.0.4.2 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36",
  11. "Chrome 52 @ Win 10":
  12. "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36",
  13. "Chrome 53 @ Win 10":
  14. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2883.87 Safari/537.36",
  15. "Chrome 54": "Mozilla/5.0 Chrome/54.0.2840.99 Safari/537.36",
  16. "Chrome 55 @ Mac":
  17. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36",
  18. "Chrome 56 @ Linux":
  19. "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36",
  20. "Chrome 57 @ Win 7":
  21. "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
  22. "Chrome 58 @ Android":
  23. "Mozilla/5.0 (Linux; Android 8.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Klar/1.0 Chrome/58.0.3029.121 Mobile Safari/537.36",
  24. "Chrome 59 @ Win7":
  25. "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
  26. "Chrome 60 @ Win10":
  27. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
  28. "Chrome 61 @ Win10":
  29. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
  30. "Chrome 62 @ Win10":
  31. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3165.0 Safari/537.36",
  32. "Chrome 63 @ Win7":
  33. "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3213.3 Safari/537.36",
  34. "Chrome 64 @ Win7":
  35. "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36",
  36. "Chrome 65":
  37. "Mozilla/5.0 (Win) AppleWebKit/1000.0 (KHTML, like Gecko) Chrome/65.663 Safari/1000.01",
  38. "Chrome 66 @ Win10":
  39. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3334.0 Safari/537.36",
  40. "Chrome 66 Webview":
  41. "Mozilla/5.0 (Linux; Android 4.4.4; One Build/KTU84L.H4) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.0.0 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/28.0.0.20.16;]",
  42. "UC Browser @ 10.7":
  43. "UCWEB/2.0 (MIDP-2.0; U; Adr 4.0.4; en-US; ZTE_U795) U2/1.0.0 UCBrowser/10.7.6.805 U2/1.0.0 Mobile",
  44. "UC Browser 12 @ Android":
  45. "Mozilla/5.0 (Linux; U; Android 7.1.1; en-US; Lenovo K8 Note Build/NMB26.54-74) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.0.0.1088 Mobile Safari/537.36",
  46. "UC Browser 11.5 @ iOS 11":
  47. "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/15A5304i UCBrowser/11.5.7.986 Mobile AliApp(TUnionSDK/0.1.15)",
  48. "Safari @ Mac 10.14":
  49. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0 Safari/605.1.15",
  50. "Embeded @ Mac 10.4":
  51. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14) AppleWebKit/537.36 (KHTML, like Gecko)",
  52. "Safari @ iOS 12":
  53. "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/ 604.1.21 (KHTML, like Gecko) Version/ 12.0 Mobile/17A6278a Safari/602.1.26",
  54. "Chrome @ iOS 12":
  55. "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/70.0.3538.75 Mobile/15E148 Safari/605.1",
  56. "Firefox @ iOS 12":
  57. "Mozilla/5.0 (iPad; CPU OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/13.2b11866 Mobile/16A366 Safari/605.1.15"
  58. };
  59. const positiveTestCases = {
  60. "Chrome 50 @ Win10":
  61. "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
  62. "Chrome 67 @ Win10":
  63. "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.2526.73 Safari/537.36",
  64. "Chrome 60 @ IOS":
  65. "Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) CriOS/60.0.3112.72 Mobile/15A5327g Safari/602.1",
  66. "Chrome @ Mac":
  67. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36",
  68. "UC Browser 12.13.2 @ Andriod":
  69. "Mozilla/5.0 (Linux; U; Android 8.0.0; en-US; Pixel XL Build/OPR3.170623.007) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/12.13.2.1005 U3/0.8.0 Mobile Safari/534.30",
  70. "UC Browser 12.13.4 @ Andriod":
  71. "Mozilla/5.0 (Linux; U; Android 8.0.0; en-US; Pixel XL Build/OPR3.170623.007) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/12.13.4.1005 U3/0.8.0 Mobile Safari/534.30",
  72. "Safari @ Mac 13":
  73. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Safari/605.1.15",
  74. "Safari @ Mac 15.5":
  75. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/601.1.39 (KHTML, like Gecko) Version/10.1.2 Safari/601.1.39",
  76. "Safari @ ios 13":
  77. "Mozilla/5.0 (iPhone; CPU iPhone OS 13_0 like Mac OS X) AppleWebKit/602.1.38 (KHTML, like Gecko) Version/66.6 Mobile/14A5297c Safari/602.1",
  78. "Null": null,
  79. };
  80. describe("isSameSiteNoneCompatible", () => {
  81. for (const i in positiveTestCases) {
  82. if (positiveTestCases.hasOwnProperty(i)) {
  83. it(`Test ${i} (true)`, () => {
  84. expect(isSameSiteNoneCompatible(positiveTestCases[i])).toBe(true);
  85. });
  86. }
  87. }
  88. for (const i in negativeTestCases) {
  89. if (negativeTestCases.hasOwnProperty(i)) {
  90. it(`Test ${i} (false)`, () => {
  91. expect(isSameSiteNoneCompatible(negativeTestCases[i])).toBe(false);
  92. });
  93. }
  94. }
  95. });
  96. describe("shouldSendSameSiteNone with mutiple cookies", () => {
  97. let app, server;
  98. beforeEach(done => {
  99. app = new express();
  100. app.use(shouldSendSameSiteNone);
  101. app.get("/", (req, res, next) => {
  102. res.set("Set-Cookie", "a=b;samesite = none ;secure");
  103. res.cookie("foo", "bar", { sameSite: "none" });
  104. res.cookie("koo", "mar", { sameSite: "none" });
  105. res.send("ok");
  106. });
  107. server = http.createServer(app);
  108. server.listen(done);
  109. });
  110. afterEach(done => {
  111. server.close(done);
  112. });
  113. for (const i in negativeTestCases) {
  114. if (negativeTestCases.hasOwnProperty(i)) {
  115. it(`Remove SameSite=None attributes in ${i}`, async done => {
  116. const response = await supertest(app)
  117. .get("/")
  118. .set("User-Agent", negativeTestCases[i]);
  119. const expected = ["a=b;secure", "foo=bar; Path=/", "koo=mar; Path=/"];
  120. expect(response.header["set-cookie"]).toEqual(expected);
  121. expect(response.text).toEqual("ok");
  122. done();
  123. });
  124. }
  125. }
  126. for (const i in positiveTestCases) {
  127. if (positiveTestCases.hasOwnProperty(i)) {
  128. it(`Keep SameSite=None attributes in ${i}`, async done => {
  129. const response = await supertest(app)
  130. .get("/")
  131. .set("User-Agent", positiveTestCases[i]);
  132. const expected = [
  133. "a=b;samesite = none ;secure",
  134. "foo=bar; Path=/; SameSite=None",
  135. "koo=mar; Path=/; SameSite=None"
  136. ];
  137. expect(response.header["set-cookie"]).toEqual(expected);
  138. expect(response.text).toEqual("ok");
  139. done();
  140. });
  141. }
  142. }
  143. });
  144. describe("shouldSendSameSiteNone with single cookies", () => {
  145. let app, server;
  146. beforeEach(done => {
  147. app = new express();
  148. app.use(shouldSendSameSiteNone);
  149. app.get("/", (req, res, next) => {
  150. res.cookie("foo", "bar", { sameSite: "none" });
  151. res.send("ok");
  152. });
  153. server = http.createServer(app);
  154. server.listen(done);
  155. });
  156. afterEach(done => {
  157. server.close(done);
  158. });
  159. for (const i in negativeTestCases) {
  160. if (negativeTestCases.hasOwnProperty(i)) {
  161. it(`Remove SameSite=None attributes in ${i}`, async done => {
  162. const response = await supertest(app)
  163. .get("/")
  164. .set("User-Agent", negativeTestCases[i]);
  165. const expected = ["foo=bar; Path=/"];
  166. expect(response.header["set-cookie"]).toEqual(expected);
  167. expect(response.text).toEqual("ok");
  168. done();
  169. });
  170. }
  171. }
  172. for (const i in positiveTestCases) {
  173. if (positiveTestCases.hasOwnProperty(i)) {
  174. it(`Keep SameSite=None attributes in ${i}`, async done => {
  175. const response = await supertest(app)
  176. .get("/")
  177. .set("User-Agent", positiveTestCases[i]);
  178. const expected = ["foo=bar; Path=/; SameSite=None"];
  179. expect(response.header["set-cookie"]).toEqual(expected);
  180. expect(response.text).toEqual("ok");
  181. done();
  182. });
  183. }
  184. }
  185. });
  186. describe("shouldSendSameSiteNone with no cookies", () => {
  187. let app, server;
  188. beforeEach(done => {
  189. app = new express();
  190. app.use(shouldSendSameSiteNone);
  191. app.get("/", (req, res, next) => {
  192. res.send("ok");
  193. });
  194. server = http.createServer(app);
  195. server.listen(done);
  196. });
  197. afterEach(done => {
  198. server.close(done);
  199. });
  200. for (const i in negativeTestCases) {
  201. if (negativeTestCases.hasOwnProperty(i)) {
  202. it(`Remove SameSite=None attributes in ${i}`, async done => {
  203. const response = await supertest(app)
  204. .get("/")
  205. .set("User-Agent", negativeTestCases[i]);
  206. expect(response.header["set-cookie"]).toEqual(undefined);
  207. expect(response.text).toEqual("ok");
  208. done();
  209. });
  210. }
  211. }
  212. for (const i in positiveTestCases) {
  213. if (positiveTestCases.hasOwnProperty(i)) {
  214. it(`Keep SameSite=None attributes in ${i}`, async done => {
  215. const response = await supertest(app)
  216. .get("/")
  217. .set("User-Agent", positiveTestCases[i]);
  218. expect(response.header["set-cookie"]).toEqual(undefined);
  219. expect(response.text).toEqual("ok");
  220. done();
  221. });
  222. }
  223. }
  224. });