@unchainedshop/ticketing 2.10.5 → 2.10.7

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/lib/index.d.ts CHANGED
@@ -21,6 +21,7 @@ export declare const ticketingModules: {
21
21
  serialNumber?: string;
22
22
  passTypeIdentifier?: string;
23
23
  }>;
24
+ buildMagicKey: (orderId: string) => Promise<string>;
24
25
  }>;
25
26
  };
26
27
  };
package/lib/index.js CHANGED
@@ -5,6 +5,7 @@ import loadAppleWalletHandler from './mobile-tickets/apple-webservice.js';
5
5
  import loadGoogleWalletHandler from './mobile-tickets/google-webservice.js';
6
6
  import loadPDFHandler from './pdf-tickets/print-webservice.js';
7
7
  import passes from './module.js';
8
+ import setupMagicKey from './magic-key.js';
8
9
  export const ticketingModules = {
9
10
  passes,
10
11
  };
@@ -26,6 +27,9 @@ export default function setupTicketing(app, unchainedAPI, { renderOrderPDF, crea
26
27
  createAppleWalletPass,
27
28
  createGoogleWalletPass,
28
29
  });
30
+ if (!process.env.UNCHAINED_SECRET)
31
+ throw new Error('Unchained Ticketing needs the UNCHAINED_SECRET environment variable to be set in order to allow magic key access to orders and tokens.');
32
+ setupMagicKey();
29
33
  subscribe('TOKEN_INVALIDATED', async () => {
30
34
  await unchainedAPI.modules.passes.invalidateAppleWalletPasses(unchainedAPI);
31
35
  });
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,sBAAsB,MAAM,sCAAsC,CAAC;AAC1E,OAAO,uBAAuB,MAAM,uCAAuC,CAAC;AAC5E,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;CACP,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,GAAoB,EACpB,EACE,cAAc,GAGf;IAED,gBAAgB,CAAC,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC1D,cAAc,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAoB,EACpB,EACE,sBAAsB,EACtB,qBAAqB,GAItB;IAED,gBAAgB,CAAC,aAAa,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IACtE,gBAAgB,CAAC,aAAa,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAEpE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,GAAoB,EACpB,YAA0B,EAC1B,EACE,cAAc,EACd,qBAAqB,EACrB,sBAAsB,GAKvB;IAED,eAAe,CAAC,GAAG,EAAE;QACnB,cAAc;KACf,CAAC,CAAC;IACH,kBAAkB,CAAC,GAAG,EAAE;QACtB,qBAAqB;QACrB,sBAAsB;KACvB,CAAC,CAAC;IAEH,SAAS,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAwB,EAAE,EAAE;QACrF,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7F,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,sBAAsB,MAAM,sCAAsC,CAAC;AAC1E,OAAO,uBAAuB,MAAM,uCAAuC,CAAC;AAC5E,OAAO,cAAc,MAAM,mCAAmC,CAAC;AAC/D,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAI3C,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;CACP,CAAC;AAEF,MAAM,UAAU,eAAe,CAC7B,GAAoB,EACpB,EACE,cAAc,GAGf;IAED,gBAAgB,CAAC,aAAa,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC1D,cAAc,CAAC,GAAG,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAoB,EACpB,EACE,sBAAsB,EACtB,qBAAqB,GAItB;IAED,gBAAgB,CAAC,aAAa,CAAC,aAAa,EAAE,sBAAsB,CAAC,CAAC;IACtE,gBAAgB,CAAC,aAAa,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAEpE,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,GAAoB,EACpB,YAA0B,EAC1B,EACE,cAAc,EACd,qBAAqB,EACrB,sBAAsB,GAKvB;IAED,eAAe,CAAC,GAAG,EAAE;QACnB,cAAc;KACf,CAAC,CAAC;IACH,kBAAkB,CAAC,GAAG,EAAE;QACtB,qBAAqB;QACrB,sBAAsB;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAC/B,MAAM,IAAI,KAAK,CACb,wIAAwI,CACzI,CAAC;IAEJ,aAAa,EAAE,CAAC;IAEhB,SAAS,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAwB,EAAE,EAAE;QACrF,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7F,MAAM,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ declare const _default: () => void;
2
+ export default _default;
@@ -0,0 +1,30 @@
1
+ import { roles } from '@unchainedshop/api';
2
+ const isMagicKeyValidForOrder = async (obj, { orderId }, { modules, req }) => {
3
+ const order = await modules.orders.findOrder({ orderId });
4
+ // always return true if orderId leads to nothing to show potentially allowed actions
5
+ if (!order)
6
+ return true;
7
+ const magicKey = await modules.passes.buildMagicKey(order._id);
8
+ return magicKey === req.headers['x-magic-key'];
9
+ };
10
+ const isMagicKeyValidForToken = async (obj, { tokenId }, context) => {
11
+ const { modules, req } = context;
12
+ const token = await modules.warehousing.findToken({ tokenId });
13
+ // always return true if tokenId leads to nothing to show potentially allowed actions
14
+ if (!token)
15
+ return true;
16
+ const order = await modules.orders.findOrder({ orderId: token.meta.orderId });
17
+ if (!order)
18
+ return false;
19
+ // Restrict access if token does not belong to the original user anymore (for ex. web3 owned)
20
+ if (order.userId !== token.userId)
21
+ return false;
22
+ const magicKey = await modules.passes.buildMagicKey(order._id);
23
+ return magicKey === req.headers['x-magic-key'];
24
+ };
25
+ export default () => {
26
+ roles.allRoles.ALL.allow(roles.actions.viewOrder, isMagicKeyValidForOrder);
27
+ roles.allRoles.ALL.allow(roles.actions.viewToken, isMagicKeyValidForToken);
28
+ roles.allRoles.ALL.allow(roles.actions.updateToken, isMagicKeyValidForToken);
29
+ };
30
+ //# sourceMappingURL=magic-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magic-key.js","sourceRoot":"","sources":["../src/magic-key.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAG3C,MAAM,uBAAuB,GAAG,KAAK,EACnC,GAAQ,EACR,EAAE,OAAO,EAAuB,EAChC,EAAE,OAAO,EAAE,GAAG,EAA0B,EACxC,EAAE;IACF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,qFAAqF;IACrF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,QAAQ,KAAK,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,KAAK,EACnC,GAAQ,EACR,EAAE,OAAO,EAAuB,EAChC,OAA+B,EAC/B,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAEjC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,qFAAqF;IACrF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,6FAA6F;IAC7F,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAEhD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,QAAQ,KAAK,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,eAAe,GAAG,EAAE;IAClB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC3E,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC3E,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AAC/E,CAAC,CAAC"}
package/lib/module.d.ts CHANGED
@@ -20,6 +20,7 @@ declare const ticketingModule: {
20
20
  serialNumber?: string;
21
21
  passTypeIdentifier?: string;
22
22
  }>;
