30代SEの自由帳

最初のタイトルは頓挫した

COVID19Radarのソースを追ってみる-2日目

COVID19Radarのソースを追ってみる-2日目

1日目はこちら

引き続きCOCOA(接触確認アプリ)のベースとして使用されているOSS(オープンソースソフトウェア)である、COVID19Radarについて、処理を追ってみた。

ただ、C#の経験もFultter以外のAndroid開発の経験もなく、苦戦した挙句ざっくり理解で止めた1ので、参考程度で。

なので、同じようなことしている人がいれば即やめ。
ソースべた貼りには少し抵抗があるので、コメント付近だけ抜粋。

はじめに

COVID19Radarのライセンスの話。
私もよくわかっていないですが、COVID19RadarはMPL2.0というライセンスを適用しており、
ざっくり、OSSの使用,改変自由。ただ使用,改変したところはOSS化(ソース公開)必須。この制約はファイル単位で適用。

って感じのライセンスみたいです。

いまのCOCOAでは私が知っている範囲では、COVID19Radarへのリンクのみで、独自のソース公開は行っていないように見えるので、このライセンスに従うと↓になるはず2なんですが、実際のところはどうなんでしょうね。

  • 挙動差がない箇所を含むファイル:OSSそのままの実装(ただしVerの記載が見つからないのでいつ時点のソースか?は不明)
  • 挙動差がある箇所を含むファイル:完全独自の実装

調査対象

  • ソース(GitHub):https://github.com/Covid-19Radar/Covid19Radar
  • リビジョン:795be4a5892d9cd914fdf3113bf8ca21fa759669 5a54949ddf51dbf0db58c09d4142a31c7d663076
    ※見てるソースが新しすぎることに気づいたので一旦リリース日の6/16のソースまで戻しました。

TutorialPage1

[このアプリでできること]画面を表示。 [次へ]ボタンを押すとTutorialPage2(プライバシーについて)画面へ移動

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar\Views\Tutorial\TutorialPage1.xaml
  • 遷移先:TutorialPage2
  • COCOAとの挙動差:なさそう
  • 詳細:
// Button=ボタン
<Button
    // [次へ]ボタン
    AutomationId="NextButton"
    // ボタンが押されたら、TutorialPage2(プライバシーについて)画面へ移動
    // 次はTutorialPage2の方に移動。xmlに集約されてたからxmlへ(Covid19Radar\Covid19Radar\Covid19Radar\Views\Tutorial\TutorialPage2.xaml)
    // Commad=操作された時のアクションで、↓はTutorialPage2へ遷移(移動)って意味らしい
    Command="{prism:NavigateTo 'TutorialPage2'}"
    Style="{StaticResource DefaultButton}"
    // Text=表示されているテキスト。TutorialPage1Buttonで検索するとAppResources.ja.resxがHitするので、そこに表示される内容が定義されている。
    Text="{x:Static resources:AppResources.TutorialPage1Button}" />

TutorialPage2

[プライバシーについて]画面を表示。 [利用規約へ]ボタンを押すとTutorialPage3(利用規約)画面へ移動

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar\Views\Tutorial\TutorialPage2.xaml
  • 遷移先:TutorialPage3
  • COCOAとの挙動差:なさそう
  • 詳細: TutorialPage1と同じ読み方なので、割愛

TutorialPage3

[利用規約]画面を表示。 [規約に同意して次へ]ボタンを押すとOnClickAgree()って処理を実行 OnClickAgree()の処理内容については後述

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar\Views\Tutorial\TutorialPage3.xaml
  • 遷移先:OnClickAgree()
  • COCOAとの挙動差:なさそう
  • 詳細:
// ボタンが押されたら、OnClickAgree()を実行
// 次はOnClickAgree()の方に移動。(Covid19Radar\Covid19Radar\Covid19Radar\ViewModels\Tutorial\TutorialPage3ViewModel.cs)
// Binding Pathの場合は、OnClickAgree()って処理を実行するって意味っぽい
Command="{Binding Path=OnClickAgree}"

