Anki/ts
Damien Elmes 1a68c9f5d5
Harden access to internal API (#3925)
* Sanitize field content in editor

The editor already strips script tags from fields, but was allowing
through Javascript in things like onclick handlers. We block this now,
as the editor context has access to internal APIs that we don't want to
expose to untrusted third-party code.

* Require an auth token for API access

We were previously inspecting the referrer, but that is spoofable,
and doesn't guard against other processes on the machine.

To accomplish this, we use a request interceptor to automatically
add an auth token to webviews with the right context. Some related
changes were required:

- We avoid storing _page, which was leading to leaks & warning on exit
- At webview creation (or set_kind() invocation), we assign either
an authenticated or unauthenticated web profile.
- Some of our screens initialize the AnkiWebView when calling, e.g.,
aqt.forms.stats.Ui_Dialog(). They then immediately call .set_kind().
This reveals a race condition in our DOM handling code: the webview
initialization creates an empty page with the injected script, which
causes a domDone signal to be sent back. This signal arrives after
we've created another page with .set_kind(), causing our code to think
the DOM is ready when it's not. Then when we try to inject the dynamic
styling, we get an error, as the DOM is not ready yet. In the absence
of better solutions, I've added a hack to set_kind() to deal with this
for now.

* Provide AnkiWebPage init defaults for existing add-on callers

* Inject bridge script when profile set-up skipped

Some add-ons fully override AnkiWebPage.__init__ and thus depend on _setupBridge injecting the JS bridge script.

With this change we account for these cases, while giving add-ons the opportunity to look for solutions that do not require overriding AnkiWebPage.__init__ completely.

* Add some missed pages/endpoints (thanks to iamllama)

* Avoid sending API key for remote resources

Thanks to Abdo for the report

---------

Co-authored-by: Aristotelis P <201596065+aps-amboss@users.noreply.github.com>
2025-04-17 11:15:10 +10:00
..
editable add min-height to fields (#3922) 2025-04-15 20:24:43 +10:00
editor Harden access to internal API (#3925) 2025-04-17 11:15:10 +10:00
html-filter Reduce use of type casting (#3723) 2025-01-12 20:05:05 +11:00
icons Use tilted (filled and unfilled) sticky icons in the cards editor (#3825) 2025-02-16 22:24:11 +07:00
lib Harden access to internal API (#3925) 2025-04-17 11:15:10 +10:00
mathjax Issue 2563 - remove mhchem (#3705) 2025-01-09 22:24:39 +11:00
reviewer Reduce use of type casting (#3723) 2025-01-12 20:05:05 +11:00
routes Feat/Ignored before card count (#3910) 2025-04-15 20:21:54 +10:00
src ts/src/app.html: Changed from favicon.png to favicon.ico (#3485) 2024-10-11 22:25:58 +10:00
tools Switch to SvelteKit (#3077) 2024-03-31 09:16:31 +01:00
.gitignore Update eslint to 4.22.0 2021-04-22 19:19:39 +02:00
bundle_svelte.mjs Switch to SvelteKit (#3077) 2024-03-31 09:16:31 +01:00
bundle_ts.mjs Add env var to enable sourcemaps 2022-12-04 11:37:16 +10:00
licenses.json Harden access to internal API (#3925) 2025-04-17 11:15:10 +10:00
page.html Load page script after body created (#1802) 2022-04-19 17:16:56 +10:00
README.md add add.sh helper for adding dependency and updating licenses 2020-12-31 12:20:51 +10:00
svelte.config.js Fix import order 2024-05-17 17:11:28 +07:00
transform_ts.mjs Move away from Bazel (#2202) 2022-11-27 15:24:20 +10:00
tsconfig.json Switch to SvelteKit (#3077) 2024-03-31 09:16:31 +01:00
tsconfig_legacy.json Switch to SvelteKit (#3077) 2024-03-31 09:16:31 +01:00
vite.config.ts Update vitest and unpin vite 2024-10-26 18:41:59 +10:00
yarn.sh Fix yarn.sh failing with linked out folder 2023-03-31 13:08:59 +10:00

Anki's TypeScript and Sass dependencies. Some TS/JS code is also stored separately in ../qt/aqt/data/web/.

To update all dependencies:

./update.sh

To add a new dev dependency, use something like:

./add.sh -D @rollup/plugin-alias