├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug-report.md │ └── release-qa-check-list.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ └── validate.yml ├── .gitignore ├── .tx └── config ├── ChangeLog.md ├── Gemfile ├── LICENSE ├── NOTICE ├── OONIProbeUITests ├── Info.plist ├── OONIProbeUITests-Bridging-Header.h ├── OONIProbeUITests.swift └── OoniRunViewUITests.swift ├── OONIProbeUnitTests ├── APITest.m ├── Info.plist ├── MakeTimeoutTest.m ├── NetworkTest.m ├── ResultTest.m ├── TestKeysTest.m └── WebConnectivityTest.m ├── Podfile ├── Podfile.lock ├── README.md ├── assets ├── OONIProbeLogo.png ├── app-store-badge.png └── play-store-badge.png ├── fastlane ├── Appfile ├── Deliverfile ├── Fastfile ├── Preview.html ├── README.md ├── Snapfile ├── SnapshotHelper.swift ├── report.xml └── screenshots │ ├── Framefile.json │ ├── README.txt │ ├── background.jpg │ ├── fonts │ ├── FiraSans-Bold.otf │ └── FiraSans-Regular.otf │ └── gen_ipad.sh ├── fixtures └── OONIProbe.db ├── ooniprobe.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── libight_ios.xccheckout ├── xcshareddata │ └── xcschemes │ │ ├── OONIProbeUITests.xcscheme │ │ ├── OONIProbeUnitTests.xcscheme │ │ └── ooniprobe.xcscheme └── xcuserdata │ └── lorenzo.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist ├── ooniprobe.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── ooniprobe ├── Airports.plist ├── AppDelegate.h ├── AppDelegate.m ├── Base.lproj │ ├── LaunchScreen.xib │ └── Localizable.strings ├── Colors.xcassets │ ├── Contents.json │ ├── color_base.colorset │ │ └── Contents.json │ ├── color_black.colorset │ │ └── Contents.json │ ├── color_blue0.colorset │ │ └── Contents.json │ ├── color_blue1.colorset │ │ └── Contents.json │ ├── color_blue2.colorset │ │ └── Contents.json │ ├── color_blue3.colorset │ │ └── Contents.json │ ├── color_blue4.colorset │ │ └── Contents.json │ ├── color_blue5.colorset │ │ └── Contents.json │ ├── color_blue6.colorset │ │ └── Contents.json │ ├── color_blue7.colorset │ │ └── Contents.json │ ├── color_blue8.colorset │ │ └── Contents.json │ ├── color_blue9.colorset │ │ └── Contents.json │ ├── color_cyan0.colorset │ │ └── Contents.json │ ├── color_cyan1.colorset │ │ └── Contents.json │ ├── color_cyan2.colorset │ │ └── Contents.json │ ├── color_cyan3.colorset │ │ └── Contents.json │ ├── color_cyan4.colorset │ │ └── Contents.json │ ├── color_cyan5.colorset │ │ └── Contents.json │ ├── color_cyan6.colorset │ │ └── Contents.json │ ├── color_cyan7.colorset │ │ └── Contents.json │ ├── color_cyan8.colorset │ │ └── Contents.json │ ├── color_cyan9.colorset │ │ └── Contents.json │ ├── color_fuchsia0.colorset │ │ └── Contents.json │ ├── color_fuchsia1.colorset │ │ └── Contents.json │ ├── color_fuchsia2.colorset │ │ └── Contents.json │ ├── color_fuchsia3.colorset │ │ └── Contents.json │ ├── color_fuchsia4.colorset │ │ └── Contents.json │ ├── color_fuchsia5.colorset │ │ └── Contents.json │ ├── color_fuchsia6.colorset │ │ └── Contents.json │ ├── color_fuchsia7.colorset │ │ └── Contents.json │ ├── color_fuchsia8.colorset │ │ └── Contents.json │ ├── color_fuchsia9.colorset │ │ └── Contents.json │ ├── color_gray0.colorset │ │ └── Contents.json │ ├── color_gray1.colorset │ │ └── Contents.json │ ├── color_gray2.colorset │ │ └── Contents.json │ ├── color_gray2_1.colorset │ │ └── Contents.json │ ├── color_gray3.colorset │ │ └── Contents.json │ ├── color_gray4.colorset │ │ └── Contents.json │ ├── color_gray5.colorset │ │ └── Contents.json │ ├── color_gray6.colorset │ │ └── Contents.json │ ├── color_gray7.colorset │ │ └── Contents.json │ ├── color_gray7_1.colorset │ │ └── Contents.json │ ├── color_gray8.colorset │ │ └── Contents.json │ ├── color_gray9.colorset │ │ └── Contents.json │ ├── color_green0.colorset │ │ └── Contents.json │ ├── color_green1.colorset │ │ └── Contents.json │ ├── color_green2.colorset │ │ └── Contents.json │ ├── color_green3.colorset │ │ └── Contents.json │ ├── color_green4.colorset │ │ └── Contents.json │ ├── color_green5.colorset │ │ └── Contents.json │ ├── color_green6.colorset │ │ └── Contents.json │ ├── color_green7.colorset │ │ └── Contents.json │ ├── color_green8.colorset │ │ └── Contents.json │ ├── color_green9.colorset │ │ └── Contents.json │ ├── color_indigo0.colorset │ │ └── Contents.json │ ├── color_indigo1.colorset │ │ └── Contents.json │ ├── color_indigo2.colorset │ │ └── Contents.json │ ├── color_indigo3.colorset │ │ └── Contents.json │ ├── color_indigo4.colorset │ │ └── Contents.json │ ├── color_indigo5.colorset │ │ └── Contents.json │ ├── color_indigo6.colorset │ │ └── Contents.json │ ├── color_indigo7.colorset │ │ └── Contents.json │ ├── color_indigo8.colorset │ │ └── Contents.json │ ├── color_indigo9.colorset │ │ └── Contents.json │ ├── color_lime0.colorset │ │ └── Contents.json │ ├── color_lime1.colorset │ │ └── Contents.json │ ├── color_lime2.colorset │ │ └── Contents.json │ ├── color_lime3.colorset │ │ └── Contents.json │ ├── color_lime4.colorset │ │ └── Contents.json │ ├── color_lime5.colorset │ │ └── Contents.json │ ├── color_lime6.colorset │ │ └── Contents.json │ ├── color_lime7.colorset │ │ └── Contents.json │ ├── color_lime8.colorset │ │ └── Contents.json │ ├── color_lime9.colorset │ │ └── Contents.json │ ├── color_orange0.colorset │ │ └── Contents.json │ ├── color_orange1.colorset │ │ └── Contents.json │ ├── color_orange2.colorset │ │ └── Contents.json │ ├── color_orange3.colorset │ │ └── Contents.json │ ├── color_orange4.colorset │ │ └── Contents.json │ ├── color_orange5.colorset │ │ └── Contents.json │ ├── color_orange6.colorset │ │ └── Contents.json │ ├── color_orange7.colorset │ │ └── Contents.json │ ├── color_orange8.colorset │ │ └── Contents.json │ ├── color_orange9.colorset │ │ └── Contents.json │ ├── color_pink0.colorset │ │ └── Contents.json │ ├── color_pink1.colorset │ │ └── Contents.json │ ├── color_pink2.colorset │ │ └── Contents.json │ ├── color_pink3.colorset │ │ └── Contents.json │ ├── color_pink4.colorset │ │ └── Contents.json │ ├── color_pink5.colorset │ │ └── Contents.json │ ├── color_pink6.colorset │ │ └── Contents.json │ ├── color_pink7.colorset │ │ └── Contents.json │ ├── color_pink8.colorset │ │ └── Contents.json │ ├── color_pink9.colorset │ │ └── Contents.json │ ├── color_quiz.colorset │ │ └── Contents.json │ ├── color_red0.colorset │ │ └── Contents.json │ ├── color_red1.colorset │ │ └── Contents.json │ ├── color_red2.colorset │ │ └── Contents.json │ ├── color_red3.colorset │ │ └── Contents.json │ ├── color_red4.colorset │ │ └── Contents.json │ ├── color_red5.colorset │ │ └── Contents.json │ ├── color_red6.colorset │ │ └── Contents.json │ ├── color_red7.colorset │ │ └── Contents.json │ ├── color_red8.colorset │ │ └── Contents.json │ ├── color_red9.colorset │ │ └── Contents.json │ ├── color_teal0.colorset │ │ └── Contents.json │ ├── color_teal1.colorset │ │ └── Contents.json │ ├── color_teal2.colorset │ │ └── Contents.json │ ├── color_teal3.colorset │ │ └── Contents.json │ ├── color_teal4.colorset │ │ └── Contents.json │ ├── color_teal5.colorset │ │ └── Contents.json │ ├── color_teal6.colorset │ │ └── Contents.json │ ├── color_teal7.colorset │ │ └── Contents.json │ ├── color_teal8.colorset │ │ └── Contents.json │ ├── color_teal9.colorset │ │ └── Contents.json │ ├── color_violet0.colorset │ │ └── Contents.json │ ├── color_violet1.colorset │ │ └── Contents.json │ ├── color_violet2.colorset │ │ └── Contents.json │ ├── color_violet3.colorset │ │ └── Contents.json │ ├── color_violet4.colorset │ │ └── Contents.json │ ├── color_violet5.colorset │ │ └── Contents.json │ ├── color_violet6.colorset │ │ └── Contents.json │ ├── color_violet7.colorset │ │ └── Contents.json │ ├── color_violet8.colorset │ │ └── Contents.json │ ├── color_violet9.colorset │ │ └── Contents.json │ ├── color_white.colorset │ │ └── Contents.json │ ├── color_yellow0.colorset │ │ └── Contents.json │ ├── color_yellow1.colorset │ │ └── Contents.json │ ├── color_yellow2.colorset │ │ └── Contents.json │ ├── color_yellow3.colorset │ │ └── Contents.json │ ├── color_yellow4.colorset │ │ └── Contents.json │ ├── color_yellow5.colorset │ │ └── Contents.json │ ├── color_yellow6.colorset │ │ └── Contents.json │ ├── color_yellow7.colorset │ │ └── Contents.json │ ├── color_yellow8.colorset │ │ └── Contents.json │ ├── color_yellow9.colorset │ │ └── Contents.json │ ├── disabled_test_background.colorset │ │ └── Contents.json │ └── disabled_test_text.colorset │ │ └── Contents.json ├── DefaultPreferences.plist ├── Engine │ ├── Engine.h │ ├── Engine.m │ ├── LoggerArray.h │ ├── LoggerArray.m │ ├── LoggerComposed.h │ ├── LoggerComposed.m │ ├── LoggerNull.h │ ├── LoggerNull.m │ ├── LoggeriOS.h │ ├── LoggeriOS.m │ ├── OONICheckInConfig.h │ ├── OONICheckInConfig.m │ ├── OONICheckInResults.h │ ├── OONICheckInResults.m │ ├── OONIContext.h │ ├── OONIContext.m │ ├── OONIGeolocateResults.h │ ├── OONIGeolocateResults.m │ ├── OONILogger.h │ ├── OONIMKTask.h │ ├── OONIMKTaskConfig.h │ ├── OONISession.h │ ├── OONISessionConfig.h │ ├── OONISessionConfig.m │ ├── OONISubmitResults.h │ ├── OONISubmitResults.m │ ├── OONIURLInfo.h │ ├── OONIURLInfo.m │ ├── PELoggerAdapter.h │ ├── PELoggerAdapter.m │ ├── PEMKTask.h │ ├── PEMKTask.m │ ├── PESession.h │ └── PESession.m ├── GUI │ ├── ConfigureButton.h │ ├── ConfigureButton.m │ ├── NavigationBarUtility.h │ ├── NavigationBarUtility.m │ ├── PaddingLabel.h │ ├── PaddingLabel.m │ ├── RunButton.h │ └── RunButton.m ├── GoogleService-Info.plist ├── Images.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-40.png │ │ ├── Icon-40@2x.png │ │ ├── Icon-40@3x.png │ │ ├── Icon-60@2x.png │ │ ├── Icon-60@3x.png │ │ ├── Icon-72.png │ │ ├── Icon-72@2x.png │ │ ├── Icon-76.png │ │ ├── Icon-76@2x.png │ │ ├── Icon-83.5@2x.png │ │ ├── Icon-Small-50.png │ │ ├── Icon-Small-50@2x.png │ │ ├── Icon-Small.png │ │ ├── Icon-Small@2x.png │ │ ├── Icon-Small@3x.png │ │ ├── Icon.png │ │ ├── Icon@2x.png │ │ ├── NotificationIcon@2x.png │ │ ├── NotificationIcon@3x.png │ │ ├── NotificationIcon~ipad.png │ │ ├── NotificationIcon~ipad@2x.png │ │ └── ios-marketing.png │ ├── Contents.json │ ├── LaunchImage.launchimage │ │ ├── Contents.json │ │ ├── ipad.png │ │ ├── ipad2.png │ │ ├── iphone4.png │ │ └── iphone5.png │ ├── close.imageset │ │ ├── Contents.json │ │ └── close.pdf │ ├── dashboard │ │ ├── Contents.json │ │ ├── dashboard-bg-navbar.imageset │ │ │ ├── Contents.json │ │ │ └── navbar.pdf │ │ ├── delete_forever.imageset │ │ │ ├── Contents.json │ │ │ └── delete_forever.pdf │ │ └── settings_icon.imageset │ │ │ ├── Contents.json │ │ │ └── settings_icon.pdf │ ├── onboarding │ │ ├── Contents.json │ │ ├── dots_1.imageset │ │ │ ├── Contents.json │ │ │ └── dots_1.pdf │ │ ├── dots_2.imageset │ │ │ ├── Contents.json │ │ │ └── dots_2.pdf │ │ ├── dots_3.imageset │ │ │ ├── Contents.json │ │ │ └── dots_3.pdf │ │ ├── onboarding_1.imageset │ │ │ ├── Contents.json │ │ │ └── onboarding_1.pdf │ │ ├── onboarding_2.imageset │ │ │ ├── Contents.json │ │ │ └── onboarding_2.pdf │ │ └── onboarding_3.imageset │ │ │ ├── Contents.json │ │ │ └── onboarding_3.pdf │ ├── ooni_empty_state.imageset │ │ ├── Contents.json │ │ └── ooni_empty_state.pdf │ ├── ooni_logo_round.imageset │ │ ├── Contents.json │ │ ├── ooni_logo@2x.png │ │ └── ooni_logo@3x.png │ ├── ooni_probe_logo.imageset │ │ ├── Contents.json │ │ └── ooni_probe_logo.pdf │ ├── oonirun │ │ ├── Contents.json │ │ ├── question_mark.imageset │ │ │ ├── Contents.json │ │ │ └── question_mark.pdf │ │ └── update.imageset │ │ │ ├── Contents.json │ │ │ └── update.pdf │ ├── settings │ │ ├── Contents.json │ │ ├── about_ooni.imageset │ │ │ ├── Contents.json │ │ │ └── about_ooni.pdf │ │ ├── advanced.imageset │ │ │ ├── Contents.json │ │ │ └── advanced.pdf │ │ ├── automated_testing.imageset │ │ │ ├── Contents.json │ │ │ └── automated_testing.pdf │ │ ├── backArrow.imageset │ │ │ ├── Contents.json │ │ │ ├── backArrow.png │ │ │ ├── backArrow@2x.png │ │ │ └── backArrow@3x.png │ │ ├── help.imageset │ │ │ ├── Contents.json │ │ │ └── help.pdf │ │ ├── minus_circle.imageset │ │ │ ├── Contents.json │ │ │ └── minus_circle.pdf │ │ ├── notifications.imageset │ │ │ ├── Contents.json │ │ │ └── notifications.pdf │ │ ├── ooni_backend_proxy.imageset │ │ │ ├── Contents.json │ │ │ └── ooni_backend_proxy.pdf │ │ ├── ooni_logo.imageset │ │ │ ├── Contents.json │ │ │ └── ooni_logo.pdf │ │ ├── privacy.imageset │ │ │ ├── Contents.json │ │ │ └── privacy.pdf │ │ ├── send_email.imageset │ │ │ ├── Contents.json │ │ │ └── send_email.pdf │ │ ├── sharing.imageset │ │ │ ├── Contents.json │ │ │ └── sharing.pdf │ │ └── test_options.imageset │ │ │ ├── Contents.json │ │ │ └── test_options.pdf │ ├── tabs │ │ ├── Contents.json │ │ ├── tab_dashboard.imageset │ │ │ ├── Contents.json │ │ │ └── tab_dashboard.pdf │ │ ├── tab_feed.imageset │ │ │ ├── Contents.json │ │ │ └── tab_feed.pdf │ │ ├── tab_settings.imageset │ │ │ ├── Contents.json │ │ │ └── tab_settings.pdf │ │ └── tab_test_results.imageset │ │ │ ├── Contents.json │ │ │ └── tab_test_results.pdf │ ├── test_results │ │ ├── Contents.json │ │ ├── data_usage.imageset │ │ │ ├── Contents.json │ │ │ └── data_usage.pdf │ │ ├── date_and_time.imageset │ │ │ ├── Contents.json │ │ │ └── date_and_time.pdf │ │ ├── download.imageset │ │ │ ├── Contents.json │ │ │ └── download.pdf │ │ ├── download_nopad.imageset │ │ │ ├── Contents.json │ │ │ └── download_nopad.pdf │ │ ├── error.imageset │ │ │ ├── Contents.json │ │ │ └── error.pdf │ │ ├── exclamation_point.imageset │ │ │ ├── Contents.json │ │ │ └── exclamation_point.pdf │ │ ├── globe.imageset │ │ │ ├── Contents.json │ │ │ └── globe.pdf │ │ ├── more_icon.imageset │ │ │ ├── Contents.json │ │ │ └── more_icon.pdf │ │ ├── network.imageset │ │ │ ├── Contents.json │ │ │ └── network.pdf │ │ ├── not_uploaded.imageset │ │ │ ├── Contents.json │ │ │ └── not_uploaded.pdf │ │ ├── ooni_bw.imageset │ │ │ ├── Contents.json │ │ │ └── ooni_bw.pdf │ │ ├── reload.imageset │ │ │ ├── Contents.json │ │ │ └── reload.pdf │ │ ├── runtime.imageset │ │ │ ├── Contents.json │ │ │ └── runtime.pdf │ │ ├── tick.imageset │ │ │ ├── Contents.json │ │ │ └── tick.pdf │ │ ├── upload.imageset │ │ │ ├── Contents.json │ │ │ └── upload.pdf │ │ ├── upload_nopad.imageset │ │ │ ├── Contents.json │ │ │ └── upload_nopad.pdf │ │ └── video_quality.imageset │ │ │ ├── Contents.json │ │ │ └── video_quality.pdf │ ├── tests │ │ ├── Contents.json │ │ ├── circumvention.imageset │ │ │ ├── Contents.json │ │ │ └── circumvention.pdf │ │ ├── experimental.imageset │ │ │ ├── Contents.json │ │ │ └── experimental.pdf │ │ ├── experimental_x.imageset │ │ │ ├── Contents.json │ │ │ └── experimental.pdf │ │ ├── facebook_messenger.imageset │ │ │ ├── Contents.json │ │ │ └── facebook_messenger.pdf │ │ ├── instant_messaging.imageset │ │ │ ├── Contents.json │ │ │ └── instant_messaging.pdf │ │ ├── middle_boxes.imageset │ │ │ ├── Contents.json │ │ │ └── middle_boxes.pdf │ │ ├── performance.imageset │ │ │ ├── Contents.json │ │ │ └── performance.pdf │ │ ├── psiphon.imageset │ │ │ ├── Contents.json │ │ │ └── psiphon.pdf │ │ ├── riseupvpn.imageset │ │ │ ├── Contents.json │ │ │ └── riseupvpn.pdf │ │ ├── signal.imageset │ │ │ ├── Contents.json │ │ │ └── signal.pdf │ │ ├── telegram.imageset │ │ │ ├── Contents.json │ │ │ └── telegram.pdf │ │ ├── tor.imageset │ │ │ ├── Contents.json │ │ │ └── tor.pdf │ │ ├── websites.imageset │ │ │ ├── Contents.json │ │ │ └── websites.pdf │ │ └── whatsapp.imageset │ │ │ ├── Contents.json │ │ │ └── whatsapp.pdf │ └── website_categories │ │ ├── Contents.json │ │ ├── category_ALDR.imageset │ │ ├── Contents.json │ │ └── category_ALDR.pdf │ │ ├── category_ANON.imageset │ │ ├── Contents.json │ │ └── category_ANON.pdf │ │ ├── category_COMM.imageset │ │ ├── Contents.json │ │ └── category_COMM.pdf │ │ ├── category_COMT.imageset │ │ ├── Contents.json │ │ └── category_COMT.pdf │ │ ├── category_CTRL.imageset │ │ ├── Contents.json │ │ └── category_CTRL.pdf │ │ ├── category_CULTR.imageset │ │ ├── Contents.json │ │ └── category_CULTR.pdf │ │ ├── category_DATE.imageset │ │ ├── Contents.json │ │ └── category_DATE.pdf │ │ ├── category_ECON.imageset │ │ ├── Contents.json │ │ └── category_ECON.pdf │ │ ├── category_ENV.imageset │ │ ├── Contents.json │ │ └── category_ENV.pdf │ │ ├── category_FILE.imageset │ │ ├── Contents.json │ │ └── category_FILE.pdf │ │ ├── category_GAME.imageset │ │ ├── Contents.json │ │ └── category_GAME.pdf │ │ ├── category_GMB.imageset │ │ ├── Contents.json │ │ └── category_GMB.pdf │ │ ├── category_GOVT.imageset │ │ ├── Contents.json │ │ └── category_GOVT.pdf │ │ ├── category_GRP.imageset │ │ ├── Contents.json │ │ └── category_GRP.pdf │ │ ├── category_HACK.imageset │ │ ├── Contents.json │ │ └── category_HACK.pdf │ │ ├── category_HATE.imageset │ │ ├── Contents.json │ │ └── category_HATE.pdf │ │ ├── category_HOST.imageset │ │ ├── Contents.json │ │ └── category_HOST.pdf │ │ ├── category_HUMR.imageset │ │ ├── Contents.json │ │ └── category_HUMR.pdf │ │ ├── category_IGO.imageset │ │ ├── Contents.json │ │ └── category_IGO.pdf │ │ ├── category_LGBT.imageset │ │ ├── Contents.json │ │ └── category_LGBT.pdf │ │ ├── category_MILX.imageset │ │ ├── Contents.json │ │ └── category_MILX.pdf │ │ ├── category_MISC.imageset │ │ ├── Contents.json │ │ └── category_MISC.pdf │ │ ├── category_MMED.imageset │ │ ├── Contents.json │ │ └── category_MMED.pdf │ │ ├── category_NEWS.imageset │ │ ├── Contents.json │ │ └── category_NEWS.pdf │ │ ├── category_POLR.imageset │ │ ├── Contents.json │ │ └── category_POLR.pdf │ │ ├── category_PORN.imageset │ │ ├── Contents.json │ │ └── category_PORN.pdf │ │ ├── category_PROV.imageset │ │ ├── Contents.json │ │ └── category_PROV.pdf │ │ ├── category_PUBH.imageset │ │ ├── Contents.json │ │ └── category_PUBH.pdf │ │ ├── category_REL.imageset │ │ ├── Contents.json │ │ └── category_REL.pdf │ │ ├── category_SRCH.imageset │ │ ├── Contents.json │ │ └── category_SRCH.pdf │ │ └── category_XED.imageset │ │ ├── Contents.json │ │ └── category_XED.pdf ├── Info.plist ├── Languages.plist ├── Model │ ├── Database │ │ ├── Measurement.h │ │ ├── Measurement.m │ │ ├── Network.h │ │ ├── Network.m │ │ ├── Result.h │ │ ├── Result.m │ │ ├── Url.h │ │ └── Url.m │ ├── JsonResult │ │ ├── Advanced.h │ │ ├── Advanced.m │ │ ├── EventResult.h │ │ ├── EventResult.m │ │ ├── GatewayConnection.h │ │ ├── GatewayConnection.m │ │ ├── JsonResult.h │ │ ├── JsonResult.m │ │ ├── Server.h │ │ ├── Server.m │ │ ├── Simple.h │ │ ├── Simple.m │ │ ├── Summary.h │ │ ├── Summary.m │ │ ├── Tampering.h │ │ ├── Tampering.m │ │ ├── TestKeys.h │ │ ├── TestKeys.m │ │ ├── Value.h │ │ └── Value.m │ └── Settings │ │ ├── Options.h │ │ ├── Options.m │ │ ├── Settings.h │ │ └── Settings.m ├── Notifications │ ├── Reachability.h │ ├── Reachability.m │ ├── ReachabilityManager.h │ └── ReachabilityManager.m ├── PrefixHeader.pch ├── Resources │ ├── anim │ │ ├── checkMark.json │ │ ├── circumvention.json │ │ ├── crossMark.json │ │ ├── experimental.json │ │ ├── instant_messaging.json │ │ ├── middle_boxes.json │ │ ├── performance.json │ │ └── websites.json │ └── fonts │ │ ├── FiraSans-Italic.otf │ │ ├── FiraSans-Light.otf │ │ ├── FiraSans-LightItalic.otf │ │ ├── FiraSans-Regular.otf │ │ ├── FiraSans-SemiBold.otf │ │ └── FiraSans-SemiBoldItalic.otf ├── Storyboards │ ├── Dashboard.storyboard │ ├── Main.storyboard │ ├── OONIRun.storyboard │ ├── Onboarding.storyboard │ ├── Result.storyboard │ └── Settings.storyboard ├── Strings.plist ├── Test │ ├── RunningTest.h │ ├── RunningTest.m │ ├── Suite │ │ ├── AbstractSuite.h │ │ ├── AbstractSuite.m │ │ ├── CircumventionSuite.h │ │ ├── CircumventionSuite.m │ │ ├── ExperimentalSuite.h │ │ ├── ExperimentalSuite.m │ │ ├── InstantMessagingSuite.h │ │ ├── InstantMessagingSuite.m │ │ ├── MiddleBoxesSuite.h │ │ ├── MiddleBoxesSuite.m │ │ ├── PerformanceSuite.h │ │ ├── PerformanceSuite.m │ │ ├── Suite.h │ │ ├── WebsitesSuite.h │ │ └── WebsitesSuite.m │ └── Test │ │ ├── AbstractTest.h │ │ ├── AbstractTest.m │ │ ├── Dash.h │ │ ├── Dash.m │ │ ├── Experimental.h │ │ ├── Experimental.m │ │ ├── FacebookMessenger.h │ │ ├── FacebookMessenger.m │ │ ├── HttpHeaderFieldManipulation.h │ │ ├── HttpHeaderFieldManipulation.m │ │ ├── HttpInvalidRequestLine.h │ │ ├── HttpInvalidRequestLine.m │ │ ├── NdtTest.h │ │ ├── NdtTest.m │ │ ├── Psiphon.h │ │ ├── Psiphon.m │ │ ├── RiseupVPN.h │ │ ├── RiseupVPN.m │ │ ├── Signal.h │ │ ├── Signal.m │ │ ├── Telegram.h │ │ ├── Telegram.m │ │ ├── Tests.h │ │ ├── Tor.h │ │ ├── Tor.m │ │ ├── WebConnectivity.h │ │ ├── WebConnectivity.m │ │ ├── Whatsapp.h │ │ └── Whatsapp.m ├── TestUrls.plist ├── Utility │ ├── BackgroundTask.h │ ├── BackgroundTask.m │ ├── DictionaryUtility.h │ ├── DictionaryUtility.m │ ├── LocalizationUtility.h │ ├── LocalizationUtility.m │ ├── MessageUtility.h │ ├── MessageUtility.m │ ├── NSDictionary+Safety.h │ ├── NSDictionary+Safety.m │ ├── NetworkSession.h │ ├── NetworkSession.m │ ├── OONIApi.h │ ├── OONIApi.m │ ├── ProxySettings.h │ ├── ProxySettings.m │ ├── SettingsUtility.h │ ├── SettingsUtility.m │ ├── TestUtility.h │ ├── TestUtility.m │ ├── ThirdPartyServices.h │ ├── ThirdPartyServices.m │ ├── UIDevice-DeviceInfo.h │ ├── UIDevice-DeviceInfo.m │ ├── VersionUtility.h │ └── VersionUtility.m ├── View │ ├── AboutViewController.h │ ├── AboutViewController.m │ ├── DashboardTableViewController.h │ ├── DashboardTableViewController.m │ ├── OONIRun │ │ ├── OoniRunViewController.h │ │ └── OoniRunViewController.m │ ├── Onboarding │ │ ├── Onboarding1ViewController.h │ │ ├── Onboarding1ViewController.m │ │ ├── Onboarding2ViewController.h │ │ ├── Onboarding2ViewController.m │ │ ├── Onboarding3ViewController.h │ │ ├── Onboarding3ViewController.m │ │ ├── OnboardingAutoTestViewController.h │ │ ├── OnboardingAutoTestViewController.m │ │ ├── OnboardingCrashViewController.h │ │ ├── OnboardingCrashViewController.m │ │ ├── PopQuizViewController.h │ │ ├── PopQuizViewController.m │ │ ├── WrongAnswerViewController.h │ │ └── WrongAnswerViewController.m │ ├── RunTest │ │ ├── ProgressViewController.h │ │ ├── ProgressViewController.m │ │ ├── TestOverviewViewController.h │ │ ├── TestOverviewViewController.m │ │ ├── TestRunningViewController.h │ │ └── TestRunningViewController.m │ ├── Settings │ │ ├── CustomURLViewController.h │ │ ├── CustomURLViewController.m │ │ ├── ProxyViewController.h │ │ ├── ProxyViewController.m │ │ ├── SettingsCategoriesTableViewController.h │ │ ├── SettingsCategoriesTableViewController.m │ │ ├── SettingsTableViewController.h │ │ ├── SettingsTableViewController.m │ │ ├── WebsiteCategoriesTableViewController.h │ │ └── WebsiteCategoriesTableViewController.m │ ├── TabsViewController.h │ ├── TabsViewController.m │ └── TestResults │ │ ├── Details │ │ ├── CircumventionDetailsViewController.h │ │ ├── CircumventionDetailsViewController.m │ │ ├── DashDetailsViewController.h │ │ ├── DashDetailsViewController.m │ │ ├── FailedTestDetailsViewController.h │ │ ├── FailedTestDetailsViewController.m │ │ ├── InstantMessagingDetailsViewController.h │ │ ├── InstantMessagingDetailsViewController.m │ │ ├── MiddleBoxesDetailsViewController.h │ │ ├── MiddleBoxesDetailsViewController.m │ │ ├── NdtDetailsViewController.h │ │ ├── NdtDetailsViewController.m │ │ ├── TestDetailsViewController.h │ │ ├── TestDetailsViewController.m │ │ ├── WebsitesDetailsViewController.h │ │ └── WebsitesDetailsViewController.m │ │ ├── Footer │ │ ├── TestDetailsFooterViewController.h │ │ ├── TestDetailsFooterViewController.m │ │ ├── UploadFooterViewController.h │ │ └── UploadFooterViewController.m │ │ ├── Headers │ │ ├── Header1MBViewController.h │ │ ├── Header1MBViewController.m │ │ ├── Header1ViewController.h │ │ ├── Header1ViewController.m │ │ ├── Header2ViewController.h │ │ ├── Header2ViewController.m │ │ ├── Header3ViewController.h │ │ ├── Header3ViewController.m │ │ ├── HeaderSwipeViewController.h │ │ ├── HeaderSwipeViewController.m │ │ ├── ResultsHeaderViewController.h │ │ └── ResultsHeaderViewController.m │ │ ├── LogViewController.h │ │ ├── LogViewController.m │ │ ├── Rows │ │ ├── BasicTableViewCell.h │ │ ├── BasicTableViewCell.m │ │ ├── DashboardTableViewCell.h │ │ ├── DashboardTableViewCell.m │ │ ├── TestResultTableViewCell.h │ │ ├── TestResultTableViewCell.m │ │ ├── TestSummaryTableViewCell.h │ │ └── TestSummaryTableViewCell.m │ │ ├── TestResultsViewController.h │ │ ├── TestResultsViewController.m │ │ ├── TestSummaryViewController.h │ │ └── TestSummaryViewController.m ├── ar.lproj │ └── Localizable.strings ├── ca.lproj │ └── Localizable.strings ├── de.lproj │ └── Localizable.strings ├── el.lproj │ └── Localizable.strings ├── es.lproj │ └── Localizable.strings ├── fa.lproj │ └── Localizable.strings ├── fr.lproj │ └── Localizable.strings ├── hi.lproj │ └── Localizable.strings ├── id.lproj │ └── Localizable.strings ├── is.lproj │ └── Localizable.strings ├── it.lproj │ └── Localizable.strings ├── ja.lproj │ └── Localizable.strings ├── main.m ├── my.lproj │ └── Localizable.strings ├── nl.lproj │ └── Localizable.strings ├── ooniprobe.entitlements ├── pt-BR.lproj │ └── Localizable.strings ├── ro.lproj │ └── Localizable.strings ├── ru.lproj │ └── Localizable.strings ├── sk.lproj │ └── Localizable.strings ├── sq.lproj │ └── Localizable.strings ├── sw.lproj │ └── Localizable.strings ├── th.lproj │ └── Localizable.strings ├── tr.lproj │ └── Localizable.strings ├── vi.lproj │ └── Localizable.strings ├── zh-Hans.lproj │ └── Localizable.strings ├── zh-Hant.lproj │ └── Localizable.strings ├── zh_CN.lproj └── zh_TW.lproj ├── project.pbxproj └── share ├── Base.lproj └── MainInterface.storyboard ├── Info.plist ├── ShareViewController.swift └── share.entitlements /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj merge=union 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug Report 3 | about: Issue template for reporting bugs 4 | title: 'subsystem: brief description of unexpected behaviour' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | ## Expected Behavior 11 | 12 | 13 | ## Actual Behavior 14 | 15 | 16 | ## Steps to Reproduce the Problem 17 | 18 | 1. 19 | 2. 20 | 3. 21 | 22 | ## Specifications 23 | 24 | - Version: 25 | - Platform: 26 | - Subsystem: 27 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Fixes # 2 | 3 | ## Proposed Changes 4 | 5 | - 6 | - 7 | - 8 | -------------------------------------------------------------------------------- /.github/workflows/validate.yml: -------------------------------------------------------------------------------- 1 | name: Validate 2 | on: 3 | pull_request: 4 | push: 5 | schedule: 6 | - cron: "0 2 * * */2" 7 | 8 | jobs: 9 | build: 10 | name: Ensure the code builds 11 | runs-on: macos-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - run: pod repo update 15 | - run: pod install 16 | - run: | 17 | set -o pipefail 18 | xcodebuild -workspace ooniprobe.xcworkspace -scheme ooniprobe \ 19 | -destination='name=Any iOS Device' -sdk iphoneos archive CODE_SIGNING_ALLOWED="NO" | xcpretty 20 | 21 | test: 22 | name: Run tests 23 | needs: [ build ] 24 | runs-on: macos-latest 25 | steps: 26 | - uses: actions/checkout@v4 27 | - run: pod repo update 28 | - run: pod install 29 | - run: | 30 | set -o pipefail 31 | xcodebuild clean build test -workspace ooniprobe.xcworkspace -sdk iphonesimulator \ 32 | -scheme ooniprobe -destination 'name=iPhone 14' | xcpretty 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /ooniprobe.xcodeproj/project.xcworkspace/xcuserdata/ 3 | /ooniprobe.xcodeproj/xcuserdata 4 | /ooniprobe.xcworkspace/xcuserdata/ 5 | /Pods/ 6 | fastlane/screenshots/*/*.png 7 | fastlane/screenshots/screenshots.html 8 | fastlane/screenshots/report.xml 9 | fastlane/metadata/ 10 | ooniprobe.xcworkspace/xcuserdata/lorenzo.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist 11 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [ooniprobe.localizablestrings] 5 | file_filter = ooniprobe/.lproj/Localizable.strings 6 | source_file = ooniprobe/Base.lproj/Localizable.strings 7 | source_lang = en 8 | type = STRINGS 9 | 10 | [ooniprobe.description] 11 | file_filter = description/.xlf 12 | source_file = description/source.xlf 13 | source_lang = en 14 | type = XLIFF 15 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "cocoapods" 4 | gem 'activesupport', '~> 7.0', '<= 7.0.8' 5 | gem "fastlane" 6 | gem "xcpretty" 7 | -------------------------------------------------------------------------------- /OONIProbeUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /OONIProbeUITests/OONIProbeUITests-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /OONIProbeUnitTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /OONIProbeUnitTests/MakeTimeoutTest.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestUtility.h" 3 | 4 | @interface MakeTimeoutTest : XCTestCase 5 | 6 | @end 7 | 8 | @implementation MakeTimeoutTest 9 | 10 | - (void)setUp { 11 | } 12 | 13 | - (void)tearDown { 14 | } 15 | 16 | - (void)testStandard { 17 | NSInteger bytes = 2000; 18 | NSInteger timeout = 11; 19 | XCTAssert([TestUtility makeTimeout:bytes] == timeout); 20 | } 21 | 22 | - (void)testZero { 23 | NSInteger zero = 0; 24 | NSInteger timeout = 10; 25 | XCTAssert([TestUtility makeTimeout:zero] == timeout); 26 | } 27 | 28 | - (void)testMax { 29 | NSInteger max = NSIntegerMax; 30 | NSInteger timeout = NSIntegerMax/2000+10; 31 | XCTAssert([TestUtility makeTimeout:max] == timeout); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /assets/OONIProbeLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/assets/OONIProbeLogo.png -------------------------------------------------------------------------------- /assets/app-store-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/assets/app-store-badge.png -------------------------------------------------------------------------------- /assets/play-store-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/assets/play-store-badge.png -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier("org.openobservatory.ooniprobe") # The bundle identifier of your app 2 | # apple_id("[[APPLE_ID]]") # Your Apple email address 3 | itc_team_id "118013850" 4 | 5 | # For more information about the Appfile, see: 6 | # https://docs.fastlane.tools/advanced/#appfile 7 | -------------------------------------------------------------------------------- /fastlane/Deliverfile: -------------------------------------------------------------------------------- 1 | # The Deliverfile allows you to store various App Store Connect metadata 2 | # For more information, check out the docs 3 | # https://docs.fastlane.tools/actions/deliver/ 4 | 5 | release_notes({ 6 | 'default' => "We're excited to share that the latest OONI Probe version features a brand new test for RiseupVPN! \nThanks to the LEAP collective (who developed this new test), you can now check whether RiseupVPN works on your network." 7 | }) 8 | 9 | -------------------------------------------------------------------------------- /fastlane/README.md: -------------------------------------------------------------------------------- 1 | fastlane documentation 2 | ================ 3 | # Installation 4 | 5 | Make sure you have the latest version of the Xcode command line tools installed: 6 | 7 | ``` 8 | xcode-select --install 9 | ``` 10 | 11 | Install _fastlane_ using 12 | ``` 13 | [sudo] gem install fastlane -NV 14 | ``` 15 | or alternatively using `brew install fastlane` 16 | 17 | # Available Actions 18 | ## iOS 19 | ### ios screenshots 20 | ``` 21 | fastlane ios screenshots 22 | ``` 23 | Generate new localized screenshots 24 | ### ios upload_symbols 25 | ``` 26 | fastlane ios upload_symbols 27 | ``` 28 | 29 | ### ios release 30 | ``` 31 | fastlane ios release 32 | ``` 33 | 34 | 35 | ---- 36 | 37 | This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run. 38 | More information about fastlane can be found on [fastlane.tools](https://fastlane.tools). 39 | The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools). 40 | -------------------------------------------------------------------------------- /fastlane/report.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /fastlane/screenshots/Framefile.json: -------------------------------------------------------------------------------- 1 | { 2 | "device_frame_version": "latest", 3 | "default": { 4 | "keyword": { 5 | "font": "./fonts/FiraSans-Bold.otf" 6 | }, 7 | "title": { 8 | "font": "./fonts/FiraSans-Regular.otf", 9 | "color": "#545454" 10 | }, 11 | "background": "./background.jpg", 12 | "padding": 50, 13 | "show_complete_frame": false, 14 | "stack_title" : false, 15 | "title_below_image": false 16 | }, 17 | 18 | "data": [ 19 | { 20 | "filter": "Dashboard", 21 | "keyword": { 22 | "color": "#d21559" 23 | } 24 | }, 25 | { 26 | "filter": "TestResults", 27 | "keyword": { 28 | "color": "#feb909" 29 | } 30 | }, 31 | { 32 | "filter": "WebsiteBlocked", 33 | "keyword": { 34 | "color": "#aa4dbc" 35 | } 36 | }, 37 | { 38 | "filter": "SpeedTest", 39 | "keyword": { 40 | "color": "#31bb48" 41 | } 42 | }, 43 | { 44 | "filter": "ChooseWebsite", 45 | "keyword": { 46 | "color": "#31bb48" 47 | } 48 | } 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /fastlane/screenshots/README.txt: -------------------------------------------------------------------------------- 1 | Put all screenshots you want to use inside the folder of its language (e.g. en-US). 2 | The device type will automatically be recognized using the image resolution. Apple TV screenshots 3 | should be stored in a subdirectory named appleTV with language folders inside of it. iMessage 4 | screenshots, like Apple TV screenshots, should also be stored in a subdirectory named iMessage 5 | with language folders inside of it. 6 | 7 | The screenshots can be named whatever you want, but keep in mind they are sorted alphabetically. 8 | -------------------------------------------------------------------------------- /fastlane/screenshots/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/fastlane/screenshots/background.jpg -------------------------------------------------------------------------------- /fastlane/screenshots/fonts/FiraSans-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/fastlane/screenshots/fonts/FiraSans-Bold.otf -------------------------------------------------------------------------------- /fastlane/screenshots/fonts/FiraSans-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/fastlane/screenshots/fonts/FiraSans-Regular.otf -------------------------------------------------------------------------------- /fastlane/screenshots/gen_ipad.sh: -------------------------------------------------------------------------------- 1 | for i in $(ls -d */) 2 | do cd $i 3 | for file in iPad*.png 4 | do 5 | cp "$file" "${file/4th/2nd}" 6 | done 7 | cd .. 8 | done 9 | -------------------------------------------------------------------------------- /fixtures/OONIProbe.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/fixtures/OONIProbe.db -------------------------------------------------------------------------------- /ooniprobe.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ooniprobe.xcodeproj/xcuserdata/lorenzo.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | OONIProbeUITests.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 10 11 | 12 | OONIProbeUnitTests.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 18 16 | 17 | ooniprobe.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 9 21 | 22 | 23 | SuppressBuildableAutocreation 24 | 25 | D4A2F5D81A6C3244001B8460 26 | 27 | primary 28 | 29 | 30 | EDF23EEA2225258100B97520 31 | 32 | primary 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ooniprobe.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ooniprobe.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ooniprobe/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | 5 | @interface AppDelegate : UIResponder { 6 | NSMutableArray *links; 7 | } 8 | 9 | @property (strong, nonatomic) UIWindow *window; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /ooniprobe/Colors.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ooniprobe/Colors.xcassets/color_base.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xCB", 9 | "green" : "0x88", 10 | "red" : "0x05" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0xCB", 27 | "green" : "0x88", 28 | "red" : "0x05" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "srgb", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0xA6", 45 | "green" : "0x6A", 46 | "red" : "0x05" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ooniprobe/Colors.xcassets/color_gray7_1.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.341", 9 | "green" : "0.314", 10 | "red" : "0.286" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.341", 27 | "green" : "0.314", 28 | "red" : "0.286" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "idiom" : "universal" 41 | } 42 | ], 43 | "info" : { 44 | "author" : "xcode", 45 | "version" : 1 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /ooniprobe/Colors.xcassets/color_quiz.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xFF", 9 | "green" : "0xFF", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0xFF", 27 | "green" : "0xFF", 28 | "red" : "0xFF" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "srgb", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0x9C", 45 | "green" : "0x9C", 46 | "red" : "0x9C" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ooniprobe/Colors.xcassets/color_red0.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xF5", 9 | "green" : "0xF5", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0xF5", 27 | "green" : "0xF5", 28 | "red" : "0xFF" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "srgb", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0xF5", 45 | "green" : "0xF5", 46 | "red" : "0xFF" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ooniprobe/Colors.xcassets/color_red1.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xE3", 9 | "green" : "0xE3", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0xE3", 27 | "green" : "0xE3", 28 | "red" : "0xFF" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "srgb", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0xE3", 45 | "green" : "0xE3", 46 | "red" : "0xFF" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ooniprobe/Colors.xcassets/color_red2.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0xC9", 9 | "green" : "0xC9", 10 | "red" : "0xFF" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "light" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0xC9", 27 | "green" : "0xC9", 28 | "red" : "0xFF" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | }, 33 | { 34 | "appearances" : [ 35 | { 36 | "appearance" : "luminosity", 37 | "value" : "dark" 38 | } 39 | ], 40 | "color" : { 41 | "color-space" : "srgb", 42 | "components" : { 43 | "alpha" : "1.000", 44 | "blue" : "0xC9", 45 | "green" : "0xC9", 46 | "red" : "0xFF" 47 | } 48 | }, 49 | "idiom" : "universal" 50 | } 51 | ], 52 | "info" : { 53 | "author" : "xcode", 54 | "version" : 1 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /ooniprobe/Engine/Engine.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "OONIMKTask.h" 3 | #import "OONIMKTaskConfig.h" 4 | #import "PEMKTask.h" 5 | #import "OONIContext.h" 6 | #import "OONISession.h" 7 | #import "OONISessionConfig.h" 8 | #import "PESession.h" 9 | #import "OONILogger.h" 10 | #import "LoggerComposed.h" 11 | #import "LoggeriOS.h" 12 | #import "LoggerNull.h" 13 | #import "LoggerArray.h" 14 | 15 | /** 16 | * Engine is a factory class for creating several kinds of tasks. We will use different 17 | * engines depending on the task that you wish to create. 18 | */ 19 | @interface Engine : NSObject 20 | 21 | + (NSString*) newUUID4; 22 | 23 | + (PEMKTask*) startExperimentTaskWithSettings:(id)settings error:(NSError **)error; 24 | 25 | + (PESession*) newSession:(OONISessionConfig*)config error:(NSError **)error; 26 | 27 | + (OONISessionConfig*) getDefaultSessionConfigWithSoftwareName:(NSString*)softwareName 28 | softwareVersion:(NSString*)softwareVersion 29 | logger:(id)logger; 30 | 31 | + (NSString*) getAssetsDir; 32 | 33 | + (NSString*) getStateDir; 34 | 35 | + (NSString*) getTempDir; 36 | 37 | + (NSString*) getTunnelDir; 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggerArray.h: -------------------------------------------------------------------------------- 1 | #import "OONILogger.h" 2 | 3 | /** LoggerArray is a logger that writes logs into an array. */ 4 | @interface LoggerArray : NSObject 5 | 6 | @property (nonatomic, strong) NSMutableArray* array; 7 | 8 | @end 9 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggerArray.m: -------------------------------------------------------------------------------- 1 | #import "LoggerArray.h" 2 | 3 | @implementation LoggerArray 4 | - (id) init { 5 | self = [super init]; 6 | if (self) { 7 | self.array = [NSMutableArray new]; 8 | } 9 | return self; 10 | } 11 | 12 | - (void) debug:(NSString*) message { 13 | [self.array addObject:message]; 14 | } 15 | 16 | - (void) info:(NSString*) message { 17 | [self.array addObject:message]; 18 | } 19 | 20 | - (void) warn:(NSString*) message { 21 | [self.array addObject:message]; 22 | } 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggerComposed.h: -------------------------------------------------------------------------------- 1 | #import "OONILogger.h" 2 | 3 | /** LoggerComposed allows to compose two loggers */ 4 | @interface LoggerComposed : NSObject 5 | 6 | @property (nonatomic, strong) id left; 7 | @property (nonatomic, strong) id right; 8 | 9 | - (id) initWithLeft:(id)left right:(id)right; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggerComposed.m: -------------------------------------------------------------------------------- 1 | #import "LoggerComposed.h" 2 | 3 | @implementation LoggerComposed 4 | - (id) initWithLeft:(id)left right:(id)right { 5 | self = [super init]; 6 | if (self) { 7 | self.left = left; 8 | self.right = right; 9 | } 10 | return self; 11 | } 12 | 13 | - (void) debug:(NSString*) message { 14 | [self.left debug:message]; 15 | [self.right debug:message]; 16 | } 17 | 18 | - (void) info:(NSString*) message { 19 | [self.left info:message]; 20 | [self.right info:message]; 21 | } 22 | 23 | - (void) warn:(NSString*) message { 24 | [self.left warn:message]; 25 | [self.right warn:message]; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggerNull.h: -------------------------------------------------------------------------------- 1 | #import "OONILogger.h" 2 | 3 | @interface LoggerNull : NSObject 4 | @end 5 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggerNull.m: -------------------------------------------------------------------------------- 1 | #import "LoggerNull.h" 2 | 3 | @implementation LoggerNull 4 | 5 | - (void) debug:(NSString*) message {} 6 | 7 | - (void) info:(NSString*) message {} 8 | 9 | - (void) warn:(NSString*) message {} 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggeriOS.h: -------------------------------------------------------------------------------- 1 | #import "OONILogger.h" 2 | 3 | /** LoggeriOS is a logger that logs with the iOS logging system. */ 4 | @interface LoggeriOS : NSObject 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Engine/LoggeriOS.m: -------------------------------------------------------------------------------- 1 | #import "LoggeriOS.h" 2 | #define TAG_ENGINE @"engine" 3 | 4 | @implementation LoggeriOS 5 | 6 | - (void) debug:(NSString*) message { 7 | NSLog(@"%@: debug: %@", TAG_ENGINE, message); 8 | } 9 | 10 | - (void) info:(NSString*) message { 11 | NSLog(@"%@: info: %@", TAG_ENGINE, message); 12 | } 13 | 14 | - (void) warn:(NSString*) message { 15 | NSLog(@"%@: warn: %@", TAG_ENGINE, message); 16 | } 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONICheckInResults.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "OONIURLInfo.h" 4 | 5 | @interface OONICheckInInfoWebConnectivity : NSObject 6 | 7 | - (id) initWithURLInfo:(OonimkallCheckInInfoWebConnectivity*)r; 8 | 9 | @property (nonatomic, strong) NSString *reportID; 10 | @property (nonatomic, strong) NSMutableArray *urls; 11 | 12 | @end 13 | 14 | /** CheckInInfo contains the return test objects from the checkin API. */ 15 | @interface OONICheckInResults : NSObject 16 | 17 | - (id) initWithResults:(OonimkallCheckInInfo*)r; 18 | 19 | @property (nonatomic, strong) OONICheckInInfoWebConnectivity* webConnectivity; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONICheckInResults.m: -------------------------------------------------------------------------------- 1 | #import "OONICheckInResults.h" 2 | 3 | @implementation OONICheckInResults 4 | 5 | - (id) initWithResults:(OonimkallCheckInInfo*)r { 6 | self = [super init]; 7 | if (self) { 8 | self.webConnectivity = [[OONICheckInInfoWebConnectivity alloc] initWithURLInfo:r.webConnectivity]; 9 | } 10 | return self; 11 | } 12 | 13 | @end 14 | 15 | @implementation OONICheckInInfoWebConnectivity 16 | 17 | - (id) initWithURLInfo:(OonimkallCheckInInfoWebConnectivity*)r { 18 | self = [super init]; 19 | if (self) { 20 | self.reportID = r.reportID; 21 | self.urls = [NSMutableArray new]; 22 | for (int i = 0; i < r.size; i++) { 23 | [self.urls addObject:[[OONIURLInfo alloc] initWithURLInfo:[r at:i]]]; 24 | } 25 | } 26 | return self; 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONIContext.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | /** OONIContext is the context for long running tasks. */ 5 | @interface OONIContext : NSObject 6 | 7 | @property (nonatomic, strong) OonimkallContext* ctx; 8 | 9 | - (id) initWithContext:(OonimkallContext*)ctx; 10 | - (void) cancel; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONIContext.m: -------------------------------------------------------------------------------- 1 | #import "OONIContext.h" 2 | 3 | @implementation OONIContext 4 | 5 | - (id) initWithContext:(OonimkallContext*)ctx { 6 | self = [super init]; 7 | if (self) { 8 | self.ctx = ctx; 9 | } 10 | return self; 11 | } 12 | 13 | - (void) cancel { 14 | [self.ctx cancel]; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONIGeolocateResults.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | /** OONIGeolocateResults contains the results of OONIGeolocateTask. */ 5 | @interface OONIGeolocateResults : NSObject 6 | 7 | /** ASN is the probe ASN. */ 8 | @property (nonatomic, strong) NSString* ASN; 9 | 10 | /** country is the probe country. */ 11 | @property (nonatomic, strong) NSString* country; 12 | 13 | /** IP is the probe IP. */ 14 | @property (nonatomic, strong) NSString* IP; 15 | 16 | /** org is the probe ASN organization. */ 17 | @property (nonatomic, strong) NSString* org; 18 | 19 | - (id) initWithResults:(OonimkallGeolocateResults*)r; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONIGeolocateResults.m: -------------------------------------------------------------------------------- 1 | #import "OONIGeolocateResults.h" 2 | 3 | @implementation OONIGeolocateResults 4 | 5 | - (id) initWithResults:(OonimkallGeolocateResults*)r { 6 | self = [super init]; 7 | if (self) { 8 | self.ASN = r.asn; 9 | self.country = r.country; 10 | self.IP = r.ip; 11 | self.org = r.org; 12 | } 13 | return self; 14 | } 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONILogger.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | /** OONILogger is the logger used by a OONISession. */ 5 | @protocol OONILogger 6 | 7 | /** debug emits a debug message */ 8 | - (void) debug:(NSString*) message; 9 | 10 | /** info emits an informational message */ 11 | - (void) info:(NSString*) message; 12 | 13 | /** warn emits a warning message */ 14 | - (void) warn:(NSString*) message; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONIMKTaskConfig.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | /** 4 | * OONIMKTaskConfig is the interface that any settings for MK-like tasks 5 | * must implement. It allows the engine to discover the name of the task 6 | * that we want to run and to obtain its serialization. 7 | */ 8 | @protocol OONIMKTaskConfig 9 | 10 | /** taskName returns the task name */ 11 | - (NSString*) taskName; 12 | 13 | /** 14 | * serialization returns the JSON serialization of the task config, which 15 | * must be compatible with Measurement Kit v0.9.0 specification. 16 | */ 17 | - (NSString*) serialization; 18 | 19 | /** 20 | * dictionary returns the NSDictionary object of the task config 21 | */ 22 | - (NSDictionary*) dictionary; 23 | 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONISessionConfig.m: -------------------------------------------------------------------------------- 1 | #import "OONISessionConfig.h" 2 | #import "PELoggerAdapter.h" 3 | 4 | @implementation OONISessionConfig 5 | 6 | - (OonimkallSessionConfig*) toOonimkallSessionConfig { 7 | OonimkallSessionConfig* c = [[OonimkallSessionConfig alloc] init]; 8 | c.assetsDir = self.assetsDir; 9 | c.logger = [[PELoggerAdapter alloc] initWithLogger:self.logger]; 10 | c.probeServicesURL = self.probeServicesURL; 11 | c.softwareName = self.softwareName; 12 | c.softwareVersion = self.softwareVersion; 13 | c.stateDir = self.stateDir; 14 | c.tempDir = self.tempDir; 15 | c.verbose = self.verbose; 16 | return c; 17 | } 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONISubmitResults.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | /** 5 | * OONISubmitResults contains the results of a single measurement submission 6 | * to the OONI backends using the OONI collector API. 7 | */ 8 | @interface OONISubmitResults : NSObject 9 | 10 | /** updatedMeasurement is a copy of the original measurement 11 | * in which the report ID has been updated. */ 12 | @property (nonatomic, strong) NSString* updatedMeasurement; 13 | 14 | /** updatedReportID returns the updated report ID. */ 15 | @property (nonatomic, strong) NSString* updatedReportID; 16 | 17 | - (id) initWithResults:(OonimkallSubmitMeasurementResults*)r; 18 | @end 19 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONISubmitResults.m: -------------------------------------------------------------------------------- 1 | #import "OONISubmitResults.h" 2 | 3 | @implementation OONISubmitResults 4 | 5 | - (id) initWithResults:(OonimkallSubmitMeasurementResults*)r { 6 | self = [super init]; 7 | if (self) { 8 | self.updatedMeasurement = r.updatedMeasurement; 9 | self.updatedReportID = r.updatedReportID; 10 | } 11 | return self; 12 | } 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONIURLInfo.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface OONIURLInfo : NSObject 5 | 6 | @property (nonatomic, strong) NSString *url; 7 | @property (nonatomic, strong) NSString *category_code; 8 | @property (nonatomic, strong) NSString *country_code; 9 | 10 | - (id) initWithURLInfo:(OonimkallURLInfo*)urlInfo; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/Engine/OONIURLInfo.m: -------------------------------------------------------------------------------- 1 | #import "OONIURLInfo.h" 2 | 3 | @implementation OONIURLInfo 4 | 5 | - (id) initWithURLInfo:(OonimkallURLInfo*)urlInfo { 6 | self = [super init]; 7 | if (self) { 8 | self.url = urlInfo.url; 9 | self.category_code = urlInfo.categoryCode; 10 | self.country_code = urlInfo.countryCode; 11 | } 12 | return self; 13 | } 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ooniprobe/Engine/PELoggerAdapter.h: -------------------------------------------------------------------------------- 1 | #import "OONILogger.h" 2 | 3 | @interface PELoggerAdapter : NSObject 4 | 5 | @property (nonatomic, strong) id logger; 6 | 7 | - (id)initWithLogger:(id)logger; 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /ooniprobe/Engine/PELoggerAdapter.m: -------------------------------------------------------------------------------- 1 | #import "PELoggerAdapter.h" 2 | 3 | @implementation PELoggerAdapter 4 | 5 | - (id)initWithLogger:(id)logger { 6 | self = [super init]; 7 | if (self) { 8 | self.logger = logger; 9 | } 10 | return self; 11 | } 12 | 13 | - (void) debug:(NSString*) message { 14 | [self.logger debug:message]; 15 | } 16 | 17 | - (void) info:(NSString*) message { 18 | [self.logger info:message]; 19 | } 20 | 21 | - (void) warn:(NSString*) message { 22 | [self.logger warn:message]; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ooniprobe/Engine/PEMKTask.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "OONIMKTask.h" 4 | 5 | @interface PEMKTask : NSObject 6 | 7 | - (id)initWithTask:(OonimkallTask*)task; 8 | 9 | @property (nonatomic, strong) OonimkallTask* task; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /ooniprobe/Engine/PEMKTask.m: -------------------------------------------------------------------------------- 1 | #import "PEMKTask.h" 2 | 3 | @implementation PEMKTask 4 | 5 | - (id)initWithTask:(OonimkallTask*)task { 6 | self = [super init]; 7 | if (self) { 8 | self.task = task; 9 | } 10 | return self; 11 | } 12 | 13 | - (BOOL) canInterrupt { 14 | return true; 15 | } 16 | 17 | - (void) interrupt { 18 | [self.task interrupt]; 19 | } 20 | 21 | - (BOOL) isDone { 22 | return [self.task isDone]; 23 | } 24 | 25 | - (NSDictionary*) waitForNextEvent:(NSError **)error { 26 | NSData *data = [[self.task waitForNextEvent] dataUsingEncoding:NSUTF8StringEncoding]; 27 | return [NSJSONSerialization JSONObjectWithData:data options:0 error:error]; 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /ooniprobe/Engine/PESession.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "OONISession.h" 4 | #import "OONISessionConfig.h" 5 | 6 | @interface PESession : NSObject 7 | 8 | - (id)initWithConfig:(OONISessionConfig *)config error:(NSError **)error; 9 | 10 | @property (nonatomic, strong) OonimkallSession* session; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/GUI/ConfigureButton.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface ConfigureButton : UIButton 5 | 6 | - (UIImage*)createSolidColorImageWithColor:(UIColor*)color andSize:(CGSize)size; 7 | 8 | @end 9 | 10 | -------------------------------------------------------------------------------- /ooniprobe/GUI/NavigationBarUtility.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface NavigationBarUtility : NSObject 5 | + (void)setDefaults; 6 | + (void)setNavigationBar:(UINavigationBar *)navigationBar; 7 | + (void)setNavigationBar:(UINavigationBar *)navigationBar color:(UIColor*)defaultColor; 8 | + (void)setBarTintColor:(UINavigationBar *)navigationBar color:(UIColor*)color; 9 | @end 10 | -------------------------------------------------------------------------------- /ooniprobe/GUI/PaddingLabel.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface PaddingLabel : UILabel 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/GUI/PaddingLabel.m: -------------------------------------------------------------------------------- 1 | #import "PaddingLabel.h" 2 | #define padding UIEdgeInsetsMake(5, 10, 5, 10) 3 | 4 | @implementation PaddingLabel 5 | //From https://stackoverflow.com/a/34333687/1187692 6 | 7 | - (void)drawTextInRect:(CGRect)rect { 8 | [super drawTextInRect:UIEdgeInsetsInsetRect(rect, padding)]; 9 | self.layer.masksToBounds = true; 10 | self.layer.cornerRadius = 8; 11 | } 12 | 13 | - (CGSize) intrinsicContentSize { 14 | CGSize superContentSize = [super intrinsicContentSize]; 15 | CGFloat width = superContentSize.width + padding.left + padding.right; 16 | CGFloat height = superContentSize.height + padding.top + padding.bottom; 17 | return CGSizeMake(width, height); 18 | } 19 | 20 | - (CGSize) sizeThatFits:(CGSize)size { 21 | CGSize superSizeThatFits = [super sizeThatFits:size]; 22 | CGFloat width = superSizeThatFits.width + padding.left + padding.right; 23 | CGFloat height = superSizeThatFits.height + padding.top + padding.bottom; 24 | return CGSizeMake(width, height); 25 | } 26 | @end 27 | -------------------------------------------------------------------------------- /ooniprobe/GUI/RunButton.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface RunButton : UIButton 5 | 6 | @end 7 | 8 | -------------------------------------------------------------------------------- /ooniprobe/GUI/RunButton.m: -------------------------------------------------------------------------------- 1 | #import "RunButton.h" 2 | 3 | @implementation RunButton 4 | 5 | - (id)initWithFrame:(CGRect)frame 6 | { 7 | self = [super initWithFrame:frame]; 8 | if (self) { 9 | [self commonInit]; 10 | } 11 | return self; 12 | } 13 | 14 | - (id)initWithCoder:(NSCoder *)aDecoder 15 | { 16 | self = [super initWithCoder:aDecoder]; 17 | if (self) { 18 | [self commonInit]; 19 | } 20 | return self; 21 | } 22 | 23 | - (void)commonInit 24 | { 25 | self.layer.cornerRadius = self.bounds.size.height/2; 26 | self.layer.masksToBounds = YES; 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-40.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-72.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-72@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-76.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-76@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-83.5@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small-50.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small-50@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/Icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/Icon@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon@3x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/NotificationIcon~ipad@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/AppIcon.appiconset/ios-marketing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/AppIcon.appiconset/ios-marketing.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "filename" : "iphone4.png", 7 | "extent" : "full-screen", 8 | "minimum-system-version" : "7.0", 9 | "scale" : "2x" 10 | }, 11 | { 12 | "extent" : "full-screen", 13 | "idiom" : "iphone", 14 | "subtype" : "retina4", 15 | "filename" : "iphone5.png", 16 | "minimum-system-version" : "7.0", 17 | "orientation" : "portrait", 18 | "scale" : "2x" 19 | }, 20 | { 21 | "orientation" : "portrait", 22 | "idiom" : "ipad", 23 | "filename" : "ipad.png", 24 | "extent" : "full-screen", 25 | "minimum-system-version" : "7.0", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "orientation" : "portrait", 30 | "idiom" : "ipad", 31 | "filename" : "ipad2.png", 32 | "extent" : "full-screen", 33 | "minimum-system-version" : "7.0", 34 | "scale" : "2x" 35 | } 36 | ], 37 | "info" : { 38 | "version" : 1, 39 | "author" : "xcode" 40 | } 41 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/LaunchImage.launchimage/ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/LaunchImage.launchimage/ipad.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/LaunchImage.launchimage/ipad2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/LaunchImage.launchimage/ipad2.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/LaunchImage.launchimage/iphone4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/LaunchImage.launchimage/iphone4.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/LaunchImage.launchimage/iphone5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/LaunchImage.launchimage/iphone5.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "close.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/close.imageset/close.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/close.imageset/close.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/dashboard/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/dashboard/dashboard-bg-navbar.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "navbar.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/dashboard/dashboard-bg-navbar.imageset/navbar.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/dashboard/dashboard-bg-navbar.imageset/navbar.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/dashboard/delete_forever.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "delete_forever.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/dashboard/delete_forever.imageset/delete_forever.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/dashboard/delete_forever.imageset/delete_forever.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/dashboard/settings_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "settings_icon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/dashboard/settings_icon.imageset/settings_icon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/dashboard/settings_icon.imageset/settings_icon.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/dots_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "dots_1.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/dots_1.imageset/dots_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/onboarding/dots_1.imageset/dots_1.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/dots_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "dots_2.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/dots_2.imageset/dots_2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/onboarding/dots_2.imageset/dots_2.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/dots_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "dots_3.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/dots_3.imageset/dots_3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/onboarding/dots_3.imageset/dots_3.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/onboarding_1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "onboarding_1.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/onboarding_1.imageset/onboarding_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/onboarding/onboarding_1.imageset/onboarding_1.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/onboarding_2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "onboarding_2.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/onboarding_2.imageset/onboarding_2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/onboarding/onboarding_2.imageset/onboarding_2.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/onboarding_3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "onboarding_3.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/onboarding/onboarding_3.imageset/onboarding_3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/onboarding/onboarding_3.imageset/onboarding_3.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/ooni_empty_state.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ooni_empty_state.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/ooni_empty_state.imageset/ooni_empty_state.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/ooni_empty_state.imageset/ooni_empty_state.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/ooni_logo_round.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "ooni_logo@2x.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "filename" : "ooni_logo@3x.png", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/ooni_logo_round.imageset/ooni_logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/ooni_logo_round.imageset/ooni_logo@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/ooni_logo_round.imageset/ooni_logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/ooni_logo_round.imageset/ooni_logo@3x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/ooni_probe_logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ooni_probe_logo.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/ooni_probe_logo.imageset/ooni_probe_logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/ooni_probe_logo.imageset/ooni_probe_logo.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/oonirun/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/oonirun/question_mark.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "question_mark.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/oonirun/question_mark.imageset/question_mark.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/oonirun/question_mark.imageset/question_mark.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/oonirun/update.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "update.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/oonirun/update.imageset/update.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/oonirun/update.imageset/update.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/about_ooni.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "about_ooni.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/about_ooni.imageset/about_ooni.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/about_ooni.imageset/about_ooni.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/advanced.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "advanced.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/advanced.imageset/advanced.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/advanced.imageset/advanced.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/automated_testing.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "automated_testing.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/automated_testing.imageset/automated_testing.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/automated_testing.imageset/automated_testing.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/backArrow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "backArrow.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "backArrow@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "backArrow@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/backArrow.imageset/backArrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/backArrow.imageset/backArrow.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/backArrow.imageset/backArrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/backArrow.imageset/backArrow@2x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/backArrow.imageset/backArrow@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/backArrow.imageset/backArrow@3x.png -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/help.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "help.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/help.imageset/help.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/help.imageset/help.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/minus_circle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "minus_circle.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/minus_circle.imageset/minus_circle.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/minus_circle.imageset/minus_circle.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/notifications.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "notifications.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/notifications.imageset/notifications.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/notifications.imageset/notifications.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/ooni_backend_proxy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "ooni_backend_proxy.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/ooni_backend_proxy.imageset/ooni_backend_proxy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/ooni_backend_proxy.imageset/ooni_backend_proxy.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/ooni_logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ooni_logo.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/ooni_logo.imageset/ooni_logo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/ooni_logo.imageset/ooni_logo.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/privacy.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "privacy.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/privacy.imageset/privacy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/privacy.imageset/privacy.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/send_email.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "send_email.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/send_email.imageset/send_email.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/send_email.imageset/send_email.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/sharing.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "sharing.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/sharing.imageset/sharing.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/sharing.imageset/sharing.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/test_options.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "test_options.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/settings/test_options.imageset/test_options.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/settings/test_options.imageset/test_options.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_dashboard.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tab_dashboard.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_dashboard.imageset/tab_dashboard.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tabs/tab_dashboard.imageset/tab_dashboard.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_feed.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tab_feed.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_feed.imageset/tab_feed.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tabs/tab_feed.imageset/tab_feed.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_settings.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tab_settings.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_settings.imageset/tab_settings.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tabs/tab_settings.imageset/tab_settings.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_test_results.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tab_test_results.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tabs/tab_test_results.imageset/tab_test_results.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tabs/tab_test_results.imageset/tab_test_results.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/data_usage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "data_usage.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/data_usage.imageset/data_usage.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/data_usage.imageset/data_usage.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/date_and_time.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "date_and_time.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/date_and_time.imageset/date_and_time.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/date_and_time.imageset/date_and_time.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/download.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "download.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/download.imageset/download.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/download.imageset/download.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/download_nopad.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "download_nopad.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/download_nopad.imageset/download_nopad.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/download_nopad.imageset/download_nopad.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/error.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "error.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/exclamation_point.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "exclamation_point.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/exclamation_point.imageset/exclamation_point.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/exclamation_point.imageset/exclamation_point.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/globe.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "globe.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/globe.imageset/globe.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/globe.imageset/globe.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/more_icon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "more_icon.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/more_icon.imageset/more_icon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/more_icon.imageset/more_icon.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/network.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "network.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/network.imageset/network.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/network.imageset/network.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/not_uploaded.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "not_uploaded.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/not_uploaded.imageset/not_uploaded.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/not_uploaded.imageset/not_uploaded.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/ooni_bw.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ooni_bw.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/ooni_bw.imageset/ooni_bw.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/ooni_bw.imageset/ooni_bw.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/reload.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "reload.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/reload.imageset/reload.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/reload.imageset/reload.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/runtime.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "runtime.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/runtime.imageset/runtime.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/runtime.imageset/runtime.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/tick.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tick.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/tick.imageset/tick.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/tick.imageset/tick.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/upload.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "upload.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/upload.imageset/upload.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/upload.imageset/upload.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/upload_nopad.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "upload_nopad.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/upload_nopad.imageset/upload_nopad.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/upload_nopad.imageset/upload_nopad.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/video_quality.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "video_quality.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/test_results/video_quality.imageset/video_quality.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/test_results/video_quality.imageset/video_quality.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/circumvention.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "circumvention.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/circumvention.imageset/circumvention.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/circumvention.imageset/circumvention.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/experimental.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "experimental.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/experimental.imageset/experimental.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/experimental.imageset/experimental.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/experimental_x.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "experimental.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/experimental_x.imageset/experimental.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/experimental_x.imageset/experimental.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/facebook_messenger.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "facebook_messenger.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/facebook_messenger.imageset/facebook_messenger.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/facebook_messenger.imageset/facebook_messenger.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/instant_messaging.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "instant_messaging.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/instant_messaging.imageset/instant_messaging.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/instant_messaging.imageset/instant_messaging.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/middle_boxes.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "middle_boxes.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/middle_boxes.imageset/middle_boxes.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/middle_boxes.imageset/middle_boxes.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/performance.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "performance.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/performance.imageset/performance.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/performance.imageset/performance.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/psiphon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "psiphon.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/psiphon.imageset/psiphon.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/psiphon.imageset/psiphon.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/riseupvpn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "riseupvpn.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/riseupvpn.imageset/riseupvpn.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/riseupvpn.imageset/riseupvpn.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/signal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "signal.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/signal.imageset/signal.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/signal.imageset/signal.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/telegram.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "telegram.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/telegram.imageset/telegram.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/telegram.imageset/telegram.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/tor.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "tor.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/tor.imageset/tor.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/tor.imageset/tor.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/websites.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "websites.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/websites.imageset/websites.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/websites.imageset/websites.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/whatsapp.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "whatsapp.pdf", 5 | "idiom" : "universal" 6 | } 7 | ], 8 | "info" : { 9 | "author" : "xcode", 10 | "version" : 1 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/tests/whatsapp.imageset/whatsapp.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/tests/whatsapp.imageset/whatsapp.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ALDR.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_ALDR.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ALDR.imageset/category_ALDR.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_ALDR.imageset/category_ALDR.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ANON.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_ANON.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ANON.imageset/category_ANON.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_ANON.imageset/category_ANON.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_COMM.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_COMM.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_COMM.imageset/category_COMM.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_COMM.imageset/category_COMM.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_COMT.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_COMT.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_COMT.imageset/category_COMT.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_COMT.imageset/category_COMT.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_CTRL.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_CTRL.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_CTRL.imageset/category_CTRL.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_CTRL.imageset/category_CTRL.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_CULTR.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_CULTR.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_CULTR.imageset/category_CULTR.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_CULTR.imageset/category_CULTR.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_DATE.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_DATE.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_DATE.imageset/category_DATE.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_DATE.imageset/category_DATE.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ECON.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_ECON.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ECON.imageset/category_ECON.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_ECON.imageset/category_ECON.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ENV.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_ENV.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_ENV.imageset/category_ENV.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_ENV.imageset/category_ENV.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_FILE.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_FILE.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_FILE.imageset/category_FILE.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_FILE.imageset/category_FILE.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GAME.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_GAME.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GAME.imageset/category_GAME.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_GAME.imageset/category_GAME.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GMB.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_GMB.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GMB.imageset/category_GMB.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_GMB.imageset/category_GMB.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GOVT.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_GOVT.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GOVT.imageset/category_GOVT.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_GOVT.imageset/category_GOVT.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GRP.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_GRP.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_GRP.imageset/category_GRP.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_GRP.imageset/category_GRP.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HACK.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_HACK.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HACK.imageset/category_HACK.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_HACK.imageset/category_HACK.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HATE.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_HATE.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HATE.imageset/category_HATE.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_HATE.imageset/category_HATE.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HOST.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_HOST.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HOST.imageset/category_HOST.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_HOST.imageset/category_HOST.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HUMR.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_HUMR.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_HUMR.imageset/category_HUMR.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_HUMR.imageset/category_HUMR.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_IGO.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_IGO.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_IGO.imageset/category_IGO.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_IGO.imageset/category_IGO.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_LGBT.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_LGBT.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_LGBT.imageset/category_LGBT.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_LGBT.imageset/category_LGBT.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_MILX.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_MILX.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_MILX.imageset/category_MILX.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_MILX.imageset/category_MILX.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_MISC.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_MISC.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_MISC.imageset/category_MISC.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_MISC.imageset/category_MISC.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_MMED.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_MMED.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_MMED.imageset/category_MMED.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_MMED.imageset/category_MMED.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_NEWS.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_NEWS.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_NEWS.imageset/category_NEWS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_NEWS.imageset/category_NEWS.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_POLR.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_POLR.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_POLR.imageset/category_POLR.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_POLR.imageset/category_POLR.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_PORN.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_PORN.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_PORN.imageset/category_PORN.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_PORN.imageset/category_PORN.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_PROV.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_PROV.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_PROV.imageset/category_PROV.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_PROV.imageset/category_PROV.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_PUBH.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_PUBH.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_PUBH.imageset/category_PUBH.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_PUBH.imageset/category_PUBH.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_REL.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_REL.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_REL.imageset/category_REL.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_REL.imageset/category_REL.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_SRCH.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_SRCH.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_SRCH.imageset/category_SRCH.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_SRCH.imageset/category_SRCH.pdf -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_XED.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "category_XED.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "template" 14 | } 15 | } -------------------------------------------------------------------------------- /ooniprobe/Images.xcassets/website_categories/category_XED.imageset/category_XED.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Images.xcassets/website_categories/category_XED.imageset/category_XED.pdf -------------------------------------------------------------------------------- /ooniprobe/Model/Database/Network.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface Network : SRKObject 5 | 6 | @property (strong, nonatomic) NSString *network_name; 7 | @property (strong, nonatomic) NSString *ip; 8 | @property (strong, nonatomic) NSString *asn; 9 | @property (strong, nonatomic) NSString *country_code; 10 | @property (strong, nonatomic) NSString *network_type; 11 | 12 | + (Network*)checkExistingNetworkWithAsn:(NSString*)asn networkName:(NSString*)network_name ip:(NSString*)ip cc:(NSString*)country_code networkType:(NSString*)network_type; 13 | - (NSString*)getAsn; 14 | - (NSString*)getNetworkName; 15 | - (NSString*)getNetworkNameOrAsn; 16 | - (NSString*)getCountry; 17 | @end 18 | -------------------------------------------------------------------------------- /ooniprobe/Model/Database/Url.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface Url : SRKObject 5 | @property (strong, nonatomic) NSString *url; 6 | @property (strong, nonatomic) NSString *category_code; 7 | @property (strong, nonatomic) NSString *country_code; 8 | 9 | - (id)initWithUrl:(NSString*)url category:(NSString*)categoryCode country:(NSString*)countryCode; 10 | - (id)initWithUrl:(NSString*)url; 11 | + (Url*)getUrl:(NSString*)url; 12 | + (Url*)checkExistingUrl:(NSString*)input categoryCode:(NSString*)categoryCode countryCode:(NSString*)countryCode; 13 | + (Url*)checkExistingUrl:(NSString*)input; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Advanced.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | __deprecated 4 | @interface Advanced : NSObject 5 | @property (nonatomic, strong) NSNumber *packet_loss; 6 | @property (nonatomic, strong) NSNumber *avg_rtt; 7 | @property (nonatomic, strong) NSNumber *max_rtt; 8 | @property (nonatomic, strong) NSNumber *mss; 9 | @end 10 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Advanced.m: -------------------------------------------------------------------------------- 1 | #import "Advanced.h" 2 | 3 | @implementation Advanced 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/EventResult.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Value.h" 3 | 4 | @interface EventResult : NSObject 5 | 6 | @property (nonatomic, strong) NSString *key; 7 | @property (nonatomic, strong) Value *value; 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/EventResult.m: -------------------------------------------------------------------------------- 1 | #import "EventResult.h" 2 | 3 | @implementation EventResult 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/GatewayConnection.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface GatewayConnection : NSObject 4 | 5 | @property (nonatomic, strong) NSString *ip; 6 | @property (nonatomic, strong) NSNumber *port; 7 | @property (nonatomic, strong) NSString *transport_type; 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/GatewayConnection.m: -------------------------------------------------------------------------------- 1 | #import "GatewayConnection.h" 2 | 3 | @implementation GatewayConnection 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/JsonResult.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "ObjectMapper.h" 3 | #import "InCodeMappingProvider.h" 4 | #import "NSObject+ObjectMapper.h" 5 | #import "TestKeys.h" 6 | #import "InCodeMappingProvider.h" 7 | 8 | @interface JsonResult : NSObject 9 | @property (nonatomic, strong) NSDate *test_start_time; 10 | @property (nonatomic, strong) NSDate *measurement_start_time; 11 | @property (nonatomic, strong) NSNumber *test_runtime; 12 | @property (nonatomic, strong) NSString *input; 13 | @property (nonatomic, strong) NSString *report_id; 14 | @property (nonatomic, strong) TestKeys *test_keys; 15 | @end 16 | 17 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/JsonResult.m: -------------------------------------------------------------------------------- 1 | #import "JsonResult.h" 2 | 3 | @implementation JsonResult 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Server.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface Server : NSObject 4 | @property (nonatomic, strong) NSString *hostname; 5 | @property (nonatomic, strong) NSString *site; 6 | @end 7 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Server.m: -------------------------------------------------------------------------------- 1 | #import "Server.h" 2 | 3 | @implementation Server 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Simple.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | //DASHSummary and NDT5Summary 4 | @interface Simple : NSObject 5 | @property (nonatomic, strong) NSNumber *upload; 6 | @property (nonatomic, strong) NSNumber *download; 7 | @property (nonatomic, strong) NSNumber *ping; 8 | @property (nonatomic, strong) NSNumber *median_bitrate; 9 | @property (nonatomic, strong) NSNumber *min_playout_delay; 10 | @end 11 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Simple.m: -------------------------------------------------------------------------------- 1 | #import "Simple.h" 2 | 3 | @implementation Simple 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Summary.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface Summary : NSObject 4 | @property (nonatomic, strong) NSNumber *upload; 5 | @property (nonatomic, strong) NSNumber *download; 6 | @property (nonatomic, strong) NSNumber *ping; 7 | @property (nonatomic, strong) NSNumber *max_rtt; 8 | @property (nonatomic, strong) NSNumber *avg_rtt; 9 | @property (nonatomic, strong) NSNumber *min_rtt; 10 | @property (nonatomic, strong) NSNumber *mss; 11 | @property (nonatomic, strong) NSNumber *retransmit_rate; 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Summary.m: -------------------------------------------------------------------------------- 1 | #import "Summary.h" 2 | 3 | @implementation Summary 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Tampering.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface Tampering : NSObject 4 | -(id)initWithValue:(id)currentValue; 5 | @property (nonatomic) BOOL value; 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Value.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface Value : NSObject 4 | @property (nonatomic, strong) NSNumber *key; 5 | @property (nonatomic, strong) NSString *message; 6 | @property (nonatomic, strong) NSNumber *percentage; 7 | @property (nonatomic, strong) NSString *json_str; 8 | @property (nonatomic, strong) NSNumber *idx; 9 | @property (nonatomic, strong) NSString *report_id; 10 | @property (nonatomic, strong) NSString *probe_ip; 11 | @property (nonatomic, strong) NSString *probe_asn; 12 | @property (nonatomic, strong) NSString *probe_cc; 13 | @property (nonatomic, strong) NSString *probe_network_name; 14 | @property (nonatomic, strong) NSNumber *downloaded_kb; 15 | @property (nonatomic, strong) NSNumber *uploaded_kb; 16 | @property (nonatomic, strong) NSString *input; 17 | @property (nonatomic, strong) NSString *failure; 18 | @property (nonatomic, strong) NSString *orig_key; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ooniprobe/Model/JsonResult/Value.m: -------------------------------------------------------------------------------- 1 | #import "Value.h" 2 | 3 | @implementation Value 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Model/Settings/Options.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface Options : NSObject 4 | @property (nonatomic, strong) NSNumber *max_runtime; 5 | @property (nonatomic, strong) NSNumber *no_collector; 6 | @property (nonatomic, strong) NSString *software_name; 7 | @property (nonatomic, strong) NSString *software_version; 8 | @property (nonatomic, strong) NSString *probe_services_base_url; 9 | @end 10 | -------------------------------------------------------------------------------- /ooniprobe/Model/Settings/Options.m: -------------------------------------------------------------------------------- 1 | #import "Options.h" 2 | #import "SettingsUtility.h" 3 | #import "VersionUtility.h" 4 | 5 | @implementation Options 6 | 7 | - (id)init { 8 | self = [super init]; 9 | if (self) { 10 | BOOL upload_results = [SettingsUtility getSettingWithName:@"upload_results"]; 11 | NSString *software_version = [VersionUtility get_software_version]; 12 | self.no_collector = [NSNumber numberWithBool:!upload_results]; 13 | self.software_name = SOFTWARE_NAME; 14 | self.software_version = software_version; 15 | } 16 | return self; 17 | } 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ooniprobe/Model/Settings/Settings.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Options.h" 3 | #import "ObjectMapper.h" 4 | #import "NSObject+ObjectMapper.h" 5 | #import "OONIMKTaskConfig.h" 6 | 7 | @interface Settings : NSObject 8 | @property (nonatomic, strong) NSMutableDictionary *annotations; 9 | @property (nonatomic, strong) NSArray *disabled_events; 10 | @property (nonatomic, strong) NSArray *inputs; 11 | @property (nonatomic, strong) NSString *log_level; 12 | @property (nonatomic, strong) NSString *name; 13 | @property (nonatomic, strong) NSString *assets_dir; 14 | @property (nonatomic, strong) NSString *state_dir; 15 | @property (nonatomic, strong) NSString *temp_dir; 16 | @property (nonatomic, strong) NSNumber *version; 17 | @property (nonatomic, strong) Options *options; 18 | @property (nonatomic, strong) NSString *proxy; 19 | @property (nonatomic, strong) NSString *tunnel_dir; 20 | 21 | @end 22 | 23 | -------------------------------------------------------------------------------- /ooniprobe/Notifications/ReachabilityManager.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Reachability.h" 3 | 4 | @interface ReachabilityManager : NSObject 5 | 6 | @property (strong, nonatomic) Reachability *reachability; 7 | + (ReachabilityManager *)sharedManager; 8 | - (NSString*)getStatus; 9 | - (BOOL)noInternetAccess; 10 | - (BOOL)isWifi; 11 | - (BOOL)isVPNConnected; 12 | - (float)getBatteryLevel; 13 | @end 14 | -------------------------------------------------------------------------------- /ooniprobe/Resources/fonts/FiraSans-Italic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Resources/fonts/FiraSans-Italic.otf -------------------------------------------------------------------------------- /ooniprobe/Resources/fonts/FiraSans-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Resources/fonts/FiraSans-Light.otf -------------------------------------------------------------------------------- /ooniprobe/Resources/fonts/FiraSans-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Resources/fonts/FiraSans-LightItalic.otf -------------------------------------------------------------------------------- /ooniprobe/Resources/fonts/FiraSans-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Resources/fonts/FiraSans-Regular.otf -------------------------------------------------------------------------------- /ooniprobe/Resources/fonts/FiraSans-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Resources/fonts/FiraSans-SemiBold.otf -------------------------------------------------------------------------------- /ooniprobe/Resources/fonts/FiraSans-SemiBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ooni/probe-ios/103590611aff04de26b05ae1db9724bb9a779d24/ooniprobe/Resources/fonts/FiraSans-SemiBoldItalic.otf -------------------------------------------------------------------------------- /ooniprobe/Test/RunningTest.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Suite.h" 3 | #import "Tests.h" 4 | 5 | NS_ASSUME_NONNULL_BEGIN 6 | 7 | @interface RunningTest : NSObject 8 | 9 | + (RunningTest *) currentTest; 10 | 11 | - (void)clearSuites; 12 | - (void)runTest; 13 | - (void)networkTestEnded; 14 | - (void)setAndRun:(NSMutableArray*)testSuites inView:(UIViewController *)view; 15 | @property (nonatomic, strong) NSMutableArray *testSuites; 16 | @property (nonatomic, strong) AbstractSuite *testSuite; 17 | @property (nonatomic, strong) AbstractTest *testRunning; 18 | @property (nonatomic) BOOL isTestRunning; 19 | @property (nonatomic) NSMutableArray *iTestSuites; 20 | 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/AbstractSuite.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Result.h" 3 | #import "AbstractTest.h" 4 | #import "Tests.h" 5 | #import "SettingsUtility.h" 6 | #import "MessageUtility.h" 7 | #import "Url.h" 8 | 9 | @interface AbstractSuite : NSObject 10 | @property NSString *name; 11 | @property NSString *dataUsage; 12 | @property Result *result; 13 | @property NSMutableArray *testList; 14 | @property int measurementIdx; 15 | @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 16 | @property BOOL interrupted; 17 | @property BOOL storeDB; 18 | @property BOOL autoRun; 19 | @property float totalTests; 20 | 21 | -(id)initSuite:(NSString*)testSuite; 22 | -(void)testEnded:(AbstractTest*)test; 23 | -(void)runTestSuite; 24 | -(NSArray*)getTestList; 25 | -(void)newResult; 26 | -(int)getRuntime; 27 | @end 28 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/CircumventionSuite.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AbstractSuite.h" 3 | 4 | @interface CircumventionSuite : AbstractSuite 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/CircumventionSuite.m: -------------------------------------------------------------------------------- 1 | #import "CircumventionSuite.h" 2 | 3 | @implementation CircumventionSuite 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.dataUsage = @"< 1 MB"; 9 | self.name = @"circumvention"; 10 | } 11 | return self; 12 | } 13 | 14 | - (NSArray*)getTestList { 15 | if ([self.testList count] == 0){ 16 | if ([SettingsUtility getSettingWithName:@"test_psiphon"]) 17 | [self.testList addObject:[[Psiphon alloc] init]]; 18 | if ([SettingsUtility getSettingWithName:@"test_tor"]) 19 | [self.testList addObject:[[Tor alloc] init]]; 20 | if ([SettingsUtility getSettingWithName:@"test_riseupvpn"]) 21 | [self.testList addObject:[[RiseupVPN alloc] init]]; 22 | } 23 | return super.getTestList; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/ExperimentalSuite.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AbstractSuite.h" 3 | 4 | @interface ExperimentalSuite : AbstractSuite 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/ExperimentalSuite.m: -------------------------------------------------------------------------------- 1 | #import "ExperimentalSuite.h" 2 | 3 | @implementation ExperimentalSuite 4 | 5 | - (id)init { 6 | self = [super init]; 7 | if (self) { 8 | self.dataUsage = NSLocalizedString(@"TestResults.NotAvailable", nil); 9 | self.name = @"experimental"; 10 | } 11 | return self; 12 | } 13 | 14 | - (NSArray *)getTestList { 15 | if ([self.testList count] == 0) { 16 | if ([SettingsUtility isExperimentalTestEnabled]) { 17 | [self.testList addObject:[[Experimental alloc] initWithName:@"stunreachability"]]; 18 | [self.testList addObject:[[Experimental alloc] initWithName:@"openvpn"]]; 19 | [self.testList addObject:[[Experimental alloc] initWithName:@"echcheck"]]; 20 | if ([SettingsUtility isLongRunningTestsInForegroundEnabled] || self.autoRun) { 21 | [self.testList addObject:[[Experimental alloc] initWithName:@"torsf"]]; 22 | [self.testList addObject:[[Experimental alloc] initWithName:@"vanilla_tor"]]; 23 | } 24 | } 25 | } 26 | return super.getTestList; 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/InstantMessagingSuite.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AbstractSuite.h" 3 | 4 | @interface InstantMessagingSuite : AbstractSuite 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/InstantMessagingSuite.m: -------------------------------------------------------------------------------- 1 | #import "InstantMessagingSuite.h" 2 | 3 | @implementation InstantMessagingSuite 4 | -(id) init { 5 | self = [super init]; 6 | if (self) { 7 | self.dataUsage = @"< 1 MB"; 8 | self.name = @"instant_messaging"; 9 | } 10 | return self; 11 | } 12 | 13 | 14 | - (NSArray*)getTestList { 15 | if ([self.testList count] == 0){ 16 | if ([SettingsUtility getSettingWithName:@"test_whatsapp"]) 17 | [self.testList addObject:[[Whatsapp alloc] init]]; 18 | if ([SettingsUtility getSettingWithName:@"test_telegram"]) 19 | [self.testList addObject:[[Telegram alloc] init]]; 20 | if ([SettingsUtility getSettingWithName:@"test_facebook_messenger"]) 21 | [self.testList addObject:[[FacebookMessenger alloc] init]]; 22 | if ([SettingsUtility getSettingWithName:@"test_signal"]) 23 | [self.testList addObject:[[Signal alloc] init]]; 24 | } 25 | return super.getTestList; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/MiddleBoxesSuite.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AbstractSuite.h" 3 | 4 | /** 5 | * @deprecated 6 | * It is not possible to run a MiddleBoxesSuite anymore 7 | * The HttpHeaderFieldManipulation and HttpInvalidRequestLine tests 8 | * are being ran inside the PerformanceSuite 9 | */ 10 | __deprecated 11 | @interface MiddleBoxesSuite : AbstractSuite 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/MiddleBoxesSuite.m: -------------------------------------------------------------------------------- 1 | #import "MiddleBoxesSuite.h" 2 | 3 | @implementation MiddleBoxesSuite 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.dataUsage = @"< 1 MB"; 9 | self.name = @"middle_boxes"; 10 | } 11 | return self; 12 | } 13 | 14 | - (NSArray*)getTestList { 15 | if ([self.testList count] == 0){ 16 | if ([SettingsUtility getSettingWithName:@"run_http_invalid_request_line"]) 17 | [self.testList addObject:[[HttpInvalidRequestLine alloc] init]]; 18 | if ([SettingsUtility getSettingWithName:@"run_http_header_field_manipulation"]) 19 | [self.testList addObject:[[HttpHeaderFieldManipulation alloc] init]]; 20 | } 21 | return super.getTestList; 22 | } 23 | @end 24 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/PerformanceSuite.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AbstractSuite.h" 3 | 4 | @interface PerformanceSuite : AbstractSuite 5 | 6 | @end 7 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/PerformanceSuite.m: -------------------------------------------------------------------------------- 1 | #import "PerformanceSuite.h" 2 | 3 | @implementation PerformanceSuite 4 | 5 | 6 | -(id) init { 7 | self = [super init]; 8 | if (self) { 9 | self.dataUsage = @"5 - 200 MB"; 10 | self.name = @"performance"; 11 | } 12 | return self; 13 | } 14 | 15 | - (NSArray*)getTestList { 16 | if ([self.testList count] == 0){ 17 | if ([SettingsUtility getSettingWithName:@"run_ndt"] && !self.autoRun) 18 | [self.testList addObject:[[NdtTest alloc] init]]; 19 | if ([SettingsUtility getSettingWithName:@"run_dash"] && !self.autoRun) 20 | [self.testList addObject:[[Dash alloc] init]]; 21 | if ([SettingsUtility getSettingWithName:@"run_http_invalid_request_line"]) 22 | [self.testList addObject:[[HttpInvalidRequestLine alloc] init]]; 23 | if ([SettingsUtility getSettingWithName:@"run_http_header_field_manipulation"]) 24 | [self.testList addObject:[[HttpHeaderFieldManipulation alloc] init]]; 25 | } 26 | return super.getTestList; 27 | } 28 | @end 29 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/Suite.h: -------------------------------------------------------------------------------- 1 | #import "AbstractSuite.h" 2 | #import "WebsitesSuite.h" 3 | #import "InstantMessagingSuite.h" 4 | #import "MiddleBoxesSuite.h" 5 | #import "PerformanceSuite.h" 6 | #import "CircumventionSuite.h" 7 | #import "ExperimentalSuite.h" 8 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/WebsitesSuite.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AbstractSuite.h" 3 | 4 | @interface WebsitesSuite : AbstractSuite 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Suite/WebsitesSuite.m: -------------------------------------------------------------------------------- 1 | #import "WebsitesSuite.h" 2 | 3 | @implementation WebsitesSuite 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.dataUsage = @"~ 8 MB"; 9 | self.name = @"websites"; 10 | } 11 | return self; 12 | } 13 | 14 | - (NSArray*)getTestList { 15 | if ([self.testList count] == 0 && [SettingsUtility getNumberCategoriesEnabled] > 0){ 16 | [self.testList addObject:[[WebConnectivity alloc] init]]; 17 | } 18 | return super.getTestList; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Dash.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface Dash : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Dash.m: -------------------------------------------------------------------------------- 1 | #import "Dash.h" 2 | 3 | @implementation Dash : AbstractTest 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"dash"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | /* 20 | onEntry method for dash test, check "failure" key 21 | !=null => failed 22 | */ 23 | measurement.is_failed = json.test_keys.failure == NULL ? false : true; 24 | [super onEntry:json obj:measurement]; 25 | } 26 | 27 | -(int)getRuntime{ 28 | return 45; 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Experimental.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface Experimental : AbstractTest 4 | -(id) initWithName:(NSString*)name; 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Experimental.m: -------------------------------------------------------------------------------- 1 | #import "Experimental.h" 2 | 3 | @implementation Experimental 4 | 5 | -(id) initWithName:(NSString*)name { 6 | self = [super init]; 7 | if (self) { 8 | self.name = name; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | [super onEntry:json obj:measurement]; 20 | } 21 | 22 | -(int)getRuntime{ 23 | return 30; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/FacebookMessenger.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface FacebookMessenger : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/FacebookMessenger.m: -------------------------------------------------------------------------------- 1 | #import "FacebookMessenger.h" 2 | 3 | @implementation FacebookMessenger : AbstractTest 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"facebook_messenger"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | /* 19 | if "facebook_tcp_blocking", "facebook_dns_blocking" are null => failed 20 | if "facebook_tcp_blocking" or "facebook_dns_blocking" are true => anomalous 21 | */ 22 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 23 | //set anomaly if either "facebook_tcp_blocking" or "facebook_dns_blocking" is true 24 | if (json.test_keys.facebook_tcp_blocking == NULL || json.test_keys.facebook_dns_blocking == NULL) 25 | [measurement setIs_failed:true]; 26 | else 27 | measurement.is_anomaly = [json.test_keys.facebook_tcp_blocking boolValue] || [json.test_keys.facebook_dns_blocking boolValue]; 28 | [super onEntry:json obj:measurement]; 29 | } 30 | 31 | -(int)getRuntime{ 32 | return 10; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/HttpHeaderFieldManipulation.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface HttpHeaderFieldManipulation : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/HttpHeaderFieldManipulation.m: -------------------------------------------------------------------------------- 1 | #import "HttpHeaderFieldManipulation.h" 2 | 3 | @implementation HttpHeaderFieldManipulation : AbstractTest 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"http_header_field_manipulation"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | /* 20 | onEntry method for http header field manipulation test, check "failure" key 21 | null => failed 22 | true => anomalous 23 | then the keys in the "tampering" object will be checked, if any of them is not null and TRUE, then test is anomalous 24 | tampering { 25 | header_field_name 26 | header_field_number 27 | header_field_value 28 | header_name_capitalization 29 | request_line_capitalization 30 | total 31 | } 32 | */ 33 | if (json.test_keys.failure != NULL && json.test_keys.tampering == NULL) 34 | [measurement setIs_failed:true]; 35 | else 36 | measurement.is_anomaly = json.test_keys.tampering.value; 37 | [super onEntry:json obj:measurement]; 38 | } 39 | 40 | -(int)getRuntime{ 41 | return 5; 42 | } 43 | 44 | @end 45 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/HttpInvalidRequestLine.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface HttpInvalidRequestLine : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/HttpInvalidRequestLine.m: -------------------------------------------------------------------------------- 1 | #import "HttpInvalidRequestLine.h" 2 | 3 | @implementation HttpInvalidRequestLine : AbstractTest 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"http_invalid_request_line"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | /* 20 | onEntry method for http invalid request line test, check "tampering" key 21 | null => failed 22 | true => anomalous 23 | */ 24 | if (json.test_keys.tampering == NULL) 25 | [measurement setIs_failed:true]; 26 | else 27 | measurement.is_anomaly = json.test_keys.tampering.value; 28 | [super onEntry:json obj:measurement]; 29 | } 30 | 31 | -(int)getRuntime{ 32 | return 10; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/NdtTest.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface NdtTest : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/NdtTest.m: -------------------------------------------------------------------------------- 1 | #import "NdtTest.h" 2 | 3 | @implementation NdtTest : AbstractTest 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"ndt"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | /* 20 | onEntry method for ndt test, check "failure" key 21 | !=null => failed 22 | */ 23 | measurement.is_failed = json.test_keys.failure == NULL ? false : true; 24 | [self calculateServerName:json]; 25 | [super onEntry:json obj:measurement]; 26 | } 27 | 28 | -(void)calculateServerName:(JsonResult*)json{ 29 | NSString *site = [json.test_keys.server.site substringToIndex:3]; 30 | NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Airports" ofType:@"plist"]; 31 | NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath]; 32 | if ([dict objectForKey:site]){ 33 | json.test_keys.server_name = json.test_keys.server.site; 34 | json.test_keys.server_country = [dict objectForKey:site]; 35 | } 36 | } 37 | 38 | -(int)getRuntime{ 39 | return 45; 40 | } 41 | 42 | @end 43 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Psiphon.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface Psiphon : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Psiphon.m: -------------------------------------------------------------------------------- 1 | #import "Psiphon.h" 2 | 3 | @implementation Psiphon 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"psiphon"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | if (json.test_keys == NULL) { 20 | measurement.is_failed = true; 21 | return; 22 | } 23 | measurement.is_anomaly = json.test_keys.failure == NULL ? false : true; 24 | [super onEntry:json obj:measurement]; 25 | } 26 | 27 | -(int)getRuntime{ 28 | return 20; 29 | } 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/RiseupVPN.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface RiseupVPN : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/RiseupVPN.m: -------------------------------------------------------------------------------- 1 | #import "RiseupVPN.h" 2 | 3 | @implementation RiseupVPN 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"riseupvpn"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | if (json.test_keys == NULL || json.test_keys.transport_status == NULL) { 20 | measurement.is_failed = true; 21 | return; 22 | } 23 | bool isTransportBlocked = [json.test_keys.transport_status[@"openvpn"] isEqualToString:BLOCKED] || [json.test_keys.transport_status[@"obfs4"] isEqualToString:BLOCKED]; 24 | measurement.is_anomaly = !json.test_keys.ca_cert_status.boolValue || json.test_keys.api_failure != nil || isTransportBlocked; 25 | [super onEntry:json obj:measurement]; 26 | 27 | } 28 | 29 | -(int)getRuntime{ 30 | return 15; 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Signal.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface Signal : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Signal.m: -------------------------------------------------------------------------------- 1 | #import "Signal.h" 2 | 3 | @implementation Signal 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"signal"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | measurement.is_failed = [json.test_keys.signal_backend_status length] == 0; 20 | measurement.is_anomaly = [json.test_keys.signal_backend_status isEqualToString:BLOCKED]; 21 | [super onEntry:json obj:measurement]; 22 | } 23 | 24 | -(int)getRuntime{ 25 | return 10; 26 | } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Telegram.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface Telegram : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Telegram.m: -------------------------------------------------------------------------------- 1 | #import "Telegram.h" 2 | 3 | @implementation Telegram : AbstractTest 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"telegram"; 9 | } 10 | return self; 11 | } 12 | 13 | 14 | -(void) runTest { 15 | [super prepareRun]; 16 | [super runTest]; 17 | } 18 | 19 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 20 | /* 21 | if "telegram_http_blocking", "telegram_tcp_blocking", "telegram_web_status" are null => failed 22 | if either "telegram_http_blocking" or "telegram_tcp_blocking" is true, OR if "telegram_web_status" is "blocked" => anomalous 23 | */ 24 | if (json.test_keys.telegram_http_blocking == NULL || json.test_keys.telegram_tcp_blocking == NULL || json.test_keys.telegram_web_status == NULL) 25 | [measurement setIs_failed:true]; 26 | else 27 | measurement.is_anomaly = [json.test_keys.telegram_http_blocking boolValue] || [json.test_keys.telegram_tcp_blocking boolValue] || [json.test_keys.telegram_web_status isEqualToString:BLOCKED]; 28 | [super onEntry:json obj:measurement]; 29 | } 30 | 31 | -(int)getRuntime{ 32 | return 10; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Tests.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | #import "WebConnectivity.h" 3 | #import "HttpInvalidRequestLine.h" 4 | #import "HttpHeaderFieldManipulation.h" 5 | #import "NdtTest.h" 6 | #import "Dash.h" 7 | #import "Whatsapp.h" 8 | #import "Telegram.h" 9 | #import "FacebookMessenger.h" 10 | #import "Tor.h" 11 | #import "Psiphon.h" 12 | #import "RiseupVPN.h" 13 | #import "Signal.h" 14 | #import "Experimental.h" 15 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Tor.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface Tor : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Tor.m: -------------------------------------------------------------------------------- 1 | #import "Tor.h" 2 | 3 | @implementation Tor 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"tor"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | if (json.test_keys == NULL) { 20 | measurement.is_failed = true; 21 | return; 22 | } 23 | measurement.is_anomaly = (([json.test_keys.dir_port_accessible doubleValue] <= 0 && [json.test_keys.dir_port_total doubleValue] > 0) || 24 | ([json.test_keys.obfs4_accessible doubleValue] <= 0 && [json.test_keys.obfs4_total doubleValue] > 0) || 25 | ([json.test_keys.or_port_dirauth_accessible doubleValue] <= 0 && [json.test_keys.or_port_dirauth_total doubleValue] > 0) || 26 | ([json.test_keys.or_port_accessible doubleValue] <= 0 && [json.test_keys.or_port_total doubleValue] > 0)); 27 | [super onEntry:json obj:measurement]; 28 | } 29 | 30 | -(int)getRuntime{ 31 | return 40; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/WebConnectivity.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface WebConnectivity : AbstractTest 4 | @property NSArray *inputs; 5 | -(void)setUrls:(NSArray*)inputs; 6 | -(void)setDefaultMaxRuntime; 7 | -(void)disableMaxRuntime; 8 | @end 9 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Whatsapp.h: -------------------------------------------------------------------------------- 1 | #import "AbstractTest.h" 2 | 3 | @interface Whatsapp : AbstractTest 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/Test/Test/Whatsapp.m: -------------------------------------------------------------------------------- 1 | #import "Whatsapp.h" 2 | 3 | @implementation Whatsapp : AbstractTest 4 | 5 | -(id) init { 6 | self = [super init]; 7 | if (self) { 8 | self.name = @"whatsapp"; 9 | } 10 | return self; 11 | } 12 | 13 | -(void) runTest { 14 | [super prepareRun]; 15 | [super runTest]; 16 | } 17 | 18 | -(void)onEntry:(JsonResult*)json obj:(Measurement*)measurement{ 19 | /* 20 | if "whatsapp_endpoints_status", "whatsapp_web_status", "registration_server" are null => failed 21 | if "whatsapp_endpoints_status" or "whatsapp_web_status" or "registration_server_status" are "blocked" => anomalous 22 | */ 23 | if (json.test_keys.whatsapp_endpoints_status == NULL || json.test_keys.whatsapp_web_status == NULL || json.test_keys.registration_server_status == NULL) 24 | [measurement setIs_failed:true]; 25 | else 26 | measurement.is_anomaly = [json.test_keys.whatsapp_endpoints_status isEqualToString:BLOCKED] || [json.test_keys.whatsapp_web_status isEqualToString:BLOCKED] || [json.test_keys.registration_server_status isEqualToString:BLOCKED]; 27 | [super onEntry:json obj:measurement]; 28 | } 29 | 30 | -(int)getRuntime{ 31 | return 10; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /ooniprobe/TestUrls.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | web_connectivity 6 | https://ooni.org/nettest/web-connectivity 7 | http_invalid_request_line 8 | https://ooni.org/nettest/http-invalid-request-line 9 | http_header_field_manipulation 10 | https://ooni.org/nettest/http-header-field-manipulation 11 | ndt 12 | https://ooni.org/nettest/ndt 13 | dash 14 | https://ooni.org/nettest/dash 15 | whatsapp 16 | https://ooni.org/nettest/whatsapp 17 | telegram 18 | https://ooni.org/nettest/telegram 19 | facebook_messenger 20 | https://ooni.org/nettest/facebook-messenger 21 | psiphon 22 | https://ooni.org/nettest/psiphon 23 | tor 24 | https://ooni.org/nettest/tor 25 | riseupvpn 26 | https://ooni.org/nettest/riseupvpn 27 | signal 28 | https://ooni.org/nettest/signal 29 | 30 | 31 | -------------------------------------------------------------------------------- /ooniprobe/Utility/BackgroundTask.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | static NSString* taskID = @"org.openobservatory.ooniprobe.autotesting"; 4 | 5 | @interface BackgroundTask : NSObject 6 | 7 | + (void)configure; 8 | + (void)checkIn; 9 | + (void)scheduleCheckIn; 10 | + (void)cancelCheckIn; 11 | @end 12 | -------------------------------------------------------------------------------- /ooniprobe/Utility/DictionaryUtility.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface DictionaryUtility : NSObject 4 | 5 | + (NSDictionary *)parseQueryString:(NSString *)query; 6 | + (NSDictionary *)getParametersFromDict:(NSDictionary*)dict; 7 | @end 8 | -------------------------------------------------------------------------------- /ooniprobe/Utility/LocalizationUtility.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "DateTools.h" 3 | 4 | @interface LocalizationUtility : NSObject 5 | 6 | + (NSString*)getNameForTest:(NSString*)testName; 7 | + (NSString*)getDescriptionForTest:(NSString*)testName; 8 | + (NSString*)getLongDescriptionForTest:(NSString*)testName; 9 | + (NSString*)getFilterNameForTest:(NSString*)testName; 10 | + (NSString*)getNameForSetting:(NSString*)settingName; 11 | + (NSString*)getSingularPluralTemplate:(long)value :(NSString*)locString; 12 | + (NSString*)getSingularPlural:(long)value :(NSString*)locString; 13 | + (NSString*)getUrlForTest:(NSString*)testName; 14 | + (NSString*)getReadableRuntime:(int)runTime; 15 | @end 16 | -------------------------------------------------------------------------------- /ooniprobe/Utility/MessageUtility.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface MessageUtility : NSObject 5 | 6 | + (void)showToast:(NSString*)msg inView:(UIView*)view; 7 | 8 | + (void)alertVpnWithTitle:(NSString *)title message:(NSString *)msg 9 | inView:(UIViewController *)view 10 | runVPNAction:(void (^)(UIAlertAction *))runVpnAction 11 | runAlwaysVPNAction:(void (^)(UIAlertAction *))runAlwaysVPNAction 12 | disableVPNAction:(void (^)(UIAlertAction *))disableVpnAction; 13 | 14 | + (void)alertWithTitle:(NSString *)title message:(NSString *)msg inView:(UIViewController *)view; 15 | + (void)alertWithTitle:(NSString *)title message:(NSString *)msg okButton:(UIAlertAction*)okButton inView:(UIViewController *)view; 16 | + (void)alertWithTitle:(NSString *)title message:(NSString *)msg buttons:(NSArray*)buttons inView:(UIViewController *)view; 17 | 18 | + (void)alertWithTitle:(NSString *)title message:(NSString *)msg 19 | okButton:(UIAlertAction *)okButton 20 | cancelButton:(UIAlertAction *)cancelButton 21 | inView:(UIViewController *)view; 22 | 23 | + (void)notificationAlertinView:(UIViewController *)view; 24 | + (void)autotestAlertinView:(UIViewController *)view; 25 | + (void)sendLocalNotification:(NSString*)text; 26 | @end 27 | -------------------------------------------------------------------------------- /ooniprobe/Utility/NSDictionary+Safety.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface NSDictionary (Safety) 4 | 5 | - (id)safeObjectForKey:(id)aKey; 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /ooniprobe/Utility/NSDictionary+Safety.m: -------------------------------------------------------------------------------- 1 | #import "NSDictionary+Safety.h" 2 | 3 | @implementation NSDictionary (Safety) 4 | 5 | - (id)safeObjectForKey:(id)aKey { 6 | NSObject *object = self[aKey]; 7 | 8 | if (object == nil) { 9 | return @""; 10 | } 11 | 12 | if (object == [NSNull null]) { 13 | return @""; 14 | } 15 | 16 | return object; 17 | } 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /ooniprobe/Utility/NetworkSession.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | @interface NetworkSession : NSObject 6 | + (NSURLSession*)getSession; 7 | @end 8 | 9 | NS_ASSUME_NONNULL_END 10 | -------------------------------------------------------------------------------- /ooniprobe/Utility/NetworkSession.m: -------------------------------------------------------------------------------- 1 | #import "NetworkSession.h" 2 | #import "VersionUtility.h" 3 | 4 | @implementation NetworkSession 5 | 6 | + (NSURLSession*)getSession{ 7 | NSURLSessionConfiguration *sessionConf = [NSURLSessionConfiguration defaultSessionConfiguration]; 8 | NSString * userAgent = [NSString stringWithFormat:@"ooniprobe-ios/%@", [VersionUtility get_software_version]]; 9 | sessionConf.HTTPAdditionalHeaders = @{@"User-Agent": userAgent}; 10 | return [NSURLSession sessionWithConfiguration:sessionConf]; 11 | } 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ooniprobe/Utility/OONIApi.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface OONIApi : NSObject 4 | 5 | +(void)checkIn :(NSString*)runType onSuccess: (void (^)(NSArray*))successcb onError:(void (^)(NSError*))errorcb; 6 | 7 | +(void)getExplorerUrl:(NSString*)report_id withUrl:(NSString*)measurement_url 8 | onSuccess:(void (^)(NSDictionary*))successcb onError:(void (^)(NSError*))errorcb; 9 | 10 | +(void)getExplorerUrl:(NSString*)baseURl 11 | report_id:(NSString*)report_id 12 | withUrl:(NSString*)measurement_url 13 | onSuccess:(void (^)(NSDictionary*))successcb 14 | onError:(void (^)(NSError*))errorcb; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ooniprobe/Utility/ProxySettings.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | typedef NS_ENUM(NSInteger, ProxyProtocol) { 4 | NONE, 5 | PSIPHON, 6 | SOCKS5, 7 | HTTP, 8 | HTTPS 9 | }; 10 | 11 | @interface ProxySettings : NSObject 12 | 13 | @property (nonatomic) ProxyProtocol protocol; 14 | @property (nonatomic, strong) NSString *hostname; 15 | @property (nonatomic, strong) NSString *port; 16 | 17 | - (void)saveProxy; 18 | - (BOOL)isCustom; 19 | - (NSString*)getProxyString; 20 | + (BOOL)isIPv6:(NSString*)hostname; 21 | + (NSString*)getProtocol:(ProxyProtocol) protocol; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /ooniprobe/Utility/ThirdPartyServices.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Countly.h" 3 | 4 | NS_ASSUME_NONNULL_BEGIN 5 | 6 | @interface ThirdPartyServices : NSObject 7 | 8 | + (void)initCountlyAnyway; 9 | + (void)reloadConsents; 10 | + (void)recordError:(NSString*)title reason:(NSString*)reason userInfo:(NSDictionary*)userInfo; 11 | 12 | @end 13 | 14 | NS_ASSUME_NONNULL_END 15 | -------------------------------------------------------------------------------- /ooniprobe/Utility/UIDevice-DeviceInfo.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface UIDevice (DeviceInfo) 4 | 5 | /** 6 | Returns a machine-readable model name in the format of "iPhone4,1" 7 | */ 8 | - (NSString *)modelIdentifier; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /ooniprobe/Utility/UIDevice-DeviceInfo.m: -------------------------------------------------------------------------------- 1 | #include 2 | #import "UIDevice-DeviceInfo.h" 3 | 4 | @implementation UIDevice (DeviceInfo) 5 | 6 | - (NSString *)getSysInfoByName:(const char *)typeSpecifier 7 | { 8 | size_t size = 0; 9 | int ret = sysctlbyname(typeSpecifier, NULL, &size, NULL, 0); 10 | if (ret != 0 || size == 0) abort(); 11 | 12 | char *answer = malloc(size); 13 | if (answer == NULL) abort(); 14 | 15 | ret = sysctlbyname(typeSpecifier, answer, &size, NULL, 0); 16 | if (ret != 0) { 17 | free(answer); 18 | abort(); 19 | } 20 | 21 | NSString *results = [NSString stringWithCString:answer encoding: NSUTF8StringEncoding]; 22 | 23 | free(answer); 24 | return results; 25 | } 26 | 27 | - (NSString *)modelIdentifier 28 | { 29 | return [self getSysInfoByName:"hw.machine"]; 30 | } 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /ooniprobe/Utility/VersionUtility.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface VersionUtility : NSObject 4 | 5 | + (NSString*)get_software_version; 6 | @end 7 | -------------------------------------------------------------------------------- /ooniprobe/Utility/VersionUtility.m: -------------------------------------------------------------------------------- 1 | #import "VersionUtility.h" 2 | 3 | @implementation VersionUtility 4 | 5 | + (NSString*)get_software_version{ 6 | return [NSString stringWithFormat:@"%@%@", 7 | [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], 8 | RELEASE_NAME]; 9 | 10 | } 11 | @end 12 | -------------------------------------------------------------------------------- /ooniprobe/View/AboutViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface AboutViewController : UIViewController 4 | 5 | @property (nonatomic, strong) IBOutlet UIView *headerView; 6 | @property (nonatomic, strong) IBOutlet UILabel *textLabel; 7 | @property (nonatomic, strong) IBOutlet UIButton *learnMoreButton; 8 | @property (nonatomic, strong) IBOutlet UIButton *ppButton; 9 | @property (nonatomic, strong) IBOutlet UILabel *versionLabel; 10 | @property (nonatomic, strong) IBOutlet UIButton *reportsButton; 11 | @property (nonatomic, strong) IBOutlet UIButton *blogButton; 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ooniprobe/View/DashboardTableViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SettingsTableViewController.h" 3 | #import "TestRunningViewController.h" 4 | #import "RunButton.h" 5 | #import "ConfigureButton.h" 6 | #import "TestOverviewViewController.h" 7 | #import "ReachabilityManager.h" 8 | 9 | @interface DashboardTableViewController : UIViewController { 10 | } 11 | @property (nonatomic, strong) IBOutlet UITableView *tableView; 12 | @property (weak, nonatomic) IBOutlet UIButton *runButton; 13 | @property (nonatomic, strong) NSMutableArray *items; 14 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *tableFooterConstraint; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ooniprobe/View/OONIRun/OoniRunViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "UIView+Toast.h" 3 | #import "RunButton.h" 4 | 5 | @interface OoniRunViewController : UIViewController { 6 | NSMutableArray *urls; 7 | } 8 | 9 | @property (nonatomic, retain) NSURL* url; 10 | @property (nonatomic, retain) IBOutlet UITableView *tableView; 11 | @property (nonatomic, retain) IBOutlet UIImageView *headerImage; 12 | @property (nonatomic, retain) IBOutlet UIImageView *footerImage; 13 | @property (nonatomic, retain) IBOutlet UILabel *titleLabel; 14 | @property (nonatomic, retain) IBOutlet UILabel *subtitleLabel; 15 | @property (nonatomic, retain) IBOutlet UILabel *randomlistLabel; 16 | @property (nonatomic, strong) IBOutlet RunButton *runButton; 17 | 18 | @property (nonatomic, retain) NSString *testName; 19 | 20 | @property (nonatomic, retain) NSString *runId; 21 | @property (nonatomic, retain) NSDictionary *testArguments; 22 | @property (nonatomic, retain) NSString *testDescription; 23 | 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/Onboarding1ViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface Onboarding1ViewController : UIViewController 4 | 5 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 6 | @property (strong, nonatomic) IBOutlet UILabel *textLabel; 7 | @property (weak, nonatomic) IBOutlet NSLayoutConstraint *topConstraint; 8 | @property (strong, nonatomic) IBOutlet UIButton *nextButton; 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/Onboarding1ViewController.m: -------------------------------------------------------------------------------- 1 | #import "Onboarding1ViewController.h" 2 | 3 | @interface Onboarding1ViewController () 4 | 5 | @end 6 | 7 | @implementation Onboarding1ViewController 8 | 9 | - (void)viewDidLoad { 10 | [super viewDidLoad]; 11 | 12 | self.nextButton.layer.cornerRadius = 30; 13 | self.nextButton.layer.masksToBounds = true; 14 | 15 | [self.nextButton setTitle:NSLocalizedString(@"Onboarding.WhatIsOONIProbe.GotIt", nil) forState:UIControlStateNormal]; 16 | [self.nextButton setTitleColor:[UIColor colorNamed:@"color_blue8"] 17 | forState:UIControlStateNormal]; 18 | 19 | [self.titleLabel setText:NSLocalizedString(@"Onboarding.WhatIsOONIProbe.Title", nil)]; 20 | [self.textLabel setText:NSLocalizedString(@"Onboarding.WhatIsOONIProbe.Paragraph", nil)]; 21 | } 22 | 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/Onboarding2ViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "PopQuizViewController.h" 4 | 5 | @interface Onboarding2ViewController : UIViewController { 6 | UIView *quizView; 7 | UIView *wrongAnswerView; 8 | } 9 | 10 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 11 | @property (strong, nonatomic) IBOutlet UILabel *textLabel; 12 | @property (strong, nonatomic) IBOutlet UIButton *nextButton; 13 | @property (strong, nonatomic) IBOutlet UIButton *learnMoreButton; 14 | @property (nonatomic, assign) int question_number; 15 | @property (weak, nonatomic) IBOutlet NSLayoutConstraint *topConstraint; 16 | @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint; 17 | 18 | -(void)setQuestion_number:(int)qn; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/Onboarding3ViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "RHMarkdownLabel.h" 4 | @interface Onboarding3ViewController : UIViewController 5 | 6 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 7 | @property (strong, nonatomic) IBOutlet RHMarkdownLabel *textLabel; 8 | 9 | @property (strong, nonatomic) IBOutlet UIButton *changeButton; 10 | @property (strong, nonatomic) IBOutlet UIButton *goButton; 11 | @property (weak, nonatomic) IBOutlet NSLayoutConstraint *topConstraint; 12 | @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/OnboardingAutoTestViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface OnboardingAutoTestViewController : UIViewController 4 | 5 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 6 | @property (strong, nonatomic) IBOutlet UILabel *textLabel; 7 | @property (weak, nonatomic) IBOutlet NSLayoutConstraint *topConstraint; 8 | 9 | @property (strong, nonatomic) IBOutlet UIButton *yesButton; 10 | @property (strong, nonatomic) IBOutlet UIButton *noButton; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/OnboardingCrashViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface OnboardingCrashViewController : UIViewController 4 | 5 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 6 | @property (strong, nonatomic) IBOutlet UILabel *textLabel; 7 | @property (weak, nonatomic) IBOutlet NSLayoutConstraint *topConstraint; 8 | 9 | @property (strong, nonatomic) IBOutlet UIButton *yesButton; 10 | @property (strong, nonatomic) IBOutlet UIButton *noButton; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/PopQuizViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | #import "WrongAnswerViewController.h" 5 | 6 | @protocol PopQuizViewControllerDelegate 7 | -(void)setQuestion_number:(NSInteger)qn; 8 | @end 9 | 10 | @interface PopQuizViewController : UIViewController 11 | 12 | @property (strong, nonatomic) IBOutlet UIButton *trueButton; 13 | @property (strong, nonatomic) IBOutlet UIButton *falseButton; 14 | @property (strong, nonatomic) IBOutlet UIView *cointainerWindow; 15 | @property (strong, nonatomic) IBOutlet UIButton *closeView; 16 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 17 | @property (strong, nonatomic) IBOutlet UILabel *textLabel; 18 | @property (nonatomic, assign) int question_number; 19 | @property (nonatomic, weak) id delegate; 20 | 21 | -(void)nextQuestion; 22 | -(void)dismissPopup; 23 | 24 | @end 25 | -------------------------------------------------------------------------------- /ooniprobe/View/Onboarding/WrongAnswerViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @protocol WrongAnswerViewControllerDelegate 5 | -(void)nextQuestion; 6 | -(void)dismissPopup; 7 | @end 8 | 9 | @interface WrongAnswerViewController : UIViewController 10 | 11 | @property (strong, nonatomic) IBOutlet UIButton *goBackButton; 12 | @property (strong, nonatomic) IBOutlet UIButton *continueButton; 13 | @property (strong, nonatomic) IBOutlet UIView *cointainerWindow; 14 | @property (strong, nonatomic) IBOutlet UIButton *closeView; 15 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 16 | @property (strong, nonatomic) IBOutlet UILabel *textLabel; 17 | @property (nonatomic, assign) int question_number; 18 | @property (nonatomic, weak) id delegate; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ooniprobe/View/RunTest/ProgressViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "RunningTest.h" 3 | 4 | @interface ProgressViewController : UIViewController 5 | 6 | @property (strong, nonatomic) IBOutlet UIProgressView *progressBar; 7 | @property (strong, nonatomic) IBOutlet UILabel *runningTestsLabel; 8 | @property (strong, nonatomic) IBOutlet UILabel *testNameLabel; 9 | 10 | @end 11 | 12 | -------------------------------------------------------------------------------- /ooniprobe/View/RunTest/TestRunningViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | #import "TestUtility.h" 5 | #import "Suite.h" 6 | #import "Engine.h" 7 | 8 | @interface TestRunningViewController : UIViewController 9 | 10 | @property (strong, nonatomic) LOTAnimationView *animation; 11 | @property (strong, nonatomic) IBOutlet UILabel *runningTestsLabel; 12 | @property (strong, nonatomic) IBOutlet UILabel *testNameLabel; 13 | @property (strong, nonatomic) IBOutlet UIView *animationView; 14 | @property (strong, nonatomic) IBOutlet UIProgressView *progressBar; 15 | @property (strong, nonatomic) IBOutlet UILabel *etaLabel; 16 | @property (strong, nonatomic) IBOutlet UILabel *timeLabel; 17 | @property (strong, nonatomic) IBOutlet UILabel *logLabel; 18 | @property (strong, nonatomic) IBOutlet UIButton *interruptButton; 19 | @property (strong, nonatomic) IBOutlet UIButton *minimizeButton; 20 | @property (strong, nonatomic) IBOutlet UIStackView *proxyView; 21 | @property (strong, nonatomic) IBOutlet UILabel *proxyLabel; 22 | @property (assign) bool presenting; 23 | @property (assign) int totalRuntime; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /ooniprobe/View/Settings/CustomURLViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestRunningViewController.h" 3 | #import "MessageUtility.h" 4 | #import "RunButton.h" 5 | 6 | @interface CustomURLViewController : UIViewController { 7 | UIToolbar *keyboardToolbar; 8 | NSMutableArray *urlArray; 9 | } 10 | 11 | @property (strong, nonatomic) NSMutableArray *urlsList; 12 | @property (nonatomic, retain) IBOutlet UITableView *tableView; 13 | @property (nonatomic, retain) IBOutlet RunButton *runButton; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /ooniprobe/View/Settings/ProxyViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "ProxySettings.h" 3 | 4 | @interface ProxyViewController : UITableViewController { 5 | NSArray *items; 6 | UIToolbar *keyboardToolbar; 7 | ProxySettings *currentProxy; 8 | } 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /ooniprobe/View/Settings/SettingsCategoriesTableViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SettingsUtility.h" 3 | #import "SettingsTableViewController.h" 4 | #import 5 | 6 | @interface SettingsCategoriesTableViewController : UITableViewController { 7 | NSArray *categories; 8 | } 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /ooniprobe/View/Settings/SettingsTableViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SettingsUtility.h" 3 | #import "UIView+Toast.h" 4 | #import "MessageUtility.h" 5 | #import "TestUtility.h" 6 | #import 7 | #import "Suite.h" 8 | 9 | @interface SettingsTableViewController : UITableViewController { 10 | NSArray *items; 11 | UIToolbar *keyboardToolbar; 12 | } 13 | 14 | @property (nonatomic, strong) NSString *category; 15 | @property (nonatomic, strong) AbstractSuite *testSuite; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /ooniprobe/View/Settings/WebsiteCategoriesTableViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SettingsUtility.h" 3 | 4 | @interface WebsiteCategoriesTableViewController : UITableViewController { 5 | NSArray *categories; 6 | NSArray *categories_disabled; 7 | } 8 | 9 | @end 10 | -------------------------------------------------------------------------------- /ooniprobe/View/TabsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "UIView+Toast.h" 3 | 4 | @interface TabsViewController : UITabBarController { 5 | BOOL modalShowed; 6 | } 7 | 8 | @end 9 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Details/CircumventionDetailsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestDetailsViewController.h" 3 | #import "RHMarkdownLabel.h" 4 | 5 | @interface CircumventionDetailsViewController : TestDetailsViewController 6 | 7 | @property (nonatomic, strong) IBOutlet UIImageView *statusImage; 8 | @property (nonatomic, strong) IBOutlet UILabel *titleLabel; 9 | @property (nonatomic, strong) IBOutlet RHMarkdownLabel *textLabel; 10 | 11 | @property (nonatomic, strong) IBOutlet UILabel *detail1TitleLabel; 12 | @property (nonatomic, strong) IBOutlet UILabel *detail1SubtitleLabel; 13 | 14 | @property (nonatomic, strong) IBOutlet UILabel *detail2TitleLabel; 15 | @property (nonatomic, strong) IBOutlet UILabel *detail2SubtitleLabel; 16 | 17 | @property (nonatomic, strong) IBOutlet UILabel *detail3TitleLabel; 18 | @property (nonatomic, strong) IBOutlet UILabel *detail3SubtitleLabel; 19 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadBarFooterConstraint; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Details/DashDetailsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestDetailsViewController.h" 3 | 4 | @interface DashDetailsViewController : TestDetailsViewController 5 | 6 | @property (nonatomic, strong) IBOutlet UILabel *titleLabel; 7 | @property (nonatomic, strong) IBOutlet UILabel *subtitleLabel; 8 | 9 | @property (nonatomic, strong) IBOutlet UILabel *bitrateTitleLabel; 10 | @property (nonatomic, strong) IBOutlet UILabel *bitrateValueLabel; 11 | @property (nonatomic, strong) IBOutlet UILabel *bitrateUnitLabel; 12 | 13 | @property (nonatomic, strong) IBOutlet UILabel *delayTitleLabel; 14 | @property (nonatomic, strong) IBOutlet UILabel *delayValueLabel; 15 | @property (nonatomic, strong) IBOutlet UILabel *delayUnitLabel; 16 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadBarFooterConstraint; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Details/FailedTestDetailsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestDetailsViewController.h" 3 | 4 | @interface FailedTestDetailsViewController : TestDetailsViewController 5 | 6 | @property (nonatomic, strong) IBOutlet UIImageView *statusImage; 7 | @property (nonatomic, strong) IBOutlet UILabel *titleLabel; 8 | @property (nonatomic, strong) IBOutlet UILabel *subtitleLabel; 9 | @property (nonatomic, strong) IBOutlet UIButton *tryAgainButton; 10 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadBarFooterConstraint; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Details/InstantMessagingDetailsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestDetailsViewController.h" 3 | 4 | @interface InstantMessagingDetailsViewController : TestDetailsViewController 5 | 6 | @property (nonatomic, strong) IBOutlet UIImageView *statusImage; 7 | @property (nonatomic, strong) IBOutlet UILabel *titleLabel; 8 | @property (nonatomic, strong) IBOutlet UILabel *textLabel; 9 | 10 | @property (nonatomic, strong) IBOutlet UILabel *detail1TitleLabel; 11 | @property (nonatomic, strong) IBOutlet UILabel *detail1SubtitleLabel; 12 | 13 | @property (nonatomic, strong) IBOutlet UILabel *detail2TitleLabel; 14 | @property (nonatomic, strong) IBOutlet UILabel *detail2SubtitleLabel; 15 | 16 | @property (nonatomic, strong) IBOutlet UILabel *detail3TitleLabel; 17 | @property (nonatomic, strong) IBOutlet UILabel *detail3SubtitleLabel; 18 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadBarFooterConstraint; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Details/MiddleBoxesDetailsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestDetailsViewController.h" 3 | #import "PaddingLabel.h" 4 | 5 | //This screen is still used for HIRL and HHFM under the Performance suite 6 | @interface MiddleBoxesDetailsViewController : TestDetailsViewController 7 | 8 | @property (nonatomic, strong) IBOutlet UIImageView *statusImage; 9 | @property (nonatomic, strong) IBOutlet UILabel *titleLabel; 10 | @property (nonatomic, strong) IBOutlet UILabel *textLabel; 11 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadBarFooterConstraint; 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Details/TestDetailsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Result.h" 3 | #import "Measurement.h" 4 | #import "TestUtility.h" 5 | #import "LogViewController.h" 6 | #import "RHMarkdownLabel.h" 7 | #import "MessageUtility.h" 8 | 9 | @interface TestDetailsViewController : UIViewController { 10 | NSString *segueType; 11 | BOOL isInExplorer; 12 | } 13 | 14 | @property (nonatomic, strong) Result *result; 15 | @property (nonatomic, strong) Measurement *measurement; 16 | @property (nonatomic, strong) IBOutlet UIView *headerView; 17 | @property (nonatomic, strong) IBOutlet UIScrollView *scrollView; 18 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *scrollViewFooterConstraint; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Details/WebsitesDetailsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestDetailsViewController.h" 3 | 4 | @interface WebsitesDetailsViewController : TestDetailsViewController 5 | 6 | @property (nonatomic, strong) IBOutlet UIImageView *statusImage; 7 | @property (nonatomic, strong) IBOutlet UILabel *titleLabel; 8 | @property (nonatomic, strong) IBOutlet UILabel *subtitleLabel; 9 | @property (nonatomic, strong) IBOutlet RHMarkdownLabel *textLabel; 10 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadBarFooterConstraint; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Footer/TestDetailsFooterViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Result.h" 3 | #import "Measurement.h" 4 | #import "RHMarkdownLabel.h" 5 | 6 | @interface TestDetailsFooterViewController : UIViewController { 7 | NSString *segueType; 8 | } 9 | 10 | @property (nonatomic, strong) Result *result; 11 | @property (nonatomic, strong) Measurement *measurement; 12 | 13 | @property (nonatomic, strong) IBOutlet UILabel *dateLabel; 14 | @property (nonatomic, strong) IBOutlet UILabel *dateDetailLabel; 15 | @property (nonatomic, strong) IBOutlet UILabel *networkLabel; 16 | @property (nonatomic, strong) IBOutlet UILabel *networkNameLabel; 17 | @property (nonatomic, strong) IBOutlet UILabel *networkAsnLabel; 18 | @property (nonatomic, strong) IBOutlet UILabel *countryLabel; 19 | @property (nonatomic, strong) IBOutlet UILabel *countryDetailLabel; 20 | @property (nonatomic, strong) IBOutlet UILabel *runtimeLabel; 21 | @property (nonatomic, strong) IBOutlet UILabel *runtimeDetailLabel; 22 | @property (nonatomic, strong) IBOutlet UIButton *dataButton; 23 | @property (nonatomic, strong) IBOutlet UIButton *explorerButton; 24 | @property (nonatomic, strong) IBOutlet UIButton *logButton; 25 | @property (nonatomic, strong) IBOutlet RHMarkdownLabel *methodologyLabel; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Footer/UploadFooterViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Result.h" 3 | #import "Measurement.h" 4 | #import "LoggerArray.h" 5 | 6 | /// This view controller manage the upload footer and its method. It's contained as sub view in 3 other views 7 | @interface UploadFooterViewController : UIViewController 8 | 9 | /// result contains the Result that the upload footer is about to upload 10 | @property (nonatomic, strong) Result *result; 11 | 12 | /// measurement contains the the Measurement that the upload footer is about to upload 13 | @property (nonatomic, strong) Measurement *measurement; 14 | 15 | @property (nonatomic, strong) IBOutlet UILabel *titleLabel; 16 | @property (nonatomic, strong) IBOutlet UIButton *uploadButton; 17 | 18 | // upload_all is a bool used to indicate if the footer should upload a measurement (one) or a result (all) 19 | @property (assign) bool upload_all; 20 | 21 | @property (nonatomic, strong) LoggerArray* logger; 22 | 23 | @property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 24 | 25 | @property (atomic, assign) BOOL canceled; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Headers/Header1MBViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SettingsUtility.h" 3 | #import "TestUtility.h" 4 | #import "Result.h" 5 | 6 | /** 7 | * @deprecated 8 | * Is not possible to run a MiddleBoxesSuite anymore 9 | * so the Header1MBViewController is not gonna be shown for new tests 10 | */ 11 | __deprecated 12 | @interface Header1MBViewController : UIViewController 13 | 14 | @property (nonatomic, strong) Result *result; 15 | @property (nonatomic, strong) IBOutlet UIView *headerView; 16 | @property (nonatomic, strong) IBOutlet UILabel *headerTitle; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Headers/Header2ViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SettingsUtility.h" 3 | #import "TestUtility.h" 4 | #import "Result.h" 5 | 6 | @interface Header2ViewController : UIViewController 7 | 8 | @property (nonatomic, strong) Result *result; 9 | @property (nonatomic, strong) IBOutlet UIView *headerView; 10 | @property (nonatomic, strong) IBOutlet UILabel *dateAndTimeLabel; 11 | @property (nonatomic, strong) IBOutlet UILabel *dateAndTimeDetailLabel; 12 | @property (nonatomic, strong) IBOutlet UILabel *dataUsageLabel; 13 | @property (nonatomic, strong) IBOutlet UILabel *dataUsageUploadLabel; 14 | @property (nonatomic, strong) IBOutlet UILabel *dataUsageDownloadLabel; 15 | @property (nonatomic, strong) IBOutlet UILabel *runtimeLabel; 16 | @property (nonatomic, strong) IBOutlet UILabel *runtimeDetailLabel; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Headers/Header3ViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "SettingsUtility.h" 3 | #import "TestUtility.h" 4 | #import "Result.h" 5 | 6 | @interface Header3ViewController : UIViewController 7 | 8 | @property (nonatomic, strong) Result *result; 9 | @property (nonatomic, strong) IBOutlet UIView *headerView; 10 | @property (nonatomic, strong) IBOutlet UILabel *countryLabel; 11 | @property (nonatomic, strong) IBOutlet UILabel *countryDetailLabel; 12 | @property (nonatomic, strong) IBOutlet UILabel *networkLabel; 13 | @property (nonatomic, strong) IBOutlet UILabel *networkNameLabel; 14 | @property (nonatomic, strong) IBOutlet UILabel *networkAsnLabel; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Headers/HeaderSwipeViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Header1ViewController.h" 3 | #import "Header2ViewController.h" 4 | #import "Header3ViewController.h" 5 | #import "SettingsUtility.h" 6 | #import "Result.h" 7 | 8 | @interface HeaderSwipeViewController : UIViewController { 9 | NSArray *viewControllers; 10 | NSUInteger index; 11 | } 12 | 13 | @property (nonatomic,strong) UIPageViewController *pageViewController; 14 | 15 | @property (nonatomic, retain) Header1ViewController *first; 16 | @property (nonatomic, retain) Header2ViewController *second; 17 | @property (nonatomic, retain) Header3ViewController *third; 18 | @property (nonatomic, strong) Result *result; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/LogViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Measurement.h" 3 | 4 | @interface LogViewController : UIViewController 5 | 6 | @property (nonatomic, strong) NSString *type; 7 | @property (nonatomic, strong) Measurement *measurement; 8 | @property (nonatomic, strong) NSString *text; 9 | @property (nonatomic, strong) IBOutlet UITextView *textView; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Rows/BasicTableViewCell.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface BasicTableViewCell : UITableViewCell 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Rows/DashboardTableViewCell.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "TestUtility.h" 3 | #import "RunButton.h" 4 | #import "Suite.h" 5 | 6 | @interface DashboardTableViewCell : UITableViewCell 7 | @property (strong, nonatomic) IBOutlet UIView *cardbackgroundView; 8 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 9 | @property (strong, nonatomic) IBOutlet UILabel *descLabel; 10 | @property (strong, nonatomic) IBOutlet UIImageView *testLogo; 11 | 12 | -(void)setTestSuite:(AbstractSuite*)testSuite; 13 | @end 14 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Rows/TestResultTableViewCell.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Result.h" 3 | #import "TestUtility.h" 4 | 5 | @interface TestResultTableViewCell : UITableViewCell 6 | @property (strong, nonatomic) IBOutlet UIImageView *testIcon; 7 | @property (strong, nonatomic) IBOutlet UILabel *testNameLabel; 8 | @property (strong, nonatomic) IBOutlet UILabel *testAsnLabel; 9 | @property (strong, nonatomic) IBOutlet UILabel *testTimeLabel; 10 | @property (strong, nonatomic) IBOutlet UIStackView *mainStackView; 11 | @property (strong, nonatomic) IBOutlet UIStackView *stackView1; 12 | @property (strong, nonatomic) IBOutlet UIImageView *image1; 13 | @property (strong, nonatomic) IBOutlet UILabel *label1; 14 | @property (strong, nonatomic) IBOutlet UIStackView *stackView2; 15 | @property (strong, nonatomic) IBOutlet UIImageView *image2; 16 | @property (strong, nonatomic) IBOutlet UILabel *label2; 17 | @property (strong, nonatomic) IBOutlet UIStackView *stackView3; 18 | @property (strong, nonatomic) IBOutlet UIImageView *image3; 19 | @property (strong, nonatomic) IBOutlet UILabel *label3; 20 | @property (strong, nonatomic) IBOutlet UIImageView *notUploadedImage; 21 | 22 | -(void)setResult:(Result*)result; 23 | @end 24 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/Rows/TestSummaryTableViewCell.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "Result.h" 3 | #import "Measurement.h" 4 | 5 | @interface TestSummaryTableViewCell : UITableViewCell 6 | @property (strong, nonatomic) IBOutlet UILabel *titleLabel; 7 | @property (strong, nonatomic) IBOutlet UIImageView *statusImage; 8 | @property (strong, nonatomic) IBOutlet UIImageView *notUploadedImage; 9 | @property (strong, nonatomic) IBOutlet UIImageView *categoryImage; 10 | @property (strong, nonatomic) IBOutlet UIImageView *detail1Image; 11 | @property (strong, nonatomic) IBOutlet UILabel *detail1Label; 12 | @property (strong, nonatomic) IBOutlet UIStackView *stackView1; 13 | @property (strong, nonatomic) IBOutlet UIStackView *stackView2; 14 | @property (strong, nonatomic) IBOutlet UIImageView *detail2Image; 15 | @property (strong, nonatomic) IBOutlet UILabel *detail2Label; 16 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *ndtSpaceConstraint; 17 | 18 | -(void)setResult:(Result*)result andMeasurement:(Measurement*)measurement; 19 | @end 20 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/TestResultsViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import "Measurement.h" 4 | #import "Result.h" 5 | #import "UIScrollView+EmptyDataSet.h" 6 | #import "ResultsHeaderViewController.h" 7 | #import "TestSummaryViewController.h" 8 | #import "TestResultTableViewCell.h" 9 | 10 | @interface TestResultsViewController : UIViewController { 11 | NSArray *keys; 12 | NSDictionary *resultsDic; 13 | SRKQuery *query; 14 | } 15 | 16 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *tableFooterConstraint; 17 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadbarFooterConstraint; 18 | @property (nonatomic, strong) IBOutlet UITableView *tableView; 19 | @property (nonatomic, strong) SRKResultSet* results; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /ooniprobe/View/TestResults/TestSummaryViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "HeaderSwipeViewController.h" 3 | #import "Result.h" 4 | #import "Measurement.h" 5 | #import "LogViewController.h" 6 | #import "TestRunningViewController.h" 7 | #import "TestDetailsViewController.h" 8 | #import "MessageUtility.h" 9 | 10 | @interface TestSummaryViewController : UIViewController { 11 | UIColor *defaultColor; 12 | Measurement *segueObj; 13 | NSString *segueType; 14 | } 15 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *uploadBarFooterConstraint; 16 | @property (strong, nonatomic) IBOutlet NSLayoutConstraint *tableFooterConstraint; 17 | @property (nonatomic, strong) IBOutlet UITableView *tableView; 18 | @property (nonatomic, strong) Result* result; 19 | @property (nonatomic, strong) SRKResultSet *measurements; 20 | @property (nonatomic, strong) NSArray *> *groupedMeasurements; 21 | @end 22 | -------------------------------------------------------------------------------- /ooniprobe/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import "AppDelegate.h" 3 | 4 | int main(int argc, char * argv[]) { 5 | @autoreleasepool { 6 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /ooniprobe/ooniprobe.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.associated-domains 8 | 9 | applinks:run.ooni.io 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /ooniprobe/zh_CN.lproj: -------------------------------------------------------------------------------- 1 | zh-Hans.lproj -------------------------------------------------------------------------------- /ooniprobe/zh_TW.lproj: -------------------------------------------------------------------------------- 1 | zh-Hant.lproj -------------------------------------------------------------------------------- /share/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSExtension 6 | 7 | NSExtensionAttributes 8 | 9 | NSExtensionActivationRule 10 | 11 | NSExtensionActivationSupportsWebURLWithMaxCount 12 | 1 13 | 14 | 15 | NSExtensionMainStoryboard 16 | MainInterface 17 | NSExtensionPointIdentifier 18 | com.apple.share-services 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /share/share.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | --------------------------------------------------------------------------------