protego safe z milionem pobrań

ProteGO Safe – programista analizuje kontrowersyjną aplikację

8 minut czytania
Komentarze

Cześć. Od pewnego czasu jest dość głośno o aplikacji ProteGO Safe. Jako że program ma otwarty kod źródłowy, a Android jest mi dość bliski, stwierdziłem, że go przeanalizuję. Z góry zaznaczam, że będzie to analiza jedynie części androidowej, bez zagłębiania się w logikę wykonywaną na zewnętrznych serwerach. Nie chciałbym tutaj również wchodzić w kontrowersje natury prawno-politycznej. Po prostu zobaczcie, jak programista odbiera kod źródłowy ProteGO Safe.

ProteGO Safe – pierwsze wrażenia od strony programisty

lenovo zwrot na konto

Po otwarciu projektu zaskoczyło mnie zastosowanie Clean Architecture oraz Model View ViewModel. Serio, patrząc na kod nie czuć, że to aplikacja rządowa. Porównajcie to sobie na przykład ze słynnym kodem PKP:

function isZaznaczonoWieleZnizek_WybranoKlopotliwaZnizke() {

              var znizka_arr = ["kod_znizki", "kod_znizki_2", "kod_znizki_3"];                    
              var liczba_n = parseInt($("#liczba_n").val());              

              var DOMYSLNA_WARTOSC_VAL = 1;
              var WIELE_ZNIZEK_VAL = 2;

              var klopotliwe_znizki_arr = [KLOPOTLIWE_ZNIZKI.KOMBATANCI, KLOPOTLIWE_ZNIZKI.WETERANI, KLOPOTLIWE_ZNIZKI.CYWILNA_OFIARA];

              var ilosc_wybranych_znizek = 0;
              var isWybranoKlopotliwaZnizka = false;

              $.each(znizka_arr, function(index, elem) {

                  var wybrana_znizka = parseInt($("#" + elem).find(":selected").val());                  
                  if(klopotliwe_znizki_arr.indexOf(wybrana_znizka) > -1 ) {
                      isWybranoKlopotliwaZnizka = true;
                  }                        

                  if(wybrana_znizka > DOMYSLNA_WARTOSC_VAL ) {                            
                      ilosc_wybranych_znizek++;
                  }

              });

              if(isWybranoKlopotliwaZnizka && (ilosc_wybranych_znizek >= WIELE_ZNIZEK_VAL || liczba_n > 0)) {                        

                  var poc_kategoria_odc_1 = parseInt($("#train_category_1").val());
                  var poc_kategoria_odc_2 = parseInt($("#train_category_2").val());
                  var klasa_wagonu = parseInt($("#klasa_wagonu").val());

                  if((isPociagKat_TLK_IC(poc_kategoria_odc_1) && isPociagKat_EIP_EIC(poc_kategoria_odc_2) && klasa_wagonu == KLASA.PIERWSZA) 
                          || (isPociagKat_EIP_EIC(poc_kategoria_odc_1) && isPociagKat_TLK_IC(poc_kategoria_odc_2) && klasa_wagonu == KLASA.DRUGA)) {                          
                      return true;
                  }                        
              }

              return false;

          }

Kolejnym zaskoczeniem była dość jasna jak na standardy państwowe dokumentacja. Można się z niej dowiedzieć o celu oraz sposobie działania aplikacji.

Następną niespodzianką było to, że kod został napisany zgodnie z najnowszymi standardami. Mamy tu między innymi Kotlina, Koin (framework do wstrzykiwania zależności) czy Android Navigation component. Jedyne, do czego można się przyczepić, to używanie RxJavy, podczas analizy nie znalazłem tutaj jakiś mega skomplikowanych operacji wielowątkowych, które byłyby praktycznie niemożliwe bez RxJavy. W takich przypadkach obecnie raczej korzysta się z Kotlin Coroutine wraz z Channels. Twórców aplikacji może jednak usprawiedliwiać fakt, że OpenTrace używa RxJavy i prawdopodobnie nie chcieli tracić czasu na obudowywanie kodu w rozwiązania znane z Kotlina.

Czego nie dowiemy się ze strony gov.pl o ProteGO Safe?

