UglyDbHelper.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818
  1. package de.tudarmstadt.informatik.hostage.logging;
  2. import android.content.ContentValues;
  3. import android.content.Context;
  4. import android.database.Cursor;
  5. import android.database.sqlite.SQLiteDatabase;
  6. import android.database.sqlite.SQLiteOpenHelper;
  7. import android.util.Log;
  8. import java.util.ArrayList;
  9. import java.util.HashMap;
  10. import de.tudarmstadt.informatik.hostage.logging.Record.TYPE;
  11. import de.tudarmstadt.informatik.hostage.ui.LogFilter;
  12. /**
  13. * This class creates SQL tables and handles all access to the database.<br>
  14. * It contains several methods with predefined queries to extract different
  15. * kinds of information from the database.<br>
  16. * The database contains two tables: {@link #TABLE_RECORDS} and
  17. * {@link #TABLE_BSSIDS}:<br>
  18. * {@link #TABLE_RECORDS} contains all logging information of a single message
  19. * record except the SSID.<br>
  20. * {@link #TABLE_BSSIDS} contains the BSSID of all recorded Networks and the
  21. * corresponding SSID.<br>
  22. *
  23. * @author Lars Pandikow
  24. */
  25. public class UglyDbHelper extends SQLiteOpenHelper {
  26. // All Static variables
  27. // Database Version
  28. private static final int DATABASE_VERSION = 2;
  29. // Database Name
  30. private static final String DATABASE_NAME = "recordManager";
  31. // Contacts table names
  32. private static final String TABLE_ATTACK_INFO = "attack_info";
  33. private static final String TABLE_RECORDS = "records";
  34. private static final String TABLE_BSSIDS = "bssids";
  35. // Contacts Table Columns names
  36. public static final String KEY_ID = "_id";
  37. public static final String KEY_ATTACK_ID = "_attack_id";
  38. public static final String KEY_TYPE = "type";
  39. public static final String KEY_TIME = "timestamp";
  40. public static final String KEY_PACKET = "packet";
  41. public static final String KEY_PROTOCOL = "protocol";
  42. public static final String KEY_EXTERNAL_IP = "externalIP";
  43. public static final String KEY_LOCAL_IP = "localIP";
  44. public static final String KEY_LOCAL_HOSTNAME = "localHostName";
  45. public static final String KEY_LOCAL_PORT = "localPort";
  46. public static final String KEY_REMOTE_IP = "remoteIP";
  47. public static final String KEY_REMOTE_HOSTNAME = "remoteHostName";
  48. public static final String KEY_REMOTE_PORT = "remotePort";
  49. public static final String KEY_BSSID = "_bssid";
  50. public static final String KEY_SSID = "ssid";
  51. public static final String KEY_LATITUDE = "latitude";
  52. public static final String KEY_LONGITUDE = "longitude";
  53. public static final String KEY_ACCURACY = "accuracy";
  54. // Database sql create statements
  55. private static final String CREATE_RECORD_TABLE =
  56. "CREATE TABLE " + TABLE_RECORDS + "("
  57. + KEY_ID + " INTEGER NOT NULL,"
  58. + KEY_ATTACK_ID + " INTEGER NOT NULL,"
  59. + KEY_TYPE + " TEXT,"
  60. + KEY_TIME + " INTEGER,"
  61. + KEY_PACKET + " TEXT,"
  62. + "FOREIGN KEY(" + KEY_ATTACK_ID + ") REFERENCES " + TABLE_ATTACK_INFO + "(" + KEY_ATTACK_ID + "),"
  63. + "PRIMARY KEY(" + KEY_ID + ", " + KEY_ATTACK_ID + ")"
  64. + ")";
  65. private static final String CREATE_ATTACK_INFO_TABLE =
  66. "CREATE TABLE " + TABLE_ATTACK_INFO + "("
  67. + KEY_ATTACK_ID + " INTEGER PRIMARY KEY,"
  68. + KEY_PROTOCOL + " TEXT,"
  69. + KEY_EXTERNAL_IP + " TEXT,"
  70. + KEY_LOCAL_IP + " BLOB,"
  71. + KEY_LOCAL_HOSTNAME + " TEXT,"
  72. + KEY_LOCAL_PORT + " INTEGER,"
  73. + KEY_REMOTE_IP + " BLOB,"
  74. + KEY_REMOTE_HOSTNAME + " TEXT,"
  75. + KEY_REMOTE_PORT + " INTEGER,"
  76. + KEY_BSSID + " TEXT,"
  77. + "FOREIGN KEY(" + KEY_BSSID + ") REFERENCES " + TABLE_BSSIDS + "(" + KEY_BSSID + ")"
  78. + ")";
  79. private static final String CREATE_BSSID_TABLE =
  80. "CREATE TABLE " + TABLE_BSSIDS + "("
  81. + KEY_BSSID + " TEXT PRIMARY KEY,"
  82. + KEY_SSID + " TEXT,"
  83. + KEY_LATITUDE + " INTEGER,"
  84. + KEY_LONGITUDE + " INTEGER,"
  85. + KEY_ACCURACY + " INTEGER,"
  86. + KEY_TIME + " INTEGER"
  87. + ")";
  88. public UglyDbHelper(Context context) {
  89. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  90. }
  91. // Creating Tables
  92. @Override
  93. public void onCreate(SQLiteDatabase db){
  94. try{
  95. db.execSQL(CREATE_BSSID_TABLE);
  96. db.execSQL(CREATE_ATTACK_INFO_TABLE);
  97. db.execSQL(CREATE_RECORD_TABLE);
  98. }catch (android.database.SQLException e){
  99. System.out.println(" " + "Could not create SQL Tables.");
  100. }
  101. }
  102. // Upgrading database
  103. @Override
  104. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  105. // Drop older table if existed
  106. db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECORDS);
  107. db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTACK_INFO);
  108. db.execSQL("DROP TABLE IF EXISTS " + TABLE_BSSIDS);
  109. // Create tables again
  110. onCreate(db);
  111. }
  112. /*
  113. // Contacts Table Columns names
  114. private static final String KEY_ID = "_id";
  115. private static final String KEY_ATTACK_ID = "_attack_id";
  116. private static final String KEY_TYPE = "type";
  117. private static final String KEY_TIME = "timestamp";
  118. private static final String KEY_PACKET = "packet";
  119. private static final String KEY_PROTOCOL = "protocol";
  120. private static final String KEY_EXTERNAL_IP ="externalIP";
  121. private static final String KEY_LOCAL_IP = "localIP";
  122. private static final String KEY_LOCAL_HOSTNAME = "localHostName";
  123. private static final String KEY_LOCAL_PORT = "localPort";
  124. private static final String KEY_REMOTE_IP = "remoteIP";
  125. private static final String KEY_REMOTE_HOSTNAME = "remoteHostName";
  126. private static final String KEY_REMOTE_PORT = "remotePort";
  127. private static final String KEY_BSSID = "_bssid";
  128. private static final String KEY_SSID = "ssid";
  129. private static final String KEY_LATITUDE = "latitude";
  130. private static final String KEY_LONGITUDE = "longitude";
  131. private static final String KEY_ACCURACY = "accuracy";
  132. */
  133. /**
  134. * Gets all received {@link Record Records} for the specified information in the LogFilter ordered by date.
  135. * @return A ArrayList with all received {@link Record Records} for the LogFilter.
  136. */
  137. public ArrayList<Record> getRecordsForFilter(LogFilter filter) {
  138. ArrayList<Record> recordList = new ArrayList<Record>();
  139. String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " NATURAL JOIN " + TABLE_BSSIDS;
  140. // TIMESTAMPS
  141. selectQuery = selectQuery + " WHERE " + KEY_TIME;
  142. selectQuery = selectQuery + " < " + filter.getBelowTimestamp();
  143. selectQuery = selectQuery + " AND " + KEY_TIME;
  144. selectQuery = selectQuery + " > " + filter.getAboveTimestamp();
  145. if (filter.getBSSIDs() != null && filter.getBSSIDs().size() > 0) {
  146. selectQuery = selectQuery + " AND ";
  147. selectQuery = selectQuery + filter.getBSSIDQueryStatement(KEY_BSSID);
  148. }
  149. if (filter.getESSIDs() != null && filter.getESSIDs().size() > 0) {
  150. selectQuery = selectQuery + " AND ";
  151. selectQuery = selectQuery + filter.getESSIDQueryStatement(KEY_SSID);
  152. }
  153. if (filter.getProtocols() != null && filter.getProtocols().size() > 0) {
  154. selectQuery = selectQuery + " AND ";
  155. selectQuery = selectQuery + filter.getProtocolsQueryStatement(KEY_PROTOCOL);
  156. }
  157. // ORDERED BY TIME
  158. selectQuery = selectQuery + " ORDER BY " + filter.getSorttype();
  159. System.out.println(selectQuery);
  160. SQLiteDatabase db = this.getReadableDatabase();
  161. Cursor cursor = db.rawQuery(selectQuery, null);
  162. // looping through all rows and adding to list
  163. if (cursor.moveToFirst()) {
  164. do {
  165. Record record = createRecord(cursor);
  166. // Adding record to list
  167. recordList.add(record);
  168. } while (cursor.moveToNext());
  169. }
  170. cursor.close();
  171. // return record list
  172. db.close();
  173. return recordList;
  174. }
  175. /**
  176. * Gets all non duplicate Records For the key BSSID.
  177. * @return A ArrayList with received Records.
  178. */
  179. public ArrayList<String> getUniqueBSSIDRecords(){
  180. return this.getUniqueDataEntryForKeyType(KEY_BSSID, TABLE_BSSIDS);
  181. }
  182. /**
  183. * Gets all non duplicate Records For the key ESSID.
  184. * @return A ArrayList with received Records.
  185. */
  186. public ArrayList<String> getUniqueESSIDRecords(){
  187. return this.getUniqueDataEntryForKeyType(KEY_SSID, TABLE_BSSIDS);
  188. }
  189. /**
  190. * Gets all non duplicate Data Entry For a specific KeyType ( e.g. BSSIDs).
  191. * @return A ArrayList with received Records.
  192. */
  193. public ArrayList<String> getUniqueDataEntryForKeyType(String keyType, String table) {
  194. ArrayList<String> recordList = new ArrayList<String>();
  195. //String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " NATURAL JOIN " + TABLE_BSSIDS + " NATURAL JOIN " + TABLE_PORTS;
  196. String selectQuery = "SELECT DISTINCT " + keyType + " FROM " + table + " ORDER BY " + keyType; // " NATURAL JOIN " + TABLE_ATTACK_INFO + " NATURAL JOIN " + TABLE_BSSIDS + " NATURAL JOIN " + TABLE_PORTS +
  197. // ORDERED BY TIME
  198. System.out.println(selectQuery);
  199. SQLiteDatabase db = this.getReadableDatabase();
  200. Cursor cursor = db.rawQuery(selectQuery, null);
  201. // looping through all rows and adding to list
  202. if (cursor.moveToFirst()) {
  203. do {
  204. String record = cursor.getString(0);
  205. recordList.add(record);
  206. } while (cursor.moveToNext());
  207. }
  208. cursor.close();
  209. // return record list
  210. db.close();
  211. return recordList;
  212. }
  213. /**
  214. * Adds a given {@link Record} to the database.
  215. *
  216. * @param record
  217. * The added {@link Record} .
  218. */
  219. public void addRecord(Record record) {
  220. SQLiteDatabase db = this.getWritableDatabase();
  221. HashMap<String, Object> bssidValues = new HashMap<String, Object>();
  222. bssidValues.put(KEY_BSSID, record.getBssid());
  223. bssidValues.put(KEY_SSID, record.getSsid());
  224. bssidValues.put(KEY_LATITUDE, record.getLatitude());
  225. bssidValues.put(KEY_LONGITUDE, record.getLongitude());
  226. bssidValues.put(KEY_ACCURACY, record.getAccuracy());
  227. bssidValues.put(KEY_TIME, record.getTimestampLocation());
  228. ContentValues attackValues = new ContentValues();
  229. attackValues.put(KEY_ATTACK_ID, record.getAttack_id()); // Log Attack ID
  230. attackValues.put(KEY_PROTOCOL, record.getProtocol().toString());
  231. attackValues.put(KEY_EXTERNAL_IP, record.getExternalIP());
  232. attackValues.put(KEY_LOCAL_IP, record.getLocalIP()); // Log Local IP
  233. attackValues.put(KEY_LOCAL_HOSTNAME, record.getLocalHost());
  234. attackValues.put(KEY_LOCAL_PORT, record.getLocalPort());
  235. attackValues.put(KEY_REMOTE_IP, record.getRemoteIP()); // Log Remote IP
  236. attackValues.put(KEY_REMOTE_HOSTNAME, record.getRemoteHost());
  237. attackValues.put(KEY_REMOTE_PORT, record.getRemotePort()); // Log Remote Port
  238. attackValues.put(KEY_BSSID, record.getBssid());
  239. ContentValues recordValues = new ContentValues();
  240. recordValues.put(KEY_ID, record.getId()); // Log Message Number
  241. recordValues.put(KEY_ATTACK_ID, record.getAttack_id()); // Log Attack ID
  242. recordValues.put(KEY_TYPE, record.getType().name()); // Log Type
  243. recordValues.put(KEY_TIME, record.getTimestamp()); // Log Timestamp
  244. recordValues.put(KEY_PACKET, record.getPacket()); // Log Packet
  245. long e1=0;
  246. long e2=0;
  247. // Inserting Rows
  248. if (db != null) {
  249. e1 = db.insertWithOnConflict(TABLE_ATTACK_INFO, null, attackValues,
  250. SQLiteDatabase.CONFLICT_REPLACE);
  251. e2 = db.insert(TABLE_RECORDS, null, recordValues);
  252. db.close(); // Closing database connection
  253. }
  254. // Update Network Information
  255. long e3 = updateNetworkInformation(bssidValues);
  256. if (e1 ==-1 || e2 == -1 || e3 == -1){
  257. System.out.println(""+"Could not insert Record");
  258. }
  259. }
  260. /**
  261. * Creates a {@link Record} from a Cursor. If the cursor does not show to a
  262. * valid data structure a runtime exception is thrown.
  263. *
  264. * @param cursor
  265. * @return Returns the created {@link Record} .
  266. */
  267. private Record createRecord(Cursor cursor) {
  268. Record record = new Record();
  269. record.setId(Integer.parseInt(cursor.getString(0)));
  270. record.setAttack_id(cursor.getLong(1));
  271. record.setType(cursor.getString(2).equals("SEND") ? TYPE.SEND : TYPE.RECEIVE);
  272. record.setTimestamp(cursor.getLong(3));
  273. record.setPacket(cursor.getString(4));
  274. record.setProtocol(cursor.getString(5));
  275. record.setExternalIP(cursor.getString(6));
  276. record.setLocalIP(cursor.getString(7));
  277. record.setLocalHost(cursor.getString(8));
  278. record.setLocalPort(Integer.parseInt(cursor.getString(9)));
  279. record.setRemoteIP(cursor.getString(10));
  280. record.setRemoteHost(cursor.getString(11));
  281. record.setRemotePort(Integer.parseInt(cursor.getString(12)));
  282. record.setBssid(cursor.getString(13));
  283. record.setSsid(cursor.getString(14));
  284. record.setLatitude(Double.parseDouble(cursor.getString(15)));
  285. record.setLongitude(Double.parseDouble(cursor.getString(16)));
  286. record.setAccuracy(Float.parseFloat(cursor.getString(17)));
  287. record.setTimestampLocation(cursor.getLong(18));
  288. return record;
  289. }
  290. /**
  291. * Gets a single {@link Record} with the given ID from the database.
  292. *
  293. * @param id
  294. * The ID of the {@link Record};
  295. * @return The {@link Record}.
  296. */
  297. public Record getRecord(int id) {
  298. String selectQuery = "SELECT * FROM " + TABLE_RECORDS
  299. + " NATURAL JOIN " + TABLE_ATTACK_INFO
  300. + " NATURAL JOIN "+ TABLE_BSSIDS
  301. + " WHERE " + KEY_ID + " = " + id;
  302. SQLiteDatabase db = this.getReadableDatabase();
  303. Cursor cursor = db.rawQuery(selectQuery, null);
  304. Record record = null;
  305. if (cursor.moveToFirst()) {
  306. record = createRecord(cursor);
  307. }
  308. cursor.close();
  309. db.close();
  310. // return contact
  311. return record;
  312. }
  313. /**
  314. * Gets all {@link Record Records} saved in the database.
  315. *
  316. * @return A ArrayList of all the {@link Record Records} in the Database.
  317. */
  318. public ArrayList<Record> getAllRecords() {
  319. ArrayList<Record> recordList = new ArrayList<Record>();
  320. // Select All Query
  321. String selectQuery = "SELECT * FROM " + TABLE_RECORDS
  322. + " NATURAL JOIN " + TABLE_ATTACK_INFO
  323. + " NATURAL JOIN " + TABLE_BSSIDS;
  324. SQLiteDatabase db = this.getReadableDatabase();
  325. Cursor cursor = db.rawQuery(selectQuery, null);
  326. Log.i("Database", "Start loop");
  327. // looping through all rows and adding to list
  328. if (cursor.moveToFirst()) {
  329. do {
  330. Log.i("Database", "Add Record");
  331. Record record = createRecord(cursor);
  332. // Adding record to list
  333. recordList.add(record);
  334. } while (cursor.moveToNext());
  335. }
  336. cursor.close();
  337. db.close();
  338. // return record list
  339. return recordList;
  340. }
  341. /**
  342. * Gets a single {@link Record} with the given attack id from the database.
  343. *
  344. * @param attack_id
  345. * The attack id of the {@link Record};
  346. * @return The {@link Record}.
  347. */
  348. public Record getRecordOfAttackId(long attack_id) {
  349. String selectQuery = "SELECT * FROM " + TABLE_RECORDS
  350. + " NATURAL JOIN " + TABLE_ATTACK_INFO
  351. + " NATURAL JOIN " + TABLE_BSSIDS
  352. + " WHERE " + KEY_ATTACK_ID + " = " + attack_id
  353. + " GROUP BY " + KEY_ATTACK_ID;
  354. SQLiteDatabase db = this.getReadableDatabase();
  355. Cursor cursor = db.rawQuery(selectQuery, null);
  356. Record record = null;
  357. if (cursor.moveToFirst()) {
  358. record = createRecord(cursor);
  359. }
  360. cursor.close();
  361. // return record list
  362. db.close();
  363. return record;
  364. }
  365. /**
  366. * Gets all received {@link Record Records} for every attack identified by
  367. * its attack id and ordered by date.
  368. *
  369. * @return A ArrayList with all received {@link Record Records} for each
  370. * attack id in the Database.
  371. */
  372. public ArrayList<Record> getAllReceivedRecordsOfEachAttack() {
  373. ArrayList<Record> recordList = new ArrayList<Record>();
  374. String selectQuery = "SELECT * FROM " + TABLE_RECORDS
  375. + " NATURAL JOIN " + TABLE_ATTACK_INFO
  376. + " NATURAL JOIN " + TABLE_BSSIDS
  377. + " WHERE " + KEY_TYPE + "='RECEIVE'"
  378. + " ORDER BY " + KEY_TIME;
  379. SQLiteDatabase db = this.getReadableDatabase();
  380. Cursor cursor = db.rawQuery(selectQuery, null);
  381. // looping through all rows and adding to list
  382. if (cursor.moveToFirst()) {
  383. do {
  384. Record record = createRecord(cursor);
  385. // Adding record to list
  386. recordList.add(record);
  387. } while (cursor.moveToNext());
  388. }
  389. cursor.close();
  390. // return record list
  391. db.close();
  392. return recordList;
  393. }
  394. /**
  395. * Gets a representative {@link Record} for every attack identified by its
  396. * attack id.
  397. *
  398. * @return A ArrayList with one {@link Record Records} for each attack id in
  399. * the Database.
  400. */
  401. public ArrayList<Record> getRecordOfEachAttack() {
  402. ArrayList<Record> recordList = new ArrayList<Record>();
  403. String selectQuery = "SELECT * FROM " + TABLE_RECORDS
  404. + " NATURAL JOIN " + TABLE_ATTACK_INFO
  405. + " NATURAL JOIN " + TABLE_BSSIDS
  406. + " GROUP BY " + KEY_ATTACK_ID;
  407. SQLiteDatabase db = this.getReadableDatabase();
  408. Cursor cursor = db.rawQuery(selectQuery, null);
  409. // looping through all rows and adding to list
  410. if (cursor.moveToFirst()) {
  411. do {
  412. Record record = createRecord(cursor);
  413. // Adding record to list
  414. recordList.add(record);
  415. } while (cursor.moveToNext());
  416. }
  417. cursor.close();
  418. // return record list
  419. db.close();
  420. return recordList;
  421. }
  422. /**
  423. * Gets a representative {@link Record} for every attack with a higher
  424. * attack id than the specified.
  425. *
  426. * @param attack_id
  427. * The attack id to match the query against.
  428. * @return A ArrayList with one {@link Record Records} for each attack id
  429. * higher than the given.
  430. */
  431. public ArrayList<Record> getRecordOfEachAttack(long attack_id) {
  432. ArrayList<Record> recordList = new ArrayList<Record>();
  433. String selectQuery = "SELECT * FROM " + TABLE_RECORDS
  434. + " NATURAL JOIN " + TABLE_ATTACK_INFO
  435. + " NATURAL JOIN " + TABLE_BSSIDS
  436. + " WHERE " + KEY_ATTACK_ID + " > " + attack_id
  437. + " GROUP BY " + KEY_ATTACK_ID;
  438. SQLiteDatabase db = this.getReadableDatabase();
  439. Cursor cursor = db.rawQuery(selectQuery, null);
  440. // looping through all rows and adding to list
  441. if (cursor.moveToFirst()) {
  442. do {
  443. Record record = createRecord(cursor);
  444. // Adding record to list
  445. recordList.add(record);
  446. } while (cursor.moveToNext());
  447. }
  448. cursor.close();
  449. // return count
  450. db.close();
  451. return recordList;
  452. }
  453. /**
  454. * Determines the number of {@link Record Records} in the database.
  455. *
  456. * @return The number of {@link Record Records} in the database.
  457. */
  458. public int getRecordCount() {
  459. String countQuery = "SELECT * FROM " + TABLE_RECORDS;
  460. SQLiteDatabase db = this.getReadableDatabase();
  461. Cursor cursor = db.rawQuery(countQuery, null);
  462. int result = cursor.getCount();
  463. cursor.close();
  464. // return count
  465. db.close();
  466. return result;
  467. }
  468. /**
  469. * Determines the number of different attack_ids in the database.
  470. *
  471. * @return The number of different attack_ids in the database.
  472. */
  473. public int getAttackCount() {
  474. String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO;
  475. SQLiteDatabase db = this.getReadableDatabase();
  476. Cursor cursor = db.rawQuery(countQuery, null);
  477. int result = cursor.getCount();
  478. cursor.close();
  479. // return count
  480. db.close();
  481. return result;
  482. }
  483. /**
  484. * Determines the number of different attack_ids for a specific protocol in
  485. * the database.
  486. *
  487. * @param protocol
  488. * The String representation of the
  489. * {@link de.tudarmstadt.informatik.hostage.protocol.Protocol
  490. * Protocol}
  491. * @return The number of different attack_ids in the database.
  492. */
  493. public int getAttackPerProtocolCount(String protocol) {
  494. String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO + " WHERE "
  495. + KEY_PROTOCOL + " = " + "'" + protocol + "'";
  496. SQLiteDatabase db = this.getReadableDatabase();
  497. Cursor cursor = db.rawQuery(countQuery, null);
  498. int result = cursor.getCount();
  499. cursor.close();
  500. // return count
  501. db.close();
  502. return result;
  503. }
  504. /**
  505. * Determines the smallest attack id stored in the database.
  506. *
  507. * @return The smallest attack id stored in the database.
  508. */
  509. public long getSmallestAttackId() {
  510. String selectQuery = "SELECT MIN(" + KEY_ATTACK_ID + ") FROM "
  511. + TABLE_ATTACK_INFO;
  512. SQLiteDatabase db = this.getReadableDatabase();
  513. Cursor cursor = db.rawQuery(selectQuery, null);
  514. int result;
  515. if (cursor.moveToFirst()) {
  516. result = cursor.getInt(0);
  517. } else {
  518. result = -1;
  519. }
  520. cursor.close();
  521. db.close();
  522. return result;
  523. }
  524. /**
  525. * Determines the highest attack id stored in the database.
  526. *
  527. * @return The highest attack id stored in the database.
  528. */
  529. public long getHighestAttackId() {
  530. String selectQuery = "SELECT MAX(" + KEY_ATTACK_ID + ") FROM "
  531. + TABLE_ATTACK_INFO;
  532. SQLiteDatabase db = this.getReadableDatabase();
  533. Cursor cursor = db.rawQuery(selectQuery, null);
  534. int result;
  535. if (cursor.moveToFirst()) {
  536. result = cursor.getInt(0);
  537. } else {
  538. result = -1;
  539. }
  540. cursor.close();
  541. db.close();
  542. return result;
  543. }
  544. /**
  545. * Determines if a network with given BSSID has already been recorded as
  546. * malicious.
  547. *
  548. * @param BSSID
  549. * The BSSID of the network.
  550. * @return True if an attack has been recorded in a network with the given
  551. * BSSID, else false.
  552. */
  553. public boolean bssidSeen(String BSSID) {
  554. String countQuery = "SELECT * FROM " + TABLE_BSSIDS + " WHERE "
  555. + KEY_BSSID + " = " + "'" + BSSID + "'";
  556. SQLiteDatabase db = this.getReadableDatabase();
  557. Cursor cursor = db.rawQuery(countQuery, null);
  558. int result = cursor.getCount();
  559. cursor.close();
  560. db.close();
  561. return result > 0;
  562. }
  563. /**
  564. * Determines if an attack has been recorded on a specific protocol in a
  565. * network with a given BSSID.
  566. *
  567. * @param protocol
  568. * The
  569. * {@link de.tudarmstadt.informatik.hostage.protocol.Protocol
  570. * Protocol} to inspect.
  571. * @param BSSID
  572. * The BSSID of the network.
  573. * @return True if an attack on the given protocol has been recorded in a
  574. * network with the given BSSID, else false.
  575. */
  576. public boolean bssidSeen(String protocol, String BSSID) {
  577. String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO
  578. + " NATURAL JOIN " + TABLE_BSSIDS + " WHERE " + KEY_PROTOCOL
  579. + " = " + "'" + protocol + "'" + " AND " + KEY_BSSID + " = "
  580. + "'" + BSSID + "'";
  581. SQLiteDatabase db = this.getReadableDatabase();
  582. Cursor cursor = db.rawQuery(countQuery, null);
  583. int result = cursor.getCount();
  584. cursor.close();
  585. db.close();
  586. return result > 0;
  587. }
  588. /**
  589. * Returns a String array with all BSSIDs stored in the database.
  590. *
  591. * @return String[] of all recorded BSSIDs.
  592. */
  593. public String[] getAllBSSIDS() {
  594. String selectQuery = "SELECT * FROM " + TABLE_BSSIDS;
  595. SQLiteDatabase db = this.getReadableDatabase();
  596. Cursor cursor = db.rawQuery(selectQuery, null);
  597. String[] bssidList = new String[cursor.getCount()];
  598. int counter = 0;
  599. // looping through all rows and adding to list
  600. if (cursor.moveToFirst()) {
  601. do {
  602. bssidList[counter] = cursor.getString(0);
  603. counter++;
  604. } while (cursor.moveToNext());
  605. }
  606. cursor.close();
  607. db.close();
  608. return bssidList;
  609. }
  610. /**
  611. * Gets the last recorded SSID to a given BSSID.
  612. *
  613. * @param bssid
  614. * The BSSID to match against.
  615. * @return A String of the last SSID or null if the BSSID is not in the
  616. * database.
  617. */
  618. public String getSSID(String bssid) {
  619. String selectQuery = "SELECT " + KEY_SSID + " FROM " + TABLE_BSSIDS
  620. + " WHERE " + KEY_BSSID + " = " + "'" + bssid + "'";
  621. SQLiteDatabase db = this.getReadableDatabase();
  622. Cursor cursor = db.rawQuery(selectQuery, null);
  623. String ssid = null;
  624. if (cursor.moveToFirst()) {
  625. ssid = cursor.getString(0);
  626. }
  627. cursor.close();
  628. db.close();
  629. return ssid;
  630. }
  631. /**
  632. * Deletes all records from {@link #TABLE_RECORDS} with a specific BSSID.
  633. *
  634. * @param bssid
  635. * The BSSID to match against.
  636. */
  637. public void deleteByBSSID(String bssid) {
  638. SQLiteDatabase db = this.getReadableDatabase();
  639. db.delete(TABLE_RECORDS, KEY_BSSID + " = ?", new String[] { bssid });
  640. db.delete(TABLE_ATTACK_INFO, KEY_BSSID + " = ?", new String[] { bssid });
  641. db.close();
  642. }
  643. // TODO Delete statement �berarbeiten
  644. /**
  645. * Deletes all records from {@link #TABLE_RECORDS} with a time stamp smaller
  646. * then the given
  647. *
  648. * @param date
  649. * A Date represented in milliseconds.
  650. */
  651. public void deleteByDate(long date) {
  652. SQLiteDatabase db = this.getReadableDatabase();
  653. String deleteQuery = "DELETE FROM " + TABLE_RECORDS + " WHERE "
  654. + KEY_TIME + " < " + date;
  655. // TODO Delete statement �berarbeiten
  656. // String deleteQuery2 = "DELETE "
  657. db.execSQL(deleteQuery);
  658. db.close();
  659. }
  660. /**
  661. * Deletes all records from {@link #TABLE_RECORDS}.
  662. */
  663. public void clearData() {
  664. SQLiteDatabase db = this.getReadableDatabase();
  665. db.delete(TABLE_RECORDS, null, null);
  666. db.delete(TABLE_ATTACK_INFO, null, null);
  667. db.close();
  668. }
  669. public ArrayList<HashMap<String, Object>> getNetworkInformation() {
  670. String selectQuery = "SELECT * FROM " + TABLE_BSSIDS;
  671. SQLiteDatabase db = this.getReadableDatabase();
  672. Cursor cursor = db.rawQuery(selectQuery, null);
  673. ArrayList<HashMap<String, Object>> networkInformation = new ArrayList<HashMap<String, Object>>();
  674. // looping through all rows and adding to list
  675. if (cursor.moveToFirst()) {
  676. do {
  677. HashMap<String, Object> values = new HashMap<String, Object>();
  678. values.put(KEY_BSSID, cursor.getString(0));
  679. values.put(KEY_SSID, cursor.getString(1));
  680. values.put(KEY_LATITUDE,
  681. Double.parseDouble(cursor.getString(2)));
  682. values.put(KEY_LONGITUDE,
  683. Double.parseDouble(cursor.getString(3)));
  684. values.put(KEY_ACCURACY, Float.parseFloat(cursor.getString(4)));
  685. values.put(KEY_TIME, cursor.getLong(5));
  686. networkInformation.add(values);
  687. } while (cursor.moveToNext());
  688. }
  689. cursor.close();
  690. db.close();
  691. return networkInformation;
  692. }
  693. public long updateNetworkInformation(
  694. HashMap<String, Object> networkInformation) {
  695. SQLiteDatabase db = this.getReadableDatabase();
  696. String bssid = (String) networkInformation.get(KEY_BSSID);
  697. String bssidQuery = "SELECT * FROM " + TABLE_BSSIDS + " WHERE "
  698. + KEY_BSSID + " = " + "'" + bssid + "'";
  699. Cursor cursor = db.rawQuery(bssidQuery, null);
  700. int result = cursor.getCount();
  701. long errorCode = 0;
  702. if (cursor != null
  703. && cursor.moveToFirst()
  704. && (result <= 0 || cursor.getLong(5) < (Long) networkInformation
  705. .get(KEY_TIME)))
  706. ;
  707. {
  708. ContentValues bssidValues = new ContentValues();
  709. bssidValues.put(KEY_BSSID, bssid);
  710. bssidValues
  711. .put(KEY_SSID, (String) networkInformation.get(KEY_SSID));
  712. bssidValues.put(KEY_LATITUDE,
  713. (double) (Double) networkInformation.get(KEY_LATITUDE));
  714. bssidValues.put(KEY_LONGITUDE,
  715. (double) (Double) networkInformation.get(KEY_LONGITUDE));
  716. bssidValues.put(KEY_ACCURACY,
  717. (float) (Float) networkInformation.get(KEY_ACCURACY));
  718. bssidValues.put(KEY_TIME, (Long) networkInformation.get(KEY_TIME));
  719. errorCode = db.insertWithOnConflict(TABLE_BSSIDS, null, bssidValues,
  720. SQLiteDatabase.CONFLICT_REPLACE);
  721. }
  722. cursor.close();
  723. db.close();
  724. return errorCode;
  725. }
  726. public void updateNetworkInformation(
  727. ArrayList<HashMap<String, Object>> networkInformation) {
  728. Log.i("DatabaseHandler", "Starte updating");
  729. for (HashMap<String, Object> values : networkInformation) {
  730. updateNetworkInformation(values);
  731. }
  732. }
  733. }