@unchainedshop/ticketing 2.10.6 → 2.11.0
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 +1 -0
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -1
- package/lib/magic-key.d.ts +2 -0
- package/lib/magic-key.js +30 -0
- package/lib/magic-key.js.map +1 -0
- package/lib/module.d.ts +1 -0
- package/lib/module.js +6 -0
- package/lib/module.js.map +1 -1
- package/package.json +15 -15
- package/readme.md +7 -1
- package/src/index.ts +8 -0
- package/src/magic-key.ts +43 -0
- package/src/module.ts +7 -0
package/lib/index.d.ts
CHANGED
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;
|
|
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"}
|
package/lib/magic-key.js
ADDED
|
@@ -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
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.
|
|
3
|
+
"version": "2.11.0",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"types": "lib/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -41,25 +41,25 @@
|
|
|
41
41
|
},
|
|
42
42
|
"homepage": "https://github.com/unchainedshop/unchained#readme",
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@unchainedshop/api": "^2.
|
|
45
|
-
"@unchainedshop/core-files": "^2.
|
|
46
|
-
"@unchainedshop/core-worker": "^2.
|
|
47
|
-
"@unchainedshop/events": "^2.
|
|
48
|
-
"@unchainedshop/logger": "^2.
|
|
49
|
-
"@unchainedshop/mongodb": "^2.
|
|
44
|
+
"@unchainedshop/api": "^2.11.0",
|
|
45
|
+
"@unchainedshop/core-files": "^2.11.0",
|
|
46
|
+
"@unchainedshop/core-worker": "^2.11.0",
|
|
47
|
+
"@unchainedshop/events": "^2.11.0",
|
|
48
|
+
"@unchainedshop/logger": "^2.11.0",
|
|
49
|
+
"@unchainedshop/mongodb": "^2.11.0"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
|
52
52
|
"@hyperlink/node-apn": "^5.1.4",
|
|
53
53
|
"express": "^4.19.2"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@types/node": "^20.14.
|
|
57
|
-
"@unchainedshop/api": "^2.
|
|
58
|
-
"@unchainedshop/core-files": "^2.
|
|
59
|
-
"@unchainedshop/core-worker": "^2.
|
|
60
|
-
"@unchainedshop/events": "^2.
|
|
61
|
-
"@unchainedshop/logger": "^2.
|
|
62
|
-
"@unchainedshop/mongodb": "^2.
|
|
63
|
-
"@unchainedshop/types": "^2.
|
|
56
|
+
"@types/node": "^20.14.8",
|
|
57
|
+
"@unchainedshop/api": "^2.11.0",
|
|
58
|
+
"@unchainedshop/core-files": "^2.11.0",
|
|
59
|
+
"@unchainedshop/core-worker": "^2.11.0",
|
|
60
|
+
"@unchainedshop/events": "^2.11.0",
|
|
61
|
+
"@unchainedshop/logger": "^2.11.0",
|
|
62
|
+
"@unchainedshop/mongodb": "^2.11.0",
|
|
63
|
+
"@unchainedshop/types": "^2.11.0"
|
|
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
|
});
|
package/src/magic-key.ts
ADDED
|
@@ -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
|
};
|