Zarówno w artykule znajdującym się na domenie gov.pl, jak i opisie aplikacji w Google Play brakuje moim zdaniem dość istotnej informacji. Programiści pracujący dla Ministerstwa nie stworzyli od podstaw jakiegoś zaawansowanego mechanizmu, śledzącego wasze kontakty. W celu badania kontaktów pomiędzy urządzeniami z Bluetooth użyli otwartoźródłowej biblioteki o nazwie Opentrace. Jest to ta sama biblioteka, której bazuje TraceTogether – aplikacja wdrożona przez Singapur w celu przeciwdziałaniu rozwoju epidemii COVID-19.

Według mnie jest to bardzo istotna informacja, ponieważ wiemy, że mamy do czynienia z czymś sprawdzonym, co zostało już zweryfikowane przez programistów z całego świata. Nie mam pojęcia, dlaczego nie ma tej informacji w oficjalnych opisach. Jedyna wzmianka w tym temacie znajduje się w dokumentacji na githubie – miejscu nieodwiedzanym zbyt chętnie przez ludzi niezwiązanych z programowaniem.

ProteGO Safe korzysta z rozwiązań OpenTrace wdrożonych z sukcesem w Singapurze.

Fragment oficjalnej dokumentacji, źródło: https://github.com/ProteGO-Safe/specs

Co zawiera aplikacja ProteGO Safe?

W tym akapicie jako słowo aplikacja należy rozumieć wyłącznie część napisaną przez programistów pracujących dla ministerstwa, bez modułu Opentrace. Jeśli chodzi o część androidową, to jest ona dość lekka. Najlepiej widać to na podstawie liczby widoków:

Pliki widoków aplikacji ProteGO Safe

Pomijając tu dialogi, mamy jedynie dwa pełnoprawne ekrany: activity_main oraz fragment_home. Po przyjrzeniu się activity_main widzimy, że jest to tylko kontener, wyświetlający fragment_home. Tak więc ostatecznie w aplikacji mamy tylko jeden ekran.

Zawartość pliku activity_main.xml

Jeśli ktoś z was używał już ProteGO Safe, to pewnie zastanawiacie się, jak to możliwe, że w aplikacji znajduje się tylko jeden ekran, skoro sam samouczek składa się z kilku.

Cała magia kryje się wewnątrz fragment_home:

Zawartość pliku fragment_home.xml

A więc fragment_home to tak naprawdę kolejny kontener, wyświetlający stronę internetową za pomocą komponentu WebView.

Gdzie znajduje się więc zawartość ProteGO Safe?

Ekrany aplikacji ProteGO Safe

Tak jak wspomniałem we wcześniejszym akapicie, aplikacja po starcie wyświetla stronę internetową. Chociaż strona internetowa to mało powiedziane – jest to pełnoprawna aplikacja webowa. Możecie sami się o tym przekonać, odwiedzając stronę safesafe.app. To właśnie ten adres jest wczytywany po starcie aplikacji. Spójrzcie na poniższe zrzuty ekranu i sami oceńcie, czy nie kłamię.

Takie podejście to nie jest nic nowego. Prawdopodobnie twórcy zdecydowali się na takie rozwiązanie, żeby nie musieć dublować pracy potrzebnej do opracowania aplikacji zarówno na platformę Android, jak i iOS.

W jaki sposób ProteGO Safe śledzi użytkowników?

Śledzenie kontaktów między urządzeniami jest jednym z najbardziej kontrowersyjnych tematów dotyczących tej aplikacji. We wcześniejszym akapicie pokazałem, że program ten wyświetla jedynie stronę internetową. Jednak śledzenie przez Bluetooth jest tematem zbyt mocno związanym z systemem mobilnym, żeby mógł być realizowany przez stronę internetową.

Zagadnieniem śledzenia kontaktów w całości zajmuje się wspomniana wcześniej biblioteka OpenTrace, czyli implementacja protokołu o nazwie BlueTrace. Protokół ten jest bardzo dobrze opisany i przetestowany w praktyce. Zachęcam do przeczytania ich whitepaperu.

