An open API service indexing awesome lists of open source software.

https://github.com/foxrefire/line-firefox

LINE 3.7.0 Firefox用非公式ポート
https://github.com/foxrefire/line-firefox

Last synced: 11 months ago
JSON representation

LINE 3.7.0 Firefox用非公式ポート

Awesome Lists containing this project

README

          

# LINE Firefox用非公式ポート

## パッチ手順
### * static/js/ltsmSandbox.js

```shell
js-beautify -r ./static/js/ltsmSandbox.js
```

ファイル中の全ての`window.origin`、`window.location.origin`、`location.origin`を`"chrome-extension://ophjlpahpchlmihnnnihgmmeilfjmjjc"`に置き換え

### * manifest.json
```diff
{
//省略
//省略
"background": {
-- "service_worker": "background.js",
++ "scripts": ["background.js"],
"type": "module"
},
-- "sandbox": {
-- "pages": [
-- "ltsmSandbox.html",
-- "cropperSandbox.html"
-- ]
-- },
//省略
//省略
++ "content_security_policy": {
++ "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self';"
++ },
++ "browser_specific_settings": {
++ "gecko": {
++ "id": "LINEPorted@FoxRefire"
++ }
++ },
-- "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuOql7UFiY9pkxo4aAmuN2HHlZhNT5ws6knRdxYhOACJcm1sBfB7GIIMuBwtpYSb3B3m7jbrKqX2iDdgYLxE9ZmFjYgrD6p4D4H9/4FCz/a7h66vp0onNu2PmbZOEnpZKeCgUGMDDcXk673R8tPfkBbmuzQ0rvpc1Z8hWgHo1jLtnjpkTlH4vzu9FGRQFsCuqUzJPjoPpa2rozvTPpmiO2qfcqH3FJoGJbKwXIPZ74JI8cY//o6xFDVhugveN1VqoGZA8PsVliAa5fgBqDohfiv36xkuD88BqynKNn00hGibuXrj4L6mnR+9I68dhwAiXY01gihtI6KhbekToLfoJmwIDAQAB",
"version": "3.7.0"
}
```

### * background.js

```shell
js-beautify -r ./background.js
```

```diff
-- chrome.action.onClicked.addListener((async () => {
-- //省略
-- //省略
-- }));
++ if(chrome.windows){
++ chrome.action.onClicked.addListener(() => {
++ chrome.windows.create({
++ url: "index.html",
++ type: "popup",
++ width: 710,
++ height: 570
++ });
++ });
++ } else {
++ chrome.action.onClicked.addListener(() => {
++ chrome.tabs.create({url: "index.html"})
++ })
++ }
```

## Writeup

まず、一般的なポート手順であるマニフェスト内のbackground.service_workerをbackground.scriptsに変更しbrowser_specific_settingsの追加を行って`moz-extension://Internal-UUID/index.html`を開いてみる。
このままではWebAssembly実行でCSPエラーが発生したため更にマニフェストにcontent_security_policyを追加して再実行。
1

まだ、ltsm_not_availableというエラーが発生していたが、スタックトレースからは直接の原因箇所が明らかではなかったため、大元のエラー箇所を探ることにする
2

デバッガーからltsmSandboxを呼び出している`setup()`の`catch`内にブレークポイントを設定して、監視式に`console.log(e)`と登録してみる
3

コンソールにさらに上流のエラーと見られる`Error: sandbox_error`が記録された
4

更に`this.sandbox`をエクスポートしてみて実際に`init()`、`sendMessage()`を実行してみると`sendMessage`内で`sandbox_error`が発生していた
5

しかしスタックトレースから辿ったところこのエラーも根本原因のエラーではなく、`jp`クラス内で`r(new Op(_d.SANDBOX_ERROR))`というコードによってスローされていることが分かった。
更に根本的な原因を探るため`jp`クラスのコンストラクタ内にブレークポイントを設定し、監視式に`console.log(t.data)`を登録
6

根本原因とみられるエラー`Invalid origin: moz-extension://Internal-UUID`が確認できた
7

`ltsmSandbox.js`をjs-beautifyでインデントを整えてから開き、ファイル内で`Invalid origin`と検索してみる
コードを見ると拡張機能のオリジンに応じて使用するトークンを選択しているようだ。
`moz-extension://Internal-UUID`はトークンと対応していないため、エラーが発生していることが分かった。
8

そこで、`ltsmSandbox.js`内の全ての現在のオリジンを取得している部分の処理を本来のオリジン`"chrome-extension://ophjlpahpchlmihnnnihgmmeilfjmjjc"`に上書きしてみたところ、正しく動作するようになった。
9
10