23
+ buildMagicKey: (orderId: string) => Promise<string>;
23
24
  }>;
24
25
  };
25
26
  export type TicketingModule = Awaited<ReturnType<(typeof ticketingModule)['configure']>>;
package/lib/module.js CHANGED
@@ -128,6 +128,11 @@ const ticketingModule = {
128
128
  }
129
129
  }
130
130
  };
131
+ const buildMagicKey = async (orderId) => {
132
+ const msgUint8 = new TextEncoder().encode([orderId, process.env.UNCHAINED_SECRET].join(''));
133
+ const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);
134
+ return Buffer.from(hashBuffer).toString('hex');
135
+ };
131
136
  return {
132
137
  upsertAppleWalletPass,
133
138
  findAppleWalletPass,
@@ -136,6 +141,7 @@ const ticketingModule = {
136
141
  findUpdatedAppleWalletPasses,
137
142
  invalidateAppleWalletPasses,
138
143
  upsertGoogleWalletPass,
144
+ buildMagicKey,
139
145
  };
140
146
  },
141
147
  };
package/lib/module.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/ticketing",
3
- "version": "2.10.5",
3
+ "version": "2.10.7",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "exports": {
@@ -20,7 +20,7 @@
20
20
  "type": "module",
21
21
  "scripts": {
22
22
  "clean": "rm -rf lib",
23
- "prepare": "npm run clean && tsc",
23
+ "prepublishOnly": "npm run clean && tsc",
24
24
  "watch": "tsc -w",
25
25
  "test": "NODE_OPTIONS=--experimental-vm-modules jest --detectOpenHandles --forceExit",
26
26
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch --detectOpenHandles --forceExit"
@@ -41,25 +41,25 @@
41
41
  },
42
42
  "homepage": "https://github.com/unchainedshop/unchained#readme",
43
43
  "dependencies": {
44
- "@unchainedshop/api": "^2.10.5",
45
- "@unchainedshop/core-files": "^2.10.5",
46
- "@unchainedshop/core-worker": "^2.10.5",
47
- "@unchainedshop/events": "^2.10.5",
48
- "@unchainedshop/logger": "^2.10.5",
49
- "@unchainedshop/mongodb": "^2.10.5"
44
+ "@unchainedshop/api": "^2.10.7",
45
+ "@unchainedshop/core-files": "^2.10.7",
46
+ "@unchainedshop/core-worker": "^2.10.7",
47
+ "@unchainedshop/events": "^2.10.7",
48
+ "@unchainedshop/logger": "^2.10.7",
49
+ "@unchainedshop/mongodb": "^2.10.7"
50
50
  },
51
51
  "peerDependencies": {
52
- "@hyperlink/node-apn": "~5",
53
- "express": "~4"
52
+ "@hyperlink/node-apn": "^5.1.4",
53
+ "express": "^4.19.2"
54
54
  },
55
55
  "devDependencies": {
56
- "@types/node": "^20.14.2",
57
- "@unchainedshop/api": "^2.10.5",
58
- "@unchainedshop/core-files": "^2.10.5",
59
- "@unchainedshop/core-worker": "^2.10.5",
60
- "@unchainedshop/events": "^2.10.5",
61
- "@unchainedshop/logger": "^2.10.5",
62
- "@unchainedshop/mongodb": "^2.10.5",
63
- "@unchainedshop/types": "^2.10.5"
56
+ "@types/node": "^20.14.7",
57
+ "@unchainedshop/api": "^2.10.7",
58
+ "@unchainedshop/core-files": "^2.10.7",
59
+ "@unchainedshop/core-worker": "^2.10.7",
60
+ "@unchainedshop/events": "^2.10.7",
61
+ "@unchainedshop/logger": "^2.10.7",
62
+ "@unchainedshop/mongodb": "^2.10.7",
63
+ "@unchainedshop/types": "^2.10.7"
64
64
  }
65
65
  }