Dla osób ceniących sobie swój czas załączam tl;dr działania protokołu

  1. Aplikacja łączy się z serwerem w celu pobrania kilkudziesięciu (jest to ustawiane w pliku konfiguracyjnym) tymczasowych identyfikatorów urządzenia. Są one generowane na podstawie tokena, umożliwiającego odbiór powiadomień push. Identyfikatory te zmieniają się co pewien okres (również ustawiany w pliku konfiguracyjnym).
  2. Przy użyciu serwisu działającego w tle, OpenTrace skanuje w poszukiwaniu urządzeń z uruchomionym Bluetooth.
  3. Jeśli oba urządzenia mają uruchomioną aplikację ProteGO Safe, to wymieniają się swoim aktualnym identyfikatorem
  4. Informacje o każdym odnotowanym kontakcie są przechowywane w wewnętrznej bazie danych. Po pewnym czasie (domyślnie jest to 21 dni) dane te są kasowane.
  5. Jeśli u użytkownika aplikacji zostanie wykryta infekcja COVID-19, to jest on pytany, czy chciałby podzielić się swoją historią kontaktów.
  6. Po wysłaniu historii kontaktów każdy z tymczasowych identyfikatorów, z którym kontaktował się zarażony, jest dekodowany na token do wiadomości push.
  7. Następuje weryfikacja, które z osób będących w naszym otoczeniu mogło się od nas zarazić
  8. Do osób narażonych na zarażenie, zostaje wysłane powiadomienie push

Gdzie ProteGO Safe przechowuje nasze dane?

programista android

Jest to kolejna kwestia budząca sporo kontrowersji. Jeśli chodzi o dane dotyczące urządzeń, z którymi się kontaktowaliśmy, sprawa jest prosta. Są one przechowywane w wewnętrznej bazie danych do czasu, aż sami nie wyrazimy zgody na ich wysłanie. Sprawa nieco się komplikuje, jeśli chodzi o dane wprowadzane w formularzu, znajdującym się pod adresem safesafe.app.

O ile mogę ze 100% pewnością potwierdzić, że aplikacja przechowuje dane w lokalnej pamięci przeglądarki (możecie to sprawdzić sami, otwierając w Chrome opcje developerskie – Ctrl + Shift + C, następnie klikając na zakładkę Application i wybierając Local Storage w menu po lewej). O tyle nie jestem w stanie potwierdzić, że to jedyne miejsce, w którym te dane są przechowywane i właśnie to budzi największe kontrowersje. Warto poczytać zgłoszone problemy na githubie. Polecam szczególnie te, które zostały zamknięte.

Oczywiście są to tylko wątpliwości internautów oraz zewnętrznych obserwatorów, ponieważ zarówno twórcy aplikacji jak i przedstawiciele ministerstwa podkreślają, że wszystkie nasze dane są przechowywane wyłącznie na urządzeniu.

Dane z witryny safesafe.app zapisane w pamięci przeglądarki

ProteGO Safe oczami programisty – ocena projektu

Tak jak wspominałem w pierwszym akapicie, aplikacja jest napisana świetnie, jeśli weźmiemy pod uwagę standardy innych aplikacji rządowych. Są tam wykorzystywane popularne biblioteki, świetna architektura oraz w miarę czytelny styl pisania.

Jednak jest kilka rzeczy, które wymagają poprawy. Moje największe wątpliwości budzi fakt, że biblioteka OpenTrace została wrzucona w całości, nie patrząc, czy wszystkie elementy są wykorzystywane przez ProteGO Safe. Jest to trochę leniwe podejście, zwiększające niepotrzebnie rozmiar aplikacji. Zgłosiłem tę uwagę twórcom i mam nadzieję, że się do tego odniosą.

Kolejną sprawą, która rzuciła mi się w oczy, jest zbyt wiele operacji wykonywanych przez HomeFragment oraz MainActivity. Jest tam kilka rzeczy, które powinny być wykonywane w widoku modelu.

Zobacz też: Ministerstwo cyfryzacji zapewnia, że ProteGO Safe jest bezpieczną aplikacją.

W tym artykule nie chciałem wchodzić zbyt mocno w kontrowersje natury politycznej lub prawnej. Chciałem Wam przedstawić jak najbardziej obiektywnie zawartość androidowej wersji ProteGO Safe. Z tych względów nie będę też robił podsumowania, czy aplikacja jest dobra. Tym bardziej nie powiem, czy warto ją instalować. Ocenę pozostawiam każdemu z Was.

Do zobaczenia, widzimy się w kolejnym odcinku! W międzyczasie tradycyjnie zajrzyjcie do poprzednich publikacji z serii Programowanie, a także odwiedźcie dedykowany programistom dział na forum. Jeśli rozwijacie aplikację na Androida, koniecznie zapoznajcie się z tekstami Tomasza na temat HMS.

Motyw