TracingSyncService.java 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package de.tudarmstadt.informatik.hostage.sync.tracing;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.io.OutputStreamWriter;
  6. import java.net.HttpURLConnection;
  7. import java.net.URL;
  8. import java.security.KeyStore;
  9. import java.util.ArrayList;
  10. import org.apache.http.HttpResponse;
  11. import org.apache.http.HttpVersion;
  12. import org.apache.http.client.HttpClient;
  13. import org.apache.http.client.methods.HttpPost;
  14. import org.apache.http.conn.ClientConnectionManager;
  15. import org.apache.http.conn.scheme.PlainSocketFactory;
  16. import org.apache.http.conn.scheme.Scheme;
  17. import org.apache.http.conn.scheme.SchemeRegistry;
  18. import org.apache.http.conn.ssl.SSLSocketFactory;
  19. import org.apache.http.entity.StringEntity;
  20. import org.apache.http.impl.client.DefaultHttpClient;
  21. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
  22. import org.apache.http.params.BasicHttpParams;
  23. import org.apache.http.params.HttpParams;
  24. import org.apache.http.params.HttpProtocolParams;
  25. import org.apache.http.protocol.HTTP;
  26. import org.json.JSONException;
  27. import org.json.JSONObject;
  28. import android.app.IntentService;
  29. import android.content.Intent;
  30. import android.content.SharedPreferences;
  31. import android.content.SharedPreferences.Editor;
  32. import android.os.Bundle;
  33. import android.os.ResultReceiver;
  34. import android.preference.PreferenceManager;
  35. import android.util.Log;
  36. import de.tudarmstadt.informatik.hostage.logging.NetworkRecord;
  37. import de.tudarmstadt.informatik.hostage.logging.SyncInfoRecord;
  38. import de.tudarmstadt.informatik.hostage.net.MySSLSocketFactory;
  39. import de.tudarmstadt.informatik.hostage.persistence.HostageDBOpenHelper;
  40. /**
  41. * Service that synchronizes with a specified remote server.
  42. *
  43. * @author Lars Pandikow
  44. */
  45. public class TracingSyncService extends IntentService {
  46. public static final String REMOTE_DEVICE = "de.tudarmstadt.informatik.hostage.REMOTE_DEVICE";
  47. public static final String ACTION_START_SYNC = "de.tudarmstadt.informatik.hostage.ACTION_START_SYNC";
  48. public static final String EXTRA_RECEIVER = "de.tudarmstadt.informatik.hostage.EXTRA_HANDLER";
  49. public static final String UPLOAD_SIZE = "de.tudarmstadt.informatik.hostage.UPLOAD_SIZE";
  50. public static final String UPLOAD_PROGRESS = "de.tudarmstadt.informatik.hostage.UPLOAD_PROGRESS";
  51. public static final int RECORD_UPLOADED = 0x00;
  52. public static final int SYNC_COMPLETE = 0x01;
  53. private HttpClient httpClient;
  54. private ResultReceiver receiver;
  55. HostageDBOpenHelper dbh;
  56. SharedPreferences pref;
  57. Editor editor;
  58. public TracingSyncService() {
  59. super(TracingSyncService.class.getName());
  60. }
  61. @Override
  62. public void onCreate() {
  63. super.onCreate();
  64. pref = PreferenceManager.getDefaultSharedPreferences(this);
  65. editor = pref.edit();
  66. dbh = new HostageDBOpenHelper(this);
  67. }
  68. /**
  69. * The IntentService calls this method from the default worker thread with
  70. * the intent that started the service. When this method returns,
  71. * IntentService stops the service, as appropriate.
  72. */
  73. @Override
  74. protected void onHandleIntent(Intent intent) {
  75. if (intent != null) {
  76. final String action = intent.getAction();
  77. if (ACTION_START_SYNC.equals(action)) {
  78. receiver = intent.getParcelableExtra(EXTRA_RECEIVER);
  79. syncNewRecords();
  80. dbh.clearSyncInfos();
  81. if (receiver != null) {
  82. receiver.send(SYNC_COMPLETE, null);
  83. }
  84. }
  85. }
  86. }
  87. /**
  88. * Uploads all new Records to a server, specified in the settings.
  89. */
  90. private void syncNewRecords() {
  91. int lastUploadedAttackId = pref.getInt("LAST_UPLOADED_ATTACK_ID", -1);
  92. // String serverAddress = pref.getString("pref_upload",
  93. // "https://ssi.cased.de");
  94. String serverAddress = "http://87.230.23.240/hostage/push.php";
  95. ArrayList<NetworkRecord> recordList = dbh.getNetworkInformation();
  96. int size = recordList.size();
  97. int offset = 1;
  98. for (NetworkRecord record : recordList) {
  99. boolean success = uploadSingleRecord(record, serverAddress);
  100. Log.i("Tracing upload", "Upload of record: " + offset + "/" + size + ((success) ? " successful." : " failed."));
  101. if (receiver != null) {
  102. Bundle data = new Bundle();
  103. data.putInt(UPLOAD_SIZE, size);
  104. data.putInt(UPLOAD_PROGRESS, offset);
  105. receiver.send(RECORD_UPLOADED, data);
  106. }
  107. offset++;
  108. // TODO pull
  109. // getRemoteData(record.getBssid(), record.getTimestamp());
  110. }
  111. }
  112. /**
  113. * Uploads a single Record to a server, specified in the settings.
  114. *
  115. * @param record
  116. * The Record to upload.
  117. * @serverAddress Address of the target server
  118. * @return True if the upload was successful, else false.
  119. */
  120. private boolean uploadSingleRecord(NetworkRecord record, String serverAddress) {
  121. // Create a https client. Uses MySSLSocketFactory to accept all
  122. // certificates
  123. HttpPost httppost;
  124. try {
  125. httpClient = createHttpClient();
  126. // Create HttpPost
  127. httppost = new HttpPost(serverAddress);
  128. // Create JSON String of Record
  129. // TODO StringEntity se = new
  130. // StringEntity(record.toString(TraCINgFormatter.getInstance()));
  131. String s = record.toJSON();
  132. StringEntity se = new StringEntity("record=" + record.toJSON());
  133. httppost.addHeader("content-type", "application/x-www-form-urlencoded");
  134. httppost.setEntity(se);
  135. // Execute HttpPost
  136. HttpResponse response = httpClient.execute(httppost);
  137. // TODO Does it make sense to update the network record after a commit?
  138. getRemoteData(record.getBssid(), record.getTimestampLocation());
  139. Log.i("TracingSyncService", "Status Code: " + response.getStatusLine().getStatusCode());
  140. } catch (Exception e) {
  141. e.printStackTrace();
  142. return false;
  143. }
  144. return true;
  145. }
  146. /**
  147. * Gets the data from the server and updates the database.
  148. */
  149. private void getRemoteData(String bssid, long timestamp) {
  150. HttpURLConnection connection;
  151. OutputStreamWriter request = null;
  152. URL url = null;
  153. String response = null;
  154. String parameters = "bssid=" + bssid;
  155. try {
  156. url = new URL("http://87.230.23.240/hostage/pull.php");
  157. connection = (HttpURLConnection) url.openConnection();
  158. connection.setDoOutput(true);
  159. connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
  160. connection.setRequestMethod("POST");
  161. request = new OutputStreamWriter(connection.getOutputStream());
  162. request.write(parameters);
  163. request.flush();
  164. request.close();
  165. String line = "";
  166. InputStreamReader isr = new InputStreamReader(connection.getInputStream());
  167. BufferedReader reader = new BufferedReader(isr);
  168. StringBuilder sb = new StringBuilder();
  169. while ((line = reader.readLine()) != null) {
  170. sb.append(line);
  171. }
  172. response = sb.toString();
  173. JSONObject jsonObj = new JSONObject(response);
  174. NetworkRecord net = new NetworkRecord();
  175. net.setBssid(jsonObj.getString("bssid"));
  176. net.setSsid(jsonObj.getString("ssid"));
  177. net.setLatitude(jsonObj.getDouble("latitude"));
  178. net.setLongitude(jsonObj.getDouble("longitude"));
  179. net.setTimestampLocation(jsonObj.getLong("timestamp"));
  180. SyncInfoRecord sync = new SyncInfoRecord();
  181. sync.setBSSID(jsonObj.getString("bssid"));
  182. sync.setDeviceID("-1");
  183. sync.setNumber_of_attacks(jsonObj.getLong("attacks"));
  184. sync.setNumber_of_portscans(jsonObj.getLong("portscans"));
  185. dbh.updateNetworkInformation(net);
  186. isr.close();
  187. reader.close();
  188. } catch (IOException e) {
  189. Log.i("NetworkTest", "Network Error: " + e);
  190. } catch (JSONException e) {
  191. e.printStackTrace();
  192. }
  193. }
  194. /**
  195. * Creates a HttpClient with an own SSL Socket.
  196. *
  197. * @return HttpsClient who accepts accepts all certificates.
  198. * @see MySSLSocketFactory
  199. */
  200. private HttpClient createHttpClient() {
  201. try {
  202. KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
  203. trustStore.load(null, null);
  204. SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
  205. sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
  206. HttpParams params = new BasicHttpParams();
  207. HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  208. HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
  209. SchemeRegistry registry = new SchemeRegistry();
  210. registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
  211. registry.register(new Scheme("https", sf, 443));
  212. ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
  213. return new DefaultHttpClient(ccm, params);
  214. } catch (Exception e) {
  215. e.printStackTrace();
  216. return new DefaultHttpClient();
  217. }
  218. }
  219. }