@operstack/audit 0.15.1 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operstack/audit",
3
- "version": "0.15.1",
3
+ "version": "0.15.2",
4
4
  "description": "SEO, AEO and GEO audit generator: collect public signals from a site into audit.json, let an analyst or an agent fill the narrative, render the OperStack report as HTML and PDF.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -26,7 +26,16 @@ const makeKey = (data) => {
26
26
  // Проверка подписи
27
27
  ok('правильный ключ принимается', verifyKey(makeKey({ email: 'a@b.co', plan: 'agency' }), pub).ok);
28
28
  ok('мусор отвергается', !verifyKey('OSK1.aaa.bbb', pub).ok);
29
- ok('чужая подпись отвергается', !verifyKey(makeKey({ plan: 'agency' }).replace(/.$/, 'A'), pub).ok);
29
+ // Портить надо байты, а не символы. В base64url последний символ кодирует не все шесть бит,
30
+ // поэтому несколько разных символов дают одни и те же байты, и подпись оставалась верной
31
+ // примерно в каждом пятом прогоне. Летучий тест хуже, чем никакого.
32
+ const tampered = (k) => {
33
+ const [p, payload, sig] = k.split('.');
34
+ const bytes = Buffer.from(sig, 'base64url');
35
+ bytes[0] ^= 0xff;
36
+ return `${p}.${payload}.${bytes.toString('base64url')}`;
37
+ };
38
+ ok('чужая подпись отвергается', !verifyKey(tampered(makeKey({ plan: 'agency' })), pub).ok);
30
39
  ok('просроченный план отвергается', !verifyKey(makeKey({ plan: 'agency', expires: '2020-01-01' }), pub).ok);
31
40
  ok('ключ другого продукта отвергается', !verifyKey(makeKey({ plan: 'site-kit' }), pub).ok);
32
41
  ok('срок в будущем проходит', verifyKey(makeKey({ plan: 'agency', expires: '2999-01-01' }), pub).ok);