@huloglobal/vendure-plugin-geo-block 0.1.0 → 0.2.1
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/CHANGELOG.md +34 -0
- 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 +45 -25
- package/dist/geo-block.controller.d.ts.map +1 -1
- package/dist/geo-block.controller.js +390 -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 +27 -23
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +67 -38
- package/dist/plugin.js.map +1 -1
- package/package.json +1 -1
- package/ui/components/geo-block.component.ts +519 -253
|
@@ -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
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
64
|
+
* Public + admin endpoints for the storefront geo-block.
|
|
65
|
+
*
|
|
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
|
|
47
70
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
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,132 @@ 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
|
+
}
|
|
180
|
+
/** Admin: plugin health + update availability. Read by the admin UI
|
|
181
|
+
* banner so the operator sees when a new version is on npm. */
|
|
182
|
+
async status(ctx, res) {
|
|
183
|
+
if (!requireAdmin(ctx, res, false))
|
|
184
|
+
return;
|
|
185
|
+
const updater = plugin_1.GeoBlockPlugin.getUpdateChecker();
|
|
186
|
+
const update = updater ? updater.getStatus() : null;
|
|
187
|
+
return res.json({
|
|
188
|
+
packageName: plugin_1.GeoBlockPlugin.getPackageName(),
|
|
189
|
+
version: plugin_1.GeoBlockPlugin.getPackageVersion(),
|
|
190
|
+
update,
|
|
191
|
+
uptimeSec: Math.round(process.uptime()),
|
|
192
|
+
});
|
|
193
|
+
}
|
|
126
194
|
async listChannels(ctx, res) {
|
|
127
195
|
if (!requireAdmin(ctx, res, false))
|
|
128
196
|
return;
|
|
129
197
|
const rows = await this.connection.rawConnection.query(`SELECT id, code, token,
|
|
130
198
|
COALESCE(customFieldsGeoblockenabled, 0) AS geoBlockEnabled,
|
|
199
|
+
customFieldsGeoblockmode AS geoBlockMode,
|
|
131
200
|
customFieldsGeoblockallowedregions AS allowedRegions,
|
|
132
201
|
customFieldsGeoblockallowedcountries AS extraAllowed,
|
|
133
202
|
customFieldsGeoblockblockedcountries AS blockedCountries,
|
|
134
|
-
customFieldsGeoblockallowedgbregions AS allowedGbRegions
|
|
203
|
+
customFieldsGeoblockallowedgbregions AS allowedGbRegions,
|
|
204
|
+
customFieldsGeoblockipallowlist AS ipAllowlist,
|
|
205
|
+
customFieldsGeoblockblockmessage AS blockMessage,
|
|
206
|
+
customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
|
|
207
|
+
customFieldsGeoblockblocklogourl AS blockLogoUrl
|
|
135
208
|
FROM channel
|
|
136
209
|
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
210
|
const result = rows.map((r) => {
|
|
151
|
-
const allowedRegions = parseList(r.allowedRegions
|
|
152
|
-
const extraAllowed = parseList(r.extraAllowed
|
|
153
|
-
const blockedCountries = parseList(r.blockedCountries
|
|
211
|
+
const allowedRegions = parseList(r.allowedRegions);
|
|
212
|
+
const extraAllowed = parseList(r.extraAllowed);
|
|
213
|
+
const blockedCountries = parseList(r.blockedCountries);
|
|
154
214
|
const resolved = (0, geo_regions_1.resolveAllowedCountries)({
|
|
155
215
|
regions: allowedRegions,
|
|
156
216
|
extraAllowed,
|
|
@@ -161,19 +221,20 @@ let GeoBlockController = class GeoBlockController {
|
|
|
161
221
|
code: r.code,
|
|
162
222
|
token: r.token,
|
|
163
223
|
enabled: !!Number(r.geoBlockEnabled || 0),
|
|
224
|
+
mode: (r.geoBlockMode || 'block'),
|
|
164
225
|
allowedRegions,
|
|
165
226
|
extraAllowed,
|
|
166
227
|
blockedCountries,
|
|
167
|
-
allowedGbRegions: parseList(r.allowedGbRegions
|
|
228
|
+
allowedGbRegions: parseList(r.allowedGbRegions),
|
|
229
|
+
ipAllowlist: parseList(r.ipAllowlist),
|
|
230
|
+
blockMessage: r.blockMessage || '',
|
|
231
|
+
blockRedirectUrl: r.blockRedirectUrl || '',
|
|
232
|
+
blockLogoUrl: r.blockLogoUrl || '',
|
|
168
233
|
resolved: { allowedCountries: resolved.allowed, blockedCountries: resolved.blocked },
|
|
169
234
|
};
|
|
170
235
|
});
|
|
171
236
|
return res.json({ channels: result });
|
|
172
237
|
}
|
|
173
|
-
/**
|
|
174
|
-
* Admin: save the geo-block settings for one channel. Body shape
|
|
175
|
-
* mirrors what `listChannels` returns (minus the resolved preview).
|
|
176
|
-
*/
|
|
177
238
|
async saveChannel(ctx, body, res) {
|
|
178
239
|
if (!requireAdmin(ctx, res, true))
|
|
179
240
|
return;
|
|
@@ -186,23 +247,197 @@ let GeoBlockController = class GeoBlockController {
|
|
|
186
247
|
const clean = v.filter(x => typeof x === 'string').map(x => x.trim().toUpperCase()).filter(Boolean);
|
|
187
248
|
return JSON.stringify(Array.from(new Set(clean)));
|
|
188
249
|
};
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
250
|
+
const normIpList = (v) => {
|
|
251
|
+
if (!Array.isArray(v))
|
|
252
|
+
return '[]';
|
|
253
|
+
const clean = v.filter(x => typeof x === 'string').map(x => x.trim()).filter(Boolean);
|
|
254
|
+
return JSON.stringify(Array.from(new Set(clean)));
|
|
255
|
+
};
|
|
256
|
+
const mode = body.mode === 'soft' ? 'soft' : 'block';
|
|
194
257
|
const updated = await this.connection.rawConnection.query(`UPDATE channel
|
|
195
258
|
SET customFieldsGeoblockenabled = ?,
|
|
259
|
+
customFieldsGeoblockmode = ?,
|
|
196
260
|
customFieldsGeoblockallowedregions = ?,
|
|
197
261
|
customFieldsGeoblockallowedcountries = ?,
|
|
198
262
|
customFieldsGeoblockblockedcountries = ?,
|
|
199
|
-
customFieldsGeoblockallowedgbregions =
|
|
200
|
-
|
|
201
|
-
|
|
263
|
+
customFieldsGeoblockallowedgbregions = ?,
|
|
264
|
+
customFieldsGeoblockipallowlist = ?,
|
|
265
|
+
customFieldsGeoblockblockmessage = ?,
|
|
266
|
+
customFieldsGeoblockblockredirecturl = ?,
|
|
267
|
+
customFieldsGeoblockblocklogourl = ?
|
|
268
|
+
WHERE token = ?`, [
|
|
269
|
+
body.enabled ? 1 : 0,
|
|
270
|
+
mode,
|
|
271
|
+
normList(body.allowedRegions),
|
|
272
|
+
normList(body.extraAllowed),
|
|
273
|
+
normList(body.blockedCountries),
|
|
274
|
+
normList(body.allowedGbRegions),
|
|
275
|
+
normIpList(body.ipAllowlist),
|
|
276
|
+
String(body.blockMessage || '').slice(0, 4000),
|
|
277
|
+
String(body.blockRedirectUrl || '').slice(0, 2048),
|
|
278
|
+
String(body.blockLogoUrl || '').slice(0, 2048),
|
|
279
|
+
body.token,
|
|
280
|
+
]);
|
|
281
|
+
if (!updated.affectedRows)
|
|
202
282
|
return res.status(404).json({ error: 'channel not found' });
|
|
203
|
-
}
|
|
204
283
|
return res.json({ ok: true });
|
|
205
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Admin: top blocked countries + daily series + totals over the last
|
|
287
|
+
* N days (default 30). Fed straight into the admin Stats panel.
|
|
288
|
+
*/
|
|
289
|
+
async stats(ctx, req, res) {
|
|
290
|
+
if (!requireAdmin(ctx, res, false))
|
|
291
|
+
return;
|
|
292
|
+
const days = Math.min(Math.max(parseInt(req.query.days || '30', 10) || 30, 1), 365);
|
|
293
|
+
const channelId = req.query.channelId
|
|
294
|
+
? parseInt(String(req.query.channelId), 10) : null;
|
|
295
|
+
const where = channelId
|
|
296
|
+
? 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY) AND channelId = ?'
|
|
297
|
+
: 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY)';
|
|
298
|
+
const params = channelId ? [days, channelId] : [days];
|
|
299
|
+
const top = await this.connection.rawConnection.query(`SELECT country, COUNT(*) AS n
|
|
300
|
+
FROM geo_block_event WHERE ${where}
|
|
301
|
+
GROUP BY country ORDER BY n DESC LIMIT 20`, params);
|
|
302
|
+
const series = await this.connection.rawConnection.query(`SELECT DATE(createdAt) AS day,
|
|
303
|
+
SUM(decision='block') AS blocked,
|
|
304
|
+
SUM(decision='soft-block') AS softBlocked
|
|
305
|
+
FROM geo_block_event WHERE ${where}
|
|
306
|
+
GROUP BY DATE(createdAt) ORDER BY day`, params);
|
|
307
|
+
const totals = await this.connection.rawConnection.query(`SELECT
|
|
308
|
+
SUM(decision='block') AS blocked,
|
|
309
|
+
SUM(decision='soft-block') AS softBlocked,
|
|
310
|
+
COUNT(*) AS total,
|
|
311
|
+
COUNT(DISTINCT ip) AS uniqueIps
|
|
312
|
+
FROM geo_block_event WHERE ${where}`, params);
|
|
313
|
+
const reasons = await this.connection.rawConnection.query(`SELECT reason, COUNT(*) AS n
|
|
314
|
+
FROM geo_block_event WHERE ${where}
|
|
315
|
+
GROUP BY reason ORDER BY n DESC`, params);
|
|
316
|
+
return res.json({
|
|
317
|
+
days, channelId,
|
|
318
|
+
totals: totals[0] || {},
|
|
319
|
+
topCountries: top,
|
|
320
|
+
series, reasons,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Admin: dry-run check — "what would happen if a visitor from US
|
|
325
|
+
* with no UK region came in?". Lets the admin sanity-check their
|
|
326
|
+
* rules without standing up a proxy.
|
|
327
|
+
*/
|
|
328
|
+
async simulate(ctx, body, res) {
|
|
329
|
+
if (!requireAdmin(ctx, res, false))
|
|
330
|
+
return;
|
|
331
|
+
if (!(body === null || body === void 0 ? void 0 : body.token))
|
|
332
|
+
return res.status(400).json({ error: 'channel token required' });
|
|
333
|
+
const row = await this.loadChannelRow(body.token);
|
|
334
|
+
if (!row)
|
|
335
|
+
return res.status(404).json({ error: 'channel not found' });
|
|
336
|
+
const cfg = this.buildConfig(body.token, row);
|
|
337
|
+
const verdict = (0, geo_regions_1.isAllowed)(body.country || null, body.region || null, {
|
|
338
|
+
enabled: cfg.geoBlock.enabled,
|
|
339
|
+
allowedCountries: cfg.geoBlock.allowedCountries,
|
|
340
|
+
blockedCountries: cfg.geoBlock.blockedCountries,
|
|
341
|
+
allowedGbRegions: cfg.geoBlock.allowedGbRegions,
|
|
342
|
+
});
|
|
343
|
+
return res.json({
|
|
344
|
+
input: {
|
|
345
|
+
country: body.country || null,
|
|
346
|
+
region: body.region || null,
|
|
347
|
+
ip: body.ip || null,
|
|
348
|
+
},
|
|
349
|
+
verdict,
|
|
350
|
+
ipMatchesAllowlist: (0, geo_regions_1.ipMatchesAny)(body.ip, parseList(row.ipAllowlist || '')),
|
|
351
|
+
effectiveRules: cfg.geoBlock,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
async gc(ctx, body, res) {
|
|
355
|
+
var _a;
|
|
356
|
+
if (!requireAdmin(ctx, res, true))
|
|
357
|
+
return;
|
|
358
|
+
const olderThanDays = Math.max(1, parseInt((body === null || body === void 0 ? void 0 : body.olderThanDays) || '90', 10) || 90);
|
|
359
|
+
const result = await this.connection.rawConnection.query(`DELETE FROM geo_block_event WHERE createdAt < DATE_SUB(NOW(), INTERVAL ? DAY)`, [olderThanDays]);
|
|
360
|
+
return res.json({ deleted: (_a = result === null || result === void 0 ? void 0 : result.affectedRows) !== null && _a !== void 0 ? _a : 0, olderThanDays });
|
|
361
|
+
}
|
|
362
|
+
// -- private helpers ---------------------------------------------------
|
|
363
|
+
async loadChannelRow(token) {
|
|
364
|
+
const rows = await this.connection.rawConnection.query(`SELECT id, token,
|
|
365
|
+
customFieldsShowcompanynumber AS showCompanyNumber,
|
|
366
|
+
customFieldsBusinesscompanynumber AS companyNumber,
|
|
367
|
+
customFieldsGeoblockenabled AS geoBlockEnabled,
|
|
368
|
+
customFieldsGeoblockmode AS geoBlockMode,
|
|
369
|
+
customFieldsGeoblockallowedregions AS allowedRegions,
|
|
370
|
+
customFieldsGeoblockallowedcountries AS extraAllowed,
|
|
371
|
+
customFieldsGeoblockblockedcountries AS blockedCountries,
|
|
372
|
+
customFieldsGeoblockallowedgbregions AS allowedGbRegions,
|
|
373
|
+
customFieldsGeoblockipallowlist AS ipAllowlist,
|
|
374
|
+
customFieldsGeoblockblockmessage AS blockMessage,
|
|
375
|
+
customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
|
|
376
|
+
customFieldsGeoblockblocklogourl AS blockLogoUrl
|
|
377
|
+
FROM channel WHERE token = ? LIMIT 1`, [token]);
|
|
378
|
+
return rows[0] || null;
|
|
379
|
+
}
|
|
380
|
+
buildConfig(token, r) {
|
|
381
|
+
const allowedRegions = parseList(r.allowedRegions);
|
|
382
|
+
const extraAllowed = parseList(r.extraAllowed, ['GB']);
|
|
383
|
+
const blockedCountries = parseList(r.blockedCountries);
|
|
384
|
+
const resolved = (0, geo_regions_1.resolveAllowedCountries)({
|
|
385
|
+
regions: allowedRegions,
|
|
386
|
+
extraAllowed,
|
|
387
|
+
blocked: blockedCountries,
|
|
388
|
+
});
|
|
389
|
+
return {
|
|
390
|
+
channelToken: token,
|
|
391
|
+
geoBlock: {
|
|
392
|
+
enabled: !!Number(r.geoBlockEnabled || 0),
|
|
393
|
+
mode: (r.geoBlockMode === 'soft' ? 'soft' : 'block'),
|
|
394
|
+
allowedCountries: resolved.allowed,
|
|
395
|
+
blockedCountries: resolved.blocked,
|
|
396
|
+
allowedGbRegions: parseList(r.allowedGbRegions, ['ENG', 'WLS']),
|
|
397
|
+
allowedRegions,
|
|
398
|
+
blockMessage: String(r.blockMessage || ''),
|
|
399
|
+
blockRedirectUrl: r.blockRedirectUrl || null,
|
|
400
|
+
blockLogoUrl: r.blockLogoUrl || null,
|
|
401
|
+
},
|
|
402
|
+
companyData: {
|
|
403
|
+
showCompanyNumber: !!Number(r.showCompanyNumber || 0),
|
|
404
|
+
companyNumber: String(r.companyNumber || ''),
|
|
405
|
+
},
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
async logEvent(input) {
|
|
409
|
+
try {
|
|
410
|
+
const repo = this.connection.rawConnection.getRepository(geo_block_event_entity_1.GeoBlockEvent);
|
|
411
|
+
const row = repo.create({
|
|
412
|
+
channelId: input.channelId,
|
|
413
|
+
country: input.country ? input.country.toUpperCase().slice(0, 8) : null,
|
|
414
|
+
region: input.region ? input.region.toUpperCase().slice(0, 8) : null,
|
|
415
|
+
ip: input.ip ? input.ip.slice(0, 64) : null,
|
|
416
|
+
userAgent: input.ua ? String(input.ua).slice(0, 500) : null,
|
|
417
|
+
url: (input.url || '').slice(0, 2048),
|
|
418
|
+
decision: input.decision,
|
|
419
|
+
reason: input.reason.slice(0, 64),
|
|
420
|
+
});
|
|
421
|
+
await repo.save(row);
|
|
422
|
+
}
|
|
423
|
+
catch (e) {
|
|
424
|
+
core_1.Logger.warn(`geo-block event log failed: ${e === null || e === void 0 ? void 0 : e.message}`, loggerCtx);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
defaultMessage(reason) {
|
|
428
|
+
switch (reason) {
|
|
429
|
+
case 'denylist':
|
|
430
|
+
return 'This service is not available in your country.';
|
|
431
|
+
case 'country-not-allowed':
|
|
432
|
+
return 'This service is not available in your country.';
|
|
433
|
+
case 'uk-region-not-allowed':
|
|
434
|
+
return 'This service is only available in selected UK regions.';
|
|
435
|
+
case 'maintenance':
|
|
436
|
+
return 'The site is temporarily unavailable. Please try again later.';
|
|
437
|
+
default:
|
|
438
|
+
return 'Access denied.';
|
|
439
|
+
}
|
|
440
|
+
}
|
|
206
441
|
};
|
|
207
442
|
exports.GeoBlockController = GeoBlockController;
|
|
208
443
|
__decorate([
|
|
@@ -212,6 +447,29 @@ __decorate([
|
|
|
212
447
|
__metadata("design:paramtypes", [Object]),
|
|
213
448
|
__metadata("design:returntype", Promise)
|
|
214
449
|
], GeoBlockController.prototype, "getConfig", null);
|
|
450
|
+
__decorate([
|
|
451
|
+
(0, common_1.Get)('check'),
|
|
452
|
+
__param(0, (0, common_1.Req)()),
|
|
453
|
+
__param(1, (0, common_1.Res)()),
|
|
454
|
+
__metadata("design:type", Function),
|
|
455
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
456
|
+
__metadata("design:returntype", Promise)
|
|
457
|
+
], GeoBlockController.prototype, "check", null);
|
|
458
|
+
__decorate([
|
|
459
|
+
(0, common_1.Get)('presets'),
|
|
460
|
+
__param(0, (0, common_1.Res)()),
|
|
461
|
+
__metadata("design:type", Function),
|
|
462
|
+
__metadata("design:paramtypes", [Object]),
|
|
463
|
+
__metadata("design:returntype", void 0)
|
|
464
|
+
], GeoBlockController.prototype, "presets", null);
|
|
465
|
+
__decorate([
|
|
466
|
+
(0, common_1.Get)('status'),
|
|
467
|
+
__param(0, (0, core_1.Ctx)()),
|
|
468
|
+
__param(1, (0, common_1.Res)()),
|
|
469
|
+
__metadata("design:type", Function),
|
|
470
|
+
__metadata("design:paramtypes", [core_1.RequestContext, Object]),
|
|
471
|
+
__metadata("design:returntype", Promise)
|
|
472
|
+
], GeoBlockController.prototype, "status", null);
|
|
215
473
|
__decorate([
|
|
216
474
|
(0, common_1.Get)('admin/channels'),
|
|
217
475
|
__param(0, (0, core_1.Ctx)()),
|
|
@@ -229,8 +487,43 @@ __decorate([
|
|
|
229
487
|
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
230
488
|
__metadata("design:returntype", Promise)
|
|
231
489
|
], GeoBlockController.prototype, "saveChannel", null);
|
|
490
|
+
__decorate([
|
|
491
|
+
(0, common_1.Get)('admin/stats'),
|
|
492
|
+
__param(0, (0, core_1.Ctx)()),
|
|
493
|
+
__param(1, (0, common_1.Req)()),
|
|
494
|
+
__param(2, (0, common_1.Res)()),
|
|
495
|
+
__metadata("design:type", Function),
|
|
496
|
+
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
497
|
+
__metadata("design:returntype", Promise)
|
|
498
|
+
], GeoBlockController.prototype, "stats", null);
|
|
499
|
+
__decorate([
|
|
500
|
+
(0, common_1.Post)('admin/simulate'),
|
|
501
|
+
__param(0, (0, core_1.Ctx)()),
|
|
502
|
+
__param(1, (0, common_1.Body)()),
|
|
503
|
+
__param(2, (0, common_1.Res)()),
|
|
504
|
+
__metadata("design:type", Function),
|
|
505
|
+
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
506
|
+
__metadata("design:returntype", Promise)
|
|
507
|
+
], GeoBlockController.prototype, "simulate", null);
|
|
508
|
+
__decorate([
|
|
509
|
+
(0, common_1.Post)('admin/gc'),
|
|
510
|
+
__param(0, (0, core_1.Ctx)()),
|
|
511
|
+
__param(1, (0, common_1.Body)()),
|
|
512
|
+
__param(2, (0, common_1.Res)()),
|
|
513
|
+
__metadata("design:type", Function),
|
|
514
|
+
__metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
|
|
515
|
+
__metadata("design:returntype", Promise)
|
|
516
|
+
], GeoBlockController.prototype, "gc", null);
|
|
232
517
|
exports.GeoBlockController = GeoBlockController = __decorate([
|
|
233
518
|
(0, common_1.Controller)('geo-block'),
|
|
234
519
|
__metadata("design:paramtypes", [core_1.TransactionalConnection])
|
|
235
520
|
], GeoBlockController);
|
|
521
|
+
function inWindow(w) {
|
|
522
|
+
const now = Date.now();
|
|
523
|
+
const start = Date.parse(w.startsAt);
|
|
524
|
+
const end = Date.parse(w.endsAt);
|
|
525
|
+
if (!isFinite(start) || !isFinite(end))
|
|
526
|
+
return false;
|
|
527
|
+
return now >= start && now <= end;
|
|
528
|
+
}
|
|
236
529
|
//# 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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"}
|