@huloglobal/vendure-plugin-geo-block 0.1.0 → 0.2.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/dist/geo-block-event.entity.d.ts +22 -0
- package/dist/geo-block-event.entity.d.ts.map +1 -0
- package/dist/geo-block-event.entity.js +68 -0
- package/dist/geo-block-event.entity.js.map +1 -0
- package/dist/geo-block.controller.d.ts +42 -25
- package/dist/geo-block.controller.d.ts.map +1 -1
- package/dist/geo-block.controller.js +368 -97
- package/dist/geo-block.controller.js.map +1 -1
- package/dist/geo-regions.d.ts +38 -13
- package/dist/geo-regions.d.ts.map +1 -1
- package/dist/geo-regions.js +212 -15
- package/dist/geo-regions.js.map +1 -1
- package/dist/index.d.ts +7 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +22 -23
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +56 -38
- package/dist/plugin.js.map +1 -1
- package/package.json +1 -1
- package/ui/components/geo-block.component.ts +471 -255
|
@@ -15,7 +15,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.GeoBlockController = void 0;
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const core_1 = require("@vendure/core");
|
|
18
|
+
const geo_block_event_entity_1 = require("./geo-block-event.entity");
|
|
18
19
|
const geo_regions_1 = require("./geo-regions");
|
|
20
|
+
const plugin_1 = require("./plugin");
|
|
21
|
+
const proxy_headers_1 = require("./proxy-headers");
|
|
22
|
+
const loggerCtx = 'GeoBlockController';
|
|
19
23
|
function requireAdmin(ctx, res, write = false) {
|
|
20
24
|
if (!(ctx === null || ctx === void 0 ? void 0 : ctx.activeUserId)) {
|
|
21
25
|
res.status(401).json({ error: 'Authentication required' });
|
|
@@ -32,21 +36,44 @@ const DEFAULTS = {
|
|
|
32
36
|
channelToken: '',
|
|
33
37
|
geoBlock: {
|
|
34
38
|
enabled: false,
|
|
39
|
+
mode: 'block',
|
|
35
40
|
allowedCountries: ['GB'],
|
|
36
41
|
blockedCountries: [],
|
|
37
42
|
allowedGbRegions: ['ENG', 'WLS'],
|
|
38
43
|
allowedRegions: [],
|
|
44
|
+
blockMessage: '',
|
|
45
|
+
blockRedirectUrl: null,
|
|
46
|
+
blockLogoUrl: null,
|
|
39
47
|
},
|
|
40
48
|
companyData: { showCompanyNumber: false, companyNumber: '' },
|
|
41
49
|
};
|
|
50
|
+
const parseList = (raw, fallback = []) => {
|
|
51
|
+
if (Array.isArray(raw))
|
|
52
|
+
return raw.filter(v => typeof v === 'string');
|
|
53
|
+
if (typeof raw !== 'string' || !raw.length)
|
|
54
|
+
return fallback;
|
|
55
|
+
try {
|
|
56
|
+
const parsed = JSON.parse(raw);
|
|
57
|
+
if (Array.isArray(parsed))
|
|
58
|
+
return parsed.filter(v => typeof v === 'string');
|
|
59
|
+
}
|
|
60
|
+
catch { }
|
|
61
|
+
return raw.split(',').map(s => s.trim()).filter(Boolean);
|
|
62
|
+
};
|
|
42
63
|
/**
|
|
43
|
-
* Public
|
|
44
|
-
* channel. The storefront calls GET /ees/site-config and identifies the
|
|
45
|
-
* channel via the standard `vendure-token` header (the same one shop-api
|
|
46
|
-
* uses), or via ?token=<channelToken> as a fallback for static fetchers.
|
|
64
|
+
* Public + admin endpoints for the storefront geo-block.
|
|
47
65
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
66
|
+
* Public:
|
|
67
|
+
* GET /geo-block/site-config — channel-aware rules the storefront caches
|
|
68
|
+
* GET /geo-block/check — per-request decision (with logging)
|
|
69
|
+
* GET /geo-block/presets — preset catalogue for the storefront banner
|
|
70
|
+
*
|
|
71
|
+
* Admin:
|
|
72
|
+
* GET /geo-block/admin/channels — all channels + their rules
|
|
73
|
+
* POST /geo-block/admin/save — save one channel's rules
|
|
74
|
+
* GET /geo-block/admin/stats — block totals + top blocked countries
|
|
75
|
+
* POST /geo-block/admin/simulate — "what would happen if a visitor from X visited?"
|
|
76
|
+
* POST /geo-block/admin/gc — prune old GeoBlockEvent rows
|
|
50
77
|
*/
|
|
51
78
|
let GeoBlockController = class GeoBlockController {
|
|
52
79
|
constructor(connection) {
|
|
@@ -58,99 +85,118 @@ let GeoBlockController = class GeoBlockController {
|
|
|
58
85
|
|| req.query.token
|
|
59
86
|
|| '';
|
|
60
87
|
const token = headerToken.trim();
|
|
61
|
-
if (!token)
|
|
88
|
+
if (!token)
|
|
62
89
|
return { ...DEFAULTS };
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
customFieldsShowcompanynumber AS showCompanyNumber,
|
|
66
|
-
customFieldsBusinesscompanynumber AS companyNumber,
|
|
67
|
-
customFieldsGeoblockenabled AS geoBlockEnabled,
|
|
68
|
-
customFieldsGeoblockallowedregions AS allowedRegions,
|
|
69
|
-
customFieldsGeoblockallowedcountries AS extraAllowed,
|
|
70
|
-
customFieldsGeoblockblockedcountries AS blockedCountries,
|
|
71
|
-
customFieldsGeoblockallowedgbregions AS allowedGbRegions
|
|
72
|
-
FROM channel
|
|
73
|
-
WHERE token = ?
|
|
74
|
-
LIMIT 1`, [token]);
|
|
75
|
-
if (!rows.length) {
|
|
90
|
+
const row = await this.loadChannelRow(token);
|
|
91
|
+
if (!row)
|
|
76
92
|
return { ...DEFAULTS, channelToken: token };
|
|
77
|
-
|
|
78
|
-
const r = rows[0];
|
|
79
|
-
const parseList = (raw, fallback) => {
|
|
80
|
-
if (Array.isArray(raw))
|
|
81
|
-
return raw.filter(v => typeof v === 'string');
|
|
82
|
-
if (typeof raw !== 'string' || !raw.length)
|
|
83
|
-
return fallback;
|
|
84
|
-
try {
|
|
85
|
-
const parsed = JSON.parse(raw);
|
|
86
|
-
if (Array.isArray(parsed))
|
|
87
|
-
return parsed.filter(v => typeof v === 'string');
|
|
88
|
-
}
|
|
89
|
-
catch { }
|
|
90
|
-
// MariaDB stores list customFields as a JSON-encoded text. Be
|
|
91
|
-
// forgiving of a CSV fallback for older rows.
|
|
92
|
-
return raw.split(',').map(s => s.trim()).filter(Boolean);
|
|
93
|
-
};
|
|
94
|
-
const allowedRegions = parseList(r.allowedRegions, []);
|
|
95
|
-
const extraAllowed = parseList(r.extraAllowed, ['GB']);
|
|
96
|
-
const blockedCountries = parseList(r.blockedCountries, []);
|
|
97
|
-
// Resolve regions + extras − blocked into a single flat allow-list.
|
|
98
|
-
// `allowed === null` means WORLDWIDE — no country filter, only the
|
|
99
|
-
// denylist applies.
|
|
100
|
-
const resolved = (0, geo_regions_1.resolveAllowedCountries)({
|
|
101
|
-
regions: allowedRegions,
|
|
102
|
-
extraAllowed,
|
|
103
|
-
blocked: blockedCountries,
|
|
104
|
-
});
|
|
105
|
-
return {
|
|
106
|
-
channelToken: token,
|
|
107
|
-
geoBlock: {
|
|
108
|
-
enabled: !!Number(r.geoBlockEnabled || 0),
|
|
109
|
-
allowedCountries: resolved.allowed,
|
|
110
|
-
blockedCountries: resolved.blocked,
|
|
111
|
-
allowedGbRegions: parseList(r.allowedGbRegions, ['ENG', 'WLS']),
|
|
112
|
-
allowedRegions,
|
|
113
|
-
},
|
|
114
|
-
companyData: {
|
|
115
|
-
showCompanyNumber: !!Number(r.showCompanyNumber || 0),
|
|
116
|
-
companyNumber: String(r.companyNumber || ''),
|
|
117
|
-
},
|
|
118
|
-
};
|
|
93
|
+
return this.buildConfig(token, row);
|
|
119
94
|
}
|
|
120
95
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
96
|
+
* Per-request decision endpoint. The storefront calls this on entry
|
|
97
|
+
* (or middleware can call it) with optional `?country=` overrides.
|
|
98
|
+
* Logs the decision so the admin stats panel shows top blocked
|
|
99
|
+
* countries.
|
|
100
|
+
*
|
|
101
|
+
* Returns 200 with `{ allowed: boolean, reason, mode }` regardless —
|
|
102
|
+
* the storefront decides whether to redirect or render a banner.
|
|
125
103
|
*/
|
|
104
|
+
async check(req, res) {
|
|
105
|
+
const headerToken = req.headers['vendure-token']
|
|
106
|
+
|| req.headers['x-vendure-token']
|
|
107
|
+
|| req.query.token
|
|
108
|
+
|| '';
|
|
109
|
+
const token = headerToken.trim();
|
|
110
|
+
if (!token)
|
|
111
|
+
return res.json({ allowed: true, reason: 'no-channel' });
|
|
112
|
+
const row = await this.loadChannelRow(token);
|
|
113
|
+
if (!row)
|
|
114
|
+
return res.json({ allowed: true, reason: 'unknown-channel' });
|
|
115
|
+
const cfg = this.buildConfig(token, row);
|
|
116
|
+
// Optional override (?country=US) for testing — non-prod only;
|
|
117
|
+
// honoured but logged at the trust level of the caller.
|
|
118
|
+
const ip = (0, proxy_headers_1.getRealIp)(req);
|
|
119
|
+
const country = req.query.country
|
|
120
|
+
|| (0, proxy_headers_1.getResolvedCountry)(req)
|
|
121
|
+
|| null;
|
|
122
|
+
const region = req.query.region
|
|
123
|
+
|| (0, proxy_headers_1.getResolvedRegion)(req)
|
|
124
|
+
|| null;
|
|
125
|
+
const opts = (0, plugin_1.getOptions)();
|
|
126
|
+
const allowlist = parseList(row.ipAllowlist || '');
|
|
127
|
+
const channelId = Number(row.id) || 1;
|
|
128
|
+
// 1. IP allowlist trumps everything else.
|
|
129
|
+
if ((0, geo_regions_1.ipMatchesAny)(ip, allowlist)) {
|
|
130
|
+
return res.json({ allowed: true, reason: 'ip-allowlist', mode: cfg.geoBlock.mode });
|
|
131
|
+
}
|
|
132
|
+
// 2. Scheduled maintenance window.
|
|
133
|
+
if (opts.maintenanceWindow && inWindow(opts.maintenanceWindow)) {
|
|
134
|
+
await this.logEvent({
|
|
135
|
+
channelId, country, region, ip,
|
|
136
|
+
ua: req.headers['user-agent'],
|
|
137
|
+
url: req.originalUrl,
|
|
138
|
+
decision: cfg.geoBlock.mode === 'soft' ? 'soft-block' : 'block',
|
|
139
|
+
reason: 'maintenance',
|
|
140
|
+
});
|
|
141
|
+
return res.json({
|
|
142
|
+
allowed: false,
|
|
143
|
+
reason: 'maintenance',
|
|
144
|
+
mode: cfg.geoBlock.mode,
|
|
145
|
+
message: cfg.geoBlock.blockMessage || 'The site is temporarily unavailable. Please try again later.',
|
|
146
|
+
redirectUrl: cfg.geoBlock.blockRedirectUrl,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
// 3. Channel rules.
|
|
150
|
+
const verdict = (0, geo_regions_1.isAllowed)(country, region, {
|
|
151
|
+
enabled: cfg.geoBlock.enabled,
|
|
152
|
+
allowedCountries: cfg.geoBlock.allowedCountries,
|
|
153
|
+
blockedCountries: cfg.geoBlock.blockedCountries,
|
|
154
|
+
allowedGbRegions: cfg.geoBlock.allowedGbRegions,
|
|
155
|
+
});
|
|
156
|
+
if (!verdict.allowed) {
|
|
157
|
+
await this.logEvent({
|
|
158
|
+
channelId, country, region, ip,
|
|
159
|
+
ua: req.headers['user-agent'],
|
|
160
|
+
url: req.originalUrl,
|
|
161
|
+
decision: cfg.geoBlock.mode === 'soft' ? 'soft-block' : 'block',
|
|
162
|
+
reason: verdict.reason,
|
|
163
|
+
});
|
|
164
|
+
return res.json({
|
|
165
|
+
allowed: false,
|
|
166
|
+
reason: verdict.reason,
|
|
167
|
+
mode: cfg.geoBlock.mode,
|
|
168
|
+
message: cfg.geoBlock.blockMessage || this.defaultMessage(verdict.reason),
|
|
169
|
+
redirectUrl: cfg.geoBlock.blockRedirectUrl,
|
|
170
|
+
logoUrl: cfg.geoBlock.blockLogoUrl,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
return res.json({ allowed: true, reason: verdict.reason, mode: cfg.geoBlock.mode });
|
|
174
|
+
}
|
|
175
|
+
/** Catalogue of available region presets — fed to the admin picker
|
|
176
|
+
* and any storefront that wants to show "we serve <X>". */
|
|
177
|
+
presets(res) {
|
|
178
|
+
return res.json({ presets: geo_regions_1.REGION_PRESETS });
|
|
179
|
+
}
|
|
126
180
|
async listChannels(ctx, res) {
|
|
127
181
|
if (!requireAdmin(ctx, res, false))
|
|
128
182
|
return;
|
|
129
183
|
const rows = await this.connection.rawConnection.query(`SELECT id, code, token,
|
|
130
184
|
COALESCE(customFieldsGeoblockenabled, 0) AS geoBlockEnabled,
|
|
185
|
+
customFieldsGeoblockmode AS geoBlockMode,
|
|
131
186
|
customFieldsGeoblockallowedregions AS allowedRegions,
|
|
132
187
|
customFieldsGeoblockallowedcountries AS extraAllowed,
|
|
133
188
|
customFieldsGeoblockblockedcountries AS blockedCountries,
|
|
134
|
-
customFieldsGeoblockallowedgbregions AS allowedGbRegions
|
|
189
|
+
customFieldsGeoblockallowedgbregions AS allowedGbRegions,
|
|
190
|
+
customFieldsGeoblockipallowlist AS ipAllowlist,
|
|
191
|
+
customFieldsGeoblockblockmessage AS blockMessage,
|
|
192
|
+
customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
|
|
193
|
+
customFieldsGeoblockblocklogourl AS blockLogoUrl
|
|
135
194
|
FROM channel
|
|
136
195
|
ORDER BY id`);
|
|
137
|
-
const parseList = (raw, fallback) => {
|
|
138
|
-
if (Array.isArray(raw))
|
|
139
|
-
return raw.filter(v => typeof v === 'string');
|
|
140
|
-
if (typeof raw !== 'string' || !raw.length)
|
|
141
|
-
return fallback;
|
|
142
|
-
try {
|
|
143
|
-
const parsed = JSON.parse(raw);
|
|
144
|
-
if (Array.isArray(parsed))
|
|
145
|
-
return parsed.filter(v => typeof v === 'string');
|
|
146
|
-
}
|
|
147
|
-
catch { }
|
|
148
|
-
return raw.split(',').map(s => s.trim()).filter(Boolean);
|
|
149
|
-
};
|
|
150
196
|
const result = rows.map((r) => {
|
|
151
|
-
const allowedRegions = parseList(r.allowedRegions
|
|
152
|
-
const extraAllowed = parseList(r.extraAllowed
|
|
153
|
-
const blockedCountries = parseList(r.blockedCountries
|
|
197
|
+
const allowedRegions = parseList(r.allowedRegions);
|
|
198
|
+
const extraAllowed = parseList(r.extraAllowed);
|
|
199
|
+
const blockedCountries = parseList(r.blockedCountries);
|
|
154
200
|
const resolved = (0, geo_regions_1.resolveAllowedCountries)({
|
|
155
201
|
regions: allowedRegions,
|
|
156
202
|
extraAllowed,
|
|
@@ -161,19 +207,20 @@ let GeoBlockController = class GeoBlockController {
|
|
|
161
207
|
code: r.code,
|
|
162
208
|
token: r.token,
|
|
163
209
|
enabled: !!Number(r.geoBlockEnabled || 0),
|
|
210
|
+
mode: (r.geoBlockMode || 'block'),
|
|
164
211
|
allowedRegions,
|
|
165
212
|
extraAllowed,
|
|
166
213
|
blockedCountries,
|
|
167
|
-
allowedGbRegions: parseList(r.allowedGbRegions
|
|
214
|
+
allowedGbRegions: parseList(r.allowedGbRegions),
|
|
215
|
+
ipAllowlist: parseList(r.ipAllowlist),
|
|
216
|
+
blockMessage: r.blockMessage || '',
|
|
217
|
+
blockRedirectUrl: r.blockRedirectUrl || '',
|
|
218
|
+
blockLogoUrl: r.blockLogoUrl || '',
|
|
168
219
|
resolved: { allowedCountries: resolved.allowed, blockedCountries: resolved.blocked },
|
|
169
220
|
};
|
|
170
221
|
});
|
|
171
222
|
return res.json({ channels: result });
|
|
172
223
|
}
|
|
173
|
-
/**
|
|
174
|
-
* Admin: save the geo-block settings for one channel. Body shape
|
|
175
|
-
* mirrors what `listChannels` returns (minus the resolved preview).
|
|
176
|
-
*/
|
|
177
224
|
async saveChannel(ctx, body, res) {
|
|
178
225
|
if (!requireAdmin(ctx, res, true))
|
|
179
226
|
return;
|
|
@@ -186,23 +233,197 @@ let GeoBlockController = class GeoBlockController {
|
|
|
186
233
|
const clean = v.filter(x => typeof x === 'string').map(x => x.trim().toUpperCase()).filter(Boolean);
|
|
187
234
|
return JSON.stringify(Array.from(new Set(clean)));
|
|
188
235
|
};
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
236
|
+
const normIpList = (v) => {
|
|
237
|
+
if (!Array.isArray(v))
|
|
238
|
+
return '[]';
|
|
239
|
+
const clean = v.filter(x => typeof x === 'string').map(x => x.trim()).filter(Boolean);
|
|
240
|
+
return JSON.stringify(Array.from(new Set(clean)));
|
|
241
|
+
};
|
|
242
|
+
const mode = body.mode === 'soft' ? 'soft' : 'block';
|
|
194
243
|
const updated = await this.connection.rawConnection.query(`UPDATE channel
|
|
195
244
|
SET customFieldsGeoblockenabled = ?,
|
|
245
|
+
customFieldsGeoblockmode = ?,
|
|
196
246
|
customFieldsGeoblockallowedregions = ?,
|
|
197
247
|
customFieldsGeoblockallowedcountries = ?,
|
|
198
248
|
customFieldsGeoblockblockedcountries = ?,
|
|
199
|
-
customFieldsGeoblockallowedgbregions =
|
|
200
|
-
|
|
201
|
-
|
|
249
|
+
customFieldsGeoblockallowedgbregions = ?,
|
|
250
|
+
customFieldsGeoblockipallowlist = ?,
|
|
251
|
+
customFieldsGeoblockblockmessage = ?,
|
|
252
|
+
customFieldsGeoblockblockredirecturl = ?,
|
|
253
|
+
customFieldsGeoblockblocklogourl = ?
|
|
254
|
+
WHERE token = ?`, [
|
|
255
|
+
body.enabled ? 1 : 0,
|
|
256
|
+
mode,
|
|
257
|
+
normList(body.allowedRegions),
|
|
258
|
+
normList(body.extraAllowed),
|
|
259
|
+
normList(body.blockedCountries),
|
|
260
|
+
normList(body.allowedGbRegions),
|
|
261
|
+
normIpList(body.ipAllowlist),
|
|
262
|
+
String(body.blockMessage || '').slice(0, 4000),
|
|
263
|
+
String(body.blockRedirectUrl || '').slice(0, 2048),
|
|
264
|
+
String(body.blockLogoUrl || '').slice(0, 2048),
|
|
265
|
+
body.token,
|
|
266
|
+
]);
|
|
267
|
+
if (!updated.affectedRows)
|
|
202
268
|
return res.status(404).json({ error: 'channel not found' });
|
|
203
|
-
}
|
|
204
269
|
return res.json({ ok: true });
|
|
205
270
|
}
|
|
271
|
+
/**
|
|
272
|
+
* Admin: top blocked countries + daily series + totals over the last
|
|
273
|
+
* N days (default 30). Fed straight into the admin Stats panel.
|
|
274
|
+
*/
|
|
275
|
+
async stats(ctx, req, res) {
|
|
276
|
+
if (!requireAdmin(ctx, res, false))
|
|
277
|
+
return;
|
|
278
|
+
const days = Math.min(Math.max(parseInt(req.query.days || '30', 10) || 30, 1), 365);
|
|
279
|
+
const channelId = req.query.channelId
|
|
280
|
+
? parseInt(String(req.query.channelId), 10) : null;
|
|
281
|
+
const where = channelId
|
|
282
|
+
? 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY) AND channelId = ?'
|
|
283
|
+
: 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY)';
|
|
284
|
+
const params = channelId ? [days, channelId] : [days];
|
|
285
|
+
const top = await this.connection.rawConnection.query(`SELECT country, COUNT(*) AS n
|
|
286
|
+
FROM geo_block_event WHERE ${where}
|
|
287
|
+
GROUP BY country ORDER BY n DESC LIMIT 20`, params);
|
|
288
|
+
const series = await this.connection.rawConnection.query(`SELECT DATE(createdAt) AS day,
|
|
289
|
+
SUM(decision='block') AS blocked,
|
|
290
|
+
SUM(decision='soft-block') AS softBlocked
|
|
291
|
+
FROM geo_block_event WHERE ${where}
|
|
292
|
+
GROUP BY DATE(createdAt) ORDER BY day`, params);
|
|
293
|
+
const totals = await this.connection.rawConnection.query(`SELECT
|
|
294
|
+
SUM(decision='block') AS blocked,
|
|
295
|
+
SUM(decision='soft-block') AS softBlocked,
|
|
296
|
+
COUNT(*) AS total,
|
|
297
|
+
COUNT(DISTINCT ip) AS uniqueIps
|
|
298
|
+
FROM geo_block_event WHERE ${where}`, params);
|
|
299
|
+
const reasons = await this.connection.rawConnection.query(`SELECT reason, COUNT(*) AS n
|
|
300
|
+
FROM geo_block_event WHERE ${where}
|
|
301
|
+
GROUP BY reason ORDER BY n DESC`, params);
|
|
302
|
+
return res.json({
|
|
303
|
+
days, channelId,
|
|
304
|
+
totals: totals[0] || {},
|
|
305
|
+
topCountries: top,
|
|
306
|
+
series, reasons,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Admin: dry-run check — "what would happen if a visitor from US
|
|
311
|
+
* with no UK region came in?". Lets the admin sanity-check their
|
|
312
|
+
* rules without standing up a proxy.
|
|
313
|
+
*/
|
|
314
|
+
async simulate(ctx, body, res) {
|
|
315
|
+
if (!requireAdmin(ctx, res, false))
|
|
316
|
+
return;
|
|
317
|
+
if (!(body === null || body === void 0 ? void 0 : body.token))
|
|
318
|
+
return res.status(400).json({ error: 'channel token required' });
|
|
319
|
+
const row = await this.loadChannelRow(body.token);
|
|
320
|
+
if (!row)
|
|
321
|
+
return res.status(404).json({ error: 'channel not found' });
|
|
322
|
+
const cfg = this.buildConfig(body.token, row);
|
|
323
|
+
const verdict = (0, geo_regions_1.isAllowed)(body.country || null, body.region || null, {
|
|
324
|
+
enabled: cfg.geoBlock.enabled,
|
|
325
|
+
allowedCountries: cfg.geoBlock.allowedCountries,
|
|
326
|
+
blockedCountries: cfg.geoBlock.blockedCountries,
|
|
327
|
+
allowedGbRegions: cfg.geoBlock.allowedGbRegions,
|
|
328
|
+
});
|
|
329
|
+
return res.json({
|
|
330
|
+
input: {
|
|
331
|
+
country: body.country || null,
|
|
332
|
+
region: body.region || null,
|
|
333
|
+
ip: body.ip || null,
|
|
334
|
+
},
|
|
335
|
+
verdict,
|
|
336
|
+
ipMatchesAllowlist: (0, geo_regions_1.ipMatchesAny)(body.ip, parseList(row.ipAllowlist || '')),
|
|
337
|
+
effectiveRules: cfg.geoBlock,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
async gc(ctx, body, res) {
|
|
341
|
+
var _a;
|
|
342
|
+
if (!requireAdmin(ctx, res, true))
|
|
343
|
+
return;
|
|
344
|
+
const olderThanDays = Math.max(1, parseInt((body === null || body === void 0 ? void 0 : body.olderThanDays) || '90', 10) || 90);
|
|
345
|
+
const result = await this.connection.rawConnection.query(`DELETE FROM geo_block_event WHERE createdAt < DATE_SUB(NOW(), INTERVAL ? DAY)`, [olderThanDays]);
|
|
346
|
+
return res.json({ deleted: (_a = result === null || result === void 0 ? void 0 : result.affectedRows) !== null && _a !== void 0 ? _a : 0, olderThanDays });
|
|
347
|
+
}
|
|
348
|
+
// -- private helpers ---------------------------------------------------
|
|
349
|
+
async loadChannelRow(token) {
|
|
350
|
+
const rows = await this.connection.rawConnection.query(`SELECT id, token,
|
|
351
|
+
customFieldsShowcompanynumber AS showCompanyNumber,
|
|
352
|
+
customFieldsBusinesscompanynumber AS companyNumber,
|
|
353
|
+
customFieldsGeoblockenabled AS geoBlockEnabled,
|
|
354
|
+
customFieldsGeoblockmode AS geoBlockMode,
|
|
355
|
+
customFieldsGeoblockallowedregions AS allowedRegions,
|
|
356
|
+
customFieldsGeoblockallowedcountries AS extraAllowed,
|
|
357
|
+
customFieldsGeoblockblockedcountries AS blockedCountries,
|
|
358
|
+
customFieldsGeoblockallowedgbregions AS allowedGbRegions,
|
|
359
|
+
customFieldsGeoblockipallowlist AS ipAllowlist,
|
|
360
|
+
customFieldsGeoblockblockmessage AS blockMessage,
|
|
361
|
+
customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
|
|
362
|
+
customFieldsGeoblockblocklogourl AS blockLogoUrl
|
|
363
|
+
FROM channel WHERE token = ? LIMIT 1`, [token]);
|
|
364
|
+
return rows[0] || null;
|
|
365
|
+
}
|
|
366
|
+
buildConfig(token, r) {
|
|
367
|
+
const allowedRegions = parseList(r.allowedRegions);
|
|
368
|
+
const extraAllowed = parseList(r.extraAllowed, ['GB']);
|
|
369
|
+
const blockedCountries = parseList(r.blockedCountries);
|
|
370
|
+
const resolved = (0, geo_regions_1.resolveAllowedCountries)({
|
|
371
|
+
regions: allowedRegions,
|
|
372
|
+
extraAllowed,
|
|
373
|
+
blocked: blockedCountries,
|
|
374
|
+
});
|
|
375
|
+
return {
|
|
376
|
+
channelToken: token,
|
|
377
|
+
geoBlock: {
|
|
378
|
+
enabled: !!Number(r.geoBlockEnabled || 0),
|
|
379
|
+
mode: (r.geoBlockMode === 'soft' ? 'soft' : 'block'),
|
|
380
|
+
allowedCountries: resolved.allowed,
|
|
381
|
+
blockedCountries: resolved.blocked,
|
|
382
|
+
allowedGbRegions: parseList(r.allowedGbRegions, ['ENG', 'WLS']),
|
|
383
|
+
allowedRegions,
|
|
384
|
+
blockMessage: String(r.blockMessage || ''),
|
|
385
|
+
blockRedirectUrl: r.blockRedirectUrl || null,
|
|
386
|
+
blockLogoUrl: r.blockLogoUrl || null,
|
|
387
|
+
},
|
|
388
|
+
companyData: {
|
|
389
|
+
showCompanyNumber: !!Number(r.showCompanyNumber || 0),
|
|
390
|
+
companyNumber: String(r.companyNumber || ''),
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
async logEvent(input) {
|
|
395
|
+
try {
|
|
396
|
+
const repo = this.connection.rawConnection.getRepository(geo_block_event_entity_1.GeoBlockEvent);
|
|
397
|
+
const row = repo.create({
|
|
398
|
+
channelId: input.channelId,
|
|
399
|
+
country: input.country ? input.country.toUpperCase().slice(0, 8) : null,
|
|
400
|
+
region: input.region ? input.region.toUpperCase().slice(0, 8) : null,
|
|
401
|
+
ip: input.ip ? input.ip.slice(0, 64) : null,
|
|
402
|
+
userAgent: input.ua ? String(input.ua).slice(0, 500) : null,
|
|
403
|
+
url: (input.url || '').slice(0, 2048),
|
|
404
|
+
decision: input.decision,
|
|
405
|
+
reason: input.reason.slice(0, 64),
|
|
406
|
+
});
|
|
407
|
+
await repo.save(row);
|
|
408
|
+
}
|
|
409
|
+
catch (e) {
|
|
410
|
+
core_1.Logger.warn(`geo-block event log failed: ${e === null || e === void 0 ? void 0 : e.message}`, loggerCtx);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
defaultMessage(reason) {
|
|
414
|
+
switch (reason) {
|
|
415
|
+
case 'denylist':
|
|
416
|
+
return 'This service is not available in your country.';
|
|
417
|
+
case 'country-not-allowed':
|
|
418
|
+
return 'This service is not available in your country.';
|
|
419
|
+
case 'uk-region-not-allowed':
|
|
420
|
+
return 'This service is only available in selected UK regions.';
|
|
421
|
+
case 'maintenance':
|
|
422
|
+
return 'The site is temporarily unavailable. Please try again later.';
|
|
423
|
+
default:
|
|
424
|
+
return 'Access denied.';
|
|
425
|
+
}
|
|
426
|
+
}
|
|
206
427
|
};
|
|
207
428
|
exports.GeoBlockController = GeoBlockController;
|
|
208
429
|
__decorate([
|
|
@@ -212,6 +433,21 @@ __decorate([
|
|
|
212
433
|
__metadata("design:paramtypes", [Object]),
|
|
213
434
|
__metadata("design:returntype", Promise)
|
|
214
435
|
], GeoBlockController.prototype, "getConfig", null);
|
|
436
|
+
__decorate([
|
|
437
|
+
(0, common_1.Get)('check'),
|
|
438
|
+
__param(0, (0, common_1.Req)()),
|
|
439
|
+
__param(1, (0, common_1.Res)()),
|
|
440
|
+
__metadata("design:type", Function),
|
|
441
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
442
|
+
__metadata("design:returntype", Promise)
|
|
443
|
+
], GeoBlockController.prototype, "check", null);
|
|
444
|
+
__decorate([
|
|
445
|
+
(0, common_1.Get)('presets'),
|
|
446
|
+
__param(0, (0, common_1.Res)()),
|
|
447
|
+
__metadata("design:type", Function),
|
|
448
|
+
__metadata("design:paramtypes", [Object]),
|
|
449
|
+
__metadata("design:returntype", void 0)
|
|
450
|
+
], GeoBlockController.prototype, "presets", null);
|
|
215
451
|
__decorate([
|
|
216
452
|
(0, common_1.Get)('admin/channels'),
|
|
217
453
|
__param(0, (0, core_1.Ctx)()),
|
|
@@ -229,8 +465,43 @@ __decorate([
|
|
|
229
465
|
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
230
466
|
__metadata("design:returntype", Promise)
|
|
231
467
|
], GeoBlockController.prototype, "saveChannel", null);
|
|
468
|
+
__decorate([
|
|
469
|
+
(0, common_1.Get)('admin/stats'),
|
|
470
|
+
__param(0, (0, core_1.Ctx)()),
|
|
471
|
+
__param(1, (0, common_1.Req)()),
|
|
472
|
+
__param(2, (0, common_1.Res)()),
|
|
473
|
+
__metadata("design:type", Function),
|
|
474
|
+
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
475
|
+
__metadata("design:returntype", Promise)
|
|
476
|
+
], GeoBlockController.prototype, "stats", null);
|
|
477
|
+
__decorate([
|
|
478
|
+
(0, common_1.Post)('admin/simulate'),
|
|
479
|
+
__param(0, (0, core_1.Ctx)()),
|
|
480
|
+
__param(1, (0, common_1.Body)()),
|
|
481
|
+
__param(2, (0, common_1.Res)()),
|
|
482
|
+
__metadata("design:type", Function),
|
|
483
|
+
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
484
|
+
__metadata("design:returntype", Promise)
|
|
485
|
+
], GeoBlockController.prototype, "simulate", null);
|
|
486
|
+
__decorate([
|
|
487
|
+
(0, common_1.Post)('admin/gc'),
|
|
488
|
+
__param(0, (0, core_1.Ctx)()),
|
|
489
|
+
__param(1, (0, common_1.Body)()),
|
|
490
|
+
__param(2, (0, common_1.Res)()),
|
|
491
|
+
__metadata("design:type", Function),
|
|
492
|
+
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
493
|
+
__metadata("design:returntype", Promise)
|
|
494
|
+
], GeoBlockController.prototype, "gc", null);
|
|
232
495
|
exports.GeoBlockController = GeoBlockController = __decorate([
|
|
233
496
|
(0, common_1.Controller)('geo-block'),
|
|
234
497
|
__metadata("design:paramtypes", [core_1.TransactionalConnection])
|
|
235
498
|
], GeoBlockController);
|
|
499
|
+
function inWindow(w) {
|
|
500
|
+
const now = Date.now();
|
|
501
|
+
const start = Date.parse(w.startsAt);
|
|
502
|
+
const end = Date.parse(w.endsAt);
|
|
503
|
+
if (!isFinite(start) || !isFinite(end))
|
|
504
|
+
return false;
|
|
505
|
+
return now >= start && now <= end;
|
|
506
|
+
}
|
|
236
507
|
//# sourceMappingURL=geo-block.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geo-block.controller.js","sourceRoot":"","sources":["../src/geo-block.controller.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"geo-block.controller.js","sourceRoot":"","sources":["../src/geo-block.controller.ts"],"names":[],"mappings":"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"}
|