├── .meteor ├── .gitignore ├── release ├── platforms ├── cordova-plugins ├── .cordova-plugins.1bgpkk3 ├── .id ├── .finished-upgraders ├── packages └── versions ├── client ├── body.html ├── stylesheets │ ├── status.css │ ├── intro.css │ ├── radar.scss │ └── stingwatch.css └── main.js ├── public ├── logo.gif ├── favicon.ico ├── logo64.gif ├── apple-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── intro │ ├── radar.png │ ├── map-radar.jpg │ ├── nopd-portrait.jpg │ └── cameras-portrait.jpg ├── logo64Inverse.gif ├── ms-icon-70x70.png ├── splash │ ├── screen.png │ └── screen-land.png ├── ms-icon-144x144.png ├── ms-icon-150x150.png ├── ms-icon-310x310.png ├── stingwatch_logo.jpg ├── stingwatch_logo.png ├── android-icon-36x36.png ├── android-icon-48x48.png ├── android-icon-72x72.png ├── android-icon-96x96.png ├── apple-icon-114x114.png ├── apple-icon-120x120.png ├── apple-icon-144x144.png ├── apple-icon-152x152.png ├── apple-icon-180x180.png ├── apple-icon-57x57.png ├── apple-icon-60x60.png ├── apple-icon-72x72.png ├── apple-icon-76x76.png ├── android-icon-144x144.png ├── android-icon-192x192.png └── apple-icon-precomposed.png ├── stingwatch ├── imports ├── startup │ ├── client │ │ ├── mapbox.js │ │ ├── reactive-local-store.js │ │ ├── device-id.js │ │ └── routes.jsx │ └── cordova │ │ ├── sim.js │ │ ├── notifications.js │ │ └── telephony.js ├── lib │ ├── hammer.js │ └── trigger-danger.js ├── ui │ ├── components │ │ ├── status │ │ │ ├── LearnButton.jsx │ │ │ ├── NavBar.jsx │ │ │ ├── StatusScanning.jsx │ │ │ ├── TweetButton.jsx │ │ │ ├── Factoid.jsx │ │ │ ├── Radar.jsx │ │ │ ├── TweetComposer.jsx │ │ │ └── StatusDanger.jsx │ │ ├── intro │ │ │ ├── IntroSlide2.jsx │ │ │ ├── IntroSlide1.jsx │ │ │ └── IntroSlide3.jsx │ │ └── GeekMode.jsx │ ├── pages │ │ ├── IntroPage.jsx │ │ ├── TermsRejectedPage.jsx │ │ ├── StatusPage.jsx │ │ └── TermsPage.jsx │ └── App.jsx └── globals.js ├── settings-example.json ├── cordova-build-override └── platforms │ └── android │ └── build-extras.gradle ├── .gitignore ├── server └── main.js ├── cordova └── main.js ├── package.json ├── mobile-config.js └── README.md /.meteor/.gitignore: -------------------------------------------------------------------------------- 1 | local 2 | -------------------------------------------------------------------------------- /.meteor/release: -------------------------------------------------------------------------------- 1 | METEOR@1.3.4.1 2 | -------------------------------------------------------------------------------- /.meteor/platforms: -------------------------------------------------------------------------------- 1 | android 2 | browser 3 | server 4 | -------------------------------------------------------------------------------- /client/body.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | -------------------------------------------------------------------------------- /client/stylesheets/status.css: -------------------------------------------------------------------------------- 1 | #map { 2 | height: 20rem; 3 | } 4 | -------------------------------------------------------------------------------- /public/logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/logo.gif -------------------------------------------------------------------------------- /stingwatch: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | meteor run android-device -p 4000 --settings settings.json 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/logo64.gif -------------------------------------------------------------------------------- /public/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon.png -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/favicon-96x96.png -------------------------------------------------------------------------------- /public/intro/radar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/intro/radar.png -------------------------------------------------------------------------------- /public/logo64Inverse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/logo64Inverse.gif -------------------------------------------------------------------------------- /public/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/ms-icon-70x70.png -------------------------------------------------------------------------------- /public/splash/screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/splash/screen.png -------------------------------------------------------------------------------- /public/intro/map-radar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/intro/map-radar.jpg -------------------------------------------------------------------------------- /public/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/ms-icon-150x150.png -------------------------------------------------------------------------------- /public/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/ms-icon-310x310.png -------------------------------------------------------------------------------- /public/stingwatch_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/stingwatch_logo.jpg -------------------------------------------------------------------------------- /public/stingwatch_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/stingwatch_logo.png -------------------------------------------------------------------------------- /public/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/android-icon-36x36.png -------------------------------------------------------------------------------- /public/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/android-icon-48x48.png -------------------------------------------------------------------------------- /public/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/android-icon-72x72.png -------------------------------------------------------------------------------- /public/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/android-icon-96x96.png -------------------------------------------------------------------------------- /public/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-114x114.png -------------------------------------------------------------------------------- /public/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-120x120.png -------------------------------------------------------------------------------- /public/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-144x144.png -------------------------------------------------------------------------------- /public/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-180x180.png -------------------------------------------------------------------------------- /public/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-57x57.png -------------------------------------------------------------------------------- /public/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-60x60.png -------------------------------------------------------------------------------- /public/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-72x72.png -------------------------------------------------------------------------------- /public/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-76x76.png -------------------------------------------------------------------------------- /public/splash/screen-land.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/splash/screen-land.png -------------------------------------------------------------------------------- /public/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/android-icon-144x144.png -------------------------------------------------------------------------------- /public/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/android-icon-192x192.png -------------------------------------------------------------------------------- /public/intro/nopd-portrait.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/intro/nopd-portrait.jpg -------------------------------------------------------------------------------- /public/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/apple-icon-precomposed.png -------------------------------------------------------------------------------- /public/intro/cameras-portrait.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marvinmarnold/stingwatch/HEAD/public/intro/cameras-portrait.jpg -------------------------------------------------------------------------------- /imports/startup/client/mapbox.js: -------------------------------------------------------------------------------- 1 | export function configMapbox() { 2 | Mapbox.load({ 3 | plugins: ['heat', 'label'] 4 | }); 5 | } 6 | -------------------------------------------------------------------------------- /settings-example.json: -------------------------------------------------------------------------------- 1 | { 2 | "public": { 3 | "TWITTER_CONSUMER_KEY": "", 4 | "MAPBOX_TOKEN": "" 5 | }, 6 | "TWITTER_CONSUMER_SECRET": "" 7 | } 8 | -------------------------------------------------------------------------------- /imports/lib/hammer.js: -------------------------------------------------------------------------------- 1 | export const HammerHelper = { 2 | isNext(dir) { 3 | return dir === 2; 4 | }, 5 | 6 | isPrev(dir) { 7 | return dir === 4; 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /cordova-build-override/platforms/android/build-extras.gradle: -------------------------------------------------------------------------------- 1 | cdvVersionCode = '36' 2 | android { 3 | lintOptions { 4 | disable 'MissingTranslation' 5 | disable 'ExtraTranslation' 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.meteor/cordova-plugins: -------------------------------------------------------------------------------- 1 | cordova-plugin-dialogs@1.2.1 2 | cordova-plugin-sim@1.2.1 3 | cordova-plugin-telephony@file://packages/cordova-plugin-telephony 4 | cordova-plugin-vibration@2.1.1 5 | de.appplant.cordova.plugin.local-notification@0.8.4 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | packages/bootstrap 3 | scripts 4 | settings 5 | .meteor/local 6 | packages/meteor-imsi-catcher-catcher 7 | packages/meteor-device-id 8 | packages/cordova-plugin-telephony 9 | packages/meteor-reactive-local-store 10 | settings.json 11 | -------------------------------------------------------------------------------- /imports/startup/client/reactive-local-store.js: -------------------------------------------------------------------------------- 1 | import { RLS } from 'meteor/marvin:reactive-local-store'; 2 | import { SETTINGS } from '../../globals.js'; 3 | 4 | export function configRLS() { 5 | RLS.setRegisteredKeys([ 6 | SETTINGS.TERMS_ACCEPTED 7 | ]); 8 | 9 | RLS.init(); 10 | } 11 | -------------------------------------------------------------------------------- /.meteor/.cordova-plugins.1bgpkk3: -------------------------------------------------------------------------------- 1 | cordova-plugin-dialogs@1.2.1 2 | cordova-plugin-file@4.2.0 3 | cordova-plugin-filee@4.2.0 4 | cordova-plugin-sim@1.2.1 5 | cordova-plugin-telephony@file://../cordova-plugin-telephony 6 | cordova-plugin-vibration@2.1.1 7 | de.appplant.cordova.plugin.local-notification@0.8.4 8 | -------------------------------------------------------------------------------- /.meteor/.id: -------------------------------------------------------------------------------- 1 | # This file contains a token that is unique to your project. 2 | # Check it into your repository along with the rest of this directory. 3 | # It can be used for purposes such as: 4 | # - ensuring you don't accidentally deploy one app on top of another 5 | # - providing package authors with aggregated statistics 6 | 7 | 2sgvkysqas4g1t60v7b 8 | -------------------------------------------------------------------------------- /imports/startup/client/device-id.js: -------------------------------------------------------------------------------- 1 | import { DeviceId } from 'meteor/marvin:device-id'; 2 | 3 | export function startupDeviceId() { 4 | // Generate a deviceId client side 5 | console.log('startupDeviceId'); 6 | DeviceId.gen((error, deviceId) => { 7 | console.log('generated id: ' + deviceId); 8 | // console.log('deviceId error'); 9 | // console.log(error); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /.meteor/.finished-upgraders: -------------------------------------------------------------------------------- 1 | # This file contains information which helps Meteor properly upgrade your 2 | # app when you run 'meteor update'. You should check it into version control 3 | # with your project. 4 | 5 | notices-for-0.9.0 6 | notices-for-0.9.1 7 | 0.9.4-platform-file 8 | notices-for-facebook-graph-api-2 9 | 1.2.0-standard-minifiers-package 10 | 1.2.0-meteor-platform-split 11 | 1.2.0-cordova-changes 12 | 1.2.0-breaking-changes 13 | 1.3.0-split-minifiers-package 14 | -------------------------------------------------------------------------------- /client/stylesheets/intro.css: -------------------------------------------------------------------------------- 1 | .intro-slide-2 { 2 | min-height: 100%; 3 | background-size: cover; 4 | background-repeat: no-repeat; 5 | background-position: center center; 6 | background-image: url('/intro/nopd-portrait.jpg'); 7 | color: #fff; 8 | } 9 | 10 | .intro-slide-3 { 11 | min-height: 100%; 12 | background-size: cover; 13 | background-repeat: no-repeat; 14 | background-position: center center; 15 | background-image: url('/intro/cameras-portrait.jpg'); 16 | color: #fff; 17 | } 18 | -------------------------------------------------------------------------------- /imports/ui/components/status/LearnButton.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class LearnButton extends React.Component { 4 | handleClick() { 5 | window.open("https://www.stingraymappingproject.org", "_system"); 6 | } 7 | 8 | render() { 9 | const url = "https://www.stingraymappingproject.org"; 10 | 11 | return ( 12 | 14 | 15 | Learn 16 | 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /server/main.js: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | // import '../imports/startup/server/twitter.js'; 3 | // import '../imports/api/twitter.js'; 4 | 5 | // Meteor.startup(() => { 6 | // // if (Meteor.isServer) { 7 | // // Meteor.startup(function () { 8 | // // // code to run on server at startup 9 | // // process.env.MOBILE_DDP_URL = 'http://http://192.168.88.167:4000'; 10 | // // process.env.MOBILE_ROOT_URL = 'http://http://192.168.88.167:4000'; 11 | // // }); 12 | // // } 13 | // console.log("Starting client"); 14 | // configTwitter(); 15 | // }); 16 | -------------------------------------------------------------------------------- /cordova/main.js: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | 3 | import { startupSim } from '../imports/startup/cordova/sim.js'; 4 | // import { startupDeviceId } from '../imports/startup/cordova/device-id.js'; 5 | import { startupNotifications } from '../imports/startup/cordova/notifications.js'; 6 | import { startupTelephony } from '../imports/startup/cordova/telephony.js'; 7 | 8 | Meteor.startup(() => { 9 | if(Meteor.isCordova) { 10 | console.log("Starting Cordova"); 11 | // startupDeviceId(); 12 | startupSim(); 13 | startupNotifications(); 14 | startupTelephony(); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /client/main.js: -------------------------------------------------------------------------------- 1 | import { Meteor } from 'meteor/meteor'; 2 | import { render } from 'react-dom'; 3 | 4 | import { renderRoutes } from '../imports/startup/client/routes.jsx'; 5 | import { configRLS } from '../imports/startup/client/reactive-local-store.js'; 6 | import { configMapbox } from '../imports/startup/client/mapbox.js'; 7 | import { startupDeviceId } from '../imports/startup/client/device-id.js'; 8 | 9 | Meteor.startup(() => { 10 | // console.log("Starting client"); 11 | configRLS(); 12 | configMapbox(); 13 | startupDeviceId(); 14 | render(renderRoutes(), document.getElementById('app')); 15 | }); 16 | -------------------------------------------------------------------------------- /imports/ui/components/status/NavBar.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { APP_NAME } from '../../../globals.js'; 4 | 5 | export default class NavBar extends React.Component { 6 | handleClick() { 7 | this.props.toggleGeekMode(); 8 | } 9 | 10 | render() { 11 | return ( 12 |
15 | {APP_NAME}
16 |
17 |
22 |
23 | {FACTOIDS[this.state.currentFactoidNum]}
44 |
29 | Even if you don't accept, you can still use StingWatch and receive warnings from detections recorded by users nearby you.
39 | 40 |But unless you enable data collection StingWatch cannot detect any unsual activity on your device.
41 | 42 | {this.renderButtons()} 43 |Only use this if you know what you are doing.
59 | 60 | {this.renderDeviceIdButton()} 61 | {this.renderStatusButton()} 62 | 63 |67 | {this.state.charactersRemaining} characters remaining 68 |
69 | 70 | 75 | 76 | 81 |In order to work, StingWatch records information about the cellphone towers you connect to and stores your GPS coordinates in the cloud.
18 |To keep you anonymous, your phone will generate a random Device ID that will be sent in along with your data. No other identifying information is collected. No IPs, no names, no email addresses.
19 |Data is being encrypted in motion with TLS.
20 |Although we plan on adding encryption at rest, this information is currently stored in cleartext on AWS. We will never sell your information to anybody. But after performing further data anonymization, we will make subsets of this information available to other IMSI-catcher researchers.
21 |Most importantly, data and especially detections will be mapped on our public website, stingraymappingproject.org, with 500m accuracy from where the reading actually occured.
22 |We recognize that this level of data collection may be prohibitive for some users but it is essential for us to be able to detect Stingrays and map their usage.
23 |If this is an issue for you, consider using another similar tool like SnoopSnitch, AIMSICD, Darshak, or IMSI-Catcher-Catcher. Or just, submit a pull request @ github.com/marvinmarnold/stingwatch
24 |StingWatch has detected a Stingray within 500m of you.
53 |