crypto.test.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. const { eq, ok, notOk } = require('../../helpers/assert');
  2. const { makeNetwork, makePeer } = require('../../helpers/setup');
  3. describe('events: crypto', (t) => {
  4. t('public event is published as plaintext', async () => {
  5. const net = makeNetwork();
  6. const A = makePeer(net); A.setActor();
  7. const r = await A.use('events').createEvent('Open meetup', 'desc', '2030-12-01T20:00:00Z', 'plaza', 0, '', [], [], 'public', '');
  8. ok(r && r.key);
  9. const ev = await A.use('events').getEventById(r.key);
  10. eq(ev.title, 'Open meetup');
  11. eq(ev.isPublic, 'public');
  12. notOk(ev.encrypted);
  13. });
  14. t('private event encrypts content and exposes encrypted flag', async () => {
  15. const net = makeNetwork();
  16. const A = makePeer(net); A.setActor();
  17. const r = await A.use('events').createEvent('Secret meetup', 'sensitive', '2030-12-01T20:00:00Z', 'undisclosed', 0, '', [], [], 'private', '');
  18. ok(r && r.key);
  19. const ev = await A.use('events').getEventById(r.key);
  20. eq(ev.title, 'Secret meetup');
  21. eq(ev.isPublic, 'private');
  22. ok(ev.encrypted);
  23. });
  24. t('outsider without key cannot decrypt private event', async () => {
  25. const net = makeNetwork();
  26. const A = makePeer(net); const B = makePeer(net);
  27. A.setActor();
  28. const r = await A.use('events').createEvent('Members only', 'private text', '2030-12-01T20:00:00Z', 'home', 0, '', [], [], 'private', '');
  29. B.setActor();
  30. let threw = false;
  31. try { await B.use('events').getEventById(r.key); } catch (_) { threw = true; }
  32. ok(threw, 'B without the key should not be able to read the encrypted event');
  33. });
  34. t('outsider redeems invite code, ends up as an attendee and can decrypt', async () => {
  35. const net = makeNetwork();
  36. const A = makePeer(net); const B = makePeer(net);
  37. A.setActor();
  38. const r = await A.use('events').createEvent('Invite-only', 'private', '2030-12-01T20:00:00Z', 'somewhere', 0, '', [], [], 'private', '');
  39. const { code } = await A.use('events').generateInvite(r.key);
  40. eq(typeof code, 'string');
  41. eq(code.length, 32);
  42. B.setActor();
  43. const result = await B.use('events').joinByInvite(code);
  44. eq(result.ok, true);
  45. const list = await B.use('events').listAll(null, 'all');
  46. const ev = list.find(e => e.title === 'Invite-only');
  47. ok(ev);
  48. ok(Array.isArray(ev.attendees) && ev.attendees.includes(B.keypair.id));
  49. });
  50. t('public → private toggle generates a key and encrypts subsequent reads', async () => {
  51. const net = makeNetwork();
  52. const A = makePeer(net); A.setActor();
  53. const r = await A.use('events').createEvent('Switch test', 'public-initially', '2030-12-01T20:00:00Z', 'public-loc', 0, '', [], [], 'public', '');
  54. let ev = await A.use('events').getEventById(r.key);
  55. eq(ev.isPublic, 'public');
  56. notOk(ev.encrypted);
  57. const upd = await A.use('events').updateEventById(r.key, { isPublic: 'private' });
  58. ok(upd);
  59. ev = await A.use('events').getEventById(upd.key);
  60. eq(ev.isPublic, 'private');
  61. ok(ev.encrypted);
  62. });
  63. t('private → public toggle stops encrypting future updates', async () => {
  64. const net = makeNetwork();
  65. const A = makePeer(net); A.setActor();
  66. const r = await A.use('events').createEvent('Open soon', 'will become public', '2030-12-01T20:00:00Z', 'somewhere', 0, '', [], [], 'private', '');
  67. const upd = await A.use('events').updateEventById(r.key, { isPublic: 'public' });
  68. const ev = await A.use('events').getEventById(upd.key);
  69. eq(ev.isPublic, 'public');
  70. notOk(ev.encrypted);
  71. });
  72. t('only the organizer can generate invites for a private event', async () => {
  73. const net = makeNetwork();
  74. const A = makePeer(net); const B = makePeer(net);
  75. A.setActor();
  76. const r = await A.use('events').createEvent('A event', 'd', '2030-12-01T20:00:00Z', '', 0, '', [], [], 'private', '');
  77. B.setActor();
  78. let threw = false;
  79. try { await B.use('events').generateInvite(r.key); } catch (_) { threw = true; }
  80. ok(threw);
  81. });
  82. t('public event invite generation is rejected', async () => {
  83. const net = makeNetwork();
  84. const A = makePeer(net); A.setActor();
  85. const r = await A.use('events').createEvent('Public', 'd', '2030-12-01T20:00:00Z', '', 0, '', [], [], 'public', '');
  86. let threw = false;
  87. try { await A.use('events').generateInvite(r.key); } catch (_) { threw = true; }
  88. ok(threw);
  89. });
  90. });