Glitchでプロジェクトが停止された話

# 停止の通知

Glitchのstaticプロジェクトが停止されてしまった。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Glitchで<br><br>Reason for suspension: Violating Terms of Service. PBR<br><br>っていうエラーが出ちゃった。ある static プロジェクトだけこうなったんだけど、なにかマルウェアと誤解されるようなファイルを置いちゃったのかなぁ。ほぼHTMLとCSSだけしかおいてないと思うんだが。 <a href="https://t.co/ZK9FlA0iXT">pic.twitter.com/ZK9FlA0iXT</a></p>&mdash; Takashi SASAKI 佐々木隆志 (@TakashiSasaki) <a href="https://twitter.com/TakashiSasaki/status/1639434858283040768?ref_src=twsrc%5Etfw">March 25, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">サスペンドされてるプロジェクトにアクセスすると「Oops! This project isn&#39;t running」 <a href="https://t.co/9sYRbMkp3i">pic.twitter.com/9sYRbMkp3i</a></p>&mdash; Takashi SASAKI 佐々木隆志 (@TakashiSasaki) <a href="https://twitter.com/TakashiSasaki/status/1639459962043899904?ref_src=twsrc%5Etfw">March 25, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## ダッシュボードには表示

ダッシュボードには当該プロジェクトが表示されている。

![Untitled](https://tech-memo.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8e187c08-8861-43c7-b8d2-cce991209272%2FUntitled.png?id=c2c69369-cf94-4eda-a81b-9405e68290ff&table=block&spaceId=f74817d1-981d-4a9d-bf70-0ecc1d271f27&width=2000&userId=&cache=v2)

## 停止された旨のダイアログ

ダッシュボードからプロジェクトを開こうとすると This project has been suspended というダイアログが表示される。PBRというのはPaid Beta Requestsの略らしい。

![Untitled](https://tech-memo.notion.site/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F91b9edd7-9c87-43ff-aeec-619bdecbfcb5%2FUntitled.png?id=91385a2e-b439-40a3-839e-01e9e85753ec&table=block&spaceId=f74817d1-981d-4a9d-bf70-0ecc1d271f27&width=860&userId=&cache=v2)

## ダウンロードは可能

プロジェクトが停止されてもデータが削除されるわけではなく、tgzファイルとしてダウンロードさせてもらうことはできる。ただしダウンロードされてきたtgzふぁいるは実際にはtarファイルであって、gzipでは圧縮されていなかった。そのため`tar zxvf hogehoge.tgz` などとするとエラーになる。`tar xvf hogehoge.tgz`でよい。これはバグだろうと思うけど、藪蛇になってアカウントごと削除されたら困るので深く突っ込まないでおく。

# 問い合わせ結果

問い合わせのメールを送ったところ、コードの中にBase64文字列（base 64 encoding）が含まれており、それは難読化されたコード（Obfuscated Code）して解釈される。これが規約（Terms of Service）に違反しているということであった。後述するように実際のところコードのどこにもBase64で符号化した文字列は含んでいなかったのだが、`"data:text/html;base64," + btoa(text)` というコードはあった。これは単にサンプルのHTMLファイルをダウンロードしてもらうためだけのもので、難読化を意図しているわけでもないのだが、だめらしい。単に base64 っていう文字列をマッチングしてるだけじゃないのか疑惑。

> Your project was flagged by our system for containing potentially malicious code. More specifically, the base 64 encoding in localfile.html is Obfuscated Code and is against our Terms of Service. You should be able to upload these files as a new project with that piece removed.
> 
> 
> Here's a list of things that will trigger a project suspension:
> 
> This includes:
> 
> - **Obfuscated code**
> - Code relating to cryptocurrency mining
> - Code used to spam others
> - Code used for phishing
> - Code used for spying/gaining unauthorized access to websites
> - Code used to override the default downtime for free apps
> - Code that overloads our system and prevents the enjoyment of Glitch by others.
> 
> Projects that contain code used for these purposes will remain suspended.
> 

# どんなコードだったか

ウェブページにダウンロードボタンをつけたいことがある。例えばcanvasでお絵描きしてそれをPNGでダウンロードしてもらうとか。僕は localfile.html というHTMLファイルを作成して、その中に localfile.html 自身をダウンロードしてもらうボタンをつけたかった。以下はそのコード。Base64文字列は含んでいないし、どこが難読化かと思う。data URIを使用しているとかbtoa関数を使っているのがアウトなのかなぁ。

```jsx
<html>
  <head> </head>
  <body>
    <input />
    <button>Download this page</button>
    <a>Download this page</a>
    <script>
      window.addEventListener("load", (e) => {
        fetch(location.href).then((response) => {
          if (response.ok) {
            response.blob().then((blob) => {
              blob.text().then((text) => {
                console.log(response.blob());
                document.querySelector("a").href =
                  "data:text/html;base64," + btoa(text);
              });
            });
            document.querySelector("a").target = "_blank";
            document.querySelector("a").download = "localfile.html";
          } else {
            console.log("failed to download " + location.href);
          }
        }); //fetch
        setTimeout(() => {
          document.querySelector("input").value = location.href;
        }, 10);
      });
    </script>
  </body>
</html>
```

# 困ったこと

## プロジェクト名を変更できない

Glitchにはそもそもプロジェクトを削除する機能は無く、ただ「アーカイブ」することしかできない。なので同名のプロジェクトを作ろうとすると元のプロジェクトの名前を変える必要があるのだが、それはできない。

## カスタムドメインを削除できない

Glitchプロジェクトにはカスタムドメインを割り当てることができるのだが、当然ながら二つ以上のプロジェクトに同じカスタムドメインを割り当てることはできない。サスペンドされたプロジェクトは操作できないのでカスタムドメインの割り当てを解除できない。いままでGlitchのカスタムドメインで提供していたページについては、GoogleのFirebase Hostingに移行することにした。

# 関連ページ

このページはNotionで編集したものをQiitaに貼り付けて作成しています。

Notionがホストしている画像はもしかしたらうまく貼り付けられないかも。

### Notion
[Glitchでプロジェクトが停止された話](https://tech-memo.notion.site/Glitch-bdd2cba54e354105bb5d73144f8d106d)

### Qiita
[Glitchでプロジェクトが停止された話 - Qiita](https://qiita.com/TakashiSasaki/items/9536dc13672c420a2671)