Firefox SendでもSafariはストリームでダウンロードするのは対応できてない
#JavaScript #ブラウザのJavaScript #Firefox_Send
Firefox SendもSafariだとストリーミングしながらのダウンロードができない
Web上でPiping Server経由のエンドツーエンド暗号化したファイル転送でReadableStreamをストリーミングしながらダウンロードする必要があるが、Safariは未対応。ストリーミングしながらのダウンロードを実現するのにStreamSaver.jsを使っている。だがStreamSaver.js自体がSafari未対応なので、必然的に未対応になる。
Firefox Sendではどうやってストリーミングしながら、ダウンロードしているか調べてみると、未対応だった。
対応するコード
以下でブラウザがSafariだと{streamDownload: false}になる。
{streamDownload: false}だと以下のifにマッチして、
以下のUIが表示される。
実際の画面では以下のように警告「This browser might not be able to decrypt a file this big」というふうに出る。
https://gyazo.com/f70e6bdb301aecc62a2e6adf0711fc14
ストリーミングしながらダウンロードできないため、全部をブラウザメモリ上にのぜてデータを読み切る必要がでる。そのため、「大きくて復号できない」という警告が出る。
メモリ上に載せてダウンロードする楷書はここだと思われる。
以下のif (options.stream)にマッチしないため、this.downloadBlob()が実行され、ファイルをBlob URLなどにして保存するようになっていると思う。
iOS版のGoogle Chromeでも使えない
なぜ、Safariで使えないことが深刻なのか?少し憶測も混じっているが、「Safariで使えないと、すべてのiOS上のブラウザで使えない」はず(憶測だが、ほぼ同じフレームワークをmacOSでもiOSでも使っていると思うでこう推測している)。
詳細:iOSアプリのGoogle Chromeは、V8もないし普通のChromeじゃないぽい
以下のようにiOSのブラウザはiOS WebKitを使うことを強制している。
Apps that browse the web must use the iOS WebKit framework and WebKit Javascript
(引用: )
そのため、似たような仕組みで動いているデスクトップSafariが動かないと、iOS上の全ブラウザで対応できない。そのため、iOSユーザーも多いしとても致命的。
iPad版のGoogle Chromeでも同様に以下のようになる。iPhoneでも同様のはず。
https://gyazo.com/6ad0989813ec8cd37cd1819322b55d26
そもそもストリーミングしながらダウンロードする必要性は?
大きいファイルでも、エンドツーエンドで暗号化するため。
エンドツーエンドで暗号する目的は、HTTPSでサーバーを暗号化通信するだけよりもセキュリティは向上する。
以下のような場合に、クライアント・サーバー間の暗号化だけではデータがリークする可能性がある。
サーバーが信用できない
サーバーが第三者からクラックされている
サーバーに脆弱性がある
大きいファイルをエンドツーエンドで暗号化するためには、ファイル全部をメモリ上においてから暗号化するよりも、
逐次チャンクごとを暗号化して行くほうが、メモリ的にも時間的にも効率が良い。そのため、ストリーミングする必要がある。復号も同様の理由で、ファイル全部をメモリに置いてから、復号するのはメモリ的にも時間的にも効率が悪い。
誤解を招きやすい点
注意すべきことは、Safariでもストリーミングしながら、暗号化・復号は行える。
できないことは、ストリーミングしながらのダウンロード(ただのURLからダウンロードではなく任意のReadableStreamからなどのダウンロード)。
ストリーミングしながら復号できても、保存できないと、無駄に計算資源を使って、捨てるだけになってしまう。(画像だったらCanvasに表示とかはできるかも)とりあえず、サイズに縛られず任意のデータ形式を保存する仕組みがほしい。