Skip to content

feat: WIP! EWM-497 #882

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 104 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 103 commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
72f4990
BrowserManager
knightsforce Feb 12, 2025
f1b9b02
FaviconManager
knightsforce Feb 14, 2025
b3a1d70
HistoryManager
knightsforce Feb 14, 2025
5ca8ef5
BrowserManager
knightsforce Feb 14, 2025
e66035a
BrowserService
knightsforce Feb 15, 2025
6e7d8d4
Elementary BrowserBookmarkBottomSheet
knightsforce Feb 16, 2025
79bd483
Elementary BrowserBookmarkRenameBottomSheet
knightsforce Feb 16, 2025
a3548c1
Elementary BookmarksScreen
knightsforce Feb 16, 2025
25c25a6
Remove browser_bookmarks_bloc.dart
knightsforce Feb 16, 2025
31120ba
Remove browser_favicons_bloc.dart
knightsforce Feb 16, 2025
2f72473
Elementary HistoryScreen
knightsforce Feb 17, 2025
94c3618
Remove old import
knightsforce Feb 17, 2025
919840f
Create BrowserTabsScreen
knightsforce Feb 18, 2025
0f86c6a
Browser logic beta
knightsforce Feb 20, 2025
6bae455
Fixes
knightsforce Feb 21, 2025
2697404
feat: browser tabs (#808)
knightsforce Mar 11, 2025
3bda1a1
fix: Clear storage (#713)
knightsforce Mar 17, 2025
3afe03e
EWM-453. Clear cache assets if manifestUrl not exist (#716)
knightsforce Mar 17, 2025
2476de3
refactor: EWM-444, EWM-439 (#730)
Odrin Mar 17, 2025
5a2af41
fix: ms deployment fee; contract version check; (#786)
Odrin Mar 17, 2025
c66c0f4
fix(SPARX-CK): dont throw exception if cache is null; + improve log (…
Odrin Mar 17, 2025
cd88275
feat: update nekoton_repository to 0.56.0 and add currency decimals f…
Odrin Mar 17, 2025
ac52f09
BootstrapFailedRerunView contact us button (#743)
knightsforce Mar 17, 2025
62d8fcc
refactor: EWM-424. TokenWalletOrdinaryTransactionDetails on Elementar…
knightsforce Mar 17, 2025
f079233
refactor: EWM-421. NewAccountScreen Elementary (#737)
knightsforce Mar 17, 2025
a1a069d
chore: merge fix
Mar 17, 2025
a41e7da
refactor: simplify & unify widget model factory initialization
Mar 17, 2025
6f5867d
refactor: Ewm 446 ton wallet multisig expired transaction details pag…
knightsforce Mar 17, 2025
d10041d
refactor: update TonWalletMultisigExpiredTransactionWidget constructo…
Mar 17, 2025
a95c264
feat: Browser modals (#816)
knightsforce Mar 19, 2025
79605a0
Fix bottom navigation size
knightsforce Mar 19, 2025
abd9d8e
feat(EWM-484): add wallet V3R1/V3R2 support
Mar 19, 2025
f92622a
fix(EWM-485): add account and public key null checks in inpage provid…
Mar 19, 2025
df5f04a
Update bookmark bottomsheet
knightsforce Mar 19, 2025
1e03aa1
Remove not used code
knightsforce Mar 20, 2025
91f96a6
setClipBoardData
knightsforce Mar 20, 2025
846e0d0
fix(EWM-488): wait for network switch; refactor service import/export;
Mar 20, 2025
a3d6d3e
Merge branch 'refs/heads/predev' into feat/browser
knightsforce Mar 21, 2025
6029e8f
After merge
knightsforce Mar 21, 2025
f4cd71e
Handle App links in BrowserService
knightsforce Mar 21, 2025
2a81195
Feat/browser tab animate (#817)
knightsforce Mar 23, 2025
6d7d7f2
Browser loading favicon
knightsforce Mar 24, 2025
9dc2253
fetchFavicon -> getFavicon
knightsforce Mar 25, 2025
801b83b
Replace FaviconData on HashMap
knightsforce Mar 25, 2025
c37c736
Past nad go
knightsforce Mar 25, 2025
e7a0ab3
tooltip.svg
knightsforce Mar 25, 2025
392b656
fix: browser fixes (#831)
knightsforce Apr 1, 2025
8463470
fix: browser fixes2 (#835)
knightsforce Apr 3, 2025
c6127a3
EWM-501 fix undo (#837)
knightsforce Apr 5, 2025
6466591
Center past outside PastGoButton widget
knightsforce Apr 5, 2025
3f1fb88
BrowserManagerScreenshotHelper -> BrowserManagerScreenShooter
knightsforce Apr 5, 2025
94bdf4e
BrowserPageWidget rename WebView methods and add comments
knightsforce Apr 5, 2025
453ab23
BrowserPageScrollDelegate
knightsforce Apr 5, 2025
a0c2ced
TabMenuDelegate
knightsforce Apr 5, 2025
f6bc960
BrowserPastGoDelegate
knightsforce Apr 5, 2025
a291b62
PageSlideDelegate
knightsforce Apr 5, 2025
9d66f81
PstGoDelegate move notifier inside
knightsforce Apr 5, 2025
3c2c66a
BrowserSizesDelegate
knightsforce Apr 5, 2025
13c9e95
BrowserKeysDelegate
knightsforce Apr 5, 2025
9505ad6
MenuAnimationDelegate
knightsforce Apr 5, 2025
4c67cbc
MenuAnimationDelegate rename to BrowserMenuAnimationDelegate
knightsforce Apr 5, 2025
1950c8b
BrowserProgressIndicatorDelegate
knightsforce Apr 5, 2025
ac365d5
BrowserTabsDelegate
knightsforce Apr 5, 2025
887f33e
Browser delegate add ui interface
knightsforce Apr 5, 2025
01df710
Merge branch 'refs/heads/dev' into feat/browser
knightsforce Apr 7, 2025
d9eca64
After merge
knightsforce Apr 7, 2025
1cfe8c4
Move MessengerService into domain
knightsforce Apr 8, 2025
03528a7
Browser. Fix slideTo
knightsforce Apr 10, 2025
14fd2f4
Browser. resetVerticalScroll
knightsforce Apr 10, 2025
9a507da
Browser. Wrap search text in Flexible
knightsforce Apr 10, 2025
6ba30f3
Browser. BrowserTabsDelegate onUpdateActiveTab Future wrapper
knightsforce Apr 10, 2025
ef6884b
Browser. Update BrowserMenuBackgroundBlur for impeller
knightsforce Apr 10, 2025
0f89ee9
Browser. UrlValidator
knightsforce Apr 10, 2025
844a14e
Browser. Remove _handleUrl
knightsforce Apr 10, 2025
e0738c5
Browser. UrlValidator test
knightsforce Apr 10, 2025
6cdd68f
Browser. Move take screenshot callback to BrowserPageWidgetModel
knightsforce Apr 10, 2025
4c40c7a
Browser. DimensSizeV2.d207
knightsforce Apr 10, 2025
a5b4098
Browser. BrowserBookmarksStorageService clear use tryWrapper and log
knightsforce Apr 10, 2025
848957a
fix: Browser. Page padding (#851)
knightsforce Apr 14, 2025
e53a914
Browser. Use diff pointer for check scroll page
knightsforce Apr 14, 2025
2087577
Browser. typedef ImageCache
knightsforce Apr 15, 2025
fc7a57c
Browser. Refactor FaviconManager
knightsforce Apr 15, 2025
b64c364
Browser. HistoryManager remove sort
knightsforce Apr 15, 2025
827e8d8
Browser. PermissionsManager using ValueStream
knightsforce Apr 15, 2025
7a15a08
Merge branch 'refs/heads/dev' into feat/browser
knightsforce Apr 23, 2025
969c9fa
After merge
knightsforce Apr 23, 2025
9990c4b
fix: browser fixes (#863)
knightsforce Apr 23, 2025
ec1ba7c
fix: browser fixes menu (#866)
knightsforce Apr 24, 2025
474c3d8
Merge branch 'refs/heads/dev' into feat/browser
knightsforce Apr 28, 2025
4688fd0
fix: browser fixes 3 (#868)
knightsforce Apr 29, 2025
b4b12f6
Merge branch 'refs/heads/dev' into feat/browser
knightsforce May 1, 2025
7ec422f
Browser. After merge
knightsforce May 1, 2025
59ab7a8
EWM-497. Anti phishing logic
knightsforce May 5, 2025
20c03a4
EWM-497. BrowserPage refactor widget.some fields
knightsforce May 5, 2025
f196819
EWM-497. Ci update blacklists
knightsforce May 6, 2025
08b0d32
Merge branch 'refs/heads/dev' into EWM-497
knightsforce May 6, 2025
e9ed123
EWM-497. After analyze
knightsforce May 6, 2025
e260ac8
EWM-497. actions/upload-artifact v4
knightsforce May 6, 2025
f47d1d3
EWM-497. Flutter 3.29.3
knightsforce May 6, 2025
71b428c
EWM-497. Update fetch anti-phishing lists
knightsforce May 7, 2025
e19c49c
EWM-497. Temp Download anti-phishing file
knightsforce May 7, 2025
3dc14c3
EWM-497. Touch asset to bump timestamp
knightsforce May 7, 2025
0b737fb
EWM-497. Refresh Flutter assets manifest
knightsforce May 7, 2025
5bce71c
Merge branch 'dev' into EWM-497
Odrin May 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/configs/flutter_version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.29.2
3.29.3
50 changes: 48 additions & 2 deletions .github/workflows/app-deploy.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ on:
required: true
default: release
type: choice
options: [release, debug]
options: [ release, debug ]
flavor:
description: 'Target flavor:'
required: true
default: staging
type: choice
options: [development, staging, production]
options: [ development, staging, production ]

jobs:
setup:
Expand Down Expand Up @@ -77,6 +77,21 @@ jobs:
exit 1
fi

- name: Fetch anti-phishing lists
run: |
curl -s https://raw.githubusercontent.com/broxus/ever-wallet-anti-phishing/master/blacklist.json -o /tmp/blacklist1.json
curl -s https://raw.githubusercontent.com/MetaMask/eth-phishing-detect/refs/heads/main/src/config.json -o /tmp/config.json
mkdir -p assets/config
jq -s '(.[0] + .[1].blacklist) | unique | { blacklist: . }' \
/tmp/blacklist1.json /tmp/config.json \
> assets/config/anti_phishing.json

- name: Upload anti-phishing file
uses: actions/upload-artifact@v4
with:
name: anti-phishing-json
path: assets/config/anti_phishing.json

- name: Read Flutter version
id: read_flutter
run: echo "flutter_version=$(cat .github/configs/flutter_version)" >> $GITHUB_OUTPUT
Expand Down Expand Up @@ -155,6 +170,16 @@ jobs:
echo "ios_target is set to = ${{ env.ios_target }}"
echo "build_mode is set to = ${{ inputs.build_mode }}"

- name: Remove default anti_phishing.json
run: |
rm -f assets/config/anti_phishing.json

- name: Download anti-phishing file
uses: actions/download-artifact@v4
with:
name: anti-phishing-json
path: assets/config

- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
Expand Down Expand Up @@ -257,6 +282,27 @@ jobs:
cache: true
cache-key: flutter-:os:-:channel:-:version:-:arch:-:hash:-${{ hashFiles('**/pubspec.lock') }}

- name: Remove default anti_phishing.json
run: |
rm -f assets/config/anti_phishing.json

- name: Download anti-phishing file
uses: actions/download-artifact@v4
with:
name: anti-phishing-json
path: assets/config

- name: Refresh Flutter assets manifest
run: |
touch assets/config/anti_phishing.json
dart pub get

- name: Debug anti_phishing.json
run: |
echo "→ Content assets/config:"
ls -l assets/config
cat assets/config/anti_phishing.json

- name: Display Flutter version
run: flutter --version

Expand Down
16 changes: 16 additions & 0 deletions assets/configs/anti_phishing.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"blacklist": [
"everscan.com",
"octsubridge.io",
"octus-bridge.com",
"protocoloctusbridge.com",
"octlusbridge.com",
"bridge-octus.org",
"internal-meeting.online",
"pancake-ever.com",
"gravixguard.github.io",
"gravixguard.web.app",
"broxus.net",
"chainconnect.app"
]
}
76 changes: 76 additions & 0 deletions assets/html/anti_phishing.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>SparX Wallet Phishing Detection</title>
<style>
body {
margin: 0;
padding: 20px;
background-color: #f0f0f0;
font-family: Arial, sans-serif;
color: #333;
}
.container {
max-width: 800px;
margin: 0 auto;
background-color: #fff;
border-radius: 4px;
box-shadow: 0 2px 6px rgba(0,0,0,0.1);
padding: 24px;
}
h1 {
margin-top: 0;
font-size: 1.8rem;
}
p {
line-height: 1.6;
margin-bottom: 1em;
}
a {
color: #0066cc;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<h1>SparX Wallet Phishing Detection</h1>
<p>
This domain is currently on the SparX Wallet domain warning list. This means
that based on information available to us, SparX Wallet believes this domain
could currently compromise your security and, as an added safety feature,
SparX Wallet has restricted access to the site. To override this, please read
the rest of this warning for instructions on how to continue at your own risk.
</p>
<p>
There are many reasons sites can appear on our warning list, and our warning
list compiles from other widely used industry lists. Such reasons can include
known fraud or security risks, such as domains that test positive on the
SparX Wallet Phishing Detection. Domains on these warning lists may include
outright malicious websites and legitimate websites that have been compromised
by a malicious actor.
</p>
<p>
To read more about this site please
<a href="https://cryptoscamdb.org/search">
search for the domain on CryptoScamDB
</a>.
</p>
<p>
Note that this warning list is compiled on a voluntary basis. This list may be
inaccurate or incomplete. Just because a domain does not appear on this list is
not an implicit guarantee of that domain's safety. As always, your transactions
are your own responsibility. If you wish to interact with any domain on our
warning list, you can do so by
<a href="{PHISHING_ORIGINAL_SITE}">
continuing at your own risk
</a>.
</p>
</div>
</body>
</html>
27 changes: 14 additions & 13 deletions lib/di/di.config.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions lib/feature/browser_v2/custom_web_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,26 @@ class CustomWebViewController {
);
}

Future<void> loadData({
required String data,
String mimeType = 'text/html',
String encoding = 'utf8',
WebUri? baseUrl,
WebUri? historyUrl,
WebUri? allowingReadAccessTo,
}) {
return _safeCall(
() => _nativeController.loadData(
data: data,
mimeType: mimeType,
encoding: encoding,
baseUrl: baseUrl,
historyUrl: historyUrl,
allowingReadAccessTo: allowingReadAccessTo,
),
);
}

void loggedOut() {
_safeCall(_nativeController.loggedOut);
}
Expand Down
35 changes: 33 additions & 2 deletions lib/feature/browser_v2/domain/service/browser_service.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';

import 'package:app/app/service/app_links/app_links.dart';
import 'package:app/app/service/resources_service.dart';
import 'package:app/app/service/storage_service/general_storage_service.dart';
import 'package:app/feature/browser_v2/data/history_type.dart';
import 'package:app/feature/browser_v2/domain/service/storages/browser_bookmarks_storage_service.dart';
Expand All @@ -9,6 +10,7 @@ import 'package:app/feature/browser_v2/domain/service/storages/browser_history_s
import 'package:app/feature/browser_v2/domain/service/storages/browser_permissions_storage_service.dart';
import 'package:app/feature/browser_v2/domain/service/storages/browser_tabs_storage_service.dart';
import 'package:app/feature/browser_v2/managers/bookmarks_manager.dart';
import 'package:app/feature/browser_v2/managers/broser_anti_phishing_manager.dart';
import 'package:app/feature/browser_v2/managers/browser_auth_manager.dart';
import 'package:app/feature/browser_v2/managers/favicon_manager.dart';
import 'package:app/feature/browser_v2/managers/history_manager.dart';
Expand All @@ -30,6 +32,7 @@ class BrowserService {
this._browserPermissionsStorageService,
this._messengerService,
this._generalStorageService,
this._resourcesService,
);

final AppLinksService _appLinksService;
Expand All @@ -39,8 +42,8 @@ class BrowserService {
final BrowserTabsStorageService _browserTabsStorageService;
final BrowserPermissionsStorageService _browserPermissionsStorageService;
final GeneralStorageService _generalStorageService;

final MessengerService _messengerService;
final ResourcesService _resourcesService;

late final bookmarks = BookmarksManager(
_bookmarksStorageService,
Expand All @@ -58,6 +61,8 @@ class BrowserService {

final auth = BrowserAuthManager();

late final antiPhishing = BrowserAntiPhishingManager(_resourcesService);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А почему не через DI

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Будет. Пока еще нет. Нужно CI доделать.


StreamSubscription<BrowserAppLinksData>? _appLinksNavSubs;

BookmarksManager get bM => bookmarks;
Expand All @@ -72,11 +77,12 @@ class BrowserService {

BrowserAuthManager get aM => auth;

void init() {
Future<void> init() async {
bookmarks.init();
history.init();
tabs.init();
permissions.init();
await antiPhishing.init();
WidgetsBinding.instance.addPostFrameCallback((_) {
_appLinksNavSubs =
_appLinksService.browserLinksStream.listen(_listenAppLinks);
Expand All @@ -94,6 +100,7 @@ class BrowserService {
void dispose() {
tabs.dispose();
_appLinksNavSubs?.cancel();
antiPhishing.dispose();
}

void openUrl(Uri uri) {
Expand Down Expand Up @@ -127,6 +134,30 @@ class BrowserService {
}
}

Future<void> loadPhishingGuard(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А метод же по идее можно сделать приватным?

String path,
) async {
final html = await antiPhishing.getPhishingGuardHtml(path);
return tabs.loadDataOnActiveTab(html);
}

Future<bool> loadPhishingGuardIfNeed({
required String path,
required String host,
}) async {
final list = antiPhishing.blackList;

for (final link in list) {
if (path != link && host != link) {
continue;
}

unawaited(loadPhishingGuard(path));
return true;
}
return false;
}

void _listenAppLinks(BrowserAppLinksData event) {
openUrl(event.url);
}
Expand Down
52 changes: 52 additions & 0 deletions lib/feature/browser_v2/managers/broser_anti_phishing_manager.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import 'dart:convert';

import 'package:app/app/service/resources_service.dart';
import 'package:app/utils/json/json.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:logging/logging.dart';
import 'package:rxdart/rxdart.dart';

class BrowserAntiPhishingManager {
BrowserAntiPhishingManager(this._resourcesService);

final _blackListSubj = BehaviorSubject<List<String>>.seeded([]);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А может будем использовать Set? Тогда проверка на in будет гораздо быстрее


List<String> get blackList => _blackListSubj.value;

final ResourcesService _resourcesService;

final _log = Logger('BrowserAntiPhishingManager');

Future<void> init() {
return loadLinksJson();
}

void dispose() {
_blackListSubj.close();
}

Future<void> loadLinksJson() async {
try {
final json = await _resourcesService.loadString(
'assets/configs/anti_phishing.json',
);

final map = await compute<String, Map<String, dynamic>>(_parse, json);

_blackListSubj.add(castJsonList(map['blacklist']));
} catch (e, s) {
_log.severe('Load blacklist JSON error', e, s);
}
}

Future<String> getPhishingGuardHtml(String path) async {
final html = await rootBundle.loadString('assets/html/anti_phishing.html');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А не стоит это закешировать, чтобы в первый раз мы прочитали из файловой системы, а далее html оставался в памяти?

html.replaceFirst('{PHISHING_ORIGINAL_SITE}', path);
return html;
}

static Map<String, dynamic> _parse(String json) {
return jsonDecode(json) as Map<String, dynamic>;
}
}
Loading
Loading