@nemigo/electron 2.4.0 → 2.5.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nemigo/electron",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "private": false,
5
5
  "license": "MPL-2.0",
6
6
  "author": {
@@ -28,7 +28,7 @@
28
28
  "electron": ">=39.2.0"
29
29
  },
30
30
  "devDependencies": {
31
- "@nemigo/configs": "2.4.0",
32
- "@nemigo/helpers": "2.4.0"
31
+ "@nemigo/configs": "2.5.0",
32
+ "@nemigo/helpers": "2.5.0"
33
33
  }
34
34
  }
@@ -1,37 +0,0 @@
1
- import type { WebContents } from "electron";
2
- /**
3
- * Политика защиты навигации и управления доступом к внешним URL.
4
- * Защищает от навигационных атак, ограничивая переходы только разрешенным домены
5
- *
6
- * @see https://www.electronjs.org/docs/latest/tutorial/security#13-disable-or-limit-navigation
7
- * @see https://www.electronjs.org/docs/latest/tutorial/security#14-disable-or-limit-creation-of-new-windows
8
- */
9
- export declare class NetworkSecurity {
10
- /**
11
- * Разрешенные домены для навигации внутри приложения
12
- */
13
- allowedInternalOrigins: Set<string>;
14
- /**
15
- * Разрешенные внешние домены для открытия в системном браузере
16
- */
17
- allowedExternalOrigins: Set<string>;
18
- /**
19
- * @param [allowedInternal=[]] - Разрешенные домены для навигации внутри приложения
20
- * @param [allowedExternal=[]] - Разрешенные внешние домены для открытия в системном браузере
21
- * @param [init=true] - Инициализировать сразу обработчики событий {@link NetworkSecurity.init}
22
- */
23
- constructor(allowedInternal?: (URL | string)[], allowedExternal?: (URL | string)[], init?: boolean);
24
- /**
25
- * Инициализирует обработчики событий
26
- *
27
- * ```typescript
28
- * app.on("web-contents-created", (_, contents) => {
29
- * contents.on("will-navigate", () => ...); // __handleNavigation
30
- * contents.setWindowOpenHandler(() => ...); // __handleWindowOpen
31
- * });
32
- * ```
33
- */
34
- init(): this;
35
- __handleNavigation(contents: WebContents): void;
36
- __handleWindowOpen(contents: WebContents): void;
37
- }
package/dist/security.js DELETED
@@ -1,76 +0,0 @@
1
- /* eslint-disable no-console */
2
- // oxlint-disable no-console
3
- import { extractUrlOrigin } from "@nemigo/helpers/url";
4
- import { app, shell } from "electron";
5
- /**
6
- * Политика защиты навигации и управления доступом к внешним URL.
7
- * Защищает от навигационных атак, ограничивая переходы только разрешенным домены
8
- *
9
- * @see https://www.electronjs.org/docs/latest/tutorial/security#13-disable-or-limit-navigation
10
- * @see https://www.electronjs.org/docs/latest/tutorial/security#14-disable-or-limit-creation-of-new-windows
11
- */
12
- export class NetworkSecurity {
13
- /**
14
- * Разрешенные домены для навигации внутри приложения
15
- */
16
- allowedInternalOrigins;
17
- /**
18
- * Разрешенные внешние домены для открытия в системном браузере
19
- */
20
- allowedExternalOrigins;
21
- /**
22
- * @param [allowedInternal=[]] - Разрешенные домены для навигации внутри приложения
23
- * @param [allowedExternal=[]] - Разрешенные внешние домены для открытия в системном браузере
24
- * @param [init=true] - Инициализировать сразу обработчики событий {@link NetworkSecurity.init}
25
- */
26
- constructor(allowedInternal = [], allowedExternal = [], init = true) {
27
- this.allowedInternalOrigins = new Set(allowedInternal.map((v) => extractUrlOrigin(v)));
28
- this.allowedExternalOrigins = new Set(allowedExternal.map((v) => extractUrlOrigin(v)));
29
- if (init)
30
- this.init();
31
- }
32
- /**
33
- * Инициализирует обработчики событий
34
- *
35
- * ```typescript
36
- * app.on("web-contents-created", (_, contents) => {
37
- * contents.on("will-navigate", () => ...); // __handleNavigation
38
- * contents.setWindowOpenHandler(() => ...); // __handleWindowOpen
39
- * });
40
- * ```
41
- */
42
- init() {
43
- app.on("web-contents-created", (_, contents) => {
44
- this.__handleNavigation(contents);
45
- this.__handleWindowOpen(contents);
46
- });
47
- return this;
48
- }
49
- __handleNavigation(contents) {
50
- contents.on("will-navigate", (event, url) => {
51
- if (url.startsWith("file://"))
52
- return;
53
- const { origin } = new URL(url);
54
- if (!origin)
55
- return;
56
- if (!this.allowedInternalOrigins.has(origin)) {
57
- event.preventDefault();
58
- console.warn(`Blocked navigating to disallowed origin: ${origin}`);
59
- }
60
- });
61
- }
62
- __handleWindowOpen(contents) {
63
- contents.setWindowOpenHandler(({ url }) => {
64
- const { origin } = new URL(url);
65
- // Если URL в разрешенном списке — открываем во внешнем браузере
66
- if (this.allowedExternalOrigins.has(origin)) {
67
- shell.openExternal(url).catch(console.error);
68
- }
69
- else {
70
- console.warn(`Blocked external opening of disallowed origin: ${origin}`);
71
- }
72
- // Запрещаем создание нового окна в приложении
73
- return { action: "deny" };
74
- });
75
- }
76
- }