package/readme.md CHANGED
@@ -90,4 +90,10 @@ export default async (token, unchainedAPI: UnchainedCore) => {
90
90
 
91
91
  return { asURL };
92
92
  };
93
- ```
93
+ ```
94
+
95
+ ## Magic Key Order Access
96
+
97
+ Sometimes it's handy for users to allow them to access their orders and their tickets without actually logging in. For this you can generate a "magic key" that allows access to a single order and it's tickets via a request http header called `x-magic-key`.
98
+
99
+ For example: To retrieve the magic-key when sending an order-confirmation e-mail, just call `await modules.passes.buildMagicKey(orderId);` and append it to an URL like https://my-shop/:orderId?otp=:magicKey and then in the storefront, use the magic key and send it along via x-magic-key http header when using queries that are guarded by the actions `viewOrder`, `updateToken` and `viewToken`
package/src/index.ts CHANGED
@@ -9,6 +9,7 @@ import loadGoogleWalletHandler from './mobile-tickets/google-webservice.js';
9
9
  import loadPDFHandler from './pdf-tickets/print-webservice.js';
10
10
  import passes from './module.js';
11
11
  import type { TicketingAPI } from './types.js';
12
+ import setupMagicKey from './magic-key.js';
12
13
 
13
14
  export type { TicketingAPI, RendererTypes };
