Skip to content

Commit f8fbfe3

Browse files
authored
Merge pull request #106 from TONresistor/dev
Release 2.3.0
2 parents c91688f + 1b8068e commit f8fbfe3

181 files changed

Lines changed: 8263 additions & 1613 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ jobs:
140140
env:
141141
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
142142

143+
- name: Verify macOS code signature
144+
if: matrix.platform == 'mac'
145+
run: node scripts/verify-macos-signature.mjs
146+
143147
- name: Verify package artifacts
144148
run: node scripts/verify-release-artifacts.mjs ${{ matrix.platform }} ${{ matrix.goarch }}
145149

.github/workflows/ci.yml

Lines changed: 10 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ name: CI
22

33
on:
44
push:
5-
branches: [main, dev]
5+
branches:
6+
- '**'
67
pull_request:
78
branches: [main, dev]
89

@@ -94,7 +95,7 @@ jobs:
9495
run: npm audit --audit-level=high
9596

9697
# ─────────────────────────────────────────────
97-
# Notify: Telegram (push to main only)
98+
# Notify: Telegram (one summary per push, any branch)
9899
# ─────────────────────────────────────────────
99100
notify:
100101
needs: validate
@@ -123,24 +124,8 @@ jobs:
123124
NULL_SHA="0000000000000000000000000000000000000000"
124125
REPO_URL="${{ github.server_url }}/${{ github.repository }}"
125126
126-
send() {
127-
local sha=$1 title body short url TEXT
128-
title=$(git log -1 --pretty=format:'%s' "$sha")
129-
body=$(git log -1 --pretty=format:'%b' "$sha" | head -20)
130-
short=$(git rev-parse --short "$sha")
131-
url="$REPO_URL/commit/$sha"
132-
TEXT="<b>[Desktop] $title</b>"
133-
[ -n "$body" ] && printf -v TEXT '%s\n\n%s' "$TEXT" "$body"
134-
printf -v TEXT '%s\n\n<a href="%s">View commit %s</a>' "$TEXT" "$url" "$short"
135-
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
136-
-d chat_id="${TELEGRAM_CHAT_ID}" \
137-
-d parse_mode="HTML" \
138-
-d disable_web_page_preview="true" \
139-
--data-urlencode text="$TEXT"
140-
}
141-
142-
# dev: one summary notification per push (avoid per-commit spam)
143-
if [ "$BRANCH" = "dev" ]; then
127+
# One summary notification per push for every branch (avoid per-commit spam)
128+
if [ -n "$BRANCH" ]; then
144129
if [ "$BEFORE_SHA" = "$NULL_SHA" ] || ! git merge-base --is-ancestor "$BEFORE_SHA" "$AFTER_SHA" 2>/dev/null; then
145130
COUNT=$(git rev-list --count "$AFTER_SHA")
146131
RANGE="$AFTER_SHA"
@@ -152,14 +137,15 @@ jobs:
152137
fi
153138
NOUN=commits; [ "$COUNT" = "1" ] && NOUN=commit
154139
REPO_NAME=${REPO_URL##*/}
155-
TEXT="<b>[DEV] $REPO_NAME</b>"
140+
LABEL=$(printf '%s' "$BRANCH" | tr '[:lower:]' '[:upper:]')
141+
TEXT="<b>[$LABEL] $REPO_NAME</b>"
156142
if [ "$VALIDATE_RESULT" = "success" ]; then
157-
printf -v TEXT '%s\n%s %s pushed to dev' "$TEXT" "$COUNT" "$NOUN"
143+
printf -v TEXT '%s\n%s %s pushed to %s' "$TEXT" "$COUNT" "$NOUN" "$BRANCH"
158144
else
159-
printf -v TEXT '%s\nCI failed on dev (%s %s)' "$TEXT" "$COUNT" "$NOUN"
145+
printf -v TEXT '%s\nCI failed on %s (%s %s)' "$TEXT" "$BRANCH" "$COUNT" "$NOUN"
160146
fi
161147
# Commit titles (HTML-escaped), oldest first, capped to avoid huge messages.
162-
MAX=20
148+
MAX=50
163149
TITLES=$(git log --reverse --max-count="$MAX" --pretty=format:'%s' "$RANGE" \
164150
| sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g')
165151
if [ "$COUNT" -gt "$MAX" ]; then
@@ -180,24 +166,6 @@ jobs:
180166
exit 0
181167
fi
182168
183-
# main (and any other branch): per-commit notifications (unchanged)
184-
if [ "$VALIDATE_RESULT" != "success" ]; then
185-
send "$AFTER_SHA"
186-
exit 0
187-
fi
188-
189-
if [ "$BEFORE_SHA" = "$NULL_SHA" ] || ! git merge-base --is-ancestor "$BEFORE_SHA" "$AFTER_SHA" 2>/dev/null; then
190-
COMMITS=$(git log --reverse --pretty=format:'%H' --max-count=20 "$AFTER_SHA")
191-
else
192-
COMMITS=$(git log --reverse --pretty=format:'%H' "$BEFORE_SHA..$AFTER_SHA")
193-
fi
194-
195-
while IFS= read -r sha; do
196-
[ -z "$sha" ] && continue
197-
send "$sha"
198-
sleep 1
199-
done <<< "$COMMITS"
200-
201169
# ─────────────────────────────────────────────
202170
# Dependency review (PRs only)
203171
# ─────────────────────────────────────────────

README.md

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,21 @@
3333

3434
Tonnet Browser is a native desktop browser for the TON Network. It resolves `.ton`, `.t.me`, `.adnl`, `.eth` (ENS), and `.sol` (SNS) through decentralized DNS and delivers content over RLDP directly from the network.
3535

36-
All traffic goes through ADNL, either peer-to-peer or via multi-hop tunnels. A WebSocket bridge connects directly to the TON blockchain, removing any dependency on centralized APIs like TonCenter or TonAPI. Anti-fingerprinting, per-domain isolation, and built-in TON Storage are included out of the box. No telemetry, no tracking, fully open source.
36+
All traffic goes through ADNL, either peer-to-peer or via multi-hop tunnels. A WebSocket bridge connects directly to the TON blockchain, removing any dependency on centralized APIs like TonCenter or TonAPI. Anti-fingerprinting, per-domain isolation, built-in TON Storage, and optional experimental Messenger are included. No telemetry, no tracking, fully open source.
3737

3838
## Features
3939

4040
<table>
4141
<tr>
4242
<td align="center" width="200"><br><b>Browsing</b><br><br><sub>.ton .t.me .adnl<br>TON Storage Bags<br>+ more TLDs</sub><br><br></td>
43-
<td align="center" width="200"><br><b>Wallet</b><br><br><sub>W5 v5r1, send/receive<br>HTTP 402 micropayments</sub><br><br></td>
43+
<td align="center" width="200"><br><b>Wallet</b><br><br><sub>W5 v5r1, send/receive<br>Experimental HTTP 402</sub><br><br></td>
4444
<td align="center" width="200"><br><b>Privacy</b><br><br><sub>Garlic routing<br>Anti-fingerprinting<br>Per-domain isolation<br>No telemetry</sub><br><br></td>
4545
<td align="center" width="200"><br><b>Storage</b><br><br><sub>TON Storage P2P<br>File browser<br>Download & seed</sub><br><br></td>
4646
</tr>
4747
<tr>
4848
<td align="center" width="200"><br><b>Bridge</b><br><br><sub>WebSocket JSON-RPC<br>Direct to TON<br>No centralized API dependency</sub><br><br></td>
4949
<td align="center" width="200"><br><b>Security</b><br><br><sub>Process sandboxing<br>SSRF protection<br>IPC hardening<br>Encrypted history</sub><br><br></td>
50-
<td align="center" width="200"><br><b>Routing</b><br><br><sub>DHT relay discovery<br>Direct or multi-hop<br>Censorship-resistant</sub><br><br></td>
50+
<td align="center" width="200"><br><b>Messenger</b><br><br><sub>Experimental groupchat<br>DHT room discovery<br>Opt-in network</sub><br><br></td>
5151
<td align="center" width="200"><br><b>Fingerprint</b><br><br><sub>Canvas, WebGL, Audio<br>WebRTC leak blocking<br>Generic User-Agent</sub><br><br></td>
5252
</tr>
5353
</table>
@@ -56,58 +56,69 @@ All traffic goes through ADNL, either peer-to-peer or via multi-hop tunnels. A W
5656

5757
| ![Windows](https://img.shields.io/badge/Windows-0078D6?style=for-the-badge&logo=windows&logoColor=white) | ![macOS](https://img.shields.io/badge/macOS-000000?style=for-the-badge&logo=apple&logoColor=white) | ![Linux](https://img.shields.io/badge/Linux-FCC624?style=for-the-badge&logo=linux&logoColor=white) |
5858
|:---:|:---:|:---:|
59-
| [Installer](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-Setup-2.2.0.exe) | [DMG (Universal)](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.2.0-universal.dmg) | [AppImage](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.2.0.AppImage) · [.deb](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.2.0.deb) |
59+
| [Installer](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-Setup-2.3.0.exe) | [DMG (Universal)](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.3.0-universal.dmg) | [AppImage x64](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.3.0-x86_64.AppImage) · [.deb x64](https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.3.0-amd64.deb) |
6060

6161
### Windows
6262

6363
Your browser may warn that the file is from an unknown source. Click **"Keep"** to download.
6464

65-
1. Download and run **TON-Browser-Setup-2.2.0.exe**
65+
1. Download and run **TON-Browser-Setup-2.3.0.exe**
6666
2. Follow the installation prompts
6767
3. Launch **TON Browser** from the Start menu
6868

6969
**One-line install:** Open PowerShell and run:
7070

7171
```powershell
72-
irm https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-Setup-2.2.0.exe -OutFile TonBrowser.exe; Unblock-File TonBrowser.exe; .\TonBrowser.exe
72+
irm https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-Setup-2.3.0.exe -OutFile TonBrowser.exe; Unblock-File TonBrowser.exe; .\TonBrowser.exe
7373
```
7474

7575
### macOS
7676

7777
Open the `.dmg` and drag TON Browser to Applications.
7878

79+
The app is ad-hoc signed (no paid Apple Developer ID), so Gatekeeper does not
80+
trust it yet. Clear the quarantine flag once:
81+
7982
```bash
80-
# If blocked by Gatekeeper
8183
xattr -cr /Applications/TON\ Browser.app
8284
```
8385

8486
**One-line install:** Open Terminal and run:
8587

8688
```bash
87-
curl -LO https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.2.0-universal.dmg && hdiutil attach TON-Browser-2.2.0-universal.dmg && cp -R "/Volumes/TON Browser/TON Browser.app" /Applications/ && hdiutil detach "/Volumes/TON Browser" && xattr -cr /Applications/TON\ Browser.app && open /Applications/TON\ Browser.app
89+
curl -LO https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.3.0-universal.dmg && hdiutil attach TON-Browser-2.3.0-universal.dmg && cp -R "/Volumes/TON Browser/TON Browser.app" /Applications/ && hdiutil detach "/Volumes/TON Browser" && xattr -cr /Applications/TON\ Browser.app && open /Applications/TON\ Browser.app
8890
```
8991

92+
> **Still crashes on launch (Apple Silicon)?** Older builds (≤ 2.2.0) shipped
93+
> unsigned and crash immediately on M1/M2/M3. Re-sign once, then reopen:
94+
>
95+
> ```bash
96+
> codesign --force --deep --sign - /Applications/TON\ Browser.app
97+
> ```
98+
9099
### Linux
91100
92101
```bash
93102
# AppImage
94-
chmod +x TON-Browser-2.2.0.AppImage
95-
./TON-Browser-2.2.0.AppImage
103+
chmod +x TON-Browser-2.3.0-x86_64.AppImage
104+
./TON-Browser-2.3.0-x86_64.AppImage
96105
97106
# Debian/Ubuntu
98-
sudo dpkg -i TON-Browser-2.2.0.deb
107+
sudo dpkg -i TON-Browser-2.3.0-amd64.deb
99108
```
100109
101110
**One-line install:** Open Terminal and run:
102111

103112
```bash
104113
# AppImage
105-
curl -LO https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.2.0.AppImage && chmod +x TON-Browser-2.2.0.AppImage && ./TON-Browser-2.2.0.AppImage
114+
curl -LO https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.3.0-x86_64.AppImage && chmod +x TON-Browser-2.3.0-x86_64.AppImage && ./TON-Browser-2.3.0-x86_64.AppImage
106115

107116
# Debian/Ubuntu
108-
curl -LO https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.2.0.deb && sudo dpkg -i TON-Browser-2.2.0.deb
117+
curl -LO https://github.com/TONresistor/Tonnet-Browser/releases/latest/download/TON-Browser-2.3.0-amd64.deb && sudo dpkg -i TON-Browser-2.3.0-amd64.deb
109118
```
110119

120+
ARM64 Linux builds are also published as `TON-Browser-2.3.0-arm64.AppImage` and `TON-Browser-2.3.0-arm64.deb`.
121+
111122
## Building
112123

113124
### Prerequisites

build/entitlements.mac.plist

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>com.apple.security.cs.allow-jit</key>
6+
<true/>
7+
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
8+
<true/>
9+
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
10+
<true/>
11+
<key>com.apple.security.cs.disable-library-validation</key>
12+
<true/>
13+
</dict>
14+
</plist>

electron-builder.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ mac:
7171
hardenedRuntime: true
7272
gatekeeperAssess: false
7373
x64ArchFiles: "Contents/Resources/bin/*"
74+
identity: "-"
75+
entitlements: build/entitlements.mac.plist
76+
entitlementsInherit: build/entitlements.mac.plist
7477

7578
# Electron fuses are configured per-platform in scripts/afterPack.cjs
7679
# (cookieEncryption requires code signing on macOS; enabled on Linux/Windows only)

package-lock.json

Lines changed: 2 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ton-browser",
3-
"version": "2.2.0",
3+
"version": "2.3.0",
44
"description": "Browse tonsites on The Open Network, Privately.",
55
"homepage": "https://tonnet.resistance.dog",
66
"bugs": {
@@ -84,7 +84,6 @@
8484
}
8585
},
8686
"devDependencies": {
87-
"@electron-toolkit/preload": "^3.0.2",
8887
"@electron-toolkit/utils": "^4.0.0",
8988
"@electron/fuses": "^1.8.0",
9089
"@eslint/js": "^9.39.4",

resources/preload/tonsite.js

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,31 @@ var TONCONNECT_FEATURES = [
595595
var TONNET_WALLET_IMAGE =
596596
'data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBvdmVyZmxvdz0idmlzaWJsZSIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyIgdmlld0JveD0iMCAwIDIyIDE4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBpZD0iU2hhcGUiPgo8cGF0aCBkPSJNMCA1LjIzNjM2QzAgMy40MDM0NiAwIDIuNDg3MDEgMC4zMzk1MiAxLjc4Njk0QzAuNjM4MTY5IDEuMTcxMTQgMS4xMTQ3MSAwLjY3MDQ3MyAxLjcwMDg0IDAuMzU2NzA2QzIuMzY3MTkgMCAzLjIzOTQ4IDAgNC45ODQwNyAwSDE2LjA0MjVDMTcuNzg3MSAwIDE4LjY1OTQgMCAxOS4zMjU3IDAuMzU2NzA2QzE5LjkxMTggMC42NzA0NzMgMjAuMzg4NCAxLjE3MTE0IDIwLjY4NyAxLjc4Njk0QzIwLjk0NzEgMi4zMjMxNCAyMS4wMDc5IDIuOTg2MjggMjEuMDIyMiA0LjA5MDkxSDE1LjU3NTJDMTQuMTIzOCA0LjA5MDkxIDEzLjM5ODEgNC4wOTA5MSAxMi44MjU2IDQuMzQwMDNDMTIuMDYyNCA0LjY3MjE5IDExLjQ1NTkgNS4zMDkzMSAxMS4xMzk4IDYuMTExMjJDMTAuOTAyNyA2LjcxMjY1IDEwLjkwMjcgNy40NzUxIDEwLjkwMjcgOUMxMC45MDI3IDEwLjUyNDkgMTAuOTAyNyAxMS4yODczIDExLjEzOTggMTEuODg4OEMxMS40NTU5IDEyLjY5MDcgMTIuMDYyNCAxMy4zMjc4IDEyLjgyNTYgMTMuNjZDMTMuMzk4MSAxMy45MDkxIDE0LjEyMzggMTMuOTA5MSAxNS41NzUyIDEzLjkwOTFIMjEuMDIyMkMyMS4wMDc5IDE1LjAxMzcgMjAuOTQ3MSAxNS42NzY5IDIwLjY4NyAxNi4yMTMxQzIwLjM4ODQgMTYuODI4OSAxOS45MTE4IDE3LjMyOTUgMTkuMzI1NyAxNy42NDMzQzE4LjY1OTQgMTggMTcuNzg3MSAxOCAxNi4wNDI1IDE4SDQuOTg0MDdDMy4yMzk0OCAxOCAyLjM2NzE5IDE4IDEuNzAwODQgMTcuNjQzM0MxLjExNDcxIDE3LjMyOTUgMC42MzgxNjkgMTYuODI4OSAwLjMzOTUyIDE2LjIxMzFDMCAxNS41MTMgMCAxNC41OTY1IDAgMTIuNzYzNlY1LjIzNjM2WiIgZmlsbD0iIzAwOEJGRiIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTEyLjI2NTUgOC43OTU0NUMxMi4yNjU1IDcuNjQ5ODkgMTIuMjY1NSA3LjA3NzExIDEyLjQ3NzcgNi42Mzk1NkMxMi42NjQzIDYuMjU0NjkgMTIuOTYyMiA1Ljk0MTc3IDEzLjMyODUgNS43NDU2N0MxMy43NDUgNS41MjI3MyAxNC4yOTAyIDUuNTIyNzMgMTUuMzgwNSA1LjUyMjczSDE4Ljg4NUMxOS45NzUzIDUuNTIyNzMgMjAuNTIwNSA1LjUyMjczIDIwLjkzNyA1Ljc0NTY3QzIxLjMwMzMgNS45NDE3NyAyMS42MDExIDYuMjU0NjkgMjEuNzg3OCA2LjYzOTU2QzIyIDcuMDc3MTEgMjIgNy42NDk4OSAyMiA4Ljc5NTQ1VjkuMjA0NTVDMjIgMTAuMzUwMSAyMiAxMC45MjI5IDIxLjc4NzggMTEuMzYwNEMyMS42MDExIDExLjc0NTMgMjEuMzAzMyAxMi4wNTgyIDIwLjkzNyAxMi4yNTQzQzIwLjUyMDUgMTIuNDc3MyAxOS45NzUzIDEyLjQ3NzMgMTguODg1IDEyLjQ3NzNIMTUuMzgwNUMxNC4yOTAyIDEyLjQ3NzMgMTMuNzQ1IDEyLjQ3NzMgMTMuMzI4NSAxMi4yNTQzQzEyLjk2MjIgMTIuMDU4MiAxMi42NjQzIDExLjc0NTMgMTIuNDc3NyAxMS4zNjA0QzEyLjI2NTUgMTAuOTIyOSAxMi4yNjU1IDEwLjM1MDEgMTIuMjY1NSA5LjIwNDU1VjguNzk1NDVaTTE3LjEzMjcgOUMxNy4xMzI3IDkuOTAzNzQgMTYuNDM1NCAxMC42MzY0IDE1LjU3NTIgMTAuNjM2NEMxNC43MTUgMTAuNjM2NCAxNC4wMTc3IDkuOTAzNzQgMTQuMDE3NyA5QzE0LjAxNzcgOC4wOTYyNiAxNC43MTUgNy4zNjM2NCAxNS41NzUyIDcuMzYzNjRDMTYuNDM1NCA3LjM2MzY0IDE3LjEzMjcgOC4wOTYyNiAxNy4xMzI3IDlaIiBmaWxsPSIjMDA4QkZGIi8+CjwvZz4KPC9zdmc+Cg=='
597597

598+
// Bound what an untrusted page can push across the IPC boundary (mirrors the
599+
// tonBridge.send / payForXhr caps). Legit dApp payloads are far smaller.
600+
var MAX_TONCONNECT_PAYLOAD = 65536
601+
var MAX_MANIFEST_URL = 8192
602+
// Soft cap on distinct event listeners a page may register.
603+
var MAX_TONCONNECT_LISTENERS = 64
604+
605+
// A single ipcRenderer listener fans out to all page callbacks, so repeated
606+
// listen() calls can never accumulate ipcRenderer listeners (leak / MaxListeners).
607+
var tonconnectCallbacks = []
608+
var tonconnectListenerRegistered = false
609+
function ensureTonconnectListener() {
610+
if (tonconnectListenerRegistered) return
611+
tonconnectListenerRegistered = true
612+
ipcRenderer.on('tonconnect:event', function (_event, data) {
613+
for (var i = 0; i < tonconnectCallbacks.length; i++) {
614+
try {
615+
tonconnectCallbacks[i](data)
616+
} catch (e) {
617+
/* a page callback throwing must not break the fan-out */
618+
}
619+
}
620+
})
621+
}
622+
598623
contextBridge.exposeInMainWorld('tonnet', {
599624
tonconnect: {
600625
deviceInfo: {
@@ -615,6 +640,9 @@ contextBridge.exposeInMainWorld('tonnet', {
615640
protocolVersion: 2,
616641
isWalletBrowser: true,
617642
connect: function (protocolVersion, request) {
643+
if (request && typeof request.manifestUrl === 'string' && request.manifestUrl.length > MAX_MANIFEST_URL) {
644+
return Promise.reject(new Error('tonconnect: manifestUrl too large'))
645+
}
618646
return ipcRenderer.invoke('tonconnect:request', {
619647
method: 'connect',
620648
protocolVersion: protocolVersion,
@@ -625,18 +653,28 @@ contextBridge.exposeInMainWorld('tonnet', {
625653
return ipcRenderer.invoke('tonconnect:request', { method: 'restore' })
626654
},
627655
send: function (message) {
656+
if (
657+
message &&
658+
message.params &&
659+
typeof message.params[0] === 'string' &&
660+
message.params[0].length > MAX_TONCONNECT_PAYLOAD
661+
) {
662+
return Promise.reject(new Error('tonconnect: payload too large'))
663+
}
628664
return ipcRenderer.invoke('tonconnect:request', { method: 'send', message: message })
629665
},
630666
disconnect: function () {
631667
return ipcRenderer.invoke('tonconnect:request', { method: 'disconnect' })
632668
},
633669
listen: function (callback) {
634-
var listener = function (_event, data) {
635-
callback(data)
670+
if (typeof callback !== 'function' || tonconnectCallbacks.length >= MAX_TONCONNECT_LISTENERS) {
671+
return function () {}
636672
}
637-
ipcRenderer.on('tonconnect:event', listener)
673+
ensureTonconnectListener()
674+
tonconnectCallbacks.push(callback)
638675
return function () {
639-
ipcRenderer.removeListener('tonconnect:event', listener)
676+
var idx = tonconnectCallbacks.indexOf(callback)
677+
if (idx !== -1) tonconnectCallbacks.splice(idx, 1)
640678
}
641679
},
642680
},

0 commit comments

Comments
 (0)