OnClickAgree

ユーザデータを生成/登録して、PrivacyPolicyPage(プライバシーポリシー))画面へ移動

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar\ViewModels\Tutorial\TutorialPage3ViewModel.cs
  • 遷移先:RegisterUserAsync,PrivacyPolicyPage
  • COCOAとの挙動差:なさそう
  • 詳細:

    • UserDialogs.Instance.ShowLoading()=ロードダイアグ(くるくる回るやつ)を表示。
    • 分岐系は以下
    • userDataService.RegisterUserAsync()=ユーザデータの作成。詳細は後述
    • UserDialogs.Instance.HideLoading()=ロードダイアグを消去
    • userData.IsOptined = true; = ユーザデータの登録状態をON
    • await userDataService.SetAsync(userData); = ユーザデータをアプリに保存
    • NavigationService.NavigateAsync()=画面遷移っぽい。PrivacyPolicyPageが指定されているので、次はPrivacyPolicyPageへ移動
// ユーザデータが登録されているか?
if (!userDataService.IsExistUserData){
    // ユーザデータが登録されていない場合
}
// ユーザデータの構築に成功したか?
if (userData == null){
    // 構築に失敗した場合
    ~~~省略~~~
    // return=処理の終わり。なのでこれより↓に書いてる処理は実行しない。つまりは画面遷移もしない。
    return;
}

RegisterUserAsync

PostRegisterUserAsync()を呼び出してユーザデータを作成。

作成に成功したら、ユーザーデータをアプリに保存。

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar\Services\HttpDataService.cs
  • 遷移先:PostRegisterUserAsync
  • COCOAとの挙動差:なさそう
  • 詳細: 単純だったので割愛

PostRegisterUserAsync

RegisterAPIの結果をユーザデータとして保持。

その際に作られた証明書的なやつをアプリに保存。

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar\Services\UserDataService.cs
  • 遷移先:なし(遷移元に戻る)
  • COCOAとの挙動差:なさそう
  • 詳細:
    • PostAsync()=APIを使う命令っぽい。この前に実施している処理でAPIの種類とサーバーを指定してる
    • DeserializeFromJson()=ここの処理でAPIの結果(メモリの羅列)をプログラムで扱える形に加工している
    • UserDataModel userData = new UserDataModel();= ユーザデータ用の入れ物を用意
    • たぶん各メンバはそれぞれ以下
      • Secret = 鍵の証明書的なやつ?
      • UserUuid = 鍵的なやつ。ここで発行されている鍵はgoogleAPIが発行する鍵とは別もので、端末に割り当てられる鍵っぽい。
        googleAPIのとは違って1回限りの発行なので、やろうと思えば端末を追えちゃう。。
        Issues(問題提起)にも話題が上がってるので廃止されるかも。
        ただ、目的としてはサーバー上の情報に対して削除なり、陽性登録なりの要求を出す際のなりすまし防止っぽいので、本当に廃止できるかは微妙3
      • JumpConsistentSeed = 通し番号?なぞ。使用してるところが見つからない。
      • IsOptined = ユーザデータの登録状態。true=ON。false=OFF。
    • Application.Current.Properties=この後に実行しているSavePropertiesAsync()とセットで、アプリへのデータ保存。ここでは[Secret]を保存している。

今日のまとめ

まぁ考えてみたら当然の話なんだけど、そりゃリリース6/16なんだから今のソース持ってきたらダメですよね。。

当初コンセプトをどれだけ満たせてるは分からないけど、引き続き継続。

続きはこちら


  1. 開発環境でもインストールしてデバッグしながら、とかならもう少し理解できたんだと思うけど、開発環境入れるだけで力尽きそうだったので諦めた。。

  2. 私の解釈間違いの可能性も否定は出来ない。

  3. 個人的には削除要求=14日で消えるから、即時消す必要はないかな。陽性登録=処理番号が役割担ってる気がするけど、どうなんだろ。難しい話はわからんとです。