14
15
 
@@ -66,6 +67,13 @@ export default function setupTicketing(
66
67
  createGoogleWalletPass,
67
68
  });
68
69
 
70
+ if (!process.env.UNCHAINED_SECRET)
71
+ throw new Error(
72
+ 'Unchained Ticketing needs the UNCHAINED_SECRET environment variable to be set in order to allow magic key access to orders and tokens.',
73
+ );
74
+
75
+ setupMagicKey();
76
+
69
77
  subscribe('TOKEN_INVALIDATED', async () => {
70
78
  await unchainedAPI.modules.passes.invalidateAppleWalletPasses(unchainedAPI);
71
79
  });
@@ -0,0 +1,43 @@
1
+ import { Context } from '@unchainedshop/types/api.js';
2
+ import { roles } from '@unchainedshop/api';
3
+ import { TicketingAPI } from './types.js';
4
+
5
+ const isMagicKeyValidForOrder = async (
6
+ obj: any,
7
+ { orderId }: { orderId: string },
8
+ { modules, req }: Context & TicketingAPI,
9
+ ) => {
10
+ const order = await modules.orders.findOrder({ orderId });
11
+ // always return true if orderId leads to nothing to show potentially allowed actions
12
+ if (!order) return true;
13
+
14
+ const magicKey = await modules.passes.buildMagicKey(order._id);
15
+ return magicKey === req.headers['x-magic-key'];
16
+ };
17
+
18
+ const isMagicKeyValidForToken = async (
19
+ obj: any,
20
+ { tokenId }: { tokenId: string },
21
+ context: Context & TicketingAPI,
22
+ ) => {
23
+ const { modules, req } = context;
24
+
25
+ const token = await modules.warehousing.findToken({ tokenId });
26
+ // always return true if tokenId leads to nothing to show potentially allowed actions
27
+ if (!token) return true;
28
+
29
+ const order = await modules.orders.findOrder({ orderId: token.meta.orderId });
30
+ if (!order) return false;
31
+
32
+ // Restrict access if token does not belong to the original user anymore (for ex. web3 owned)
33
+ if (order.userId !== token.userId) return false;
34
+
35
+ const magicKey = await modules.passes.buildMagicKey(order._id);
36
+ return magicKey === req.headers['x-magic-key'];
37
+ };
38
+
39
+ export default () => {
40
+ roles.allRoles.ALL.allow(roles.actions.viewOrder, isMagicKeyValidForOrder);
41
+ roles.allRoles.ALL.allow(roles.actions.viewToken, isMagicKeyValidForToken);
42
+ roles.allRoles.ALL.allow(roles.actions.updateToken, isMagicKeyValidForToken);
43
+ };
package/src/module.ts CHANGED
@@ -175,6 +175,12 @@ const ticketingModule = {
175
175
  }
176
176
  };
177
177
 
178
+ const buildMagicKey = async (orderId: string) => {
179
+ const msgUint8 = new TextEncoder().encode([orderId, process.env.UNCHAINED_SECRET].join(''));
180
+ const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);
181
+ return Buffer.from(hashBuffer).toString('hex');
182
+ };
183
+
178
184
  return {
179
185
  upsertAppleWalletPass,
180
186
  findAppleWalletPass,
@@ -183,6 +189,7 @@ const ticketingModule = {
183
189
  findUpdatedAppleWalletPasses,
184
190
  invalidateAppleWalletPasses,
185
191
  upsertGoogleWalletPass,
192
+ buildMagicKey,
186
193
  };
187
194
  },
188
195
  };