From 464596f5abe58b3fb7e5579ca16e74f1dec01cb8 Mon Sep 17 00:00:00 2001 From: zafodB Date: Wed, 18 Aug 2021 11:10:34 +0200 Subject: [PATCH 01/26] remove unused resource files --- src/main/res/anim/in_left_to_right.xml | 10 - src/main/res/anim/in_right_to_left.xml | 10 - src/main/res/anim/out_left_to_right.xml | 10 - src/main/res/anim/out_right_to_left.xml | 10 - .../drawable-hdpi/ic_action_cancel_dark.png | Bin 438 -> 0 bytes .../drawable-hdpi/ic_action_import_export.png | Bin 457 -> 0 bytes .../res/drawable-hdpi/ic_action_refresh.png | Bin 3137 -> 0 bytes .../res/drawable-hdpi/ic_action_stats.png | Bin 554 -> 0 bytes src/main/res/drawable-hdpi/ic_discard.png | Bin 840 -> 0 bytes .../res/drawable-hdpi/ic_filter_pressed.png | Bin 616 -> 0 bytes .../res/drawable-hdpi/ic_gsoc_logo_large.png | Bin 83929 -> 0 bytes .../res/drawable-hdpi/ic_gsoc_logo_small.png | Bin 61151 -> 0 bytes .../res/drawable-hdpi/ic_menu_gallery.png | Bin 1073 -> 0 bytes src/main/res/drawable-hdpi/ic_menu_help.png | Bin 1391 -> 0 bytes .../res/drawable-hdpi/ic_menu_privacy_old.png | Bin 537 -> 0 bytes .../drawable-hdpi/ic_navigation_drawer.png | Bin 100 -> 0 bytes src/main/res/drawable-hdpi/ic_profile_w7.png | Bin 6295 -> 0 bytes src/main/res/drawable-hdpi/light_green.png | Bin 4950 -> 0 bytes .../res/drawable-hdpi/light_green_large.png | Bin 17587 -> 0 bytes src/main/res/drawable-hdpi/light_grey.png | Bin 4457 -> 0 bytes .../res/drawable-hdpi/light_grey_large.png | Bin 13471 -> 0 bytes src/main/res/drawable-hdpi/light_red.png | Bin 4603 -> 0 bytes .../res/drawable-hdpi/light_red_large.png | Bin 15037 -> 0 bytes src/main/res/drawable-hdpi/light_yellow.png | Bin 4737 -> 0 bytes .../res/drawable-hdpi/light_yellow_large.png | Bin 16543 -> 0 bytes src/main/res/drawable-hdpi/rd_btn_off.png | Bin 1442 -> 0 bytes src/main/res/drawable-hdpi/rd_btn_on.png | Bin 2116 -> 0 bytes .../drawable-mdpi/ic_action_cancel_dark.png | Bin 328 -> 0 bytes .../drawable-mdpi/ic_action_import_export.png | Bin 325 -> 0 bytes .../res/drawable-mdpi/ic_action_refresh.png | Bin 3032 -> 0 bytes .../res/drawable-mdpi/ic_action_stats.png | Bin 475 -> 0 bytes src/main/res/drawable-mdpi/ic_discard.png | Bin 477 -> 0 bytes .../res/drawable-mdpi/ic_menu_gallery.png | Bin 804 -> 0 bytes src/main/res/drawable-mdpi/ic_menu_help.png | Bin 951 -> 0 bytes .../drawable-mdpi/ic_navigation_drawer.png | Bin 91 -> 0 bytes src/main/res/drawable-mdpi/ic_profile_w7.png | Bin 3862 -> 0 bytes src/main/res/drawable-mdpi/rd_btn_off.png | Bin 809 -> 0 bytes src/main/res/drawable-mdpi/rd_btn_on.png | Bin 1235 -> 0 bytes .../drawable-xhdpi/ic_action_cancel_dark.png | Bin 513 -> 0 bytes .../ic_action_import_export.png | Bin 580 -> 0 bytes .../res/drawable-xhdpi/ic_action_refresh.png | Bin 3218 -> 0 bytes .../res/drawable-xhdpi/ic_action_stats.png | Bin 823 -> 0 bytes src/main/res/drawable-xhdpi/ic_discard.png | Bin 1047 -> 0 bytes .../res/drawable-xhdpi/ic_menu_gallery.png | Bin 1336 -> 0 bytes src/main/res/drawable-xhdpi/ic_menu_help.png | Bin 1840 -> 0 bytes .../drawable-xhdpi/ic_navigation_drawer.png | Bin 109 -> 0 bytes src/main/res/drawable-xhdpi/ic_profile_w7.png | Bin 9956 -> 0 bytes .../res/drawable-xhdpi/popup_background.xml | 3 - src/main/res/drawable-xhdpi/rd_btn_off.png | Bin 2155 -> 0 bytes src/main/res/drawable-xhdpi/rd_btn_on.png | Bin 3542 -> 0 bytes .../drawable-xxhdpi/ic_action_cancel_dark.png | Bin 567 -> 0 bytes .../ic_action_import_export.png | Bin 758 -> 0 bytes .../res/drawable-xxhdpi/ic_action_refresh.png | Bin 3390 -> 0 bytes .../res/drawable-xxhdpi/ic_action_stats.png | Bin 795 -> 0 bytes .../res/drawable-xxhdpi/ic_menu_gallery.png | Bin 2304 -> 0 bytes src/main/res/drawable-xxhdpi/ic_menu_help.png | Bin 3433 -> 0 bytes .../drawable-xxhdpi/ic_navigation_drawer.png | Bin 123 -> 0 bytes .../res/drawable-xxhdpi/ic_profile_w7.png | Bin 15661 -> 0 bytes src/main/res/drawable-xxhdpi/rd_btn_off.png | Bin 2723 -> 0 bytes src/main/res/drawable-xxhdpi/rd_btn_on.png | Bin 4779 -> 0 bytes .../ic_action_import_export.png | Bin 758 -> 0 bytes .../res/drawable-xxxhdpi/ic_swipe_action.png | Bin 5366 -> 0 bytes src/main/res/drawable/cased_logo_1.png | Bin 26778 -> 0 bytes src/main/res/drawable/hostage_logo_big.png | Bin 1065798 -> 0 bytes src/main/res/drawable/ic_bro.png | Bin 46415 -> 0 bytes src/main/res/drawable/panel_help_bg.xml | 19 -- src/main/res/drawable/panel_right_border.xml | 20 -- src/main/res/drawable/panel_white_bg.xml | 14 -- src/main/res/drawable/tk_logo.png | Bin 11965 -> 0 bytes .../res/layout-land/fragment_statistics.xml | 1 - src/main/res/layout/activity_bluetooth.xml | 44 ----- src/main/res/layout/activity_edit_profile.xml | 9 - src/main/res/layout/activity_nfc.xml | 17 -- src/main/res/layout/activity_p2_psync.xml | 174 ------------------ src/main/res/layout/fragment_about.xml | 12 +- .../layout/fragment_connectioninfo_dialog.xml | 6 +- .../res/layout/fragment_profile_manager.xml | 1 - .../res/layout/fragment_record_detail.xml | 7 - src/main/res/layout/fragment_statistics.xml | 1 - .../layout/list_view_bluetooth_devices.xml | 7 - .../res/layout/preference_pcap_logging.xml | 1 - src/main/res/layout/preference_warning.xml | 8 +- .../layout/profile_manager_list_item_help.xml | 49 ----- src/main/res/layout/row_devices.xml | 34 ---- src/main/res/layout/simple_popup_table.xml | 1 - src/main/res/menu/p2_psync.xml | 9 - src/main/res/values-de/arrays.xml | 6 - src/main/res/values-de/strings.xml | 129 +------------ src/main/res/values-de/strings_gui.xml | 7 +- .../res/values-de/strings_preferences.xml | 15 -- src/main/res/values-night/colors.xml | 1 - src/main/res/values-sw720dp-land/dimens.xml | 1 - src/main/res/values-w820dp/dimens.xml | 1 - src/main/res/values/api_keys.xml | 6 +- src/main/res/values/arrays.xml | 8 - src/main/res/values/broadcast.xml | 3 +- src/main/res/values/colors.xml | 1 - src/main/res/values/dimens.xml | 2 - src/main/res/values/hpfeeds.xml | 19 -- src/main/res/values/strings.xml | 152 +-------------- src/main/res/values/strings_gui.xml | 7 +- src/main/res/values/strings_preferences.xml | 10 - src/main/res/values/strings_privacy.xml | 7 +- src/main/res/values/version.xml | 4 +- src/main/res/xml/authenticator.xml | 23 --- src/main/res/xml/jlan_config.xml | 63 ------- src/main/res/xml/syncadapter.xml | 25 --- 107 files changed, 31 insertions(+), 936 deletions(-) delete mode 100644 src/main/res/anim/in_left_to_right.xml delete mode 100644 src/main/res/anim/in_right_to_left.xml delete mode 100644 src/main/res/anim/out_left_to_right.xml delete mode 100644 src/main/res/anim/out_right_to_left.xml delete mode 100644 src/main/res/drawable-hdpi/ic_action_cancel_dark.png delete mode 100644 src/main/res/drawable-hdpi/ic_action_import_export.png delete mode 100644 src/main/res/drawable-hdpi/ic_action_refresh.png delete mode 100644 src/main/res/drawable-hdpi/ic_action_stats.png delete mode 100644 src/main/res/drawable-hdpi/ic_discard.png delete mode 100644 src/main/res/drawable-hdpi/ic_filter_pressed.png delete mode 100644 src/main/res/drawable-hdpi/ic_gsoc_logo_large.png delete mode 100644 src/main/res/drawable-hdpi/ic_gsoc_logo_small.png delete mode 100644 src/main/res/drawable-hdpi/ic_menu_gallery.png delete mode 100644 src/main/res/drawable-hdpi/ic_menu_help.png delete mode 100644 src/main/res/drawable-hdpi/ic_menu_privacy_old.png delete mode 100644 src/main/res/drawable-hdpi/ic_navigation_drawer.png delete mode 100644 src/main/res/drawable-hdpi/ic_profile_w7.png delete mode 100644 src/main/res/drawable-hdpi/light_green.png delete mode 100644 src/main/res/drawable-hdpi/light_green_large.png delete mode 100644 src/main/res/drawable-hdpi/light_grey.png delete mode 100644 src/main/res/drawable-hdpi/light_grey_large.png delete mode 100644 src/main/res/drawable-hdpi/light_red.png delete mode 100644 src/main/res/drawable-hdpi/light_red_large.png delete mode 100644 src/main/res/drawable-hdpi/light_yellow.png delete mode 100644 src/main/res/drawable-hdpi/light_yellow_large.png delete mode 100644 src/main/res/drawable-hdpi/rd_btn_off.png delete mode 100644 src/main/res/drawable-hdpi/rd_btn_on.png delete mode 100644 src/main/res/drawable-mdpi/ic_action_cancel_dark.png delete mode 100644 src/main/res/drawable-mdpi/ic_action_import_export.png delete mode 100644 src/main/res/drawable-mdpi/ic_action_refresh.png delete mode 100644 src/main/res/drawable-mdpi/ic_action_stats.png delete mode 100644 src/main/res/drawable-mdpi/ic_discard.png delete mode 100644 src/main/res/drawable-mdpi/ic_menu_gallery.png delete mode 100644 src/main/res/drawable-mdpi/ic_menu_help.png delete mode 100644 src/main/res/drawable-mdpi/ic_navigation_drawer.png delete mode 100644 src/main/res/drawable-mdpi/ic_profile_w7.png delete mode 100644 src/main/res/drawable-mdpi/rd_btn_off.png delete mode 100644 src/main/res/drawable-mdpi/rd_btn_on.png delete mode 100644 src/main/res/drawable-xhdpi/ic_action_cancel_dark.png delete mode 100644 src/main/res/drawable-xhdpi/ic_action_import_export.png delete mode 100644 src/main/res/drawable-xhdpi/ic_action_refresh.png delete mode 100644 src/main/res/drawable-xhdpi/ic_action_stats.png delete mode 100644 src/main/res/drawable-xhdpi/ic_discard.png delete mode 100644 src/main/res/drawable-xhdpi/ic_menu_gallery.png delete mode 100644 src/main/res/drawable-xhdpi/ic_menu_help.png delete mode 100644 src/main/res/drawable-xhdpi/ic_navigation_drawer.png delete mode 100644 src/main/res/drawable-xhdpi/ic_profile_w7.png delete mode 100644 src/main/res/drawable-xhdpi/popup_background.xml delete mode 100644 src/main/res/drawable-xhdpi/rd_btn_off.png delete mode 100644 src/main/res/drawable-xhdpi/rd_btn_on.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_action_cancel_dark.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_action_import_export.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_action_refresh.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_action_stats.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_menu_gallery.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_menu_help.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_navigation_drawer.png delete mode 100644 src/main/res/drawable-xxhdpi/ic_profile_w7.png delete mode 100644 src/main/res/drawable-xxhdpi/rd_btn_off.png delete mode 100644 src/main/res/drawable-xxhdpi/rd_btn_on.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_action_import_export.png delete mode 100644 src/main/res/drawable-xxxhdpi/ic_swipe_action.png delete mode 100644 src/main/res/drawable/cased_logo_1.png delete mode 100644 src/main/res/drawable/hostage_logo_big.png delete mode 100644 src/main/res/drawable/ic_bro.png delete mode 100644 src/main/res/drawable/panel_help_bg.xml delete mode 100644 src/main/res/drawable/panel_right_border.xml delete mode 100644 src/main/res/drawable/panel_white_bg.xml delete mode 100644 src/main/res/drawable/tk_logo.png delete mode 100644 src/main/res/layout/activity_bluetooth.xml delete mode 100644 src/main/res/layout/activity_edit_profile.xml delete mode 100644 src/main/res/layout/activity_nfc.xml delete mode 100644 src/main/res/layout/activity_p2_psync.xml delete mode 100644 src/main/res/layout/list_view_bluetooth_devices.xml delete mode 100644 src/main/res/layout/profile_manager_list_item_help.xml delete mode 100644 src/main/res/layout/row_devices.xml delete mode 100644 src/main/res/menu/p2_psync.xml delete mode 100644 src/main/res/xml/authenticator.xml delete mode 100644 src/main/res/xml/jlan_config.xml delete mode 100644 src/main/res/xml/syncadapter.xml diff --git a/src/main/res/anim/in_left_to_right.xml b/src/main/res/anim/in_left_to_right.xml deleted file mode 100644 index 7b6145dd..00000000 --- a/src/main/res/anim/in_left_to_right.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main/res/anim/in_right_to_left.xml b/src/main/res/anim/in_right_to_left.xml deleted file mode 100644 index 8ef976c6..00000000 --- a/src/main/res/anim/in_right_to_left.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main/res/anim/out_left_to_right.xml b/src/main/res/anim/out_left_to_right.xml deleted file mode 100644 index 3b2c6c03..00000000 --- a/src/main/res/anim/out_left_to_right.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main/res/anim/out_right_to_left.xml b/src/main/res/anim/out_right_to_left.xml deleted file mode 100644 index d0b75205..00000000 --- a/src/main/res/anim/out_right_to_left.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/main/res/drawable-hdpi/ic_action_cancel_dark.png b/src/main/res/drawable-hdpi/ic_action_cancel_dark.png deleted file mode 100644 index f889617e4471d6a0c65dd81a060bea482276b322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmV;n0ZIOeP)uR$+`ZL}CL9iu4pv&~TPqL?R?{{9XWYPqIRgeD^;8#3vi0QmIrbmFkC- z=lNP%LWrBV*rEMwV3MsoHqsVpnjWjFdZ5h9V<&ATapw~E1PAb=v+=Jp6hzH@=Ksnh z?p@-Z`}Cg%jQ{`u07*qoM6N<$g0AVdX8-^I diff --git a/src/main/res/drawable-hdpi/ic_action_import_export.png b/src/main/res/drawable-hdpi/ic_action_import_export.png deleted file mode 100644 index 18c0fe7d63774763dd23a014a5bafb6aa2798b95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmV;)0XF`LP)L<49_M` zTZp}W_|W8mn8Qvt=e_{@KKas&+H7345D^@v+y~N{mFNnxOJDYZzrlL}16zkY+MO%ablgb15WwU^v5*K50U|&IhyW2_ zXeTZj*10J_$C*avfUi)x2dv4`wYhRGVaMXHUx4qt>keJBw&aaj2t=+#s703x`W&6G zP=m{U6?a73HCtg?z!=5;%Y2BtSjWmL#5vKeZr@v7MnUj`qR!uxH_Cn<-`08!J00FK z6GpOhrUeB2`zbe-C$%9Wvi0XiAP{(hrvL*0bYz4`Hhrth00000NkvXXu0mjf#6iL8 diff --git a/src/main/res/drawable-hdpi/ic_action_refresh.png b/src/main/res/drawable-hdpi/ic_action_refresh.png deleted file mode 100644 index 804b8d49dec0886a5a58a23fa9cec25790d00a4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3137 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 M7+C7#p)N811HyFgaR2}S diff --git a/src/main/res/drawable-hdpi/ic_action_stats.png b/src/main/res/drawable-hdpi/ic_action_stats.png deleted file mode 100644 index 4a29d5c3586b6f1cb71812cd0f8a58c5808d70fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)b<83?-0-nU1iwBN8YJcj!uQ&We;H( zuFDiv0sx^4_p{g$j+44SphT=PUG?Tve)a~3jpMQUq*kDSih#mhKZaopnK^o8Gz(k zyRLg31i_<8NF4i4?IC0WU^pE12ZO<{J!8Aw#;esTt^#xt0F)60V_!{n^pgRghuJX| zOaN3>A(I?HFA4+u9)SHUq%(lZb;i{Br8Nv70H`dt>e!K{=^J)VXAPiikI>u2Myn8o zfwDb9v4~8z0)SqjbSDUa;yI=4G+L}e$0l(x!G(cCr$b?2-!tfrkPs?_Oyy`%jZ%~s zF^OU5bd%@#vl@S(PP_*{3%DP_H8wLdd`CTlp;!d6i{dj~huXz!9jk!y5Dc4Fbyk$; z*rwLKku^4{W*=-(Jjx-%cAVxghN6Q5Kx1L^7eMlO-SfOrk|ceK=Qw5JIF2@(%~zRD s`InN@(-d980L5#ZGQt3-Hz~Tl0b1+0d<>=B-T(jq07*qoM6N<$f^)?5@Bjb+ diff --git a/src/main/res/drawable-hdpi/ic_discard.png b/src/main/res/drawable-hdpi/ic_discard.png deleted file mode 100644 index f048c5f3a17edf99b5063d784e8a59ab2b1306e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 840 zcmV-O1GoH%P)^SS;Sb^%ADX zB1a&b&0YfBzN0C)BQ6x#&8g2>u#V7v`%0PmB@jW&&jBMV-?-h{yOvq8&fib?qxm?4wl!5+D$_&M()@rq*@VuvJ3Zc-IOeS-k3IQIJ z$`b5zjQ?>?DwP`G8U}!&_yGoPQ21)2(Kr%R7-div$!SHYG2G23;;`tDp3#}%PTvPg z=oj|`=Ws6ikGPgHB-oqKBrxXNZr>q^6TtYO0iGm#HKfU(emYN&9{TR$g*}@ zGnv_G@p$|M9MB{-Uoy()W|6AB-W&T0+mHocS>n7{wFehl_dO4b7rdDg2Kb zO)-_UT=Oz_lxxFE?0-8_P^4F?&`kJ;q4aJ4(~|Uu`5)(~6>?p3%{A8!z5M`aQUGz5 SFGN=W0000y diff --git a/src/main/res/drawable-hdpi/ic_filter_pressed.png b/src/main/res/drawable-hdpi/ic_filter_pressed.png deleted file mode 100644 index e1fd3b320747716a347ec1a4bc5d4ddc59d985bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 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 X#Q*;Sb!+A_T!8FycE^`H1)cvND5)lt diff --git a/src/main/res/drawable-hdpi/ic_gsoc_logo_small.png b/src/main/res/drawable-hdpi/ic_gsoc_logo_small.png deleted file mode 100644 index dc16c6f7eaea4befd7f8a3235f97a0c55073ecde..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61151 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 T_FVceoRFQ3!4|G(vTRsG8I(U-4( znlxqAR?pd!x`Hk=Y%}S)*vitB-Kr(xtryL`vwyXyCSDle2a@A_VF?oZmeImX89H>UibUhsFTN*&Mk zkK1N6}UdB3EUP}b!5wmP1LJKTQ1f5278lGuAc<6@(CQOb)4!HaWCvnyAx zInw`Jt>EP?!B~kX76;agn=fj96x+H;rXl@E^hK8?O(qU35qBG;%{&*+c>1Av*^;;0 z->#9KCb8p61k-`-HSfyrq#e{@Z!qici+caTR`(?^EL77B^vs)_!&p>X^!6->*{77c zJ5%F9+K<*Vub3rynwWy0EkAyl;egP>s7N0Hv9MHT6BpzBi(GA6sxpmFt0lxTWP3eY z%~)Zszl|r-a6RYMhQ^}ff9|~DH~IXUyI_;~nXUi-{J6?IN4M_X@}6^ts+ekCto&1X z!?tkSr_vuLeaDyY=NEbL=&ACCU!gwi0t~16ukydGd$D(|@{By|Tje*W-g%+fyZu(SnJ|zD6)aLNxqP~4a!Va2MQw$y+ zl5&#xqOm{@3q5e-;{~Xj||e`D@I1yuom7N&I%h z!Y%=h*O&Rb*W1+W`gE6X=Q2CpTW1-3K3{h%Ji*Z7u#kCyiS*HjKjt3nekwWtnd7+> z^#GQJckkM`Wtbj)2)o@K?Ku5X;M2UuY0*y-41~`Lr^BJyH~f41Ma{W$@6;YO=zMQjq@nCQZ_oK&3DwB2B9aU|QES7a zS6p4xyv=5}8iQOyr-OL=#I4JtwdOf=CT#ko%CP8zX}#mMZwxCdD?Ddxf9Su0x1L3B zDsRQHyi@i1|Ct{38s4d9l{o^;QK}`b5hW>!C8<`)MX5lF!N|bSP}jgv*T^Eo$jHjX z+{)Bg*TBNcz+j1A(Mc2yx%nxXX_dG&Topc53e+G8vLQG>t)x7$D3!r6B|j-u!8128 aJvAsbF{QHbWU38N5re0zpUXO@geCx^PS+X$ diff --git a/src/main/res/drawable-hdpi/ic_menu_help.png b/src/main/res/drawable-hdpi/ic_menu_help.png deleted file mode 100644 index 473b372072ea70542ece3cd63f54595e59c31e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1391 zcmV-#1(5oQP)6@kgoqD@R2Wnc5hTQby;KlL z^wNz&Fsdhg5h`QQ#*iG*vC<}Sv>BMuoQpZmj2@jimwnFqdoU}4bIu;^Meu*zYyJPX z{_9=~?#S&Xf=o@p324^bDyWcgpqx(`FmHJGmCrAI%j=e5^zXF*>iJh2br9t4ih+9S zsHc=L7N5&p2oJ3~pYe}NLT?&SC9mm8_v@LddCc^tHOH2Q>)bl=8P`7lSh{Ci`y)T4 zdXW-M-mC{Qi^V#7dCjKSYIBcx%8k=XN{-m=$^Ap29~T|$)G+BO0|bqfrJi|g&g;=N z#<3_^v41T(h$1T6bKA~`zW0xYC7m}=PF?^d)tQBFH*UmQmFrb=-HO4WVo`n6F(n7e zVuQ&mk~b12&v%8yFnv3(`o=|2L=7%3E(S$#5W#LOS=2bu0yCstB|`i}71#3F$qN9H)*L6>=ROxYkQlrmz4S~UU7I`|KD6qCRqNw!P6g0f z<3%zh*UMsx09Bwj)$!#t&NcitG%C#EGs&hI`NO6t{U=#Ufo3ZJfO&NLUF~A_+pRbP zho#BRj_kc_ey9`>EXXjKlu26hK?(x8ffm6cU^OHw?TEK;CC$%Au{m*2pfk(ZBcmNR z=fRB_px{ZRo{3(3BD?7QhIJ?oimRi}t^{X0Ci7(=e;@ouLK0CeA6gq*wyW_~EP`Sc z^Ip1pp!{^9iBsGIz!6u&$F~ zq>KE~ihCe1Ss5v728A53N54H6-#^wP#;Da|>cPs?b=^3qQ55a5B-We*)CN%v1Ta>{ zO@*W+r?ukeaE1*OJ$yib0wc+b%N>I%YE05H{KKRKBm})aHBd@X+tPtd7_NDnzQJzKFw)T*jtUzAN1I!8^gBo_k+ybz^wv4>{GVDJTf*rR5C zELea8Bze+cLUO~J03pF#3-~7~woPI4B#Bc#g8KNNNS9CI=}7{0Lh%QPbmWMhnz1<6 zBnE?H_Ok6#?#SWagH>ShO(N<=(@%z5HdHS0gkzaK&X{{86tA0L2)Fn8p(kv{<@hRNLC z<_s$U001R)MObuXVRU6WV{&C-bY%cCFflPLFflDNF;p=#IyE;sFflDKI65#eL6wV# z0000bbVXQnWMOn=I&E)cX=ZrLxA!rpswCF$R9|$rCqcB0ztr0<%t3IfdzJzLXUlDoVckZ3;5It~Um^pLL z!*kA=bB1(m!3butg!h=nEp)0Fd+`jv8`v^>s|vmqubTv~+0&{B+=vKXvn#oSx8ZvN zf#slBAvQ)5=n2J_lCDEJ2^=h;+OC`gHkBaIl9NDX_-_atEpc{NPLf{}TCir1aw+f& zGbM=6Q|RaBrk6fo&1Rcpf{jh)Z?OI1osbQeq$?1($IR z51O1a9MX|ggd4((&F~ISaJZmrCWDXG$lx6q$MFKc>o|r}AqD#z__c=u9V=QWhHxK0 zBR@dBc$hLX)+?|Z7jYpJNlT^{p2b_7ZI<>Sd@eEdiWGRhCdSS6@6_0g;%@BsI}!5@ zu2-=$anPhHu!6y`*e=$qfiu`#;nvlPt6`_uQ}1D)>Txny-D!B@UoWL?na*0lr|`QT biw}PQ^f}=2{KYBf00000NkvXXu0mjf_tfiy diff --git a/src/main/res/drawable-hdpi/ic_navigation_drawer.png b/src/main/res/drawable-hdpi/ic_navigation_drawer.png deleted file mode 100644 index 48faf108144754061696bd78622d74e53f6645fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj+MX_sAs(H{2@;bP0l+XkKS&$z$ diff --git a/src/main/res/drawable-hdpi/ic_profile_w7.png b/src/main/res/drawable-hdpi/ic_profile_w7.png deleted file mode 100644 index 21b531adf65b9f4686f738969ad572649ae63404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6295 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 UIc7Mmk^lez07*qoM6N<$g7;ERLjV8( diff --git a/src/main/res/drawable-hdpi/light_green_large.png b/src/main/res/drawable-hdpi/light_green_large.png deleted file mode 100644 index 55c22c0457f1458530e40ce3a184d5596fd47fd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17587 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 diff --git a/src/main/res/drawable-hdpi/light_grey_large.png b/src/main/res/drawable-hdpi/light_grey_large.png deleted file mode 100644 index 1e7d52fa7a31fd7ced236b94af64fe4dc410ca4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13471 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 diff --git a/src/main/res/drawable-hdpi/light_red.png b/src/main/res/drawable-hdpi/light_red.png deleted file mode 100644 index b3dfae8854297436853bec2056823e1d5e06d09b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4603 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 diff --git a/src/main/res/drawable-hdpi/light_red_large.png b/src/main/res/drawable-hdpi/light_red_large.png deleted file mode 100644 index 49cc5dd41e5b027c6cb791ca7b9d2f7f7f0a9b4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15037 zcmV;uIzq*XP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}001x8NklVHki7jQ{~p_K2K;FF#jqh*G-=7EMH0i!!)1mu(|gyJ8Ggu!u3NWmL`GI+ zbx(Ik0D;O{y1F|1es%7-5gDO0Vr$Tp>GW8-U)TA2fgJ;YX2+Txhje)E#}?4CcnX4H zppPZwv4lM4Iu3zFY9UaRWK7WiK`;^6(V$~@{K_HNhU5}N*d-+ne2uOtDG-zD_ zq~@Gu0-KX6$&z9-pz-NB~7xt|%a`)QLlp2{6!}o1T(m z>2(|+o{~xFo0MK@K`|^SE&ynsnqH7&>2(w=36}CIdY0@8f#Fh$R0!sr!C-sGahx+) za*w+Be2EVb?kgmfm@+76pE!=E?B`~J8WrZVmRC(xvMU0H5U2@-c{uuok z{$5QWkpKySg9rMAKrkVF%d`g)hLaG#Q_`FECrzi=tVhyXBR{lq+eB0Ohb&s9fC#d!LK%LK~$fGD;8 z>*-_sd8Ou$*<*VD_*fdFP=d+MS@7}z?+bmvZhPjqNAC9pWdZVBVQVYFaHz1oUEL0c z3AVNrhC_vZzq;-96nZ_N(^1GWAWiMxr%@EZY^E_9X^h7jCnp+*hZ+Y5CHD3-o;@q^ zksAy83Zth(?@Ss{9qzxu01P+YK7UkYwWC@fk7IPh zyM=}OlKuTF3dnTo@);>BpK>sU1PBhr4uI?Acn81`{eFhQpn{^;OP5j>e(XwnTx#Ni z#g|@5@8$cw(r1)XFbNcT{y+Py!29pd@b0@a{LlZ)j8g28zDthxnaWsY;h;>Jkze*F zKmU1^c3C)FW}c^9ySo=05ZCj*^lA==Pc^#CV{k8VjR3LSmFi(I$T1w|7z{F`sqzLD z4LbWR?Sq5|uL~BJ?{LB4I`*Yt{PTu@G8$>T`|b??@gGzC@|ROgCL;rf)F~{~yPU8w z7oVEUQ!W=MQp)w@$wmQ5|Molp@u|mbCS7Zhu`=y|DaCaFHvrrOa2vo~056z+55WD? z+a$Sx;c$TK*L&F6>7vs~p_Fo#pX>fUtrw4Nr}ybGt-$bO-nl9Db=P~)&qRMG|LjUt z_wC=CWeP99oZ=7uAjcbTWa#&EJbpaDc)ZO9O1q>elB3zYGYvX{^rMdy-hNw)p2-zk zM@N@XK_ozCGbyD?9jehM=9{Kb7L*$Vn417@AW8b@_j3#eIlA3!;oH;ot?ElpTxuhw zJfTY9dtHbxsq-u$C1d)x^Z(TcAI$LY|31aP{_7NbdnW*%0eEWqGtzejuR=@2Tuq9l zl6sgX)WKEZuz%%ol0=U;N?tyEWL)S3|AaJ0xcnmJf+&6H% zfNpn);joM0a1I8AgQgTT`0aD_b*rXRG%#&xQVQZw0Gh(VACn-K{vPRz!M3}16a45$ zIbL}sL0NY2#TQ#9<>HqDNa+^+Uvo$nf8oa;18=?MkEv(RE-@fQAzjXzJNyPsp>7Fq z+&_gQ%eFBX^e`CokY%Yi)ssMwK#_u<2NqWi>04V0W>7HSsGxKO}t_NbSWJ zQ~dbHIqu#~aCq3ox8H7KaoWG6Bnj#lt620UZ@s0LzSQjTg*NFvKq@$-`BPS|>GY3l zOf~KpFzzp?hEliC>-Ev^_mJmVZ3^Z3$Gd`qf6MwzFo%La=YvCnAVgK@KpIyY4hWyJ z;ZqiG1f{@hucdhV?W#on<(C7D$9*i%WR@VIT|0rX=3V+Cd-Uj%0aBIuRpFnNgYQbe zc(877EBxRG8NTzK1fx-oFTdP&03s;~1V|Qv`RF5s2M>TZ-dI$UufDoOfRrV#RM`{e zN~t&;%juL-x6tkO(ChV)rfG0tKvD@wEqp5COR0RuoT^HlDugOY$ZLINW2p?xK?#Y4 z`}b3P|NA)x1BHhV`xuRSLb?^YKG^ave((Tz{q_0%hYv3aAd7IMf^zh*IEm2u4L+`M zAHYihUPPL1qtof3)9EgpTuCwN#x5jST;HND7^EsuNEM3*?ri4wBoY)&s$nkU?gGV^ zc1a$t-&c71?F{$tCpbFl;Ono4m|uQecQvJgyg0=C@lQUflmq}i|NIgFGKWJN{G-=q z*imq)d^-mNcmY|~N2k+6nr6=FDs`Vxg2NRIO<{2bT%DnIDNCJVxIBjh8=vqOq9}Fg zmUNz9dMU-5Z)Ql61Rs4gAm+Vp(F*OTaLw;qNIv=Gf&;Rw90?oauy9;sX8aC;<3*BE z-9(=EkmtRn5pW+QAzq`d^cmtmq;UpU;DvNo<;w+)q#&-xLVv#tmXNl+t?+xlmt$uq z!B<~(ad_BesaE0`577cJi?D7sp;Gmbi+F7^T1df};jL%ECNisy1b&#gH zGw`{;2ps_Qd6XtI2STUSNQ0I1*fnL{H7T)f{uiH3OfTZHJvoh z_tW;XpLKBOj>13wV}f7*nvRo5sh5I#aqpQOL38?)3!@;*)hbCjwgofJ2mM|`k_?b# zJtRq1n?l+9zA|ozFKMH@^8C8oUrM=LrD9*&R+moE_pSS^zVtIBKJMR7@yaVHrqdLk zemV>sICQO8?^2r!0*GA7?Febr4)Gj!h#7zJv|5#>J)~(5N+nC*zP``GL8()gHo<6` zj`>m=*MvkVRjV`PKA2qTpbL`FDJt~%`t<~FzL`NOh2Q>m;DCdJP`9e%#vs`YAX+QO z2zk$;95+oWMdwky2;eT#w1*_A{D$;DGFczpvTjt9-%KU6(=)dr`PA zuk~HjW&3Qlc-e1JRJVD)Y|x9MddxSLljk!0*1Su9)6ag^LAMM1!#~`@H{T@iuP|A+ zE^zC>w5=f0rLlAnkdAZQawx|Qqa2+ewP;e>Z304QuC4XDUn=!#5<1nTsS4G38<*>`~349hljZ%#o|i{`PK#2&!2)UnsQ#w?K9tT(*QyT0q1Zim5YkO zXWurdptPkJp^vror6c{#zVfhDjk0u?g^OZQO{{X*TRXsLOS`UF#UVZ>%j9#!FVOnQ zPjV;){N3N(F!QTIchZvlNrIM^K5a)qmQ6W@gU-sOBjk%|6>t+u^^hcatxs6xa@bXr zqt1tHLQ$k?GIdiuLW&M{dcMzmH!1Trxvs=D?!^C(FTb2(dpp6WpXN9^N|{p7s}2kH z_{LV4UmuX=$%ph}rvWkLe1v?_kSorfHI`Fnl$#AIf@y9tvqf}544vNd4JU4(yZ>WbU4;)m=wLPjQwwS9IB6HGR{Y4i zfbi|h_%$8d0vyzH+=o(jb&S;vcoTp^g1yb^R@=?>xA?%|pD|==|GG*Nnil)UvcCJ> z>Ppbx{HDj?C?Rh|$_>1QW355NbpYX0*QxKY)7ELlicdUz2|&*P(!A`sN-(V(&>`vC zS;FD+EIwF5{Y>Z}X-MVGSC;n`9^QB(!(;+{_+gI#F>}D;@+0S_AUw6A6)SoTIlb8F zK7nIk;82an2HH%gRtffXKnSh6tqP5=a<@(j=6ii;c~`2&`5;M>%99)%Xngirhox4t zfOKo^RBP2TuM$eSbloZ`y|R$J0AL8Ex^P{C>>3oTd+fYnXk$#I2^79dVEKJ|PU$7b z^zv1!6t+xkOTMAkvPf005SV~!kdZ!@Rv8wqUsw3~&%1c~RO8pbegX5X<>(%a(i&S_ zO;$>^vKHW=qvaG1>B6VG0CtQaPiuq4buGCssMbxbR+%b))+XHrjSCL?d?+ZkCyD>M zmb$d8&J(#H0p=s{ue_4t7r*G>@#7tQ{k7da%e6fmSCq9FV8=nR(^PnBRtJM?biFP$^yWC}91;Nd=})_O_^`zL@88Apj=f_n zZ!lV{Q})ePfFoh*!LRY4rCnRWx@OcPX%zS&6_5zUYUj_l#HvqCXmi03QbBW7uOv0G zkW{HwfeR@Le%gW{SIEvbnu{qmq+1qL4^zL9nc$)Eg57Y`m3_|>l{ zBzAWzy2XMu^BMCaK{I}vD2O!X;ZhH)AlteEMA7nr+Qc_vZ0)99TurQ!@E{Levemce zy_8zHHXpTWa{ao(pZ;kFAAPiq{ry{*Z~sPj-=#{zOTR^1WnO6-dl!ofOVhblr>l`@ zps#_hdlQHam2P8euSD#7%r}ZIt;FtnuaGW5cJE$_<718A{x-*aJcM?dUeRsebZFT( zR6%I<%B3DVEWPR)^;lZATeqzuv27;p;%Z`>z2Itj`@DK1-UJHQloXn3{qY}n@WBT& zeE8vQEbfnZ#FS*hDqBGzm<58tcb9dIn%nBtbFM<#K`JGx)wVEyR~d5b^fniz&YOro_XCij;Zzz@an?7UVVC2;{zx54Pr*SASf@*Mc1Kg#j``&$@~Z(?yv z>LZqJjZGZSLR6#<5PCsWhWV5dx-a>{?y?%lH5>DYp5v0HTy>DRR46pHa_!|#KaYLx zhd<2mhkrQ3zx>M$RQtBuz1t5+b!$XaCB@?4VIx5JMmKz5kWNgr^RBJ~=$92BULc~1 zTp>uf_n1!Q>Xf7yTs&qu)fINx9`K>uPlMrUd!;#JGp_w#^<()*@1~+x<83)D>$cu@EN<(R%!N{bDLuI zO4nq>*sex(iY-LK<#qpr*e)g{G}Yp!-3Ih*)(i~ZrEBird^5ujevsqc zcP$_`UiVD=9uXCpm^d#(6hs>P$Q|Wfn_>;A_lUmZibBGDiB%EFv|BK^M{yZ;pAVr^ z@2QFZ-QUge?z=;hV%fOeH?iEs;vVjWWY#lJc{g?V4>~}2O#@lU-baEY^s(43C?vjH ze#N1M#2zQfTuErU#6d~Z%9luK76sC($ZM}h(SBB_VHpQe>Dm(+w82ke!H0MO|ueD8Z19z5743Sy0VpQy-) zsfco=Sia?a_pdJy5*t~wkDu@kmswPxL_=Z0&AHshxUEo1$;Je?=u(g%p z@Nk=W5erC{s7OlUej&}u9O+diq*q))uIWlWoai>irL50}c& zsu@kslmhPDN%8vY8Qy#EnnOWonw6m%JXCdnNYyI|kU`-X_lUtCQ!TGYpo566REw(# zF9Xwxn0;?M?Swx5>Z=*vdvD-Lv8akHrCAw)18`qGNJr3zsAlXYMnMqjKO#Ia)mk#_ zb*YwQ*7@bRT30(+SwLu-^_}lzxOFSRlP6mwemNi+OS3E_I;*K(@kQZI4Z1PsNeuqj zf>JFB5Zh_0WnrQ7wR~eD{5|RBr2x?HCwTeg3{ReLqfSe`&T1A-k+^#B3KmVVdS&3{ zx)Ge1YAq-V^&nOSxDTOFSXgM_yG%Ma>bBj#pW#3Mv&T}bKIHKbYSxhn6)ZmfK{v!1 zq8b=XBy+yfh6z4nmh-Ds|W?eK6me4wTtfl{*XY@WgdhAayl=I zn{*c-ebR>|kZO6NV|y)5Gr8P`olirdN~r02f_wK;0|<>}A0VeD zUBSOwluffvN78kh+egQC^$dI6NIOlpq|tV(CN4ne7TET=J9jdC_#quhrzV{m^#vc2 zdD1I7212KqsB(p|kJzGN7ga<`v!v=4t#J7~h|7oEx|KpH1+6(G9l@w46cCp|&k14n z&H5#fT0kNQv9;nwBo*OfBpeRktX?|;PXW1hEyeBIDIP!WGdQ{qKoS52R}g7qoP~ix zYR;ot#MX)zkyM2G5t?TCO1;41)^S{EZrn)m_^~ul*dcMBa0Q`*gi?ytr9Pyr+d551 zw<1WfInyqeirDcHTk3U9f0y3hrdT}9+Sy5&|LA&BEKoqGa-;$vRzbkayD|7)MZ)QpL6rv+laMieE><_cNqd7bfgGz1K?xFsOQ@QWY!lco16# zLsXF1He%ML3#$0BOGP9PLd`la_jbEBhC4z9D>%iH%DpNA65E-ALt&t|{FtiH>u;iS(Y*<++`XGJs?())QBXkZ^bwrcg1m=R&60cw1;%d6Mlai4R2Cb0sVDB2QY>sjL1K$- z<;oUMtvEou+vkd6t{##HsaFv26bk|<6c()eg&!3owv|mg^%GPvqzR4o^;A8UuR-B} zNU;x_Vl6$$^03qLZfvogsULBrSuR*?DrLt%=*YXgx8hQqa~_f!FgRK5pPv{aR~L*X z&%6AGz0Wre%Y-=kD zU-88EI=Y$(R}i171h#A)7}PoZY;0E)97#QBdPRMPE&0-w6{RJI0u@BF*p>Q90t8bEBZ zwU8y$Eg580AxY|gPvuWIASHw46qHO*3x2!QZTkH6xv?N9i-^1^eMCfT?mQNHprPohc};>qVqgOL~2^hE{3gx(1X} zKqT)mBe&Bg3KBZr5n+gJC1AKxNF`u;yu4zgCU6uCjs-|E!GF*nu#`;`W7OBVvT!9J zq7R91a472LRdFyDO}%CcGG#Hp;6oBDmv$*6_6;Tgv}(zy>zezq#TEpQG#`u3$(k$1 z{JGhzgx1=`^pq({!B|)Vq~PAeywL>Jw|^ND@auvTfr(8_say*;xLzZ@wo(s}xaMA@ zkN}ZVEDFj5z&M$Ys;{gPE2&4E=?*GT(dN*luWuS#hQ@YQ4O)t6S{)2mv z(OITh5t!J5OuY{X{#;qw^lBt{5bi@DRk5g&Oauiv_5l*ptk^cHCcY|H9VpeNp9O$p zK|v;19tY9XgOm;hv2S3hJ4t{dIfFDSsz?OE``S9i;O|kEg;9_b63-LChfqi$jf3zM z%f8vM>3UOXR#cJL8ku#U!YuC{QkW34aXezxtf^qq7g8*Z#eqVeVx2;gRL`#*_;ua>D& zLLeFW(yWkbR%jZfql!dGLjLdm)!%0(j*mzci&nBkgDxqEc2u%P1dc-h2WfQ~?#8ZD z4}vH{ay8Pdrd6&*I7;I`4ovJG5g#H|u(YHg+MyzR9K=f0p-Hn^HS00lV`~ISh;J#& znMtn>N&ND05J^3jQY>D{lBSwa6**2Drdd%%Vp|)Mrl3^m)iF~KX{rgYV8I0lUGagA zg>XRj6JXZVtZzg`A|zLC zY?l|3IyLdbVgvs)W(go%J*0)Kmv)$vjJhkuI(~HDZE4H;kvFcF)vQJVhI+8x|Rj=v*@r{QZ5(U`< zaFkZBSqX#?kQ$|05t6F|iXWD#QH(vJAcydef7Aj}SIs&mKE&pAdug?9*4ir4N~#rG zgr!oCsexmk#H)?p+UivuASJ72@mak`M7s6>jM`9ak1W^MCYL zS^}ANK-gsMUHV#S?cUJGmLQ26^RyqZXWvR_Juy%`At@H0oXA&DtW}Q?KsYD`QIQVu zB7Fcu1IQMDtpwQ0fNTo%LIS_;@w&(AAb|^%2+6sCu?k9#|CB8peM{0STD`K$F(z>6 z(2tM>5jy{Tbbi(dKyEy~{x9r9e*u z$+UW`6%`3dr<#HkLD>u#t4y!lnVCtDj5_C^_jCk{-G3 zXF#qiKhoI*BrX_2)2u5E${K0ZCQ~c=zf;vlvNpA{{RtKa2Kl0JGa+s_1_<{eiU48_ zdu9NkN@79jX22Z{s5bpbi07zFxe$_eT{ciQ;4RiQ=$`ayYSiNifNuyKc3O#@lz2i? zt0~y7wM|das(^q%QV_#_Vs2@=WkKlx=qaF+0f`2ZvU=@GkN{x=hX_=YMrjuhu8RcA znqwDdp&Lr2F2$u5#rlqML=K%$8297a+uLbp>#=OhT1NQ%a<& z)zU)LXAOw;Aqj&-5l~W=c4bUe(j2&l3X;yIAZel|b)c*TOUnV?77*tNh3kKq022ep zH$**XS=UZTJR-hhg5@!fwYKQUS~~9~i<61DO_`EVMLC5g18$qam9-&3pqi`-3Ibti z49pn=aaK_1hSe%Phht=5_=c&+Q!HLeOGnJ7<0fq1X zVc;04%3plNjQP_BzC*Wls@q7hEF@)j?ngi%p`OImm9?#*khGC&dO>;L1Tq%lQ?8W!t8FqbZh_O}j5XlmrL)MwsQm3(7#EL&oI-znMcpY3eo9 z1_Jp!)2>Z?UIpkB7^m}bj&De{>Jd>6=^BsmSt!RwQmh)&4#*42@nx)NJ~;zWWWYTI zlrx~~o8Z_~P1Z@zTq<%F#=H$R(Hnp`L|GM35IDXjs_}>!@?E&6uyZ)dO`XfuQ!MR< z#F}>3xuam%)l*JaQAsOE^bF{Pu9Bh~1ZNXa&;XbwLANRO(dYcW#EehVY7p>q)s7UaASY#-059agjs<1as!7|gZ32YaK%ll| z$T#VAvU#OyPXL3@ucC&WU;Jd_VqyFkpse!xRm}T&rdyl*c?Fclj86;%j|d=k+B#3E>Xz)$Fbj{W=N*uSkkC4{>r%*) z8!fU=_&#L zyv^Qy9snh(LD#LK3oOv>3HX$CI(=ly{OA%K>LLKL3M9H3C!r-^?NO0ZP?0eK4~$-hCdG%6N^5QH=v;zNrc4i%U~D?Ejdrp{q+1D`$N^TUU?} zNQ4rw1c-KckqH)ey0SUzu>x*o!0iN>nR0Najo?xn4pQ};2Y+3&U?lTVaS8<;*Vx7K z(x9#t5KsMv1c$mPfV2P!oqD2$PE)QagM@=}2;eXQZg+s|1u!dse3i6o6R=zqPZIK( z?DX_>zUAI7Gu}^ybc%0i!&9oIiHGGmpPr44gEW9dn&3Ed_z}7d+^Jc|d{a@|4*}dt zftx9?H8Y@;E&RO~)pxWBX#&j1UX*s*GZz^9L^X~G93xLkwFHMcr*pp1agY@usZ)_c zNVhmBhvpx$58!47+(?1GRg<#CFNWvMcWhFv5@2Q(LsjSd83W>(1B^qa8e=Rk3%W4I zQIIhXb<Dh zVwY8>C>V4x=?Q~FQ@>F#zoE|gi>LJz%LNJGUtz?)M(`yGGj0@+nWL(8MBvyr|Fr9< z_Hw_TRs9r{qB;-iq6O}zKWa+AFz0sH(f7!?KE(3Y%aUsFFFswE)AKwjaI4>-btCGb z$2BRJtNc6lD2at+*MPDEU?;8mumrLK$jYjxxWX*~3Zodaq&mMxn2&Vt5g_(h8g;O+3RRs;dd~KR;{&1;v@%7(nAE5SX4S=UXbi_$ zotw4!b5I<*mpN*l(*U~5m+IQfb@@VcbS3%I9j;LAyi0fC-8OJ+JB|k$NT{k@HdqW4 zr)r_9fIVi4ARQkPrJx?;gn%(-X)v!!YE(0_^~!MAl_@u@AngF+_@KH0Fd?t+E?>`{ z3ZU5i67BB0d~;FSw+S>`297NTQqQhLZ(+HpX_x_`NGhc$3=|_4_=kd*uq9gBkD14q z2tI?G@X~@2V#I6VxKMzs2ubL%LrwUSLM~8x1Qe<)R$T@J7z)r9yFUP+EF?x*o?BoH z1O)-Z2C6h}MDNov3#t;dR7U@a+Z40U9W5(2*3=O z+Sp_II(ytRpDD3vn7uXqOwwm%R)Vo<6TLMr88MGwkB=BE$3j10W!e$(dSg~{mo9}} z0HaknE+inH58ak8sR4ziUwpyr4(UAxOkd~&cH1Lh(Dco|kA)CMX%bzXV+)JDudsM4 z#f8n!wK74b=Eo(0LMMykMzl~dW@*rf1p5gC;6&&Y2&)!+YKZNH%V(eg5RKrt5P&>a z8O7->_bGg@5^?t{L18EWec?I!diq|r^DQ4TtZ(-Dbux5*8l8eO5dxg{69&-80mN8< zf{uU}kXKVLFGEmWCO|kSTv4n?Nd>Qxv*7MR*k4gl3fgmW+hJhjSX|Yfu2bw>Ko85) zY+Qq-6p|_N1Y_2zvW!{PY0O|4GXSYl%oq@S=ELQw_FY0is9H-NB?*9qDgajnmr~ec z{$BKVqzsHEfJpPvY{2qBrr-FIvP=XJCT!fo1w|=&3|y#50uc}wD9Vw3rI5Fc%LQVhW357&bl&PRDQvn1ib)qR$;Q->&f^n4q;h;cJ6~5U|Dwuq(G^yY(_$ER0 zmTv)}8Un(XL@I?~o(Y{+n5Kfco?-dY=F;IU_=RnkKWMHHAa$xD!IBEy1wbaK5%(LZ z;EP-Z9LKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}000M^NklZ2>5r&`Y?%7>xDKANhHbE;2Kp%`; z@*DEga|n<_fLsCu$i;vY+tCN5@Kf54>8>26dbYN?wBR5LvOr;WW1sr_OpFfkE@GEU+ELDp#iOcH6}pU9NP!nyVwBh=2&jP z%P$4?ibmUZ7879F#KghZi^D-w$ThHPVr`#q?7O+S*iQm`MT3K!05jmg#oV?ti_TdD zXMqi{wD<_z+qTBiT~KB4ia!e6s_H?X7~rABQ;S18UZM8^SJ->t4!E_rv$zL7IFZ)Q zRy)w?5!mQppE$sU#Sw7q_Mh7KX7-zC|C#ONO9Q$Et}XrrT)F+O8MJH1HbSRItWbSA zH<&Mg6W|%}+~S!<1wS)NY!Dh7RM=w!{1W)e z;>@+u6f`Tk%=Fip&6}Rpk3ISB5_k)|HX-KD|IrCpAy>{4 z#iya@2G|n^`=tS%178C#fOEp+jCeGmJDHFc5t%@k4k2NPFcZRYVEVE{BJ|gp<#$s) z{Oy#@+Y`GpbEk0FV}s%@K++y7%@RE3VL^_@l=LwmB77!Ceb$DNo zX#pvN9^FZ#dw#&dHyw9>dBNSE5BI2BTw%#>KLF~1TXj!N-E)JzK*9xKen?u(kmNuM zXm)T-Xg#NZ2&89;qu(XcB69nuDf!M1(wYYSwy%GdTxRI(YUg&Vo|#X-9+Z^}(h-toBV@HzRZZfcYTasp5+In{3WIf|!iGU%>;j(rX2$0I5g-0~ZmI9awzsY- zu7GuN4NV2E*}*I!XGky`NaM|_s@?Xofe^O)>U*I28>jdn`EdN;nEx=KFBH|or-)2Y(l!g^rZ=jdwPR|E2DV$=z?8VFFbwvJ^ThPUg#PN(&i%$% z=BD%nSk{)XYb>#F1!FRttPU33$*ucT*D}}l)dm!hZt%2Je~0b=)taCMCZ`iV&Yn}2 zzIq-QTL+|e(9If^6RL4kcLXIhk*A8M3DQ(2m##y0cB!{qvs**@UtY|(jWRicQy zW%UkW2Nl4U^cwcCOEksTo0j>N8P@r9cRKpsSx-=z15Vn5x-2 zfV|BRb>_7*@C;ajZ*7z7F~s*0?JOe#K@~yZacJFz_C3Xz{%Q#iyZ-gX!>g>?P9j1J z{OC({YtzS}*}f6oUP$$%_*53m9zL_QwkUjR*4#=`T$iM(!@t(#uot=x$T9iW0%3`` zDy(4`fNK7g@Q|o%v|-p;255n6XH+MIS#=m4BE#U{5AEcxS*5~PaFwPki_66xc$wY# zeWx}8`eX$5SJ^c^OUKpM=BGGS zmu|v%Cqj?QWYyDUJavUGE^El{O_Q+wysA7_L|mq*&Csg1`Jabg`}VR0zOS>}AoL<+ zRbo57MsRJ^9y5TtDM-+e%Gj6XCB!Px~lN4TRV6y!bu9e*kn@m@QyHUKmz1Z^{TkK z0wLQB0lUXFub{lL>Hj-pxOEDTgH9XZJ8PUTZRWg)k;4KpXJ+0C@Hn`-tS39F>mK;L zgmMM^1iZ3yUp1EKYg+Sz&U^UM+PgV0OMxkhs-rOTTn#EUF2neqrNaz-LB1fJ3KZp>!Bc{1+Prm?}2}qCEnP4?$%h=ZtYl8 z(?_hE70l?8=6Dxk5@K4lXTvIuL7R|fclDeL`vW6IYYTv}jtE8qJ% z?BWLIJ#a0;`xH5if#*d@MM+wS3Q-l2VN9t&79m>^>P7I2fi)|KAOnFz;GSVTA^{>RI$by|Ppa__oPx3ufS>azN}IhI?6?F4WBiwoMf zu7_x0_pZRV-SeukOD*5^#8;o;k-@To%|8dsp7q#O^L%aH*y3|Ml-cZQ+<*2dk~Rp+TjEB~jDZvQ<1fWCwWXQHDf P00000NkvXXu0mjf37a3t diff --git a/src/main/res/drawable-hdpi/light_yellow_large.png b/src/main/res/drawable-hdpi/light_yellow_large.png deleted file mode 100644 index 1389aa418ee2ccd9fd1c06935d879c4da4ac4704..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16543 zcmV*4Ky|-~P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=00004XF*Lt006O$eEU(80000WV@Og>004R=004l4008;_004mL004C` z008P>0026e000+nl3&F}001?*Nkl{1cGka$%&e-t&))kC_uO-CV+&gi z24kRQchmI1U@T-KVLu@8WQhm*ZM%m7GqmF@x}OF+=4rv6?+qCtv8<7|UM0@A0Z{=N?|10WArE!q^qDvdnz-&5+S zom+OEwb(A(Q$bvdoeB-UWVcISwR7z#;c^=&%mBy(vrtx1icD$PIje=gukcm7KNmHn zEVjjNrR zN?0^Skrpm|E+hbfP!DN`G{xXhEZO-YQI`Pb;<+5KWs4N|pgJ4)C zP);cXZ~PPGIB9uolmMm;l5EHSx$1ypk!bKUf36)R~IP&L5zD~sPh&}&E{Jm6`Lzb)qGEFH$gP*e7Q(tG|IAzc60w&a4#4P5aSg(9P zZFR@z8`JVQa~{S3ZXP_l%mih^%4kXC@&n!&m5MYIV?X}J+>+V z)>CHJc!Qq-xM48Jb9r0BG#9pvD@!Kg6q$iDc>1>-XbDh>^^woVVfkr=#m5yE-*=dQufpR0R+xV;WSs)k z0T>Pguh+`?wE&4jBjcF>3y+gbq$=nC$pRppeVx)Hb)-4){{}g4;++5g>EN1Vb{~sn z4x}CdjAdJ#A+6L%D8*PPfP~?Rucz$%348pcX_*X=o#e<*Gh}DEha!&}J~9S@ghAfV zj`iR93d@dG9NAZ4Oq>uizA?@JUy1o2SD5{u64O7dF#Usa)m9sp?25s_>m@tapb5at zg|aMIjKZx~Gd?-{DuI@O)6~R^5jn3Y{ODi8O& zCq3#U`Y3j6k)7noPJKPeqXt|zXx_jz7!)ufm}~+P2}c&IO{6Fc5}6#E|51tQ|1L58 z{Sr6dEwT7m(lYa~bkzXOm9S(}p(qO_Rm?j)JtSYFwdGnWmWx?035mOTgn&?)QVrR| z9qiPEsl|k;!wEZ{vZJgg%(Dk5GGr$?>`8(AB!?N>RiovNH4An~Irj}dQjU~rAVD<$EzYJyTjLO^x(5CGX44mn1O2jD#L=4!!JfMs?=GC(q+F!FC~4^WJvC|NrwM)pe@pnU6a{kuzCe`krS-!4(U zb;5#O0=V#1o^xn8C_J#|0X>JLIp*u^s|2@Dlw_#~@72X40)$H2Lp3-U6Bb)YFaiWm z#WB=%g2Eo<$et9iPe#ZlS^f5P17!9^y^3p)2w+rLQn!VDYgLg9&EVbY)+-4L`z>aF zRN?wN3taxz5;wnFvLC5rU|aw=7sm?)lxvYa3!t>C$=TOjtsqWjyebx(R6zOez5`;q zvsYBL&A-S+KgO8ZC>dy<2{4}dBd=?do*jEAjtiK~G%`dovs6ExDUH##T=`pIQR5iR zwh3D&;Yc0T&)WkOHzQnqdx^{czQDzAE0rcpMIHQ zP?iFa5?H=@fPkdo&^r5gcIrrEq@;!7P&{Yn&uTD?HL%Ac*y9nhqoNV)CWBv-P!iJ; zNZW)(%KDx6g02rNSxd}f1t_-p+g*QW1j)g!BKr!1-@1;AT01mn{AZv7j8D6Ka9x2xqJG46c8u zi*FLnzT)7_nq4ws#K8mXN!Q_!8LF|cQzs(6;9vwOUiimDs&)iBS=ERD)|ko0?SN?A zOAE7l9JKzk07?T0$Nn8Beskx4Ov4(fi2)$ZsVQ z&Y<|f*XL_HmFKXNG3Swd zukP|HuUf9Ipr2LB+LfjOObaNdUmD@$3k6QTP~hFK&vEm6rT?9R6+RMxa7Z{PsnuWj zP!)%ZZ>~Pj$row!F@Sd-kXAS}OU1!B753=`1LFg)F5XU!$1syIjLl*@C4OJR+8zPx zMsCmqg?F-%iIt&k@**)$9|2?5aA+}2TV{&-#3Z?XTkDua&eWvx=Pm(?$bbQ>L7C6~ z?ij~^Imf$SpX1%H%~77`06r8+70qT90uVVk3rtDYYI5~0tRSI>0*LEM;qrcsV?{Nd zGcaCyD8e!Gs!^=qC`L^ZjDUpJzX6ee0!q&_zrPI_DCaEbB^LM-3;4-2ZI_xx?y_GU z9hGY5WF?d(7oa58oTw8N{(BpJl;PDc9^?2g=6L&Sb6o!BQi(+-XwJk;&D+=PmIBGW z2c#7aK8A{0DsHEq3AK3X>(kl?+0htgG={O3$%9Z04vDz>6NAW@SamcgYB0p(jUx*r zjiM?X8Zxo%;=SR$0O{zMY`~$73(LJ7l%TNJs}mGf59Ck2IKt%fIgb9^9H0H_9OYX8 zcm;hnrkqeF)g!gy%Nmjc%Sis7;3$N0gn;gp*{Ns3N(C@p)x$$fR=^ZqHNezB#2a

HF#eGYZ~wy_SKnUx3)%$D>B$9}OD)N@!?cvBlZN@80YY7HgewXk zCL&eih4-=njF;;UzkC8)i~*bJHp;|}pOm7(V_3)v`{g^ojTJ%sUmIck!x`TG>Kt!=Wd_g~zz?xF zq(D3sIZFVN`qB>$$srY_3yz8C+XzEJxN3aJ>Wli)YVrw8K3UlnsRAiTq?!n&APo-E zd;itz0TLHHBf=qNIbIS23i)lWC=Fn2oI2LhzKvn^Ey|IqsG6|UP;lEtqEi*C*yQy; zKE~*C7H|ID42$mv%atcmz9wO{&;iMP0)%W2IJ9`<1+!Bh`Y-Yo!ccT$3m~7sWJRKd zDv%)k)Fc3=`F&I0kpnHArN$_)BNfJote1d>lmMPgvlpFgB6B5T4i17X1RRAA;zJE~ ziyc+lWt(d9{O?Ure3;?Qzn$Uwcb5LQE|6Y<()0ubqBH8Q1ERu_cfj#nQH@ssUi;u3 zfE~f)N4ljl2}pRXk%9?vTym(3Q4)@pn57QzJ5t4s-ucup{2VaL7y=45EBAdg9F%hX zSOb<~WwUB%0vwr869&r3PZh|YTYUB_Q@s1e!e99EmMm7MW*-`oJp-b~9Wq;WtiTac zwy#9>b2YLFjGcgBVPtPOONSeID+oN5{yXTDUie>Ny5RiReZ<@hvOxK;=Fym&AxP(MDE^2-?s;X@9-4PuCmPDURTZg1EF)(D}9(rTEVwl9pVFpRm zKT@qhsg**+9oBjEaBDbfH7Qmwgj#<$+4?(@mh1V?O<+a_pZ@aH&+YiA0}4K8L_S_7 zY}fk)gtP_Rw4hu|<#Jo~Q61D9GtuGDAkpFu@!b$@Xs75v&+YnqlYr1D9hMRpIWCM1 z!i*rPRzDH(p7_vXUadi?m7if z674>_ub@5OlX94rj1{+5JeB*QP!A7>Jp#-~A6;mg87QKbaKh}^kg4B&wCCVHm2#FH zmMLHw!|#Rds^_JM@mK*A>((>&OdbP4mA740tR@X*;g$=Crwk}@$=Tl+1IFOve?Ik) zyl#P`YonjN1?~AB;jl;#Sw9m!$AXj2wP%*f4sNP!k4<^L-nxYNmH>uw8!X9UGKHvt2$8u~=sl>$n80M?OIE^$|dX zkN;V)Td$#S`_OmmxSfOceE^aQ%8!J#dM5fhUa=lk3z${RL1MsQGTUcb`ZL6H+fuu< z4?DF_1)=sBMRszkz;IY--IqcRjSa5IB|ynpmMUSXI2e#{kXI1^PK!&R1n*u+TnT*q zOH&`Xze2zL7Q2+>Rsk^`afh7G5v(zmw-kLlWMWKtO91aTG6>BEPd561Gsp^Piodx+Z-5OHzevF`C&w~O=q$bqSA;kJX6D<>htRi(<13<6Epf@g z0co>Vd~U}HvsTX;9IsH1%Ed_S1ndO~u=!A(J;JaP2-Lq%r0YGqMh!Gzsf4O%pjbs& z_;3>6?wo|eTPep?!}%m@N=-<_BZwg}8Sud`Oi-OWy!(#}-*z|@+5*`rHQCB)?E(m2 z5_Bv&1J7802OpvP(!Wlz3d)T314MQRayU|f zxg1Vn*Xi7@z4{b8MOsFR`d@|nd@sF$xGO=s(kIk_MeYsS1C%f#H?m(!vdBqw;77Ms z2TyS}v^b-Eb^=7Eb>)K60T69*w~)O8O9S`FNcDtdui2w}zomCKEUKy~ zpct1{6Jl8^S)EAnMz)G#Fr0sH3&m>jkDaX{0f6T}H^$;mDqQ`KrEgnPGHZjXKKmr4dUT1jzvt!KuxbjO11xRLy_k2$+j9m#xb^=5$7sz*#)s_c+ zhIl~YiT^Fe#$dFSI_&)X#|%XWC=Kh?M@^txE}6P@3=A2dJCXVca3qz)#Bv3TPtcE61B^qLNmayH7KbO z(VCiAwhgoBcQY(?Ym@-oNf;DJNDh%fQ%yJ|&wgf%*&mj;{H>*LYkcds8#K464xqSA zR3zWPT4hW^bbnE7Vrzi8;Z)U-?-Jvlz4=;1%wCZeDMW2$NU+@76e2X z6JgX3h+VDIQ1)xP5^7?2MlM3s7pSB^T3U$G5qgyNM=gp@;0b49D3QhcD#fKT5{>`xmWFjDG+d#Bp z>0h%6AZ?i|KCI+K1m~fG2qQ-rX-nY_%5k497mrJ9Pe>3?38oY%&=rN-EV)Klh)SrUG+~DkMBV7OX5^kRRwkY>) zKNc!duz)>jv$`x62Sloej6Z7iAd34uh9>_|EmsR9TyVTtv8hT56k2{pOM9X%8r+!_559b;T#SLoA7@fMBqW-O5b5VbxsOW19wV``BKeUWwQ~4# z2qke`Ar?$kmdbOOg47CCt=?<$`2we33K!}#21!tnBc>oD#2ffD6vTGeE4h@9RFJcf zxpEGpq47LcNVw%WvP> z!~zvZKUUz$UoCL;t%a~yPY`cQ9aJP_vl_vAo=^{qcv93@3D8gd{UD|uL)`I5A&G9& zI%qeR%}R7E4k_17FUo3Jmj1O$d}8BaD28v^!wk`rzcTWGj0GT11RNn2nTwQf1PGw7 zRw5UnK4xzg=6d8##2y+XeeWB}J%vOamco19*}QhDSYRKD~ZJ=Hru~ zB4}pQLdy5(#|lh7pJVoiCE|X&(2ggZG<;4h4}H*kM580Et|h zDU1M)xDlHH@%@*Ader?P8Gt3TTznV`;@HRdl_3GZjtq`}yzqcX1(6nu$0E@da5?l< z+If0+f_Mb)lUh9h>u9i7Ly@*16_5Bi>ttdDshge>k06U}R}_oL44PxxP!n+U`4O_y zIjT#?06AuWOhmeOE&wrBi9Z5Ka(Kyc0}zLtD80T_Dt$X-bsu7iVRjO zX|;mI@3dOwT1j|J65<;h@R!g^9#5VeAvsy-s>b2|mqn?aK{#s9n_dg+E{KEx`4>By@R6;!_ zLP0_tVtFzC)e>V4koG?JRf{asvdK(}G3uJhjckBTvdS6Heat5oF>_7|)GXyZio{Hor{!xZ# zh`i-vx_FGk19e}v2Axdus&^wK`sFq7ljUQu$f z$UT*Tu7@44i(x2+r+$N)@Sxovd2f5vPWS@bV%(t}TZ}%+F}+wQ7K=l|gY*axIXIC6 z!h6z>ygKAV0~pHo0lN_Zi9wEa(C(8-CRnf1tIATWpCteZ%L3KcZ~}@Cb4-7K!7lVX zNavZXXz*gLs0X)LWA;Lm@M&BNAVaV|l)xb1OiG7-J}ViA6LOF@|Ngc=}hYa6)31EQKk!Sqw;i zmZNx?WBEzR!iKSE>$w(#NCn9g3bL|SF1^;(P=>NqETX9h@pyy}YP4|>PI41dzFV)D z|CB$^JRnC21<5r9vCvbzvNwI)Wv^80X$Fvn(q_97Dq@JmAr;GDiP2Gw72)NEq#Tf^ zIacGX0vtT{&{DlNSJWd@EY>)@lN@_BH2$G%ry`Ul#)`$tq>8i!=`x!IB4m9OWC+xUva_m0Dx%meZR@sZsRh1?lrPzFj_f2ubyX#@ zSIHn<#vgJulVGp1;l~`x?kWO3NUw*(Ls1c7x1cRY8s5i>9(4{$1jtxeEE$IwIao0l z>cLe6GypP`gQ|x(uT_MP0#4Yi==CzTHA7Gr52Ae%+VDuUaS4dwS*%QnL*%SNq?pKhZ8l*pScqZ}z86R#$iko?LpfZq z&a+tIJ`#a9TjDgD&+hFS$@k&AJx9Y%cpEMhixu&Z%3|e+`$K@$%83IYLph+DNQ>px zBYlI4$lmraz|k;BqB$pW!RsP}$qc9>#Qh(6R~AdNT7fD!f~7qqrv^JVl(fy_jf5!y zSCKGi5prqMs=2Z}u}oHIbS5*f6N~D)LURPK9IV(0NM2j4gOA=F%3!@n*;R&gP2e|SJ=85 z0yqGs2p9WYY428Mu}p`GWITg4Kr)oug-O{xH&PX4(;mWlMMv-k8v^w_0Ft$-2b3wd zT1G4MoDUXjD2ETwHJcS}r4UB?dYe^G+jZ=5DEqnd{*s(4NS4Fzda5`@(g`v%{` zaFd~Ip0R0zMG4-cxP+8_63seL=OcSfy>4kzIl2^tF9#n!y4lNjFqENeborEP{Ia1a zk+L9G6Y@)u)?PJ56VRgl!v|d$Z{6Ty|l@fkiw7V+EP=>N`9MX9?rDm2Z>UppHGC`DxK_UgQiZGx{ zL3muE~;rc$08RHV_alN`wH547{4fe+;t19c4+IU&k0 z6$uMG@Qp()TMIbMM5L4=nKlO6wt+VLRFFYghO$um?@4BD?h@tGu zl8{K{s@X2y9}*zZES965ZN467rC}OD5vKIs?v-QcdU-S;v}Uqe9*dR@l3P%VU1j;$ zF5S;H&hrF8q(n12x7cC4)=)O{9xZ#YH;3=Cv0AAH7XGG^?b@X{u+2yZPBUv}7#%W{ zg9he3p4YHhKsvR{Vv?w{5Yl3)J&771q&%_0nhs!eP7QT%24zzrG<(}a2gpbp6O~>tV)1VKRH)kMM6>m z$c)*}Vns6`hk#=!yC!YwhD6QSL|bYr3S}BGNYw&|{Y&6hu>wGQ=Uq><5rRNrtjNHr@(|j5$hH7vUWZ?-$u4C<6jR*$N&l%^N9(1cd-9EB1#A(bi>5(ohh`s9O3L zSYn+7sD?OXDDO>4NSi2?=nK)Fy9%{=8|H0%sb#cmOXjL%FE9rHYj=-B8u!x%U(iq< zfsK;C_a?(poT4VON4>UJa|TD5%4o?fRw=*;$3>fh3^r>hx5rbPilj1He6p0Qn7vwv zw$80qG}J`PTygc7`#`IApL{LpiL?q68#p2c-_wYXzB#w!Ki|5681uPJx44tf_x7 zSc`HO73piU1{Hb4AW)z2SOOAiU3&q5D_0fpZF#C#EIB5tHAt5VG7Il&?O|-zpdv%r zELcy0rOha;;ULkbxq>WH3L?i}$pC!@;D*_(a+ikRwH(l(B11_B;XNQx6{QAb>f7>6 z3Do7dEaDc6tH?qq$dtV>tVOxc;qOHIxT*~0;VH!?N|FeGSDk~7DaZ|L&ocpt9IQxM z46+n)$Xo(q4BVlzSwxBOY+&M%t4JFp9iV_pwip%%WG>>5r51xw0+OXCY{o3s4c6nb zmb+xL`r4>87y~f_Bwe7?jVrX(IcvwfZEGoB>H;LtB`ww!0AwvTYu_r8hG>A~QP`~B zkSK6~9E(4$6pIyHQYRqc0j?l(5r^C`n^jqpR*`Lj^}$9BWiv?n#4T>Q+N`j)S2rU5 zn4>w|JsPYCp&%8Sz32gsYhPzxMK-cogNh7gXGk^$Wo@r!to_~y1qm6fN+<~A%8Gm} z3Re)W9@oKU`A)-Xn})w%6&WCTR9UUg)fVgfDq*j#g^F+m;cZ`CS&^rE`BJ4;!U7h_$`CWPn_w*$1Kq=)qz^i9SgoP#49cn(eYxuY zsMRA})OnhhXRjn6;DC^l&5}b-W{QH$0U*oLHfvKA+1+XlkUSnxT44!oa;_+d>_K13 z?3GjyO4uxIxCsZOwpn%$DzYD|HIxAsTCQqsuQ(vuFcZyQsTPZ?i0m}vnXCZFg?|oZ zc6SxoHJBe%WPrv0_6vVf`ZgK>kr}MU;6zDVY7@`Y#3`vD7rr91SZt#r`v}+vNQT17 z(r2&0+NV^I)I_O2uaTWq{5zSV?=;1&F31JW#)6aGW1X zMK+B?21xF6kli(Hb|dvTXOLWq09{j$UVvz^h&JrxO2i@O0Nw#Wo?($~(Yvk=k>5Z? z21xEJ414>V1yhfA0*=sLwc#aI+Y8&4Pb3E~E=3#?ROFo1RYohTvk13pwFXG;Iuv`) zR4wFXG;D;T%(9#TC* zpgD(=-Do?ft_I!>ApMuK+^>YAkeVqY7ZZS6-uA$W@9@!rx11R@HEjmjD(A=NT zSUWry0s0ipu~)9^Lw5lpce@SKaQW=QO9c{Gi!#qJ-$X6?#3QNabwM(y$=y;5qRnff z%zfL00tZj;hW-ye_R6){t2RJVDx!_ex?(o#Er8Fk?mV1to7L(Qv~L2*V7cBe7(E+% zuh$TPdAJB)__p_!*{h%)a_m(v^#Fjp$A9mz+Elj^vB(X8k^c}A07n3x066i-V`GqK z8Rm|V6X`H^?*40l|z>?XxW)T1Kn%sv~2Ou?OUs9iIUBFtb=Xi+Ne$sO=v<6eQ?)uKvnHITRRupwXVA z{9Yj&#jVw6A~;XQ9#tPWHUWfZv@-u@8GypqvHw650m>18lRU$m2wCMYx@}10bHkU- z&j&R*EExM3lq!C&g;x)Fm3YJ8c*o%2W3PH=t~LQgvswX?5U>|aMaCYI34`Ux7{FVt zj0o92f3_}2Y9KbUTmvY5!Ppjxu2(kc_p7YMoVl7e43M{qdTbn+Zwm+y)~&BO*0T)@ zACrukdW8BavshAw`Le|EzEq@59r$zm#3gC(`xrslKNz&bCor+q;?^p_@fOYA^BXi* zE$JPcZvqH}f;grkbAQZz9Wf>0iZTZ9G|w<2f-Ngd4gpC7LklEOpc+8g-bU>UiY}*M z3}(ix`q?}TpSGw6pH^E6I9%V4mv8tPc}9x|>@%StBL$ENfU$=ps~n2kfFuQge7<~M zI+OB{K-qt6L0h~|kANI7STZ=~3LNK(wUU8(fCKvm1pbAsh()ZTB837=s6S*35R}BV z#3NmhXkTRCI73sD&1_ej33wP#Y@!ylhcs{7?`wd{tQvfXA3pYge2Tc=LuRhHdXP{M z>>CgnutPv%6QC4ARbE+(Wu9TWtZwQ@b)9 z+y%;Ju)Hr|XzQ!?`-VamYcVsX9*yxCQ;#=j_L|>xSgV5r!oMSKwG4wKV@krIC`3K= zR?D%HCA)$5Zty}YzmJ2F0H}TuH%kN0G}{80w9-Y?-X>~!m%qL z+-ez?`ju9TcPR4va{xz0ju`;cmf6}Bl1>M?+Qt(p{BA{n}UL#uxt*@?E-OI zP_#X!{!Ro~i@Aq`e1rc110=*9sla?M)@oNkq}2kmTAG@))z2A&yvQ&G0hQYglD=xv zCu@}gr4KBr#&HN}cHN7f_So>Z8KB6&6KgQH22-s2+dgJ+ybKuC#4jEGAl zEb{y#V}K&Z3?)q4n618;`gbz-aD=$w2Lcd2AW`cr-&@?VPe8C(!i|ck1F=#7NkPN!M+8X)bj2jQTCPn% z*#?$WgE+K`&>o;V=@W>zDpHHRq7AR6`^BtQZM2Gi0m!aw%f801BcDOQjiZJH+B7bsn-vT3Z5 z>eRd~tM$I2;3cz|=2@MsDg_vFIEh@sCl!?6JwOB`si3`YJQM!@6@YP(V`|JwN!o^` zY@#NcfU;?Nx9|Jjhm`LjpzzU>0AznRF1`=;na*+YzFk#`^^PyI3^ThPczB7ppW{=Jt>SQ8w`8pL7L*^%V)cY1_1nmGxHu#wfDZw@ zuolb0pfVLEeS-HxfzoEfHjP2{X}@+&`5rRX$+IXJhlk)3MKxr$iVs4R%Z45lj=ftf zF_TYPtu8?LKg;1L*%jlZPXpf=16NiUZ!*Vy8&I}^rA;z#I|kYH?RNdV-crqdFdo{& zrz{8$!$){0;5p(g3+5eg9PC@&tHt8yENE|oL;^y>UIiKDi)X)rAHQV`s;a`ctLJ?e zP_}`kt8tn;2*M#Cwib(gHLhwYf^j~lLtBwV?nc|S+0ESsBn3Tx(h(C@5T95HRsGyohx8S)!^~QR0+s$6^{K_ zEdL3)ifpJPl(1TruvZKAg$2p|AoRRjhjJS=*%p+(S)0394m`nW;o%6X5tioplpVu7 za=DH!A3mZ@e7aRQ_GhuSheR&mrDd@yrXJxKzQ8Gf4*;BaH7Tt_xoK>&FLk)B(Ytp6 zgjB5IRU^Ffl~9WS1|L(Utz*^M2}lIGjqi4ELHZ7ml!|)r%2kB#bQP994UjxH26?_p zBbKGZxT-MP*7EPeO7(4|`-1U(ap?DhnOjr;mZb-Q_h;~hrKM`5M&-U&IQAZ-_kn~6 z#8SX*o6~7qFD%jA$cJxF{Q|(5wJ1jxWo5CfDvY+VU59|>9yIpepUIfoPRT9zE`(A9 zwcvJ2?%N@^MpMUD5gjI#dn-YDUr0nh30IS{!)|d<76K5yE!+zL&jC#QkGCu)FBh5aW)0Lh4tg31Ec3oC*7+fg!hKPFbp|4UXIV&JWWM(jO8z?4&IwDHAqp#;!u) zs&wTcc?KZQv(-K&m0PLFK0vvvamOLm%33UgVz4-)WFYXsJ7lLW6g$N`{&@d}9J20$ zrFviA?ZNs%`amK^0Tb36`lJA<5O3teH}kn+Uq0W3_bGs9#=ssDl)jDdwtnD!+O`B3 zj>Qx21Q=2=LnCxmnJOAP(AmIx36u{E} zN}gd+ITSudDR4^*Ske92(26pPWwx?XOT;51&P9DE;tNeNx>Tc)!gcQUg7Jd`(gjKC z@c;=6-g#UiVUh93La|#n?1zz%oC7%XH4j%s=a5$pg>x9WJ#No%AB#1peDJ-rHX4at z3INWuyk8K7Xj-|*k-rGVfVJ zFqUX82kHbI)DMn(qaaO+H-V%jE|HeYDVD1gfGiO2!pnE!z4TYRQ>C5&I5h??%T{~5 z`xWSOw}K^qXs~!FN*`a8%9h=i;=7YDT#BR!558~M1uJA7TUBFoILv(kWHU(65xfh_ zrKt(GTAG^7gxxx3KVsNqw5v{xL6v8yu-ZP(I)~g5@^HMT_NlZMWjG3@2&vku9+g|z z8xaG}(HujS%usPK?iw6>wpjfj;m>Rf-o53bQPEHni}aW+J|snUBnCh({V{Ab`oycq z6H$*nEaO^PR<8{YN#+PSxz+Km0%0sFYf$>wqEwzXXAS*YR2gXVBe$|V2ISeP3hB*j z?mQd^h(R`oq$@6IQIqf`SN{Kyz3y|Ywp$2WRv-BvmhZ%SBw#sK&UrloV5~)HSMM|T zpEV2nFFFTHgp7cU=yrZhV?YL|%nAZ$3@U3@x3%n)u%NtNE9ckj`BP@2rXoSY$I4aE zd&6ruDhD!&^!HtX;~+tL3KHJv>+>FQ30D)K&U94*lAt76B6uJBA9dn?;Ch2mf6jO1 zJyve>bG||87=SSbRTdiKItOMP!4j(gED;O=1_bNB0^|SB#-zkB@yq}O17}wE5mtMI z*VUTVEyYNv=}g!nc`k3yM8G{)0`G+qfU9d%RUt!l58&7nAhgMqZXcNmzE@)H)|6Cm z0HyFhVBvqzu#ryyWh@#z2j@tEY0RD*ZigCP8vw`}RM4;Dhb;3%`g_i<`m)ha#eH)H zh`D%eei70XLmg|E*~7Q9JFXzNQiy@Ut(P3+n6v&84ocY2r*%I?rWUEkj4-Jfm z0!SAqhBYe7KnV?X0euH7t}ulHf&?oCMlQgRtJ)iuzBUO@;S~EQ2XK}hplHA>M8;23 z2$`ZS#b-!CK@X%|Js3c`te0Vp%3{6Gd&blxH0%t`?c%uFh@x|cj>gTe~DWM4f>r$w? diff --git a/src/main/res/drawable-hdpi/rd_btn_off.png b/src/main/res/drawable-hdpi/rd_btn_off.png deleted file mode 100644 index ac403ab1e1879f9436d4a01dfd84d1c1eb140d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1442 zcmV;T1zq}yP)5S2x6gUb_nhZB zzY2BKQAZv35}}|4CX%Tz5COva0VwDv@3~GP$o&E#kVvK?zzSe3&;~REabT%_x~z|X)jV7MA0izbjrrdok#fhSb4 z8Q^zd1h@!HB32Ir4Ty(2fKI?c$mW65z_*_3OxzU$YV{t#1zJ?mlfXG39UJH?sB%%n z>Zqc#KrYum7}0f)0o_V$0!RX<7V3=!5m4oK0NWAEo(2wku9NQBx4$Wr&1?uyPj&(i zA$K6EOLK^aE(7O*(Om!Fj4J;;uu(}K@?7Vunh+>a-bJkW1@J>`pf6fj-m)cpHEoci z@+&ZmSan*LHv+A|dgQLm0AB;=a{Ys|z*gV|USlBs8amw_qZ1J8BR zRTI#o^EzU&qridaNAI>Sl!?A(BXz1D>I}yt-T6q9ndjPlr>@>#2fX{WWZeU#{8NLKG!}jX;PI|7BDJ*+n zOQ`VgO62S=TKOWZwNuCuTmwArxlR_jPZ8iLJpqd&fW+%HNJ2W_v-^$a@bxPO_#P<< zg2F{a>21cCIFeJcNW^OKTUd#}S|lm`2BgDN6YKQ()O;`Oe4w&UAi1N{bDb&OvjNH8 zWl@%Zx~@$h$6^D0gl2E7M?zmF2*qzfMrC(tlsbbPqjtYzar zR|Azfh9tZwk__`e6LTfWZKy;bj#Q76Dzp*Fu(iSjupEebt}~;1$NluIbO)9)SN=v2 z64^jhy)$OGxd<$%4vQubX!leLR3h+~ey3Qw&mu0Z6&iGp;vEaC4rLALMmUPg4bfj0)*M?!jfC(->1WDl8T%vlA&JW`TCqZ;CmO+=j9Qw1^tl z$F;fsL4XTLW^N8d>zmQ6vM*?2>qRU-?pM%Nx&vc~_ikUC|rF{Y_n%~i%O#8Bt70^X{xj|I^WTma4@b0xBjFa0oaO8|YgCYy!3+8N1wArHz}%D&GKS zthKpBGPMcVhvb~vj8$$Sv0XPi2^JFC%wq#9Et8BvWzV zC15iWo)0ZV`2`awAyGP7Od}JzGstKWd`64b+JcU0x{%P>!rdAz-a@1e8SZXG&TSS6 zuVY9CFAjG>ys-i)4?2)z)S$%90!QxJaJLizjMt9?Ki-q^dMPydv>?`PN7}$R65m1Q wKE)q6#t|<~YND(P|NEbq>ZqfRI_@q01FmWp6(JV29{>OV07*qoM6N<$f<{7!&j0`b diff --git a/src/main/res/drawable-hdpi/rd_btn_on.png b/src/main/res/drawable-hdpi/rd_btn_on.png deleted file mode 100644 index 8b8abdb03ded621ed9a894c8268757090b298b97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2116 zcmV-K2)p-*P)jx%Yny$rP8oL-~!MNbOC(`uPZIo4_iB zXFmoGhWwsL?b?mSw)mw*O02IM_%fmfRQalbh|qc9B+y|rwhT(+p8y_^APb3EvBd-)0loz| zfc?@bRnc0A#`b0^!NOh5Vi)wGA5< z<@K~T00Y2Yqp>9}pR0`Ke`X&@N+1Rh(*pHwpbnS@{7KjKu9{$YCGb5U3j8tT_e3TP zK&H-mgvZ_o{-W;wrB}He*$9M(tL|?ds@r4-iV?+|E?|w%DdLPzw4ilIGOzQ*8ekUi zij2fM;A`o<#!4l7wue#{BZ{mCIH(2c)e$AH4j7QetI~KE;Bv>p3)J^s-C$nq^`@*L z2Y})zu+$mlJ?7V+*%NbnP9u(2`%vAcXhF-i*1WENuLtUUKHsYb{2llT;)FVZsHa;> z)(FTB`%~aP;O&s#^Um@ozVo@g3as0-BJ}pqMB2sjpuIoo@g5k#ysq`;kSGFi9 zw|XF@6qtwb*vZ-_pD9tU^!tDhWX`8OKeMEzY3IyTVt&Jx?I9LkD1d&8FP%o;J~&v@&Fof5bUC^i~fVt@`j>ht+rh@KKhoLHsV3>*tU6(X0< z0TCtIJ0H+SG*=tK>l)yiwJ*@*P7YSge!4OB(gmlY8&0~0)z6f44Xfyelb0?ym5TMx zr`*ZGidp*tO%i|x6pv`GkL0>K_ZqDCvE zEx7@ZFP9)rkS@8A2k00nE_EQzcrE`>^9FU{Qj^iHJ04Nhg-gx+L(LncUWe4#iD-B# zqIi>tG`;0vGZp|B;tcPTO5KPKn?C2&MDIE8g_RqVIT#PXg_RqViQaSGOkGmASm$2&pC4Rzac5x>h*d%yr{yh11P~LYI}P3vue0a-Ftsh%AoG z1|Z2OAt{lHW-yxXpoRrF-)lDY=~GlN^lCIaA+R5BM) z2j_umTQrjPoN;Z{kM|6mII21?p0&nnyc!K#11FAZ$;UVBk$Nquvl?+_F@XwcUzE{^ zj30n(-#v0!Wi++`oC4;lZ~j)38yhjV=X6okq7M5TTOHXp%8;bv^$0+HK zN?i{F@9VlANAP7gg57211mocYOMs1tdiaADs5gM007b)d?rR>Z|BZu;>vVDd*~NK> z-*`IFd(LZJO*jA?&O)oOe0I<9%5|?r@2NZ`4UYrSf|hNTyiOZHv%KN{3UQHpCFJ*f zI#B>O5gIK}Uk>~nL1^}V4xvetn(HVf<0CYW06zde0Nxyn(2SQ-dZodiQA(fBHy8L3 zH&aTD(e9eb$i_n{tATWSO%A2Z0C5wk_xXI~z#2rj^%2c=-2CA-^H!wZHgGYizP?$z zfz-F^y53t849^FC#_b^W5KL&hySH|m^BF8VK2=7)f+Sm%^R}zf=z|n(< uQeVjL$(hOBDF63AF-^&oOv#koUHKmz>sU;$CegzH0000PbXFRCwBAU>F6XU=$26V8kbBY;0@^ zq{4u>@9f#Lk4Z5Ys8<$96#?-opx)!S)G-k-2V^-H$RMbJq*~4eHG_d%2lN5)H&Psd zX8AX$88`tmKFR0LpMR2)lDYX-@nh*(FEV>wX{AjT2oT23$* zkPyFQSx&M8a5#d2T+4}$0s_&&O0MO^WJ8(*W-3I%Z(_12RUCjL5gsSDoS?`7xUw3l zg%w#2Ae7H3aRf7^mQ(5oW@=bYi6aPQLy}84s2Y@7l#+5_6*+|rnj=YcL aAiw|+C&DJQP0oz~0000}1B}lM3^Zxn&f4+FfWwuLclP*n9vm91Qcygpv^2f?Be9hDs(@gfd%)C*N;nPkPzMUo+FD@KobU0kw zIE9}vb?+4q{v$4~Qb9^fy!;ZRUKF)le_=44$rjF6*2UngF<6c)tJu diff --git a/src/main/res/drawable-mdpi/ic_action_refresh.png b/src/main/res/drawable-mdpi/ic_action_refresh.png deleted file mode 100644 index 934200e9ab34006be0449b2c2de9d0a963adcb8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3032 zcmb7GnYA&P+D(kUU*E)voqf-WwhG)OEZ zxrCGmJizl1f)e}UpYYB(ckYLoIp@wj^I_twEDRYTybu5Yqp^{m%{dGF1uf-y)_WV@ zeNJ>fM)r>YplAIHiqW~y696EV9teb$mAkjU_ak?29|2@ro_(CuTC3W_)eq6M(lTTiDOf9E8Oq^TE`5*a z>Fi!ykmNXf@AmmAxE8X5N5j-=e@q zQndP~UN@!1vICuN#L z$6jIKryw#Lup8{6H2%9*!?FfFcPhJ1gCL@+ALc+S?Ms6~$y|{j8gpG^S9ZGKl%pfl z9+=G|AEwCseQyAO{8WzfZTC)}5}9gnLr2b} zVD-FMb!x2FS)u4QmHQp~{Ktn0ZgtE$A3^^53~JBkuQ&PyDTL|i)s>YglTNsUQy(hi z4AXwM6?OXHcc{k6;lcOMOCn+Nx5Esnj=r}K?3)!|9(qX^={)-*+3=)+o_xYTCe&%{ zOh7}~m#tZSlk{>D_vDL(;@~eOyF^FH_m&o9X4{l)p^HSL^T`k)y1m2BQycgx96Ya}|wvh10&y z-1DrXQGF#PaIH6L1-H_%qOiiZBDm`S!8z;rzCE&ClCbH!Z^E<6vZ}aB?V2U8Ygd$G zGgnrCyrh(T6JA|_w|QqBQ^uzFI7f9bg45WvxVkWXjMtsZ{m|pxPyfbCbLm$sGKW#4 z{p*H5Gk;R<2QV;3b42vSVkCHSxoNmDJOSMAvdl_&#u9jXkg_Urn^|kw%-P;{Xeb`~ zj3c!Vl5UbNmd*!-A=bO5%jv#lRN7VGtTt`=Y%%5P zWib_)GH;~z+fe({IBNS2vkptdTkHJycbA*H1?XLP>YqvpdNNinStD+D=pc%n(w#CFBU1?@8b#vecFgRX0mV0xdG-pAhC6x@->p|iwCUfZ%X%(Ug<2vk!!RG$gkdhQR8;k3 zZ9{QD#i7#4^7Hn02UJ=cdK>yJJG}GmMlB$o3zP4WgUBPG6e~)B zp^OXD4Rg3~d=&Id@Jo`m8p-un-Sn1jVm?8aLpM3RI()UQTF|}spOk9B!?i48D$#=} z$}05d#4wH152u8VPzLd+m?%`Vc9Kslns-DlQz>9%7V&67?~h)F-h3`b&QkTAw22Z_ zt3u|!#*9j%VxxAqjGO(yI2wmGeqef8RR&t4{P4l&g_Etlm?hj2{c;MPEW zA1OuU_0Aje7Hd1};!AvSv?)rOAN`}H>b`27hHoGVvdnSuTJ#O-DveL^c&OL7W#tws zvnI4fEXdq5>`q%>c-uz`&rNze$ZAx`=IrFwZA&!Fe&M6jpJ*JP7Drrs4LgY|ljHf6 z#O%{mz8LSmFWIxNK9pB>67CJTjk>M>n3v9TV9Kb-{E^A@ka2qE1LMMt4_gPn^hvPH zK?zb*1Rg;s`l9iv*|qd5aZp_w`4+j4{DV~99-aH>GJxqpKkPm{XE(7~> zA>8sLYzMV`40bzQ=gU(e&h57Z{>Mq47|&DHoNL(&@;>Z3JXqkI3-uE}CH6N>2Z(Q1 zH(NH}-PhUDokq;XjB7ib%}(viKEK}@kiR!FYj{W<6)|*{dXUVFxR{)s+#k&ty_t7i zOI3AA+wXM!q!cl9Z%8bU>#XpszlMtw7J4+kIY}JJ8Y#%!%}o2^^{n`Gqji(#9jUv$ z`^x99PZi|u?B6)vY73YR;NK})V76R&Ch%N>?Ed@xf$ebVaT-rr8kveRYwyHGL7MdU z`E)U|F$W+>6aZ`l0KduSybi!)SpYU10Z_{VfXn;k-7bUkUIi;Nq(1rok5!hRhUeof z{x%l2fJH!7$I8(Mo04DKI{f`#wXTQ2+E=vfFI=aRa4lnLKoCkXlcvz$)9I zM#qK?GFUPKDOK~vO-ghW^61#6C|$H?=21-7wZ*z|_VNa9HaD`}c%hub`b|W_LbwR3 zYfhy+$DLjd;hB28=I)oczT$UX(}(Tgf=B7Krb*I!6XH_W{?0S7h@wYPD)J4VYX-*p L7J4;s$MF9FE4Q?+ diff --git a/src/main/res/drawable-mdpi/ic_action_stats.png b/src/main/res/drawable-mdpi/ic_action_stats.png deleted file mode 100644 index 5865d76db3dac22da74e3567882d1a6f90f02448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 475 zcmV<10VMv3P)oU*tV~*qeHX))Y+Je1j%d#F80>JqRUc3d&ZW|Cm5PXTEcmP{+WdO+a2#`x` znlyocnlhqiutC!Q8-SF!X#!vv#%a302dJk2h#_yJuT}4kX=f6N{q4VGzH63Ad?x6 zFDTz-0Jyq$kdX~aOIEb4rJxFcX_{9kOb`C|0XZg+r2^#CNmS|q)=GhQ^z}pZgnK;C z(kFd?p(sm!OWyH)-@|x!T)Q2^@HsYr-~^27G@^76*`t0!{Q{rr1BvH(cWn))G>jq$ z0;vW-kz>eaqYK{~7fP`~u%~9X}bq R6%_yg002ovPDHLkV1iRq(ER`a diff --git a/src/main/res/drawable-mdpi/ic_discard.png b/src/main/res/drawable-mdpi/ic_discard.png deleted file mode 100644 index 76335908b8c9a3ce411c26ac0bf22f40481ba782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477 zcmV<30V4j1P)Jr zm%KPg4j%8gd*8k9-o3kbtya^TrrAu>JhE;3>Zdr4GcpWgzjgv}b`NJ8=yg^w_62R# zP5_Q3mSruv-R@y3{eIto^H0}xoj)M}XRkPlgOmUWonm}j3jv-h7e))=_z}+D&|g6( z&^y80JM@A!v?WF)C$Lzg&YTWbMMT+dh?O9a6m^^SUQGJe$X+v9Lr1G%i`~ER>TLaTpm`-KyK@jYza6V&qQ|$B( z_x>hNI7b`W5<_fd0#Ouou;?fF&X@kt7h7C`O@V5?<>PAVx9*L&#bq{InfPM&N=!9t{Gt zJr^UOUc&*uVwumzR_R?|g`PG8kwTPL89mQC!4*40@wrUDk4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE>N3}r;B5V$MLgM_h*X)3LM{m|E9e7o{Eo0WM)Wo zO1S!ac5rB}Ij1sV0mm&(r4C=Fq|C(=4&Aapc<4}=h>p{PBT?LnuB%LxIy?oxo_MI5 ze_xur_g!Azb?=}TQ%;|GezyGHo9~SO{R_%(el)6QZ_r>|v7q(q$4?r$R~*;!f8Dp| z{krnR($`l)4_F)6*vFWPWYz5qx*KGWxqn~gjf&f=(hk)8_;;$cPOkArkKSp9D-M%) zWlElE+8wW7m-Xz-A_>#qhdxFp?KIsRv1!GRA9rfRI||>PX3n(g>D1q-CcNCzfx+3M zx=WW8SNd0X=`dK|^*N~#o{`@1jp1qFe*+Poavp^X;z_H@zF*N< zb-`D07vr=F1LqK?1r2ZQw-o(;IJN3$<^2=BJ%=lwE?JSlbvce-XWQRzA8i$Q+2VQR%mr<%Lf)MIG&ehl<$Ukm*SU##DNjxB zEh|^q+o_@bV4{M|cUS+zn=d>63+2=;$jo?mV)JC_?0KPS43}O_*;oC**>n@juf^&Q zzutPXY5T(8#SB~r{)(+K;o{&tFe%UJT*=m=+#V)}B+a<2dzsri7)9g~rUx!d+^roh z@L<_z;R!D66Cd1eRh?`r#$urRGLt>Pzjv*u-28WCdh7}j>1z|#EWfSOd+_*zu9-^z zm+VyJ=G33Sa_KEpd$~ zNl7e8wMs5Z1yT$~28M>Z28Oyu79mDPRwm|FrpCGk7FGrZOZk4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE>PQkPZ!4!kK;$DoX!@B6lvcdyj^SRlD8Vm0+UUA zYO-A}w7y7c>FHVE$7ClKDCoi(zAnw!yYzAVf*k@e9c&?Yb{cFJ`e?}4HK9eqv&6%w za>ZS>+}VERudWpu_Fc#gHBs(if4AtJ?f&=k?(e+P_+Iu?t1;u3$FoGQ{dDAE`@!5` zDO4VMvy7>K&Xt!64x*nu7d$x;z@W0K&tu)n4XY#fFIu>=Y~lKzC-e77zFJo~LAKv% z3S&=1YU(3zYYLgh5tZ`J2%N0@RgXi>5#y1u2v zH%3K$k!t9SpaT;amesxW6Bi9Gxjb){m%;_Nv&-N07cSj(LZ0l zFI&f}zm82w=|x$;+YXs&YP(bCOL4T8^YdTn=jFBkRyAAQ>e*b|i<@*TdAmK-?w?GY zD<}}K+OAc7F7v@?uEr9Ls9YO{O+J2iFVv>y{yyV0E79oSszBY2z}SGp^Mt##o0(3` zzsC3OczN2I2lE4}Tv)P$W^Vf|-6yo-ymWEi3_Xok;S3InDpM_LDr2)P*2-BHtK6@h z9k|5nvvKr~=@)V`c3!w5C3bZ(V|neoOH)7X*dG`m^?lBsnLKN>=bpQFabI?c z(p0Ojk*lP+SKJTl4dp$ve*Ld?A9#+p1PiV#6jPY^$za~>kGt+&;=h`ueECkqfge9R zcVD{|6IwP$KrPwLD}{ej&XVINbvBj$m^AnQrG5HFlEwXa>QWZRN6Vp?JQWH}u3s0un02MKKy85}Sb4q9e E05UX@*#H0l diff --git a/src/main/res/drawable-mdpi/ic_navigation_drawer.png b/src/main/res/drawable-mdpi/ic_navigation_drawer.png deleted file mode 100644 index 9680d157ed997266e5d1cabeae54da0f74559f41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`N}eu`Ar`&K2@6F2{QtkdQNpH! oSAs3!0dt{=7@M;~P!p# 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 Ye;poL>fVrshX4Qo07*qoM6N<$f+yud1ONa4 diff --git a/src/main/res/drawable-mdpi/rd_btn_off.png b/src/main/res/drawable-mdpi/rd_btn_off.png deleted file mode 100644 index d59c26f366baf287d59449a7e1fdeee015d3acb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 809 zcmV+^1J?YBP)@t}5dj53Cjs-#*<^^ZsTzbiAy zrF^wMjK?t=f7-&`S~0ituL0z%^#o_|GM+}#X41q@SioYfm}@>XfPA%n5+7n5-(d+q zV>5z`ViMDM4jZ^wE9O=o7$9G*pT}Fcg)g$@Qqmeaa!Qg+X72rwjb>XBXt^<0N$^et z`Lb5bT^$%827d#eXUnC<*6_${nVs#)yG0=#&8x-;BsTGaymkM((QA!C(>T<1RvpMwp?0lB|{%% zn!DfQ>u$jz{`VDbJVsmDZ8r^O@%EuehG3Y0u1#HrMeRUcqII z=d1NI_X9ACTiJ5yvCO@lNzC^XybWR=Q`vH97~crx+Z!NXt!HseD77i9rfIs>Z}0;U zTUd)emhen$V21+;9S+u8$IASI&yiL#v@NvXK{Y0{>vrFV0^E(~M5ejBhT{(aa02W3YW--N@9qG#Vy=N-gu$|m z6NN%ywB4?k;+?(LJcA!Qjq7eXuz=?qbCo}_igSfRq3?W&wr8=Drs)P=jXwXOZcc9q z6Rw1-cnY)qKt!8aJc(=hYW-~?4;K3dh|9z!yx5qlOyg5Li`NhP9B~-EiPOR`niQV? zVz&jQ-*J2;TQ1$eIbrOsVa0xr7#BL;!Et;FALGhE=z`x^Ct(aTs<@7ip7{`Ci&Mv#tX1Zy#m`)X3YLRk5TNfe312-)PjYKB#ph+QfGcm?=P49G#2d{2O zG{l(fT6&`w4^Y7vO5MnXMjBWJJB?ObrytCI%scOTm}w~OwuP!E`6rV%nR(ym`Q@GG z3m)tLt{vMs)H7%dzf$Z)aG_-5Mxq4PI@ue7ZBoqY1?J<1=y#uY_bR#kN|kw{bk z%H?ug2%$?Ub%I-&aWna&z}s6vYzPou`-i}nTGsr&9*cLXzUS`Vy?f^D*|Q=VjXn?q zp6AI^r%tJN@7`_qeLoJA+)VyR2=U2AzoQ{Q7;rdy9R>M~?!qa(x5w z&)#c|F3rhoHap$h+pFesIqkxQ3!PHRE>%^N073{yQIx6U$B*B#EXyqxi(+74;2Gcd zg`3IG1D_HE<<+&m)~3>mjsg=})~qPbY;!7=`t8u6LrN}}(}stK)4uN?t5&P~=H}*h z&CSj2s#dG}eBVDdJUpDv<#Jj&omNt*)C`c+vZesOB}m_OS_jZGYHPq=f>cW?in5r? z<%Dh9>d44Qr$t$p(x5CkPK}- z7Z$KBZ=fw)f2r?G=+S6&QB_r?P$+1Q<8)Q4)g~dtx++6jIhIHyY5{goJzkh!Ppi-&C2&&{-+nWN+ zhU=akwX)-Ro-TxtCr_SqTUuJCgb?>O@+^e7*V585Wtyfdgpi)+>A-T&sQttm+ZzKE z`wSQOnV_*aQcB&jEY&a!VVdTxNF;K-5rh!pUL+E^ZkpyT!!U$pS?a3Nd<3}Js9kRq z1DAo9+)O?WIHgjl{nDjN(y}bKzrX*QuIm>)&%5b)-tXaaQ`hy2{r&ydEX#7o#>Ql+ zRB8vDD_5@6fLBAC>-12i80d;dqw_;UL$m30TA7}nZdi&tIy%I}#DvUbGHsscwE|Oa zCjUCn0}M8r5jJZ^-M|OHIW22m1yYenq_SBvI(_=Idgsoa)y=32cpv!qk($veh?RC+ z(6Z(j&<^NfJ9acps{y#K8xuk#rIgJC2M=_pR@i* zPEjZcR^hV+AS76ZFCxHFf_3;}0xTpT!WR`#QUWS`aRDVHAj6vo$dP~!Zzf=k1ds5h z0`8IE6+U}6SYkz=AE7zA$Wy1p8|=~!7V&gK%#^meXz0%8wWZ964n9e$r4n+ z9g84Tf;flor_-F)OM-ZYj|(39WCf45hxeb@KfsBffS*~Hzw(L*Qc9U7v{MCUKG1_iSMEVs)`Iu3LwNC zbp31Y28M(huC0ypSS-&Z{1AJ~oZDU|dxfLnAZv)0eEx-J2N@bZN`};xSRVd*N0edX z!v)(Nt<9gvKeG7urIO{0bWixE0!2BMwts&$uha|1A8kEk&0uuZH~L;(`|tOA85Nv= z{XBGBuH9#n(CNB*uU!ts{0%<2k;jh*pA{j{D~Rn;}!R$8Gw2`FWGxzu11_k-;oMg}Jd=Rk0VZ|8R_9n7eMlsd?)oUuvzF zRAF22`IXMb)r_L^^h>{{o>2I4MN#t7OQ*w32loG9{aU1HB3t+Vj0s0_SwOySe*A0; z-!eu13}OCn26b;!l~kOo5--1>dzvNH%Q`%D)0B#b diff --git a/src/main/res/drawable-xhdpi/ic_action_refresh.png b/src/main/res/drawable-xhdpi/ic_action_refresh.png deleted file mode 100644 index 4dd2c9c75bfaecd8a3812470982f08932140b4c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3218 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 diff --git a/src/main/res/drawable-xhdpi/ic_action_stats.png b/src/main/res/drawable-xhdpi/ic_action_stats.png deleted file mode 100644 index a3fb3d9eed55c430e66126d96a991475973cca14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 823 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 diff --git a/src/main/res/drawable-xhdpi/ic_menu_help.png b/src/main/res/drawable-xhdpi/ic_menu_help.png deleted file mode 100644 index 128c7e807dc04d89fb65d9906e36208138d3e135..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1840 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 i{Rlgr{oFB;+y4bUe(VKPwwyQs0000 - \ No newline at end of file diff --git a/src/main/res/drawable-xhdpi/rd_btn_off.png b/src/main/res/drawable-xhdpi/rd_btn_off.png deleted file mode 100644 index 6dcf8738558001a04d43eb4dc17df7ccf1ad9992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2155 zcmV-x2$c7UP)-l(`5ABp8}dL8#ipR3RQFu{R#~ zhNcN2v9Z{1p|ic3e9#ob?`EQBr%ag$mhsxsqxspInSJ-^vYlji5dc8BJ# zbXC>){qFDF?>*<-bI&=@L=#Ok(L@tXH1QEdq~0G$q%t1RX5&*p7qA0}*#OAfSOOM- z1^fR>IvFq3Q@*+pU<>a7`hdN_r-61LYQwVuP_j|9kptcVCV?3sTQ4GNPCz1+X$5+L zgTNQijz{g!C13?DGFUW}$%q22l!++886mS-kK7SNM*Xw!oQ5vJXm-R zEo26`gw#A|!$YRf4s;_k=>tA#zk!HY0?q;B>12GdRx;Ow0NeFFz!Bh1w5TGG0bT>9 zks4nKIo}RsKK;M};C4i25t+twz;rqpU)iqg+a@59%CrH8fUg0a_VWVpDliHx25LL< z(8Do`*LovY-|dWCeYcfsE3J{$Yb79m{kD%4Xt`}EQpjbUa|N3_icDw(_#)B}kOrLs zUfM1R+ae&5%CrNA(c;^X=YAD9i|n;DeBu}Fk;^l?y`}jBk@xbSM+=G}TW__gR&3;u zs=p450kh7zf)UXRd= zR|dT7#Svf_sqZZC4`dQcKwuI(5HbD8arPpWKL?x!CY^IdBYXt759pvw!s)GQ!j=dy zn?D468|{1+NFfJR965HP&zqk<8o8Rg7bpOKM!sM+Q16Z4`+gg+6W9-Y3u(yJ`RUKcx z??=&Ta6dA!Y2YbfCjaw401N`(MVgQWexFXpC#qdb)dbj4_aopli2W3BHum^~rPbT} zhg#;RkJ+QY1;(pg_*xhdgTRlGpZGN}VI+JV_$D&Jw}GdtJtDo$A1T9Be-IsYB_NG# zzPK9Sz0Ve31bzvOZFlhiHpi&V=>d-bJ1sIii<~ZKLk7%5LZd1IkaHTg_cFklbTXbB zId-D2B{TIyd*(^!+@y1^W}&NduH>AX0G>oX;kfVn-DdO8nk-SkM}bsmgeIWE`RqWd zI0h^XJ@!PaH#>0@Ij-LUQ`HDiB_@$+^#c$1z8_5|<4eHbOr}oYpxr}4p&AY7Mn_Z> z_&4(SrIx8z1|r3kdy%IetL4tGh0Q&Rj=pc8=o8>2%383Ga=^4HLJ?q$?zD+Z=tx^0 zKK^Kjm%Vrho#)Th!sa)Fed8oLUJv`e-&aD9dG#R?==NXeRTJhUW5te{X$^^*P z3;*pxT5%!d9QD8jlOec%Y&E%>peBoo8b#m^lz{Y*W}E_& zz(_qw@O|Gy*Wde4K420ck;?R;ic!(z2_2q?Ccx@@1k;9pp2uA2F4UK&G@;ln72dJ1@v8kfeLbEQNo(~C5sv86HC zusHfW+JP0{_j`b&D0Q7j#nCqiUmWd2C(RATQTzTbJ$l@F-{@Ex15w|Xp4-gcaTios829kX(mSUJxGgs?B@?hi%ft` znxw{&%4fs2ve%o7nQgIjSAZ2UIxa}$#~5Yv5jt&ELMz-8YQD^p1+JPH{-yiTI_ly>e(tAMfScE zod$QHGrO`)_GYcJ7tz9JfrbB@R@t?vXqJv4_3q+ECzwMfaRoWJOXx%?)Vo=_i6)w8 hqKPJ&XyPM_{{arsH9+JQ!a)E4002ovPDHLkV1iP6{7V1; diff --git a/src/main/res/drawable-xhdpi/rd_btn_on.png b/src/main/res/drawable-xhdpi/rd_btn_on.png deleted file mode 100644 index c55b333f19ccbeba7dee60a733f9ef685e2ad645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3542 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 Q#sB~S07*qoM6N<$f-Nk{5dZ)H diff --git a/src/main/res/drawable-xxhdpi/ic_action_cancel_dark.png b/src/main/res/drawable-xxhdpi/ic_action_cancel_dark.png deleted file mode 100644 index a9bbcde5a0267fbd3c4c6509ac1c62acf46f150f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGok|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7;k#IIEGZ*dNXHt?qLHFSI_A;6@yoJy>&HeX8*_&=~AlY z`%pHfoh@Pshs;H>pYOJwV`TZC(D7dGud9|S&<QojJWq{W$G32b z+5V~1gJ(Xw^ejJ`(e%&xUmqVSJPiNw{_E=X^MpPv_%OM-#r}~0Ueza!552v22-k&k zw)=gRdH<(O`$GtK8R!4~v!1Zbc|A!_KQZ;k^r*>K?Gj2817|C@nmr5G57?Vqso%P4 zo96qq30ql}-e*n?kCATY?BH`Ktv3mA2oX5N&U~1)htK72frZO~6$vuuTo18);X9%D zr+{&9QxRvp(}8P^maY2A39BF6IW%49Lrz2A!_%AHd(*V&b)d^ZzkL#%zY!3T1~l9vDm!He@N#Jfu^j zcZ{=T|IvEE2|E;%<@c>-$vgG_=Q5kSK`&;A>NT$GJSg;Hj+UDB-^Sh9Nb<2H?#IoD$9}cKB rE>@6>R4b4>;QSjo7J%#o8+#@m23aH3DE>zRz930YS3j3^P6)+m;!+q1wt9EYavZLj!^G|<^{jq)3DmRV}^#_q<;`{6Vs0fL1bQrul z{VwtNdb3S;yIV||4vF6P-ErBTFS5Hqnx#ehd+bMleih9xg^^cx4M^F6F$YB5Y-|2qU^w=<^2Xc&eS$7ofe|zRiKj?~^r|+BjC|AMo8(dw#iWcZ(zw zpZI^jvhqg1`sB5tfv$RW@zdul{1L(_&GIJC^o(ua@81SjclBu|gm+ttq(xm1UGnIC zwqg4rpVwB)(_$u{y!l7;gSoq{0|OHSBS(XZ%=AxAU$l1T)n`ui=Kj57fqC%$lSbD( z6F8Vy6c`vA7+4sX1Q<9R7%(^uO($Qj<0zkgXvx8i93MLGE#Lere?CK-0#KVk1B1ub z9~(aSmvwA;=`=QH|_IpxAkkp)6EY5pqScQ@%ANdM)vNhWABQ%F<)pM^_2_bg*w z(W1v0b8_>Fv)lokxkfKGdED1^b(k%3Ovh<%m%sv{J6$XC_%h8lrXA%7;4Ga~alLBm zZbt_R&h||!Hg|2)2|N(L_Vt@XvE9N8gvz$AJ9|tzdaA*t_lny8cAwak8=CR({?{(a lpfl{ZELkB5s6pq4Py$222c{COsdvGt%G1@)Wt~$(699!TKx_a2 diff --git a/src/main/res/drawable-xxhdpi/ic_action_refresh.png b/src/main/res/drawable-xxhdpi/ic_action_refresh.png deleted file mode 100644 index 977984b74325b45b9139b710a822b5048adc6f41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3390 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 Bal-%r diff --git a/src/main/res/drawable-xxhdpi/ic_action_stats.png b/src/main/res/drawable-xxhdpi/ic_action_stats.png deleted file mode 100644 index 51634b7e449be79f251714580205b764bb3079e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 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 diff --git a/src/main/res/drawable-xxhdpi/ic_navigation_drawer.png b/src/main/res/drawable-xxhdpi/ic_navigation_drawer.png deleted file mode 100644 index 4c1220dc714d9f18267b1ab39ee0a2c0aaec15a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCCr=m0kc`H+*ADVBDDW_E>^t`? zkwb3jD&5qE-%Gisc^6r!IW#aZGX3LVV6f`lFT}*cA)vs(Ad&rNs(=DWMqh8m;R_On TBl|0WrZITB`njxgN@xNAUmzjV diff --git a/src/main/res/drawable-xxhdpi/ic_profile_w7.png b/src/main/res/drawable-xxhdpi/ic_profile_w7.png deleted file mode 100644 index bcad3ce76509e6f2ade2adba1d53fb4f52f982a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15661 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

M{pfa6vSCNx4zQ<~0>Mvh$6i2|PA+)w{d zhLN${UhBh~8d83yUMa>i`A~GMw7D&f>2SRJ$at=b_9YV*O${lMNy{IK?HMu?1+o*x z7c4ogY<1~G80qEn4!MH!m(-~lwdjKD9|lfmy1nq#3ht~{YWiaM&9M>w1Tqbvee(CU zIM-p_es3$}HsD{Tuf=qG5$!_?;E3}+odxQrug7%TkJh*GPygO!2PXMS;Lho5GTrv0 zePqeGpDqV0N4(;?UBImA>oVQ;p*^|r{_B<#Rp}O=b6p$A(Db#LZZFilgq2XPaW~z6 zU0gg~eD=Q|39OyIMAL23rZ{241D{@96`3wR{W>;0`03|?GpDc8bgOOxa7q+BF&74~ z?2PMJ`|x!vKI;>U6x;=B(e#CzZonErF5Ix<`u@r{VguaQK73sXYn#@uxc&%4K8DDi z!)-SE=^pl-h(>GtwzMPL*d10Gkx z=hi*)*~b^3^$9ktxPC8`=tZ`Lr~hlcjk*-L47fM|RRVuqBy0M9Ow9m_^4e3wz?}lO zi>H3S@v+Z_+3+Q2Ud#H2{$n3G^^0ip&iOdo9{5~^mAY0DtW_eK7L1&y;Fb9OsOfum zNZPZ&y`cUmmUl14$`F*_t$*Y{VhO#)r~Mln9{uc#2+IE2?W(KbmRqV`UV7TKX^=FK zMrZ;#2{;uvE$FG~`@LVS06YRb3anI$RU%|jDi4xh_vq)Urjc86)<3g;#TWj{QT-HZ zOHciHGf?VHzzpC>M2-X&M*7RuMNR-)fvqUE0?&h52Mh$F$8%|MF^o(nVr4fxx7piV&@kPa+g zGT?3{4!5`F5H13b1LT3c_*;Kj9>_$tC1P6IM*A?xuq|fj*;W7P?5|ay3hn;~^U&>6 TQz~vI00000NkvXXu0mjfy7{n^ diff --git a/src/main/res/drawable-xxhdpi/rd_btn_off.png b/src/main/res/drawable-xxhdpi/rd_btn_off.png deleted file mode 100644 index fd5ad6fcbbdcaaa2fb526a2c0da5def1f5859fcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2723 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 diff --git a/src/main/res/drawable-xxhdpi/rd_btn_on.png b/src/main/res/drawable-xxhdpi/rd_btn_on.png deleted file mode 100644 index 884dcbbe435c1cb06c5fb4aa66b56e8a02738ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4779 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

&$?=pgwQnyW+Q2N=+ z){WHacDYo8d&~`G2*a*v6PYPMJt@(yo7(I3vXoa>aT1G4WH@8R?^e>1xSlLzbXrxzNvx-;fO$rHUfGk$s_LY9GajPz6r(xshUR7!Dh7VC z#a|&Iy}LAXp*!KTL_v!YzLGTet+%v(xcW!sk`yIh%<-7?f+{>woDi`Yq4+M8H+aNy zYSm5DKbzZ?{&bLRd)TapD5@apMooO;1}|ys37f~x#ET$H&qS8MF+AKsT3t?TZ8$Vs zDJD2z9+&ss8@s47<9`7Twp8zP>@-iyytFpR{`}7LQW;iau~6Z!UMT9g`!?TsJ#!b` zM`B|2!e46#fLKU2>Nim_wbK9~Xqoz~RlOV$>mh)*;#XtVd_)j?&t;?#ltu`~{;>Xe z0kT1Rat)>IKkyFFa$X)Ced?<~^+{HBW!wXSgtH>_RAJOKV|~^lb2y)!>D3df-~jYh zZX0?HE+G$}uTHHw`%mUe%fns3+KF$T=S{rdHs+#Chy)3A0Lwt+zeW`=y(IbuO;Fdu zT75d*(TqH-UDv>Csxc54{LjnPeR@0JWPp0;v>lVRF? zR8O8kO#$`r4ecxyq&Fc9HzF8LIx1w(!j4&*rCT}maXu(Oum-o( zGw^;tYmn~_L4x6rhW;yJ2 zNUd~yKpIQ%J}!!aPwngZ@n67X{L4iDF1zN3$})Y8cUs%IC}%T$ypJlG5l??p6{CzA znHS=>T%N=)D>lg*Uth=zQPxSp1@W7P{!J-AlDef7Id_X4Ye^l=+GZE&5V(9Z*9Ef~ zND%W62&jxv?4FsM`+&j0$r+QOUaaWg;NZD2nDnD=*aK7PjDm5;@!J_g*;tFt?rp?1 zb<6t4xV>x%3gh()ei~i zVL2!S`A6KOVz3y76YV85;!tRvfa5lEuK&- zUEB&eV=7wlV{>?RC?Njz2cF&FVvqr0#w?ZcTgwm`UDN^nGv@5UFudv=Qf3463mAv^ zrT__1TmS2vG#;J;eIrDB*hz=NvZ(f9bdv#7yebX8Ot8f(`lib4#9G14{Eqs-!WhP) zu|b7Llc9tm_iIPdE2?zg znL((RlMqc=pZxBdBO9^jDIa3{IKygBqJ!>7vwY_jVc3}?arTc8EdcRxb~7KMo>}{j zGI}!z^ZM{);Vi@iZ)S{`T9;fAwEDm)5d|#6f8NO*WYZ7-NrpuiV^}8z;!Brp3=ag_H( zN%`dXT5?hO(9A6FhgKTGaL)=tVl~N>Cs~-XEaB|Vbxev0I+1<6KHY4D)V;*f87R)@ zNsh|D&=a{NY-7Tg~qlH8hB5_`bXh|`Tn-1Mv#DpMiw@E-ly!lclceg4?p8>+or$67SH!_b>|#U#+2jd<)X lgka)x)+m;!+q1wt9EYavZLj!^G|<^{jq)3DmRV}^#_q<;`{6Vs0fL1bQrul z{VwtNdb3S;yIV||4vF6P-ErBTFS5Hqnx#ehd+bMleih9xg^^cx4M^F6F$YB5Y-|2qU^w=<^2Xc&eS$7ofe|zRiKj?~^r|+BjC|AMo8(dw#iWcZ(zw zpZI^jvhqg1`sB5tfv$RW@zdul{1L(_&GIJC^o(ua@81SjclBu|gm+ttq(xm1UGnIC zwqg4rpVwB)(_$u{y!l7;gSoq{0|OHSBS(XZ%=AxAU$l1T)n`ui=Kj57fqC%$lSbD( z6F8Vy6c`vA7+4sX1Q<9R7%(^uO($Qj<0zkgXvx8i93MLGE#Lere?CK-0#KVk1B1ub z9~(aSmvwA;=`=QH|_IpxAkkp)6EY5pqScQ@%ANdM)vNhWABQ%F<)pM^_2_bg*w z(W1v0b8_>Fv)lokxkfKGdED1^b(k%3Ovh<%m%sv{J6$XC_%h8lrXA%7;4Ga~alLBm zZbt_R&h||!Hg|2)2|N(L_Vt@XvE9N8gvz$AJ9|tzdaA*t_lny8cAwak8=CR({?{(a lpfl{ZELkB5s6pq4Py$222c{COsdvGt%G1@)Wt~$(699!TKx_a2 diff --git a/src/main/res/drawable-xxxhdpi/ic_swipe_action.png b/src/main/res/drawable-xxxhdpi/ic_swipe_action.png deleted file mode 100644 index 127387da79c490dce7a8a33e291c4d2167b71634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5366 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 T14aHlG64t!GyNvr`^f(T{2|sr diff --git a/src/main/res/drawable/cased_logo_1.png b/src/main/res/drawable/cased_logo_1.png deleted file mode 100644 index 50bc7628bb60ff44b6ab21c7ec4d227acb8aba24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26778 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 diff --git a/src/main/res/drawable/hostage_logo_big.png b/src/main/res/drawable/hostage_logo_big.png deleted file mode 100644 index 8604c509d7dbc9eb24511e4dd53b958b38ccefda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1065798 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

YM}~Ew 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

- - diff --git a/src/main/res/values-de/arrays.xml b/src/main/res/values-de/arrays.xml index 31077dab..d3b124b6 100644 --- a/src/main/res/values-de/arrays.xml +++ b/src/main/res/values-de/arrays.xml @@ -6,11 +6,5 @@ JSON - - BSSID - Datum - Alle - - \ No newline at end of file diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 0800a053..35f8a47f 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -2,22 +2,12 @@ HosTaGe - Einstellungen - Über - AUS - AN Verbindungs Info - Status - Paranoid Mode - Verbindungs Info Nicht verbunden  Angriff  Angriffe -  Portscan -  Portscans Sicher Unsicher -  gelogged  aufgezeichnet 0 Angriffe aufgezeichnet @@ -32,31 +22,13 @@ SSID: BSSID: - Protokoll: - Zeitstempel: - Ort: Interne IP: Externe IP: - Remote IP: - Packet Typ: - Packet Inhalt: - Dienste - Aufgezeichnete Verbindungen: - Statistiken - Datenbank - Aktionen - Erster Angriff: - Letzter Angriff: - Clear Löschen Abbrechen Schließen Zeige Aufzeichnungen - Clear all data? - Choose Export Format - Delete data sets by: - Delete all data before: Durch die Filtereinstellung werden nur die gefilterten Angriffsdaten gelöscht.\n\nMöchten Sie fortfahren? Sollen sämtliche Angriffsdaten gelöscht werden?\n\nDurch die Filtereinstellungen können Sie auch gezielt Angriffsdaten gelöschen! @@ -82,21 +54,18 @@ Profile Über diese App Statistiken - Hilfe videos HosTaGe Anwenden Abbrechen dk.aau.netsec.hostage.preferences - 9fc4f490-659e-11e3-949a-0800200c9a66 Angriffe: Aktuelle Verbindung Überwache Dienste Gerät gerooted - Porthack installiert Ja Nein @@ -107,7 +76,6 @@ Gestern Entwicklerteam: - Core Entwicklung Erweiterte Einstellungen Ändere den Namen des Profils Ändere die Beschreibung des Profils @@ -115,8 +83,6 @@ Beschreibung Allgemein Wähle Icon - Profil lüschen - Willst du dieses Profil wirklich lüschen? Verwerfen Speichern Protokoll @@ -130,9 +96,6 @@ Gruppieren Filtern Zeit - Datum auswählen - Speichern - Abbrechen Protokolle Netzwerke Angriffe @@ -147,76 +110,28 @@ Angriffe pro BSSID Angriffe pro Zeit (24h) Angriffe pro Datum - Nutzung pro Protokoll Angriffe pro Protokoll Wähle Kriterium zum Vergleich Wähle Kriterium zum Vergleich - Wähle Kriterium zum Vergleich % von allen Alle - Verbindung verloren, Wifi Direct muss erneut aktiviert werden. - Could not connect to device. Retry. - - Synchronisierung abgeschlossen. - Synchronisierung konnte nicht abgeschlossen werden. Versuche es erneut. - - - Es konnte keine stabile Verbindung hergestellt werden. - Zeitüberschreitung - Versuche es erneut. - Ein unbekannter Fehler ist aufgetreten. Überprüfe die Appversion oder versuche es erneut. - Übertragungsfehler - Überprüfe die Appversion oder versuche es erneut. - - - Verbunden als Host. - Verbunden als Client. - - P2P Synchronisierung - Empfangen... - Verbinden... - Datenaustausch - - Bereit - Eingeladen - Verbunden - Fehlgeschlagen - Unerreichbar - Status ist unbekannt - - WiFi Direct ist nicht vorhanden, bitte aktiviere WiFi Direct. - Aktivieren - Abbrechen - - Eigene Geräte Informationen - Gerätename ändern - Gerätename - Gerätestatus - Das Gerät unterstützt kein Wifi Direct. - Vorhandene Geräte - Suche andere Geräte. - - EMPFANGEN + EMPFANGEN GESENDET von %s an %s\n%s um %s Uhr - d. MMMM, yyyy \'um\' HH:mm:ss \'Uhr\' - Kein Inhalt + Kein Inhalt REMOTE IP Unterhaltung - Dieses Profil immitiert Windows Vista - Dieses Profil immitiert Windows 7 + Dieses Profil immitiert Windows 7 Dieses Profil aktiviert Dienste die Typisch für Windows XP sind - Dieses Profil immitiert einen simplen Webserver, welcher nur den Port für das HTTP Protokoll überwacht - Dieses Profil immitiert einen Apache Webserver + Dieses Profil immitiert einen Apache Webserver Dieses Profil immitiert einen IIS Webserver - Dieses Profil immitiert einen simplen Webserver, welcher neben dem HTTP Protokoll auch das HTTPS Protokoll unterstützt - Dieses Profil aktiviert Unix-typische Dienste Dieses Profil immitiert ein Linux System mit entsprechenden Diensten Dieses Profil immitiert ein Linux System, bei welchem nur SSH aktiv ist Dieses Profil immitiert einen VOIP Server, welcher das SIP Protokoll überwacht In diesem Profil werden zufällige Protokolle aktiviert Dieses Profil aktiviert alle Protokolle - Swipe von der linken oder rechten Seite um alle Aktionen zu zeigen Überwache GHOST Aktiviere GHOST Überwachung Dieses Protokoll spiegelt eingehende Verbindungen @@ -226,59 +141,23 @@ Aktiviere die zu überwachenden Protokolle Bitte beachte, dass dieses Profil nicht bearbeitet werden kann. Wenn du Änderungen machst und speicherst, so wird ein neues Profil mit diesen Einstellungen erstellt. Wähle Exportformat - Synchronisiere Aufzeichungen - Über Bluetooth - Über NFC - Über Online Datenbank - WifiDirect Synchronization - Länderauswahl - Nur Angriffdaten von diesen Ländern herunterladen - Länder - Download server Sieht nicht sicher aus... Zzz... Sieht sicher aus! Wir werden angegriffen!!! - Hilfe! - Portbinder installieren - Iptables verfügbar Sie sind mit keinem Netzwerk verbunden. \n\nBitte verbinden sie sich zuerst mit einem Netzwerk, bevor sie HosTaGe starten. - Nein, danke. - Ihr Smartphone hat keine root Rechte. Um den vollen Funktionsumfang zu nutzen, benötigen sie root Rechte. - Website besuchen Sollte der maximalen Dauer eines Portscans in Sekunden entsprechen Wollen sie diesen Angriff wirklich löschen? Maximale Anzahl an Gleichzeitigen Verbindungen pro Protokol - Subnetzmaske - Portbinder deinstallieren - Portbinder

G~kzB{)!rENB(wd{jiMBJ=q^ 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�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 mJ=oO?(utY~PmoD5dKHjDmDyGwkEDRIUIP}@7O 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�lJfoD4UX(E!OnHot2PZ72T2UXaC)I88)*mfTAv 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 U>u@LKN4%&ok@x` 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 z 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%0A6LTn}&-oC#?Q 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 z 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%0D?xodk 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 diff --git a/src/main/res/drawable/ic_bro.png b/src/main/res/drawable/ic_bro.png deleted file mode 100644 index a3ac57546f3692c82b04e5f1f7720670ca2c47a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46415 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 - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/res/drawable/panel_right_border.xml b/src/main/res/drawable/panel_right_border.xml deleted file mode 100644 index ae562e99..00000000 --- a/src/main/res/drawable/panel_right_border.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/res/drawable/panel_white_bg.xml b/src/main/res/drawable/panel_white_bg.xml deleted file mode 100644 index 825e5130..00000000 --- a/src/main/res/drawable/panel_white_bg.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/res/drawable/tk_logo.png b/src/main/res/drawable/tk_logo.png deleted file mode 100644 index 828f2f86a235d0e192cd6d4a742899d78270ed4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11965 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 diff --git a/src/main/res/layout/activity_bluetooth.xml b/src/main/res/layout/activity_bluetooth.xml deleted file mode 100644 index 92cc2291..00000000 --- a/src/main/res/layout/activity_bluetooth.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/main/res/layout/activity_edit_profile.xml b/src/main/res/layout/activity_edit_profile.xml deleted file mode 100644 index 9795727a..00000000 --- a/src/main/res/layout/activity_edit_profile.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/res/layout/activity_nfc.xml b/src/main/res/layout/activity_nfc.xml deleted file mode 100644 index 8d74fde1..00000000 --- a/src/main/res/layout/activity_nfc.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/main/res/layout/activity_p2_psync.xml b/src/main/res/layout/activity_p2_psync.xml deleted file mode 100644 index 927649e7..00000000 --- a/src/main/res/layout/activity_p2_psync.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/res/layout/fragment_about.xml b/src/main/res/layout/fragment_about.xml index 60ef30e4..073b79da 100644 --- a/src/main/res/layout/fragment_about.xml +++ b/src/main/res/layout/fragment_about.xml @@ -8,7 +8,7 @@ @@ -60,8 +60,8 @@ android:layout_height="wrap_content" android:layout_weight="0.5" android:layout_alignTop="@+id/linearLayout" android:layout_alignParentLeft="true" - android:layout_alignParentStart="true" android:id="@+id/linearLayout2" - android:layout_marginLeft="10dp"> + android:layout_alignParentStart="true" + android:layout_marginLeft="10dp"> + android:layout_alignParentStart="true" + android:layout_marginLeft="10dp"> @@ -37,7 +37,7 @@ android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/bssid" - android:id="@+id/txtP2PSubheader" android:layout_column="0" + android:layout_column="0" android:layout_margin="4dp" android:textColor="?attr/colorOnBackground" android:textStyle="bold"/> @@ -57,7 +57,7 @@ android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@string/internal_ip" - android:id="@+id/textView3" android:layout_column="0" + android:layout_column="0" android:layout_margin="4dp" android:textColor="?attr/colorOnBackground" android:textStyle="bold"/> diff --git a/src/main/res/layout/fragment_profile_manager.xml b/src/main/res/layout/fragment_profile_manager.xml index cc2eb966..9c7aee29 100644 --- a/src/main/res/layout/fragment_profile_manager.xml +++ b/src/main/res/layout/fragment_profile_manager.xml @@ -1,7 +1,6 @@ diff --git a/src/main/res/layout/fragment_record_detail.xml b/src/main/res/layout/fragment_record_detail.xml index 728f56b8..64a88c80 100644 --- a/src/main/res/layout/fragment_record_detail.xml +++ b/src/main/res/layout/fragment_record_detail.xml @@ -5,13 +5,11 @@ android:layout_height="match_parent"> diff --git a/src/main/res/layout/list_view_bluetooth_devices.xml b/src/main/res/layout/list_view_bluetooth_devices.xml deleted file mode 100644 index 45b5942f..00000000 --- a/src/main/res/layout/list_view_bluetooth_devices.xml +++ /dev/null @@ -1,7 +0,0 @@ - \ No newline at end of file diff --git a/src/main/res/layout/preference_pcap_logging.xml b/src/main/res/layout/preference_pcap_logging.xml index b6a539d8..d77e53a4 100644 --- a/src/main/res/layout/preference_pcap_logging.xml +++ b/src/main/res/layout/preference_pcap_logging.xml @@ -52,7 +52,6 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/res/layout/row_devices.xml b/src/main/res/layout/row_devices.xml deleted file mode 100644 index 6bd71fb6..00000000 --- a/src/main/res/layout/row_devices.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/main/res/layout/simple_popup_table.xml b/src/main/res/layout/simple_popup_table.xml index c07d5bca..d523bb3b 100644 --- a/src/main/res/layout/simple_popup_table.xml +++ b/src/main/res/layout/simple_popup_table.xml @@ -26,7 +26,6 @@ android:background="@color/colorPrimary" /> diff --git a/src/main/res/menu/p2_psync.xml b/src/main/res/menu/p2_psync.xml deleted file mode 100644 index 85ec5a5d..00000000 --- a/src/main/res/menu/p2_psync.xml +++ /dev/null @@ -1,9 +0,0 @@ -

Um Protokolle mit Ports unter 1024 zu nutzen, benötigt ihr Smartphone root Rechte. Standartmäßig läuft HosTaGe nicht mit root Rechten. Deswegen wird ein kleines Programm mit dem Namen Portbinder benötigt. Dieses öffnet einen Socket und gibt diesen an die HosTaGe App weiter.

Eine alternative Möglichkeit ist, diese Ports umzuleiten auf höhere Ports. Unter Android ist dies möglich mit iptables. Wenn iptables auf ihrem Smartphone unterstützt werden, dann ist der Portbinder nicht nötig.

]]> - Dieser automaitsche Installer nimmt die Smartphone spezifische Binary und installiert diese auf dem Smartphone.\n\nDieser automatische Prozess verändert einige Verzeichnis Rechte. Sie handeln mit eigenem Risiko.\n\nBestätigen sie um die automatische Portbinder Installation zu starten? Fehler: Google Play Services sind nicht verfügbar. - Hilfe - Bitte befolgen sie die Anleitungen auf unserer Website um den \'Portbinder\' zu installieren.\n\nAlternativ können sie den automatischen Installer benutzen in dem sie auf den Knopf \'Hilfe!\' drücken. - Wie? Sie sind zurzeit nicht mit dem Internet verbunden.\n\nBitte stellen sie eine Verbindung her um die Threatmap zu benutzten. - Ihr Smartphone hat keinen \'Portbinder\' installiert. Aufgrund von Einschränkungen unter Android können sie nur Dienste mit Ports >1024 benutzten.\n\nUm die volle Funktionalität von HosTaGe nutzen zu können, müssen sie sicherstellen, dass ihr Smartphone gerootet ist und der \'Portbinder\' installiert ist. - Ihr Smartphone unterstützt zur Zeit nicht alle Funktionen von HosTaGe. Klicken sie auf \'Hilfe\' um mehr zu erfahren. - Bestätigen - Der Intervall in minuten in dem eine Synchronisierung mit TraCINg durchgeführt werden soll. - Synchronisierungsinterval Netzwerk ist infiziert! Netzwerk sieht sicher aus HosTaGe ist inaktiv Netzwerk wurde in der Vergangenheit angegriffen - - Sag uns deine Meinung - zu HosTaGe - - Mehrstufige Service Aktivieren Mehrstufige Angriff Detection Service - Videoanleitung Dienste - NFC ist nicht verfügbar - Android Beam Aktivieren - Halten Sie Telefone zusammen, um Daten zu senden oder empfangen. Versuchen Sie es später nochmals. Aktivieren Warnung diff --git a/src/main/res/values-de/strings_gui.xml b/src/main/res/values-de/strings_gui.xml index d07d7403..a6b3daec 100644 --- a/src/main/res/values-de/strings_gui.xml +++ b/src/main/res/values-de/strings_gui.xml @@ -1,7 +1,2 @@ - - Gerät auswählen - NFC - Bluetooth - Tracing - \ No newline at end of file + \ No newline at end of file diff --git a/src/main/res/values-de/strings_preferences.xml b/src/main/res/values-de/strings_preferences.xml index 4d8a7c42..ffc7fc42 100644 --- a/src/main/res/values-de/strings_preferences.xml +++ b/src/main/res/values-de/strings_preferences.xml @@ -1,30 +1,15 @@ - Einstellungen - Exportiere auf externen Speicher Tonauswahl - VIBRATION Wähle einen Benachrichtigunston - Externes Sichern - Externes Sichern - Exportiere Log File auf SD-Karte - Anderer Ort Benachrichtigung Vibration Aktiviere Vibration Upload von Aufzeichnungen - Server-Adresse Verbindungs Einstellungen Max Verbindungen - 5 Socket Timeout Socket timeout in Sekunden - 30 - Stream sleep time - Zeit in ms für stream sleep time - 500 - Autosynchronisation - Autosynchronisation von Logdaten aktivieren \ No newline at end of file diff --git a/src/main/res/values-night/colors.xml b/src/main/res/values-night/colors.xml index a3102e90..ba3c05cb 100644 --- a/src/main/res/values-night/colors.xml +++ b/src/main/res/values-night/colors.xml @@ -23,7 +23,6 @@ #808080 - #FFC0C0C0 #FF808080 #FFF44444 #ff669900 diff --git a/src/main/res/values-sw720dp-land/dimens.xml b/src/main/res/values-sw720dp-land/dimens.xml index 61e3fa8f..ee04b4b8 100644 --- a/src/main/res/values-sw720dp-land/dimens.xml +++ b/src/main/res/values-sw720dp-land/dimens.xml @@ -4,6 +4,5 @@ Customize dimensions originally defined in res/values/dimens.xml (such as screen margins) for sw720dp devices (e.g. 10" tablets) in landscape here. --> - 128dp diff --git a/src/main/res/values-w820dp/dimens.xml b/src/main/res/values-w820dp/dimens.xml index 63fc8164..90bf0011 100644 --- a/src/main/res/values-w820dp/dimens.xml +++ b/src/main/res/values-w820dp/dimens.xml @@ -2,5 +2,4 @@ - 64dp diff --git a/src/main/res/values/api_keys.xml b/src/main/res/values/api_keys.xml index d5f498a3..a6b3daec 100644 --- a/src/main/res/values/api_keys.xml +++ b/src/main/res/values/api_keys.xml @@ -1,6 +1,2 @@ - - AIzaSyDs3xp1-2KQojns5h7mWHHdQxAL-5AZ-q4 - AIzaSyDs3xp1-2KQojns5h7mWHHdQxAL-5AZ-q4 - 111c226204f5de7228563bbca91c5860e4965fbe936307dffa8f2f2d575ff292 - \ No newline at end of file + \ No newline at end of file diff --git a/src/main/res/values/arrays.xml b/src/main/res/values/arrays.xml index 1033b19c..019c2b79 100644 --- a/src/main/res/values/arrays.xml +++ b/src/main/res/values/arrays.xml @@ -5,13 +5,5 @@ Plaintext JSON - - - BSSID - Date - All - - - \ No newline at end of file diff --git a/src/main/res/values/broadcast.xml b/src/main/res/values/broadcast.xml index 1d1d302d..26e93fa2 100644 --- a/src/main/res/values/broadcast.xml +++ b/src/main/res/values/broadcast.xml @@ -5,7 +5,6 @@ dk.aau.netsec.hostage.BROADCAST dk.aau.netsec.hostage.BROADCAST.CONNECTIVITY_CHANGE dk.aau.netsec.hostage.BROADCAST.STARTED - dk.aau.netsec.hostage.BROADCAST.STOPPED - + \ No newline at end of file diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index 3f31a0e2..6382f6ee 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -23,7 +23,6 @@ #808080 - #FFC0C0C0 #FF808080 #FFF44444 #ff669900 diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml index 55c1e590..0e9ce62a 100644 --- a/src/main/res/values/dimens.xml +++ b/src/main/res/values/dimens.xml @@ -1,7 +1,5 @@ - 16dp - 16dp diff --git a/src/main/res/values/hpfeeds.xml b/src/main/res/values/hpfeeds.xml index 534d825b..465a6154 100644 --- a/src/main/res/values/hpfeeds.xml +++ b/src/main/res/values/hpfeeds.xml @@ -1,24 +1,5 @@ - 192.168.1.3 - 20000 - testing - secretkey - chan2 - enabled - HpFeeds Broker Settings Enable records uploading in HpFeeds - HpFeeds Broker Settings - Upload Settings - HpFeeds Broker Host - HpFeeds Broker Port - HpFeeds Broker ident - HpFeeds Broker secret - HpFeeds Broker secret - The host where the hpfeeds broker listens to - The port where the hpfeeds broker listens to - The identification name of the user - The secret key or password of the user - The channel or channels where the records are published (e.g.: chan1,chan2) \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index fed938ea..00547dcb 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -2,20 +2,12 @@ HosTaGe - Settings - About - OFF - ON - Connection Info - Status - Paranoid Mode - Connection info + Connection Info Not connected  attack  attacks Secure Insecure -  logged  recorded 0 attacks recorded @@ -24,24 +16,11 @@ You are not connected to any network. \n\nPlease connect to one, before trying to activate HosTaGe. Currently you are not connected to the Internet.\n\nPlease establish a connection to use the Threatmap. The current active profile does not seem to monitor any services.\n\nPlease activate some services to monitor in the profile. - Your device does not have \'Portbinder\' installed. Due to the limitations of Android OS, you could only use services that are utilizing ports > 1024.\n\nTo enable full functionality of HosTaGe, please make sure your device is rooted and \'Portbinder\' is installed. - Your device cannot use the full feature of HosTaGe yet. Click \'Help\' to find out how to enable this. - No, Thanks - Your device does not have root access. To unlock full functionality of HosTaGe, a rooted device is required. - Help HEX TEXT - Confirm - OK - How? - Portbinder - Video Tutorial - Visit Website - Please follow the instructions in our website to install \'Portbinder\'.\n\nAlternatively, you can use the automated installer by pressing the \'Just Help Me!\' button. - This automated installer fetches the appropriate Portbinder binary and installs in a hostage.location within the device.\n\nThis automated process will CHANGE some folder permissions to work. Proceed on your own risk.\n\nConfirm to proceed with automated installation of Portbinder? - Just Help Me! + OK - Zzz… + Zzz… Looks safe! This doesn\'t look safe… Under attack!!! @@ -57,38 +36,15 @@ SSID: BSSID: - Protocol: - Timestamp: - Location: Internal IP: - Subnet Mask: External IP: - Remote IP: - Packet type: - Packet content: - Services - Recorded connections: - Statistics - Database - Actions - First Attack: - Last Attack: - Clear - Delete + Delete Cancel Close Show records - Clear all data? - Choose Export Format Could not acquire root access.\nYour device must be rooted to use default prots. Binaries are not installed, some error occurred! Check if you gave root permissions on the app - Applying iptables rules - Iptables binary files installed! - Iptables binary files already installed! - READ/WRITE permission to storage denied. Please grant access for copying Iptables binaries. - Delete data sets by: - Delete all data before: Delete the filtered attack data? Delete all attack data?\n\nYou can delete specific attack data by filtering! @@ -115,12 +71,10 @@ Profiles About Statistics - Help videos Apply Cancel dk.aau.netsec.hostage.preferences - 9fc4f490-659e-11e3-949a-0800200c9a66 recorded attacks: port: @@ -128,11 +82,6 @@ Monitor services Device rooted - Portbinder installed - Iptables available - Install Portbinder - Uninstall Portbinder - Portbinder

To use protocols with ports below 1024 your device requires root privileges. HosTaGe does not run with root privileges by default. That is why a small program called Portbinder is needed that opens a socket and passes it to the main HosTaGe App.

Another technique is to redirect those ports to higher port numbers. This is achieved using Android\'s iptables. If iptables is available on your device the Portbinder is not required.

]]>
Yes No @@ -143,24 +92,18 @@ Yesterday HosTaGe - Tell us what do you think about HosTaGe hostage@es.aau.dk Current Funding: - Core developed by Advanced Settings Notifications & Sound - Media & Storage - Storage Location Change the name of this profile Change the description of this profile here Choose an icon for this profile General Description Select Icon - Delete profile Discard Save - Do you really want to delete this profile? Protocol Date ESSID @@ -173,9 +116,6 @@ Group by Filter by Time - Set Date - Set - Cancel Protocols Networks Attacks @@ -190,76 +130,28 @@ Attacks per BSSID Attacks over time (24h) Attacks over date - Uses per protocol Attacks per protocol Select attack data to compare Select network data to compare - Select protocol data to compare % of all - https://github.com/aau-network-security/HosTaGe All Privacy Policy - Connection lost permanently, please enable wifi direct. - Could not connect to device. Retry. Privacy Policy - HosTaGe - Synchronization complete. - Could not synchronize devices. Retry - - Could not create a stable connection. - The connection took too long, please try again. - A unknown error did happen.\nPlease check your app versions or try again. - Illegal data transmitted.\nPlease check your app version. - - - Acting as Host. - Acting as Client. - - WifiDirect Synchronization - Loading… - Connecting… - Synchronize - - - - Available - Invited - Connected - Failed - Unavailable - Unknown - - WiFi Direct down, please enable WiFi Direct - Enable WiFi Direct - Cancel - - Own Device Information - Change your device name - Device Name - Device Status - Your device does not support Wifi Direct. - Available Devices - Scanning for other devices. - - RECEIVED + RECEIVED SENT from %s to %s\n%s at %s - MMMM d, yyyy \'at\' H:m:s a - No content + No content REMOTE IP Conversation Do you really want to delete this record? - This profile will imitate a Windows Vista machine - This profile will imitate a Windows 7 machine + This profile will imitate a Windows 7 machine This profile will activate Windows XP typical services - This profile will imitate a simple webserver, which only supports the HTTP protocol - This profile will imitate an apache web server + This profile will imitate an apache web server This profile will imitate an IIS web server - This profile will imitate a simple webserver, which supports both the HTTP and HTTPS protocol - This profile monitors unix typical services This profile will imitate a linux machine by monitoring linux typical services This profile will imitate a linux machine which has only SSH activated This profile imitates a VOIP Server by monitoring the SIP service @@ -268,7 +160,6 @@ This profile simulates the PLC infrastructure of a Water Distribution and Treatment Plant This profile simulates a MODBUS Master system that controls PLCs in a ICS SCADA environment This profile monitors all available services - Swipe from the left or right on an item to expose all available actions for an item Monitor GHOST Activate GHOST monitoring This protocol mirrors an incoming connection back to the attacker on the same port, that it is running on @@ -278,45 +169,18 @@ Activate the protocols that should be monitored by HosTaGe Please note, that this profile can\'t be edited. If you make any changes to this profile, a new profile will be created. Choose export format - Synchronize records - Bro Signature - This generates a Bro signature policy for this attack - Generate - Via Bluetooth - Via NFC - Via Online Database - WifiDirect Synchronization - Country selection - Only download attack data of these countries - Countries - Download server - Pcap Capturing Error: Google Play Services are unavailable. - The interval in minutes synchronization with TraCINg should be performed - Synchronization interval Services Enable Multistage Attack Detection Service Multistage Service Iptables rules are not supported for your device! - NFC is not available on this device - Enable Android Beam before synchronizing. - Hold phones together to send or receive data. Could not activate. Please try again later. Services are not ready yet, please try in a few seconds. Press the back button again to close HosTaGe Hello blank fragment - 5 - Stream sleep time - 500 - Time in ms for stream sleeptime - 30 -  Portscan -  Portscans - Export as Bro Signature Export to storage - Synchronize New profile Enable Warning diff --git a/src/main/res/values/strings_gui.xml b/src/main/res/values/strings_gui.xml index 1d266651..a6b3daec 100644 --- a/src/main/res/values/strings_gui.xml +++ b/src/main/res/values/strings_gui.xml @@ -1,7 +1,2 @@ - - Choose Device - NFC - Bluetooth - Tracing - \ No newline at end of file + \ No newline at end of file diff --git a/src/main/res/values/strings_preferences.xml b/src/main/res/values/strings_preferences.xml index b32b4715..32c2f8ff 100644 --- a/src/main/res/values/strings_preferences.xml +++ b/src/main/res/values/strings_preferences.xml @@ -1,20 +1,12 @@ - Settings - Export to external hostage.location Set Sound - VIBRATION Select Notification Sound - External Storage - External Storage - Export Log File to SD-Card - External Location Notification Vibration Enable Vibration HpFeeds - Server Address Connection Settings Max Connections 5 @@ -25,8 +17,6 @@ Portscan Timeout Should match the maximum duration of a portscan in seconds 60 - Auto Synchronization - Enable auto synchronization of log data diff --git a/src/main/res/values/strings_privacy.xml b/src/main/res/values/strings_privacy.xml index 7f2be279..a6b3daec 100644 --- a/src/main/res/values/strings_privacy.xml +++ b/src/main/res/values/strings_privacy.xml @@ -1,7 +1,2 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/src/main/res/values/version.xml b/src/main/res/values/version.xml index 3258952d..a6b3daec 100644 --- a/src/main/res/values/version.xml +++ b/src/main/res/values/version.xml @@ -1,4 +1,2 @@ - - 4452000 - \ No newline at end of file + \ No newline at end of file diff --git a/src/main/res/xml/authenticator.xml b/src/main/res/xml/authenticator.xml deleted file mode 100644 index 757dd8c7..00000000 --- a/src/main/res/xml/authenticator.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - diff --git a/src/main/res/xml/jlan_config.xml b/src/main/res/xml/jlan_config.xml deleted file mode 100644 index ca268563..00000000 --- a/src/main/res/xml/jlan_config.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - 255.255.255.255 - LanMan,NT - Alfresco JLAN Server - - - - 28275 - - - - SHARE - - - - - - - - org.alfresco.jlan.debug.ConsoleDebug - - - - - - - - org.alfresco.jlan.smb.server.disk.JavaFileDiskDriver - /Bla - - - - - - cryptix.jce.provider.CryptixCrypto - - org.alfresco.jlan.server.auth.LocalAuthenticator - USER - - - - - jlan - System administrator - - - - normal - - - - diff --git a/src/main/res/xml/syncadapter.xml b/src/main/res/xml/syncadapter.xml deleted file mode 100644 index 1803b7f6..00000000 --- a/src/main/res/xml/syncadapter.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - From e126085063a7d6b4aebb9e18bbda43bfb83c0967 Mon Sep 17 00:00:00 2001 From: zafodB Date: Wed, 18 Aug 2021 11:35:57 +0200 Subject: [PATCH 02/26] fix a bunch of typos in code and comments --- .../hostage/logging/PcapLoggingManager.java | 30 ++----------------- .../persistence/DAO/AttackRecordDAO.java | 2 +- .../persistence/DAO/NetworkRecordDAO.java | 4 +-- .../hostage/persistence/ProfileManager.java | 8 ++--- .../dk/aau/netsec/hostage/protocol/GHOST.java | 4 +-- .../dk/aau/netsec/hostage/protocol/HTTP.java | 2 +- .../aau/netsec/hostage/protocol/MODBUS.java | 2 +- .../dk/aau/netsec/hostage/protocol/SMB.java | 2 +- .../protocol/utils/cifs/FileInject.java | 2 +- .../protocol/utils/cifs/smbutils/NMB.java | 30 +++++++++---------- .../utils/cifs/smbutils/SMBPacket.java | 4 +-- .../protocol/utils/snmpUtils/MOCreator.java | 2 +- .../hostage/services/PcapLoggingService.java | 6 ++-- .../system/iptablesUtils/RootCommand.java | 10 +++---- .../iptablesUtils/RootShellService.java | 12 ++++---- .../iptablesUtils/RootShellService2.java | 12 ++++---- .../hostage/ui/activity/MainActivity.java | 6 ++-- .../hostage/ui/adapter/DrawerListAdapter.java | 2 +- .../ui/adapter/ProfileRecyclerAdapter.java | 2 +- .../ui/adapter/ServicesListAdapter.java | 2 +- .../ui/adapter/StatisticListAdapter.java | 4 +-- .../hostage/ui/dialog/ChecklistDialog.java | 2 +- .../ui/dialog/DateTimePickerDialog.java | 2 +- .../fragment/PreferenceHostageFragment.java | 2 +- .../ui/fragment/RecordDetailFragment.java | 4 +-- .../ui/fragment/RecordOverviewFragment.java | 12 ++++---- .../hostage/ui/fragment/SettingsFragment.java | 4 +-- .../ui/fragment/StatisticsFragment.java | 16 +++++----- .../ui/fragment/UpNavigatibleFragment.java | 10 +++---- .../hostage/ui/popup/AbstractPopup.java | 2 +- .../hostage/ui/popup/SplitPopupItem.java | 8 ++--- .../netsec/hostage/ui/task/LoaderTask.java | 4 +-- src/main/res/layout/simple_popup_item.xml | 2 +- src/main/res/layout/split_popup_item.xml | 2 +- 34 files changed, 97 insertions(+), 121 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/logging/PcapLoggingManager.java b/src/main/java/dk/aau/netsec/hostage/logging/PcapLoggingManager.java index 6c5f6288..3c96d70a 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/PcapLoggingManager.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/PcapLoggingManager.java @@ -48,7 +48,7 @@ public class PcapLoggingManager { * Private mandatory constructor. *

* getPcapLoggingManagerInstance should be used to obtain an instance of logging manager, to - * ensure there is only a sinle instance active at any given time. + * ensure there is only a single instance active at any given time. * * @param context */ @@ -120,7 +120,7 @@ private void stopPcapLogging() { * PCAP logs will be written to. * * @param fragment fragment to launch the picker from and return back to - * @param enableAfterwards Speficies whether the PCAP logging should be enabled after the user + * @param enableAfterwards Specifies whether the PCAP logging should be enabled after the user * has selected the output folder. */ private void launchFolderPicker(SettingsFragment fragment, boolean enableAfterwards) { @@ -225,7 +225,7 @@ private void retrieveLogRotationPeriod() { * Activate PCAP logging. If output location is null or is not writable, prompt the user to * select an output location first. * - * @param fragment Settings fragment instance where the user triggerred the action. + * @param fragment Settings fragment instance where the user triggered the action. */ public void enablePcapLogging(SettingsFragment fragment) { if (mOutputLocation == null || !pcapLocationWritable(mOutputLocation)) { @@ -339,28 +339,4 @@ public int getLogRotationPeriod() { return mLogRotationPeriod; } - -// // ONLY FOR TESTING! (delete for release) -// public void writeTestFile(Uri locationUri) { -// -// DocumentFile dirFile = DocumentFile.fromTreeUri(context, locationUri); -// -// DocumentFile file = dirFile.createFile("text/plain", "filipsFile"); -// Uri uri = file.getUri(); -// -// -// try { -// ParcelFileDescriptor pfd = context.getContentResolver(). -// openFileDescriptor(uri, "w"); -// FileOutputStream fileOutputStream = -// new FileOutputStream(pfd.getFileDescriptor()); -// fileOutputStream.write(("Overwritten at " + System.currentTimeMillis() + -// "\n").getBytes()); -// fileOutputStream.close(); -// pfd.close(); -// -// } catch (IOException fnfe) { -// fnfe.printStackTrace(); -// } -// } } diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java index 196d87eb..4cfee4a4 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java @@ -186,7 +186,7 @@ public synchronized int getAttackPerProtocolCount(String protocol, long attack_i } /** - * Determines the number of recorded attacks for a specific protocol and accesss point since the given attack_id. + * Determines the number of recorded attacks for a specific protocol and access point since the given attack_id. * * @param protocol The String representation of the * {@link Protocol diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java index c7d8f73f..b1473536 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java @@ -341,10 +341,10 @@ public synchronized ArrayList getUniqueBSSIDRecordsForProtocol(String pr } /** - * Returns PlotComparisionItems for attacks per bssid. + * Returns PlotComparisonItems for attacks per bssid. * @param filter (LogFilter) filter object * - * @return ArrayList + * @return ArrayList */ public synchronized ArrayList attacksPerBSSID(LogFilter filter) { AttackRecordDAO attackRecordDAO = new AttackRecordDAO(this.daoSession); diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java b/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java index 5754bab7..5fa4fdaa 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java @@ -144,7 +144,7 @@ public String readAll(final InputStream is) { */ public void loadData() { try { - if (loadDefaulData()) + if (loadDefaultData()) return; String UTF8 = "utf8"; int BUFFER_SIZE = 8192; @@ -173,7 +173,7 @@ public void loadData() { } } - private boolean loadDefaulData() { + private boolean loadDefaultData() { boolean profileExist = new File(PERSIST_FILENAME).exists(); if (!profileExist) { fillDefaultData(); @@ -351,7 +351,7 @@ public void addProfile(Profile profile) { * Adds a given profile to the profile manager. * * @param profile the profile to add - * @param persist true, if the profile should also be persisted immediatly, + * @param persist true, if the profile should also be persisted immediately, * false, if the profile should just be added internally without being persisted * (Note: you can still call persistData later to persist all the profiles) */ @@ -373,7 +373,7 @@ public void addProfile(Profile profile, boolean persist) { } /** - * Deletes a given profile. These changes will be persisted immediatly. + * Deletes a given profile. These changes will be persisted immediately. * * @param profile the profile to delete */ diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java b/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java index 304ed60e..16afc33d 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java @@ -14,8 +14,8 @@ /** * Ghost Protocol. This protocol mirrors an incoming connection back to the * attacker on the same port, that it is running on. It will send all incoming - * requests back to the attacker on the mirrored connection and will relpy with - * the responses it get's from this mirrored connection. + * requests back to the attacker on the mirrored connection and will reply with + * the responses it gets from this mirrored connection. * * @author Wulf Pfeiffer */ diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java b/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java index 60035068..e94d48ca 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java @@ -310,7 +310,7 @@ private Packet buildPacket(String code, String type) { } /** - * Task for accuiring a qotd from one of four possible servers. + * Task for acquiring a qotd from one of four possible servers. * * @author Wulf Pfeiffer */ diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java b/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java index f9175619..e4b0fd4d 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java @@ -10,7 +10,7 @@ /** * Created by Shreyas Srinivasa on 25.05.15. * - * Modbus serial communications protocol on industraial PLCs + * Modbus serial communications protocol on industrial PLCs */ public class MODBUS implements Protocol { private int port = 502; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/SMB.java b/src/main/java/dk/aau/netsec/hostage/protocol/SMB.java index 32997e1e..a4530190 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/SMB.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/SMB.java @@ -63,7 +63,7 @@ public Listener getListener() { public void initialize(Listener mListener) { this.mListener = mListener; FileInject fileInject = new FileInject(); - fileInject.startListner(mListener); + fileInject.startListener(mListener); Hostage service = mListener.getService(); pref = PreferenceManager.getDefaultSharedPreferences(service); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/FileInject.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/FileInject.java index 3010d033..016ea861 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/FileInject.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/FileInject.java @@ -48,7 +48,7 @@ public Listener getListener() { return fListener; } - public void startListner(Listener fListener) { + public void startListener(Listener fListener) { this.fListener = fListener; Hostage service = fListener.getService(); fpref = PreferenceManager.getDefaultSharedPreferences(service); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java index b42c9837..3848b15c 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java @@ -14,7 +14,7 @@ /** * NetBIOS. - * Used to registrate computers and workgroups in a windows network. + * Used to register computers and workgroups in a windows network. * @author Wulf Pfeiffer */ public class NMB extends Thread { @@ -100,15 +100,15 @@ private void sendPacket(NBDS nbds) { /** * Sends the required packets for user and workgroup registration. */ - private void registrate() { - registrateUser(); - registrateGroup(); + private void register() { + registerUser(); + registerGroup(); } /** * Sends the required packets for user registration. */ - private void registrateUser() { + private void registerUser() { nbns.setType(NBNSType.REGISTRATION_UNIQUE); nbns.setService(NBNSService.SERVER); nbns.setName(username); @@ -124,7 +124,7 @@ private void registrateUser() { /** * Sends the required packets for workgroup registration. */ - private void registrateGroup() { + private void registerGroup() { nbns.setName(workgroup); nbns.setType(NBNSType.REGISTRATION_GROUP); sendPacket(nbns); @@ -154,7 +154,7 @@ private void registrateMsBrowse() { /** * Sends the required packets for local master registration. */ - private void registrateLocalMaster() { + private void registerLocalMaster() { nbns.setName(workgroup); nbns.setType(NBNSType.REGISTRATION_UNIQUE); nbns.setService(NBNSService.LOCAL_MASTER_BROWSER); @@ -237,19 +237,19 @@ public void run() { e.printStackTrace(); } - registrate(); + register(); announceHost(); queryName(); checkForAnswers(); if (isMaster) { - registrate(); + register(); queryName(); - registrate(); + register(); queryName(); - registrate(); + register(); queryName(); browserElection(); @@ -262,10 +262,10 @@ public void run() { registrateMsBrowse(); registrateMsBrowse(); - registrateLocalMaster(); - registrateLocalMaster(); - registrateLocalMaster(); - registrateLocalMaster(); + registerLocalMaster(); + registerLocalMaster(); + registerLocalMaster(); + registerLocalMaster(); requestAnnouncement(); localMasterAnnouncementAll(); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java index cf65db06..591cb861 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java @@ -339,9 +339,9 @@ private byte[] getSetupAuth() { } /** - * Builds the session setup challange packet + * Builds the session setup challenge packet * - * @return session setup challange packet + * @return session setup challenge packet */ private byte[] getSetupChal() { byte[] wordCount = { 0x04 }; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOCreator.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOCreator.java index 5a75f255..f83c5f44 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOCreator.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOCreator.java @@ -20,7 +20,7 @@ private static Variable getVariable(Object value){ if(value instanceof String) { return new OctetString((String) value); } - throw new IllegalArgumentException("Ummanaged Type:"+value.getClass()); + throw new IllegalArgumentException("Unmanaged Type:"+value.getClass()); } } diff --git a/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java b/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java index 2bfa67d1..f968c3e3 100644 --- a/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java +++ b/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java @@ -44,8 +44,8 @@ * PCAP mode saves the output as .cap files, which can be opened by Wireshark or the like. * When operating in this mode, tcpdump outputs the logs periodically into an app-private files * folder. Another thread then copies these files into the user-specified folder. This setup is - * necessary, since tcpdump cannot reliably write files direcly to the user-specified folder on - * all API verions (due to restrictions in app's access to user files on API >= 28). + * necessary, since tcpdump cannot reliably write files directly to the user-specified folder on + * all API versions (due to restrictions in app's access to user files on API >= 28). * * @author Filip Adamik * Created on 10-08-2021 @@ -239,7 +239,7 @@ private void copyFilesToUserStorage(boolean copyLastFile) { * * @param fileName Filename of the newly created file. * @return Writeable FileOutputStream - * @throws FileNotFoundException This exception should never be thown. + * @throws FileNotFoundException This exception should never be thrown. */ private FileOutputStream openFileForWriting(String fileName) throws FileNotFoundException { DocumentFile dirFile = DocumentFile.fromTreeUri(context, outputFolder); diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java index 323bda4b..4bb0a4b6 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java @@ -29,7 +29,7 @@ public class RootCommand implements Cloneable, Serializable { public int hash = -1; public boolean isv6 = false; - private List commmands; + private List commands; public RootCommand setHash(int hash) { this.hash = hash; @@ -56,12 +56,12 @@ public RootCommand clone() { return rootCommand; } - public List getCommmands() { - return commmands; + public List getCommands() { + return commands; } - public void setCommmands(List commmands) { - this.commmands = commmands; + public void setCommands(List commands) { + this.commands = commands; } /** diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java index 16e96517..f7915243 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java @@ -74,7 +74,7 @@ public RootShellService clone() { private static void complete(final RootCommand state, int exitCode) { if (enableProfiling) { - Log.d(TAG, "RootShell: " + state.getCommmands().size() + " commands completed in " + + Log.d(TAG, "RootShell: " + state.getCommands().size() + " commands completed in " + (new Date().getTime() - state.startTime.getTime()) + " ms"); } state.exitCode = exitCode; @@ -126,8 +126,8 @@ private static void runNextSubmission() { } private static void processCommands(final RootCommand state) { - if (state.commandIndex < state.getCommmands().size() && state.getCommmands().get(state.commandIndex) != null) { - String command = state.getCommmands().get(state.commandIndex); + if (state.commandIndex < state.getCommands().size() && state.getCommands().get(state.commandIndex) != null) { + String command = state.getCommands().get(state.commandIndex); //not to send conflicting status if (!state.isv6) { sendUpdate(state); @@ -168,7 +168,7 @@ private static void processCommands(final RootCommand state) { state.retryCount = 0; boolean errorExit = exitCode != 0 && !state.ignoreExitCode; - if (state.commandIndex >= state.getCommmands().size() || errorExit) { + if (state.commandIndex >= state.getCommands().size() || errorExit) { complete(state, exitCode); if (exitCode < 0) { rootState = ShellState.FAIL; @@ -198,7 +198,7 @@ private static void sendUpdate(final RootCommand state2) { new Thread(() -> { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("UPDATEUI4"); - broadcastIntent.putExtra("SIZE", state2.getCommmands().size()); + broadcastIntent.putExtra("SIZE", state2.getCommands().size()); broadcastIntent.putExtra("INDEX", state2.commandIndex); LocalBroadcastManager.getInstance(mContext).sendBroadcast(broadcastIntent); }).start(); @@ -267,7 +267,7 @@ private void reOpenShell(Context context) { public void runScriptAsRoot(Context ctx, List cmds, RootCommand state) { Log.i(TAG, "Received cmds: #" + cmds.size()); - state.setCommmands(cmds); + state.setCommands(cmds); state.commandIndex = 0; state.retryCount = 0; if (mContext == null) { diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java index f3156513..3bc0c378 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java @@ -62,7 +62,7 @@ public class RootShellService2 extends Service { private static void complete(final RootCommand state, int exitCode) { if (enableProfiling) { - Log.d(TAG, "RootShell: " + state.getCommmands().size() + " commands completed in " + + Log.d(TAG, "RootShell: " + state.getCommands().size() + " commands completed in " + (new Date().getTime() - state.startTime.getTime()) + " ms"); } state.exitCode = exitCode; @@ -111,8 +111,8 @@ private static void runNextSubmission() { } private static void processCommands(final RootCommand state) { - if (state.commandIndex < state.getCommmands().size() && state.getCommmands().get(state.commandIndex) != null) { - String command = state.getCommmands().get(state.commandIndex); + if (state.commandIndex < state.getCommands().size() && state.getCommands().get(state.commandIndex) != null) { + String command = state.getCommands().get(state.commandIndex); //not to send conflicting status sendUpdate(state); @@ -152,7 +152,7 @@ private static void processCommands(final RootCommand state) { state.retryCount = 0; boolean errorExit = exitCode != 0 && !state.ignoreExitCode; - if (state.commandIndex >= state.getCommmands().size() || errorExit) { + if (state.commandIndex >= state.getCommands().size() || errorExit) { complete(state, exitCode); if (exitCode < 0) { rootState = ShellState.FAIL; @@ -182,7 +182,7 @@ private static void sendUpdate(final RootCommand state2) { new Thread(() -> { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("UPDATEUI6"); - broadcastIntent.putExtra("SIZE", state2.getCommmands().size()); + broadcastIntent.putExtra("SIZE", state2.getCommands().size()); broadcastIntent.putExtra("INDEX", state2.commandIndex); LocalBroadcastManager.getInstance(mContext).sendBroadcast(broadcastIntent); }).start(); @@ -244,7 +244,7 @@ private void reOpenShell(Context context) { public void runScriptAsRoot(Context ctx, List cmds, RootCommand state) { Log.i(TAG, "Received cmds: #" + cmds.size()); - state.setCommmands(cmds); + state.setCommands(cmds); state.commandIndex = 0; state.retryCount = 0; if (mContext == null) { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java index 7ac0fa96..e52a9a26 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java @@ -539,7 +539,7 @@ public void navigateBack() { this.mDisplayedFragment = getSupportFragmentManager().findFragmentById(R.id.content_frame); configureFragment(); - if (!(this.mDisplayedFragment instanceof UpNavigatibleFragment) || !((UpNavigatibleFragment) this.mDisplayedFragment).isUpNavigatible()) { + if (!(this.mDisplayedFragment instanceof UpNavigatibleFragment) || !((UpNavigatibleFragment) this.mDisplayedFragment).isUpNavigable()) { mDrawerToggle.setDrawerIndicatorEnabled(true); } else { mDrawerToggle.setDrawerIndicatorEnabled(false); @@ -635,7 +635,7 @@ public void injectFragment(Fragment fragment) { if (upFrag.getUpFragment() == null) { upFrag.setUpFragment(this.mDisplayedFragment.getClass()); } - if (upFrag.isUpNavigatible()) { + if (upFrag.isUpNavigable()) { mDrawerToggle.setDrawerIndicatorEnabled(false); } } @@ -704,7 +704,7 @@ public void onBackPressed() { this.mDisplayedFragment = getSupportFragmentManager().findFragmentById(R.id.content_frame); configureFragment(); - if (!(this.mDisplayedFragment instanceof UpNavigatibleFragment) || !((UpNavigatibleFragment) this.mDisplayedFragment).isUpNavigatible()) { + if (!(this.mDisplayedFragment instanceof UpNavigatibleFragment) || !((UpNavigatibleFragment) this.mDisplayedFragment).isUpNavigable()) { mDrawerToggle.setDrawerIndicatorEnabled(true); } else { mDrawerToggle.setDrawerIndicatorEnabled(false); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/adapter/DrawerListAdapter.java b/src/main/java/dk/aau/netsec/hostage/ui/adapter/DrawerListAdapter.java index 626ecf33..a5816494 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/adapter/DrawerListAdapter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/adapter/DrawerListAdapter.java @@ -34,7 +34,7 @@ public class DrawerListAdapter extends ArrayAdapter { /** * Create the list adapter * - * @param context the context needed for resource retieval + * @param context the context needed for resource retrieval * @param objects all the items that should be displayed in the list */ public DrawerListAdapter(Context context, List objects) { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java b/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java index 77895781..a8836682 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java @@ -22,7 +22,7 @@ import dk.aau.netsec.hostage.ui.layouts.FlowLayout; /** - * RecyclerAdapter to bind list of profiles obrained from ProfileManager to UI views constructed + * RecyclerAdapter to bind list of profiles obtained from ProfileManager to UI views constructed * by RecyclerView * * @author Filip Adamik diff --git a/src/main/java/dk/aau/netsec/hostage/ui/adapter/ServicesListAdapter.java b/src/main/java/dk/aau/netsec/hostage/ui/adapter/ServicesListAdapter.java index 3d9253aa..6afd3532 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/adapter/ServicesListAdapter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/adapter/ServicesListAdapter.java @@ -49,7 +49,7 @@ public ServicesListAdapter(Context context, List objects) { /** * method to save important information from parent fragment * - * @param activity activicty from parent fragment + * @param activity activity from parent fragment * @param servicesSwitch the switch from parent fragment * @param mainListener Listener from parent fragment */ diff --git a/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java b/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java index c6a00acd..631f31bb 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java @@ -50,9 +50,9 @@ public void setValueFormatter(ValueFormatter formatter){ } /** - * Contructor + * Constructor * @param context the context - * @param objects the repesenting {@link dk.aau.netsec.hostage.ui.model.PlotComparisonItem PlotComparisonItems} + * @param objects the representing {@link dk.aau.netsec.hostage.ui.model.PlotComparisonItem PlotComparisonItems} */ public StatisticListAdapter(Context context, List objects) { super(context, getLayoutID(), objects); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java b/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java index 5fad8630..7d972a35 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java @@ -68,7 +68,7 @@ public boolean isMultipleChoice(){ * The Constructor Method * @param title String * @param itemTitles ArrayList item titles list - * @param selected boolean[] an array of bools descriping the position of all the selected titles. + * @param selected boolean[] an array of booleans describing the position of all the selected titles. * @param isMultipleChoice boolean isMultipleChoice * @param listener ChecklistDialogListener an user "event" listener * diff --git a/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java b/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java index f6210281..099ea783 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java @@ -34,7 +34,7 @@ public class DateTimePickerDialog { * * @param context Application context * @param filterFrom A flag that is passed back in the callback, indicating whether this was - * triggerred from the before or after filter. + * triggered from the before or after filter. * @param callback The interface implementation where the date and time value is passed. */ public static void showDateTimePicker(@NonNull Context context, boolean filterFrom, @NonNull DateTimeSelected callback) { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java index 4f136192..3e28e6d3 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java @@ -238,7 +238,7 @@ public Fragment getCallbackFragment() { return this; } - //TODO Replace with seperate Fragments as suggested in https://developer.android.com/guide/topics/ui/settings/organize-your-settings#split_your_hierarchy_into_multiple_screens + //TODO Replace with separate Fragments as suggested in https://developer.android.com/guide/topics/ui/settings/organize-your-settings#split_your_hierarchy_into_multiple_screens /** * SubsScreens in Android X are no longer Supported. diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java index 874af8c8..4785bfb7 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java @@ -137,7 +137,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa this.mRootView = inflater.inflate(this.getLayoutId(), container, false); this.assignViews(mRootView); - this.configurateRootView(mRootView); + this.configureRootView(mRootView); return mRootView; } @@ -171,7 +171,7 @@ private void assignViews(View view) { * * @param rootView the view to use to display the information */ - private void configurateRootView(View rootView) { + private void configureRootView(View rootView) { mRecordDetailsTextAttackType.setText(mRecord.getWasInternalAttack() ? R.string.RecordInternalAttack : R.string.RecordExternalAttack); mRecordDetailsTextBssid.setText(mRecord.getBssid()); mRecordDetailsTextSsid.setText(mRecord.getSsid()); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java index d4bff9a9..abf2c97e 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java @@ -1037,7 +1037,7 @@ public String getFormattedDateForGrouping(long timestamp) { } /** - * Returns a date as a formated string + * Returns a date as a formatted string * * @param timestamp date * @return String date format is localised @@ -1154,7 +1154,7 @@ private long dayMilliseconds(long date) { } /** - * Returns a date as a formated string + * Returns a date as a formatted string * * @param timeStamp date * @return String date format is localised @@ -1484,7 +1484,7 @@ public boolean[] selectedProtocols() { /** * Returns the Sorttype Titles * - * @return ArayList Sort type titles + * @return ArrayList Sort type titles */ public ArrayList sortTypeTiles() { ArrayList titles = new ArrayList<>(); @@ -1612,7 +1612,7 @@ private ArrayList filterMenuTitles() { } /** - * Will be called if the users clicks the positiv button on a ChechlistDialog. + * Will be called if the users clicks the positive button on a ChecklistDialog. * * @param dialog {@link ChecklistDialog ChecklistDialog } */ @@ -1712,7 +1712,7 @@ public void deleteFilteredAttacks() { } /** - * Will be called if the users clicks the negativ button on a ChechlistDialog. + * Will be called if the users clicks the negative button on a ChecklistDialog. * * @param dialog {@link ChecklistDialog ChecklistDialog } */ @@ -1731,7 +1731,7 @@ private void pushRecordDetailViewForRecord(RecordAll record) { if (fm != null) { RecordDetailFragment newFragment = new RecordDetailFragment(); newFragment.setRecord(record); - newFragment.setUpNavigatible(true); + newFragment.setUpNavigable(true); MainActivity.getInstance().injectFragment(newFragment); } } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java index 17069fe6..ab318623 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java @@ -154,7 +154,7 @@ private void initialiseLoggingSwitch() { } /** - * Initialise the location setting by assinging an on-click listener and updating UI with + * Initialise the location setting by assigning an on-click listener and updating UI with * the location value from {@link PcapLoggingManager} */ private void initialiseLocationSelector() { @@ -167,7 +167,7 @@ private void initialiseLocationSelector() { } /** - * Initialise log rotation setting by assinging an on-click listener and updating UI with + * Initialise log rotation setting by assigning an on-click listener and updating UI with * the value from {@link PcapLoggingManager} */ private void initialiseRotationPeriodSelector() { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java index c76022b4..6df17c68 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java @@ -367,7 +367,7 @@ public void onStart() { } /** - * Sets the current chart to the given type and acualises it. + * Sets the current chart to the given type and actualises it. * * @param type {@link StatisticsFragment.ChartType ChartType} */ @@ -425,7 +425,7 @@ public View getPlotViewForType(ChartType type) { } /** - * Actualises the list view. Therefore it requiers the "currentData". + * Actualises the list view. Therefore it requires the "currentData". */ public void actualiseLegendList() { StatisticListAdapter adapter = new StatisticListAdapter(getApplicationContext(), currentData); @@ -558,7 +558,7 @@ private void openAttackDataDialog() { * */ /** - * Will be called if the user selects the positiv button on an checklist dialog. + * Will be called if the user selects the positive button on an checklist dialog. * * @param dialog {@link ChecklistDialog ChecklistDialog} */ @@ -624,7 +624,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { } /** - * Will be called if the user selects the negativ button on an checklist dialog. + * Will be called if the user selects the negative button on an checklist dialog. * * @param dialog {@link ChecklistDialog ChecklistDialog} */ @@ -1727,7 +1727,7 @@ public long getDateFromMilliseconds(long timeInMillis) { } /** - * Returns the given hour as a formated string. + * Returns the given hour as a formatted string. * Format: "HH:00" */ private String getHourAsTimeString(long hour) { @@ -1737,7 +1737,7 @@ private String getHourAsTimeString(long hour) { //static final DateFormat dateFormat = new SimpleDateFormat("d.M.yy"); /** - * Returns a date as a formated string + * Returns a date as a formatted string * * @param timeStamp date * @return String date format is localised @@ -1750,7 +1750,7 @@ private String getDateAsDayString(long timeStamp) { } /** - * Returns a date as a formated string + * Returns a date as a formatted string * * @param timeStamp date * @return String date format (H:mm dd/MM/yyyy) @@ -1853,7 +1853,7 @@ private void pushRecordOverviewForFilter(LogFilter filter, String groupingKey) { // Create a new instance of your Fragment. RecordOverviewFragment newFragment = new RecordOverviewFragment(); // Set true, if the user can navigate backwards from the new pushed fragment. - newFragment.setUpNavigatible(true); + newFragment.setUpNavigable(true); // Set a Filter Object if needed. // Otherwise the RecordOverviewFragment will display all possible records / attacks. diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigatibleFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigatibleFragment.java index 2b96c504..bbd68550 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigatibleFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigatibleFragment.java @@ -9,7 +9,7 @@ */ public abstract class UpNavigatibleFragment extends Fragment { private Class mUpFragment; - private boolean mIsUpNavigatible = false; + private boolean mIsUpNavigable = false; private boolean mAllowBack = false; @@ -21,12 +21,12 @@ public void setUpFragment(Class upFragment){ this.mUpFragment = upFragment; } - public boolean isUpNavigatible(){ - return mIsUpNavigatible; + public boolean isUpNavigable(){ + return mIsUpNavigable; } - public void setUpNavigatible(boolean isUpNavigatible){ - this.mIsUpNavigatible = isUpNavigatible; + public void setUpNavigable(boolean isUpNavigable){ + this.mIsUpNavigable = isUpNavigable; } public boolean getAllowBack(){ diff --git a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java index b94c4209..ddeefb4d 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java @@ -193,7 +193,7 @@ public void showOnView(final View anchorView) { this.popupWindow.setHeight(height); if (lastItemView != null) { - View v = lastItemView.findViewById(R.id.bottom_seperator); + View v = lastItemView.findViewById(R.id.bottom_separator); if (v != null) { v.setVisibility(View.GONE); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java b/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java index d35ace32..69f165f4 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java @@ -59,17 +59,17 @@ public void configureItemView(View view){ TextView rightTitleView = view.findViewById(R.id.right_title_text_view); rightTitleView.setText(rightTitle); - TextView rightSubtilteView = view.findViewById(R.id.right_subtitle_text_view); + TextView rightSubtitleView = view.findViewById(R.id.right_subtitle_text_view); if (rightSubtitle != null){ - rightSubtilteView.setText(rightSubtitle); + rightSubtitleView.setText(rightSubtitle); } else { - rightSubtilteView.setText("-"); + rightSubtitleView.setText("-"); } } /** * Returns the displayed object for the clicked position in the view. - * E.g. the user tapped the right side, it returns the object representing the right side of the clickt view. + * E.g. the user tapped the right side, it returns the object representing the right side of the clicked view. * @param event MotionEvent * @return Object */ diff --git a/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java b/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java index e9cbb2aa..35a49c41 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java @@ -12,7 +12,7 @@ public class LoaderTask extends AsyncTask { @SuppressLint("ValidFragment") public interface TaskListener { - void doInBackgorund(); + void doInBackground(); void onFinish(); } @@ -24,7 +24,7 @@ public LoaderTask(TaskListener listener){ @Override protected Void doInBackground(Void... unused) { if (this.listener != null){ - this.listener.doInBackgorund(); + this.listener.doInBackground(); } return(null); } diff --git a/src/main/res/layout/simple_popup_item.xml b/src/main/res/layout/simple_popup_item.xml index 60bccf3b..230a69ae 100644 --- a/src/main/res/layout/simple_popup_item.xml +++ b/src/main/res/layout/simple_popup_item.xml @@ -36,7 +36,7 @@ android:layout_width="fill_parent" android:layout_height="1dp" android:background="@android:color/darker_gray" - android:id="@+id/bottom_seperator" + android:id="@+id/bottom_separator" /> \ No newline at end of file diff --git a/src/main/res/layout/split_popup_item.xml b/src/main/res/layout/split_popup_item.xml index 38bd46f2..03d6bc98 100644 --- a/src/main/res/layout/split_popup_item.xml +++ b/src/main/res/layout/split_popup_item.xml @@ -96,7 +96,7 @@ From c1c22c38460467bd69c7ae2a9bfe90ffd64d2509 Mon Sep 17 00:00:00 2001 From: zafodB Date: Wed, 18 Aug 2021 11:36:23 +0200 Subject: [PATCH 03/26] remove unused namespace declarations --- src/main/AndroidManifest.xml | 1 - src/main/res/layout/fragment_home.xml | 1 - src/main/res/layout/preference_pcap_logging.xml | 1 - src/main/res/values-de/strings.xml | 2 +- src/main/res/values/strings.xml | 2 +- 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index cf9db920..61122b9d 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ diff --git a/src/main/res/layout/fragment_home.xml b/src/main/res/layout/fragment_home.xml index 57828024..51a18f05 100644 --- a/src/main/res/layout/fragment_home.xml +++ b/src/main/res/layout/fragment_home.xml @@ -1,6 +1,5 @@ diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 35f8a47f..7a4392ba 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -1,5 +1,5 @@ - + HosTaGe Verbindungs Info diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 00547dcb..b8b532cb 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1,5 +1,5 @@ - + HosTaGe Connection Info From 1241a3831a336f9df070c7c1085f597e7f7b4763 Mon Sep 17 00:00:00 2001 From: zafodB Date: Wed, 18 Aug 2021 13:28:54 +0200 Subject: [PATCH 04/26] formatting, java style and logic changes, according to IDE code inspection --- .../com/echo/holographlibrary/BarGraph.java | 6 +- .../java/com/echo/holographlibrary/Line.java | 2 +- .../com/echo/holographlibrary/LineGraph.java | 23 +- .../com/echo/holographlibrary/PieGraph.java | 318 ++- .../dk/aau/netsec/hostage/AMQPListener.java | 6 +- .../dk/aau/netsec/hostage/COAPListener.java | 6 +- .../aau/netsec/hostage/ConnectionGuard.java | 120 +- .../netsec/hostage/ConnectionRegister.java | 2 +- .../java/dk/aau/netsec/hostage/Handler.java | 38 +- .../java/dk/aau/netsec/hostage/Hostage.java | 46 +- .../java/dk/aau/netsec/hostage/Listener.java | 21 +- .../dk/aau/netsec/hostage/MQTTListener.java | 51 +- .../netsec/hostage/commons/HelperUtils.java | 19 +- .../netsec/hostage/commons/JSONHelper.java | 9 +- .../netsec/hostage/commons/SubnetUtils.java | 19 +- .../hostage/deprecated/UglyDbHelper.java | 1879 ++++++------ .../aau/netsec/hostage/event/BeaconEvent.java | 2 +- .../aau/netsec/hostage/event/DeviceEvent.java | 4 +- .../location/CustomLocationManager.java | 62 +- .../location/CustomLocationSource.java | 2 +- .../netsec/hostage/logging/AttackRecord.java | 2 +- .../netsec/hostage/logging/LogSaveWorker.java | 2 +- .../dk/aau/netsec/hostage/logging/Record.java | 6 +- .../aau/netsec/hostage/logging/SyncData.java | 8 +- .../aau/netsec/hostage/logging/SyncInfo.java | 4 +- .../netsec/hostage/logging/SyncRecord.java | 8 +- .../logging/formatter/DefaultFormatter.java | 2 +- .../logging/formatter/TraCINgFormatter.java | 2 +- .../logging/formatter/protocol/SMB.java | 413 ++- .../logging/formatter/protocol/TELNET.java | 2 +- .../dk/aau/netsec/hostage/model/Profile.java | 5 +- .../hostage/net/MySSLSocketFactory.java | 2 +- .../hostage/net/MyServerSocketFactory.java | 83 +- .../dk/aau/netsec/hostage/nio/Reader.java | 4 +- .../dk/aau/netsec/hostage/nio/Writer.java | 2 +- .../persistence/DAO/AttackRecordDAO.java | 64 +- .../netsec/hostage/persistence/DAO/DAO.java | 6 +- .../hostage/persistence/DAO/DAOHelper.java | 12 +- .../persistence/DAO/MessageRecordDAO.java | 28 +- .../persistence/DAO/NetworkRecordDAO.java | 37 +- .../hostage/persistence/DAO/ProfileDAO.java | 2 +- .../persistence/DAO/SyncDeviceDAO.java | 17 +- .../persistence/DAO/SyncInfoRecordDAO.java | 8 +- .../persistence/HostageDBOpenHelper.java | 2539 +++++++++-------- .../hostage/persistence/ProfileManager.java | 16 +- .../dk/aau/netsec/hostage/protocol/COAP.java | 3 +- .../dk/aau/netsec/hostage/protocol/ECHO.java | 2 +- .../dk/aau/netsec/hostage/protocol/FTP.java | 2 +- .../dk/aau/netsec/hostage/protocol/GHOST.java | 2 +- .../dk/aau/netsec/hostage/protocol/HTTP.java | 22 +- .../aau/netsec/hostage/protocol/MODBUS.java | 228 +- .../dk/aau/netsec/hostage/protocol/MQTT.java | 16 +- .../dk/aau/netsec/hostage/protocol/MySQL.java | 357 +-- .../aau/netsec/hostage/protocol/S7COMM.java | 8 +- .../dk/aau/netsec/hostage/protocol/SIP.java | 283 +- .../dk/aau/netsec/hostage/protocol/SNMP.java | 5 +- .../dk/aau/netsec/hostage/protocol/SSH.java | 30 +- .../aau/netsec/hostage/protocol/TELNET.java | 15 +- .../commons/logWatchers/LogBackWatcher.java | 2 +- .../protocol/utils/amqpUtils/AMQPHandler.java | 2 +- .../protocol/utils/cifs/CifsServer.java | 8 +- .../utils/cifs/PseudoJavaFileDiskDriver.java | 29 +- .../protocol/utils/cifs/smbutils/NBDS.java | 18 +- .../protocol/utils/cifs/smbutils/NBNS.java | 393 +-- .../utils/cifs/smbutils/NBNSService.java | 54 +- .../protocol/utils/cifs/smbutils/NBSS.java | 2 +- .../protocol/utils/cifs/smbutils/NMB.java | 6 +- .../utils/cifs/smbutils/NMBStringCoder.java | 9 +- .../utils/cifs/smbutils/SMBPacket.java | 37 +- .../protocol/utils/coapUtils/COAPHandler.java | 4 +- .../protocol/utils/mqttUtils/MQTTConfig.java | 20 +- .../protocol/utils/mqttUtils/MQTTHandler.java | 26 +- .../utils/mqttUtils/SensorProfile.java | 4 +- .../utils/smptUtils/SimpleSmtpServer.java | 7 +- .../utils/smptUtils/SmtpActionType.java | 2 +- .../protocol/utils/smptUtils/SmtpMessage.java | 10 +- .../protocol/utils/smptUtils/SmtpRequest.java | 6 +- .../utils/smptUtils/SmtpResponse.java | 6 +- .../protocol/utils/smptUtils/SmtpState.java | 2 +- .../utils/snmpUtils/MOTableBuilder.java | 10 +- .../provider/HostageContentProvider.java | 3 +- .../hostage/publisher/FilePublisher.java | 4 +- .../aau/netsec/hostage/publisher/Hpfeeds.java | 656 ++--- .../hostage/publisher/PublishHelper.java | 18 +- .../netsec/hostage/services/MultiStage.java | 12 +- .../hostage/services/PcapLoggingService.java | 16 +- .../netsec/hostage/services/Stackbean.java | 6 +- .../aau/netsec/hostage/system/Decompress.java | 7 +- .../dk/aau/netsec/hostage/system/Device.java | 2 +- .../hostage/system/iptablesUtils/Api.java | 10 +- .../system/iptablesUtils/RootCommand.java | 1 + .../iptablesUtils/RootShellService.java | 63 +- .../iptablesUtils/RootShellService2.java | 55 +- .../hostage/ui/activity/MainActivity.java | 28 +- .../ui/adapter/ProfileRecyclerAdapter.java | 7 +- .../hostage/ui/adapter/RecordListAdapter.java | 13 +- .../ui/adapter/ServicesListAdapter.java | 3 +- .../ui/adapter/StatisticListAdapter.java | 6 +- .../hostage/ui/dialog/ChecklistDialog.java | 234 +- .../ui/dialog/DateTimePickerDialog.java | 25 +- .../ConnectionInfoDialogFragment.java | 4 +- .../hostage/ui/fragment/HomeFragment.java | 34 +- .../fragment/PreferenceHostageFragment.java | 6 +- .../hostage/ui/fragment/PrivacyFragment.java | 57 +- .../ui/fragment/ProfileEditFragment.java | 8 +- .../ui/fragment/ProfileManagerFragment.java | 17 +- .../ui/fragment/RecordDetailFragment.java | 43 +- .../ui/fragment/RecordOverviewFragment.java | 41 +- .../hostage/ui/fragment/ServicesFragment.java | 4 +- .../hostage/ui/fragment/SettingsFragment.java | 20 +- .../ui/fragment/StatisticsFragment.java | 87 +- .../ui/fragment/ThreatMapFragment.java | 8 +- ...Fragment.java => UpNavigableFragment.java} | 2 +- .../ui/fragment/opengl/AnimatedMesh.java | 703 ++--- .../hostage/ui/fragment/opengl/GLFont.java | 6 +- .../ui/fragment/opengl/Quaternion.java | 5 +- .../opengl/ThreatIndicatorGLRenderer.java | 13 +- .../ui/helper/SwipeToEditCallback.java | 11 +- .../netsec/hostage/ui/layouts/FlowLayout.java | 2 +- .../hostage/ui/model/DrawerListItem.java | 4 +- .../netsec/hostage/ui/model/LogFilter.java | 18 +- .../hostage/ui/model/PlotComparisonItem.java | 8 +- .../hostage/ui/model/ProfileListItem.java | 8 +- .../hostage/ui/model/ServicesListItem.java | 6 +- .../hostage/ui/popup/AbstractPopup.java | 87 +- .../hostage/ui/popup/AbstractPopupItem.java | 28 +- .../hostage/ui/popup/SimplePopupItem.java | 2 +- .../hostage/ui/popup/SplitPopupItem.java | 2 +- .../netsec/hostage/ui/task/LoaderTask.java | 2 +- .../dk/aau/netsec/hostage/wrapper/Packet.java | 4 +- 130 files changed, 4815 insertions(+), 5133 deletions(-) rename src/main/java/dk/aau/netsec/hostage/ui/fragment/{UpNavigatibleFragment.java => UpNavigableFragment.java} (91%) diff --git a/src/main/java/com/echo/holographlibrary/BarGraph.java b/src/main/java/com/echo/holographlibrary/BarGraph.java index 77cfe85c..06d4fb6a 100644 --- a/src/main/java/com/echo/holographlibrary/BarGraph.java +++ b/src/main/java/com/echo/holographlibrary/BarGraph.java @@ -45,8 +45,8 @@ public class BarGraph extends View { private final static int VALUE_FONT_SIZE = 23, AXIS_LABEL_FONT_SIZE = 12; - private ArrayList mBars = new ArrayList(); - private Paint mPaint = new Paint(); + private ArrayList mBars = new ArrayList<>(); + private final Paint mPaint = new Paint(); private Rect mRectangle = null; private boolean mShowBarText = true; private boolean mShowAxis = true; @@ -57,7 +57,7 @@ public class BarGraph extends View { private int popupImageID; - private Context mContext = null; + private Context mContext; /** diff --git a/src/main/java/com/echo/holographlibrary/Line.java b/src/main/java/com/echo/holographlibrary/Line.java index 6cd9fc4c..43b2d548 100644 --- a/src/main/java/com/echo/holographlibrary/Line.java +++ b/src/main/java/com/echo/holographlibrary/Line.java @@ -26,7 +26,7 @@ import java.util.ArrayList; public class Line { - private ArrayList points = new ArrayList(); + private ArrayList points = new ArrayList<>(); private int color; private boolean showPoints = true; // 6 has been the default prior to the addition of custom stroke widths diff --git a/src/main/java/com/echo/holographlibrary/LineGraph.java b/src/main/java/com/echo/holographlibrary/LineGraph.java index 593ac27f..55a5c9a1 100644 --- a/src/main/java/com/echo/holographlibrary/LineGraph.java +++ b/src/main/java/com/echo/holographlibrary/LineGraph.java @@ -63,8 +63,8 @@ public interface AxisDataConverter { private final static int AXIS_LABEL_FONT_SIZE = 8; - private ArrayList lines = new ArrayList(); - Paint paint = new Paint(); + private ArrayList lines = new ArrayList<>(); + final Paint paint = new Paint(); private double minY = 0, minX = 0; private double maxY = 0, maxX = 0; private double rangeYRatio = 0; @@ -89,7 +89,7 @@ public interface AxisDataConverter { private AxisDataConverter converter; - private Context mContext; + private final Context mContext; public void setxAxisStep(float step){ this.xAxisStep = step; @@ -230,7 +230,7 @@ public void removePointsFromLine(int lineIndex, LinePoint[] points){ //postInvalidate(); } public void removePointFromLine(int lineIndex, float x, float y){ - LinePoint p = null; + LinePoint p; Line line = getLine(lineIndex); p = line.getPoint(x, y); removePointFromLine(lineIndex, p); @@ -333,7 +333,7 @@ public double getMaxY(){ double max = lines.get(0).getPoint(0).getY(); for (Line line : lines){ for (LinePoint point : line.getPoints()){ - max = point.getY() > max ? point.getY() : max; + max = Math.max(point.getY(), max); } } maxY = max; @@ -345,7 +345,7 @@ public double getMinY(){ double min = lines.get(0).getPoint(0).getY(); for (Line line : lines){ for (LinePoint point : line.getPoints()){ - min = point.getY() < min ? point.getY() : min; + min = Math.min(point.getY(), min); } } minY = min; @@ -449,8 +449,8 @@ public void onDraw(Canvas ca) { // DRAW LINES for (Line line : lines){ int count = 0; - float lastXPixels = 0, newYPixels = 0; - float lastYPixels = 0, newXPixels = 0; + float lastXPixels = 0, newYPixels; + float lastYPixels = 0, newXPixels; paint.setColor(line.getColor()); paint.setStrokeWidth(getStrokeWidth(line)); @@ -625,8 +625,8 @@ private void drawBackground(Canvas canvas){ int lineCount = 0; for (Line line : lines){ int count = 0; - float firstXPixels = 0, lastXPixels = 0, newYPixels = 0; - float lastYPixels = 0, newXPixels = 0; + float firstXPixels = 0, lastXPixels = 0, newYPixels; + float lastYPixels = 0, newXPixels; if (lineCount == lineToFill){ paint.setColor(Color.BLACK); @@ -644,7 +644,6 @@ private void drawBackground(Canvas canvas){ if (count == 0){ lastXPixels = sidePadding + (xPercent*usableWidth); lastYPixels = getHeight() - bottomPadding - (usableHeight*yPercent); - firstXPixels = lastXPixels; path.moveTo(lastXPixels, lastYPixels); } else { newXPixels = sidePadding + (xPercent*usableWidth); @@ -717,7 +716,7 @@ public boolean onTouchEvent(MotionEvent event) { int count = 0; int lineCount = 0; - int pointCount = 0; + int pointCount; Region r = new Region(); for (Line line : lines){ diff --git a/src/main/java/com/echo/holographlibrary/PieGraph.java b/src/main/java/com/echo/holographlibrary/PieGraph.java index 4ac1da27..2be58008 100644 --- a/src/main/java/com/echo/holographlibrary/PieGraph.java +++ b/src/main/java/com/echo/holographlibrary/PieGraph.java @@ -51,42 +51,44 @@ public class PieGraph extends View { static final String ALL_TITLE = MainActivity.getContext().getString(R.string.pie_all); - private ArrayList slices = new ArrayList(); - private Paint paint = new Paint(); - private Path path = new Path(); - - private int indexSelected = -1; - private int thickness; - private OnSliceClickedListener listener; - - private boolean drawCompleted = false; + private ArrayList slices = new ArrayList<>(); + private final Paint paint = new Paint(); + private final Path path = new Path(); + + private int indexSelected = -1; + private int thickness; + private OnSliceClickedListener listener; + + private boolean drawCompleted = false; private String title; private String subtitle; - private Context mContext; + private final Context mContext; /** * Constructor + * * @param context Context */ - public PieGraph(Context context) { - super(context); + public PieGraph(Context context) { + super(context); this.mContext = context; - thickness = (int) (25f * context.getResources().getDisplayMetrics().density); + thickness = (int) (25f * context.getResources().getDisplayMetrics().density); this.setWillNotDraw(false); - } + } /** * Constructor + * * @param context Context - * @param attrs AttributeSet + * @param attrs AttributeSet */ - public PieGraph(Context context, AttributeSet attrs) { - super(context, attrs); + public PieGraph(Context context, AttributeSet attrs) { + super(context, attrs); this.mContext = context; - thickness = (int) (25f * context.getResources().getDisplayMetrics().density); + thickness = (int) (25f * context.getResources().getDisplayMetrics().density); this.setWillNotDraw(false); } @@ -95,82 +97,79 @@ public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.TRANSPARENT); - paint.reset(); - paint.setAntiAlias(true); - float midX, midY, radius, innerRadius; - path.reset(); - - float currentAngle = 270; - float currentSweep = 0; - int totalValue = 0; - float padding = 2; - - midX = getWidth()/2; - midY = getHeight()/2; - if (midX < midY){ - radius = midX; - } else { - radius = midY; - } - radius -= padding; - innerRadius = radius - thickness; - - for (PieSlice slice : slices){ - totalValue += slice.getValue(); - } - - int count = 0; - for (PieSlice slice : slices){ - Path p = new Path(); - paint.setColor(slice.getColor()); - currentSweep = (slice.getValue()/totalValue)*(360); - p.arcTo(new RectF(midX-radius, midY-radius, midX+radius, midY+radius), currentAngle+padding, currentSweep - padding); - p.arcTo(new RectF(midX-innerRadius, midY-innerRadius, midX+innerRadius, midY+innerRadius), (currentAngle+padding) + (currentSweep - padding), -(currentSweep-padding)); - p.close(); - - slice.setPath(p); - slice.setRegion(new Region((int)(midX-radius), (int)(midY-radius), (int)(midX+radius), (int)(midY+radius))); - canvas.drawPath(p, paint); - - if (indexSelected == count && listener != null){ - path.reset(); - //paint.setColor(slice.getColor()); - paint.setColor(Color.parseColor("#33B5E5")); - paint.setAlpha(100); - - if (slices.size() > 1) { - path.arcTo(new RectF(midX-radius-(padding*2), midY-radius-(padding*2), midX+radius+(padding*2), midY+radius+(padding*2)), currentAngle, currentSweep+padding); - path.arcTo(new RectF(midX-innerRadius+(padding*2), midY-innerRadius+(padding*2), midX+innerRadius-(padding*2), midY+innerRadius-(padding*2)), currentAngle + currentSweep + padding, -(currentSweep + padding)); - path.close(); - } else { - path.addCircle(midX, midY, radius+padding, Direction.CW); - } - - canvas.drawPath(path, paint); - paint.setAlpha(255); - } - - currentAngle = currentAngle+currentSweep; - - count++; - } + paint.reset(); + paint.setAntiAlias(true); + float midX, midY, radius, innerRadius; + path.reset(); + + float currentAngle = 270; + float currentSweep; + int totalValue = 0; + float padding = 2; + + midX = getWidth() / 2; + midY = getHeight() / 2; + radius = Math.min(midX, midY); + radius -= padding; + innerRadius = radius - thickness; + + for (PieSlice slice : slices) { + totalValue += slice.getValue(); + } + + int count = 0; + for (PieSlice slice : slices) { + Path p = new Path(); + paint.setColor(slice.getColor()); + currentSweep = (slice.getValue() / totalValue) * (360); + p.arcTo(new RectF(midX - radius, midY - radius, midX + radius, midY + radius), currentAngle + padding, currentSweep - padding); + p.arcTo(new RectF(midX - innerRadius, midY - innerRadius, midX + innerRadius, midY + innerRadius), (currentAngle + padding) + (currentSweep - padding), -(currentSweep - padding)); + p.close(); + + slice.setPath(p); + slice.setRegion(new Region((int) (midX - radius), (int) (midY - radius), (int) (midX + radius), (int) (midY + radius))); + canvas.drawPath(p, paint); + + if (indexSelected == count && listener != null) { + path.reset(); + //paint.setColor(slice.getColor()); + paint.setColor(Color.parseColor("#33B5E5")); + paint.setAlpha(100); + + if (slices.size() > 1) { + path.arcTo(new RectF(midX - radius - (padding * 2), midY - radius - (padding * 2), midX + radius + (padding * 2), midY + radius + (padding * 2)), currentAngle, currentSweep + padding); + path.arcTo(new RectF(midX - innerRadius + (padding * 2), midY - innerRadius + (padding * 2), midX + innerRadius - (padding * 2), midY + innerRadius - (padding * 2)), currentAngle + currentSweep + padding, -(currentSweep + padding)); + path.close(); + } else { + path.addCircle(midX, midY, radius + padding, Direction.CW); + } + + canvas.drawPath(path, paint); + paint.setAlpha(255); + } + + currentAngle = currentAngle + currentSweep; + + count++; + } this.drawTitle(canvas); this.drawSubtitle(canvas); - - drawCompleted = true; - - } + + drawCompleted = true; + + } /** * Draws the title in the middle of the pie. + * * @param canvas Canvas */ - private void drawTitle(Canvas canvas){ + private void drawTitle(Canvas canvas) { String title = this.title; - if (title != null && title.length() != 0){ + if (title != null && title.length() != 0) { this.paint.reset(); paint.setColor(Color.BLACK); paint.setAlpha(50); @@ -184,8 +183,8 @@ private void drawTitle(Canvas canvas){ float textwidth = (this.paint.measureText(title)); Rect bounds = new Rect(); - this.paint.getTextBounds(title,0,title.length(), bounds); - canvas.drawText(title,xCenter - (textwidth / 2),yCenter - bounds.height(), this.paint); + this.paint.getTextBounds(title, 0, title.length(), bounds); + canvas.drawText(title, xCenter - (textwidth / 2), yCenter - bounds.height(), this.paint); this.paint.reset(); } @@ -193,11 +192,12 @@ private void drawTitle(Canvas canvas){ /** * Draws the Subtitle in the middle of the pie. + * * @param canvas Canvas */ - private void drawSubtitle(Canvas canvas){ + private void drawSubtitle(Canvas canvas) { String title = this.subtitle; - if (title != null && title.length() != 0){ + if (title != null && title.length() != 0) { this.paint.reset(); paint.setColor(Color.BLACK); paint.setAlpha(50); @@ -211,118 +211,122 @@ private void drawSubtitle(Canvas canvas){ float textwidth = (this.paint.measureText(title)); Rect bounds = new Rect(); - this.paint.getTextBounds(title,0,title.length(), bounds); - canvas.drawText(title,xCenter - (textwidth / 2),yCenter + bounds.height(), this.paint); + this.paint.getTextBounds(title, 0, title.length(), bounds); + canvas.drawText(title, xCenter - (textwidth / 2), yCenter + bounds.height(), this.paint); this.paint.reset(); } } - - @Override - public boolean onTouchEvent(MotionEvent event) { - - if (drawCompleted) { - - Point point = new Point(); - point.x = (int) event.getX(); - point.y = (int) event.getY(); - - int count = 0; + + @Override + public boolean onTouchEvent(MotionEvent event) { + + if (drawCompleted) { + + Point point = new Point(); + point.x = (int) event.getX(); + point.y = (int) event.getY(); + + int count = 0; boolean drawedTitle = false; - for (PieSlice slice : slices){ - Region r = new Region(); - r.setPath(slice.getPath(), slice.getRegion()); - if (r.contains(point.x, point.y) && event.getAction() == MotionEvent.ACTION_DOWN){ - indexSelected = count; + for (PieSlice slice : slices) { + Region r = new Region(); + r.setPath(slice.getPath(), slice.getRegion()); + if (r.contains(point.x, point.y) && event.getAction() == MotionEvent.ACTION_DOWN) { + indexSelected = count; this.title = slice.getTitle(); this.subtitle = "" + (long) slice.getValue(); drawedTitle = true; - } else if (event.getAction() == MotionEvent.ACTION_UP){ - if (r.contains(point.x, point.y) && listener != null){ - if (indexSelected > -1){ - listener.onClick(indexSelected); - } - indexSelected = -1; - } - - } - else if(event.getAction() == MotionEvent.ACTION_CANCEL) { + } else if (event.getAction() == MotionEvent.ACTION_UP) { + if (r.contains(point.x, point.y) && listener != null) { + if (indexSelected > -1) { + listener.onClick(indexSelected); + } + indexSelected = -1; + } + + } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { indexSelected = -1; } - count++; - } - if ( event.getAction() == MotionEvent.ACTION_DOWN && !drawedTitle ) { + count++; + } + if (event.getAction() == MotionEvent.ACTION_DOWN && !drawedTitle) { // refresh title & subtitle this.addSlice(null); } - if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL){ - postInvalidate(); - } - } - - - return true; - } - - public ArrayList getSlices() { - return slices; - } - public void setSlices(ArrayList slices) { - this.slices = slices; - //postInvalidate(); - } - public PieSlice getSlice(int index) { - return slices.get(index); - } + if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + postInvalidate(); + } + } + + + return true; + } + + public ArrayList getSlices() { + return slices; + } + + public void setSlices(ArrayList slices) { + this.slices = slices; + //postInvalidate(); + } + + public PieSlice getSlice(int index) { + return slices.get(index); + } /** * Add a pie slice. + * * @param slice {@link PieSlice PieSlice} */ - public void addSlice(PieSlice slice) { + public void addSlice(PieSlice slice) { if (slice != null) - this.slices.add(slice); + this.slices.add(slice); long countedValue = 0; Iterator iter = this.slices.iterator(); - while (iter.hasNext()){ + while (iter.hasNext()) { PieSlice s = iter.next(); - countedValue+= s.getValue(); + countedValue += s.getValue(); } this.title = ALL_TITLE; this.subtitle = "" + countedValue; - //postInvalidate(); - } + //postInvalidate(); + } - public int getThickness() { - return thickness; - } - public void setThickness(int thickness) { - this.thickness = thickness; - //postInvalidate(); - } + public int getThickness() { + return thickness; + } + + public void setThickness(int thickness) { + this.thickness = thickness; + //postInvalidate(); + } /** * Remove all slices. */ - public void removeSlices(){ + public void removeSlices() { Iterator iter = slices.iterator(); while (iter.hasNext()) { iter.next(); iter.remove(); - } + } this.title = ""; this.subtitle = ""; - //postInvalidate(); - } + //postInvalidate(); + } /** * Set the OnSliceClickedListener, which will be called if the user clicks a slice. + * * @param listener */ public void setOnSliceClickedListener(OnSliceClickedListener listener) { @@ -332,8 +336,8 @@ public void setOnSliceClickedListener(OnSliceClickedListener listener) { /** * OnSliceClickedListener will be called if the user clicks a pie slice. */ - public interface OnSliceClickedListener { - void onClick(int index); - } + public interface OnSliceClickedListener { + void onClick(int index); + } } diff --git a/src/main/java/dk/aau/netsec/hostage/AMQPListener.java b/src/main/java/dk/aau/netsec/hostage/AMQPListener.java index 3aa4907a..8cf0ed3c 100644 --- a/src/main/java/dk/aau/netsec/hostage/AMQPListener.java +++ b/src/main/java/dk/aau/netsec/hostage/AMQPListener.java @@ -13,14 +13,14 @@ import dk.aau.netsec.hostage.protocol.utils.amqpUtils.AMQPHandler; public class AMQPListener extends Listener { - private ArrayList handlers = new ArrayList<>(); + private final ArrayList handlers = new ArrayList<>(); private Thread thread; private Thread serverThread; private ConnectionRegister conReg; private boolean running = false; - private int defaultPort =5672; + private final int defaultPort =5672; - private static Semaphore mutex = new Semaphore(1); + private static final Semaphore mutex = new Semaphore(1); /** * Constructor for the class. Instantiate class variables. * diff --git a/src/main/java/dk/aau/netsec/hostage/COAPListener.java b/src/main/java/dk/aau/netsec/hostage/COAPListener.java index 118833b1..fafb987c 100644 --- a/src/main/java/dk/aau/netsec/hostage/COAPListener.java +++ b/src/main/java/dk/aau/netsec/hostage/COAPListener.java @@ -12,14 +12,14 @@ import dk.aau.netsec.hostage.protocol.utils.coapUtils.COAPHandler; public class COAPListener extends Listener { - private ArrayList handlers = new ArrayList<>(); + private final ArrayList handlers = new ArrayList<>(); private Thread thread; private Thread serverThread; private ConnectionRegister conReg; private boolean running = false; - private int defaultPort =5683; + private final int defaultPort =5683; - private static Semaphore mutex = new Semaphore(1); + private static final Semaphore mutex = new Semaphore(1); /** * Constructor for the class. Instantiate class variables. * diff --git a/src/main/java/dk/aau/netsec/hostage/ConnectionGuard.java b/src/main/java/dk/aau/netsec/hostage/ConnectionGuard.java index becdd2e9..e8799e9e 100644 --- a/src/main/java/dk/aau/netsec/hostage/ConnectionGuard.java +++ b/src/main/java/dk/aau/netsec/hostage/ConnectionGuard.java @@ -5,75 +5,73 @@ import android.util.Log; /** - * Class used to detect port scans. + * Class used to detect port scans. * We assume a port scan if at least 2 different ports get a connection in a small amount of time. - * */ public class ConnectionGuard { - private final static ConnectionGuard INSTANCE = new ConnectionGuard(); + private ConnectionGuard() { + } - private ConnectionGuard() { - } + private static long lastConnectionTimestamp = 0; + private static long lastPortscanTimestamp = 0; + private static String lastIP = ""; + private static int lastPort = 0; - private static long lastConnectionTimestamp = 0; - private static long lastPortscanTimestamp = 0; - private static String lastIP = ""; - private static int lastPort = 0; + private static long getPortscanTimeout() { + // this might be called in a time critical context so maybe + // we don't want to do this each time and instead just once + SharedPreferences defaultPref = PreferenceManager + .getDefaultSharedPreferences(Hostage.getContext()); + // the pref value is in seconds + int portscanTimeoutS = Integer.parseInt(defaultPref.getString("pref_timeout", "60")); - private static long getPortscanTimeout() { - // this might be called in a time critical context so maybe - // we don't want to do this each time and instead just once - SharedPreferences defaultPref = PreferenceManager - .getDefaultSharedPreferences(Hostage.getContext()); - // the pref value is in seconds - int portscanTimeoutS = Integer.parseInt(defaultPref.getString("pref_timeout", "60")); - long portscanTimeoutMS = 1000 * portscanTimeoutS; + return 1000 * portscanTimeoutS; + } - return portscanTimeoutMS; - } + /** + * Register a connection for port scan detection. Stores information about the last connection. + * + * @param port The local port used for communication. + * @param ip The IP address of the remote device. + * @return True if a port scan has been detected. + */ + public synchronized static boolean registerConnection(int port, String ip) { + long timestamp = System.currentTimeMillis(); + boolean result = detectedPortscan(port, ip, timestamp); - /** - * Register a connection for port scan detection. Stores information about the last connection. - * @param port The local port used for communication. - * @param ip The IP address of the remote device. - * @return True if a port scan has been detected. - */ - public synchronized static boolean registerConnection(int port, String ip) { - long timestamp = System.currentTimeMillis(); - boolean result = detectedPortscan(port, ip, timestamp); - - lastConnectionTimestamp = timestamp; - if (result) { - lastPortscanTimestamp = timestamp; - } - lastIP = ip; - lastPort = port; - return result; - } + lastConnectionTimestamp = timestamp; + if (result) { + lastPortscanTimestamp = timestamp; + } + lastIP = ip; + lastPort = port; + return result; + } - public synchronized static boolean portscanInProgress() { - return (System.currentTimeMillis() - lastPortscanTimestamp) < getPortscanTimeout(); - } - - /** - * Check if the new connection is part of a port scan attack. - * @param port The local port used for communication. - * @param ip The IP address of the remote device. - * @param timestamp Time stamp of connection - * @return True if a port scan has been detected. - */ - private synchronized static boolean detectedPortscan(int port, String ip, long timestamp) { - Log.i("Alte Werte:", "LastTime: " + lastConnectionTimestamp + " ,LastIP: " + lastIP + ", lastPort:" + port); - Log.i("Alte Werte:", "Time: " + timestamp + " ,IP: " + ip + ", Port:" + port); - boolean result = false; - boolean belowThreshold = ((timestamp - lastConnectionTimestamp) < getPortscanTimeout()); - boolean sameIP = (lastIP.equals(ip)); - boolean samePort = (lastPort == port); - if (sameIP && belowThreshold && !samePort) { - result = true; - } - - return result; - } + public synchronized static boolean portscanInProgress() { + return (System.currentTimeMillis() - lastPortscanTimestamp) < getPortscanTimeout(); + } + + /** + * Check if the new connection is part of a port scan attack. + * + * @param port The local port used for communication. + * @param ip The IP address of the remote device. + * @param timestamp Time stamp of connection + * @return True if a port scan has been detected. + */ + private synchronized static boolean detectedPortscan(int port, String ip, long timestamp) { + Log.i("Alte Werte:", "LastTime: " + lastConnectionTimestamp + " ,LastIP: " + lastIP + ", lastPort:" + port); + Log.i("Alte Werte:", "Time: " + timestamp + " ,IP: " + ip + ", Port:" + port); + boolean result = false; + boolean belowThreshold = ((timestamp - lastConnectionTimestamp) < getPortscanTimeout()); + boolean sameIP = (lastIP.equals(ip)); + boolean samePort = (lastPort == port); + if (sameIP && belowThreshold && !samePort) { + result = true; + } + + return result; + } } diff --git a/src/main/java/dk/aau/netsec/hostage/ConnectionRegister.java b/src/main/java/dk/aau/netsec/hostage/ConnectionRegister.java index 96f0ec7e..ebee9a51 100644 --- a/src/main/java/dk/aau/netsec/hostage/ConnectionRegister.java +++ b/src/main/java/dk/aau/netsec/hostage/ConnectionRegister.java @@ -15,7 +15,7 @@ public class ConnectionRegister { /** Active connections . **/ private static int openConnections = 0; /** Context in which ConnectionRegister is created. **/ - private Context context; + private final Context context; /** * Constructor sets context. diff --git a/src/main/java/dk/aau/netsec/hostage/Handler.java b/src/main/java/dk/aau/netsec/hostage/Handler.java index f0169a92..96d83cf4 100644 --- a/src/main/java/dk/aau/netsec/hostage/Handler.java +++ b/src/main/java/dk/aau/netsec/hostage/Handler.java @@ -1,5 +1,11 @@ package dk.aau.netsec.hostage; +import android.content.Context; +import android.content.SharedPreferences; +import android.location.Location; + +import androidx.preference.PreferenceManager; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -8,18 +14,10 @@ import java.util.List; import java.util.UUID; -import android.content.Context; -import android.content.Intent; -import android.content.SharedPreferences; -import android.location.Location; - -import androidx.preference.PreferenceManager; - import dk.aau.netsec.hostage.commons.HelperUtils; import dk.aau.netsec.hostage.commons.SubnetUtils; import dk.aau.netsec.hostage.location.CustomLocationManager; import dk.aau.netsec.hostage.location.LocationException; -import dk.aau.netsec.hostage.publisher.PublishHelper; import dk.aau.netsec.hostage.logging.AttackRecord; import dk.aau.netsec.hostage.logging.Logger; import dk.aau.netsec.hostage.logging.MessageRecord; @@ -32,6 +30,7 @@ import dk.aau.netsec.hostage.protocol.utils.amqpUtils.AMQPHandler; import dk.aau.netsec.hostage.protocol.utils.coapUtils.COAPHandler; import dk.aau.netsec.hostage.protocol.utils.mqttUtils.MQTTHandler; +import dk.aau.netsec.hostage.publisher.PublishHelper; import dk.aau.netsec.hostage.wrapper.Packet; @@ -47,26 +46,26 @@ public class Handler implements Runnable { /** * Time until the socket throws a time out. The time is in milliseconds. */ - private int TIMEOUT; + private final int TIMEOUT; - private Hostage service; - protected Protocol protocol; + private final Hostage service; + protected final Protocol protocol; private Socket client; - protected Thread thread; + protected final Thread thread; - private SharedPreferences pref; + private final SharedPreferences pref; private long attack_id; - private String externalIP; - private String BSSID; - private String SSID; + private final String externalIP; + private final String BSSID; + private final String SSID; - private int subnetMask; - private int internalIPAddress; + private final int subnetMask; + private final int internalIPAddress; private boolean logged; - private Listener listener; + private final Listener listener; /** * Constructor of the class. Initializes class variables for communication @@ -235,7 +234,6 @@ private void handleAMQPPackets() { * one. Method is synchronized for thread safety. * * @param pref The default SharedPreference of the application - * @return Unique integer attack ID */ private synchronized void getAndIncrementAttackID(SharedPreferences pref) { SharedPreferences.Editor editor = pref.edit(); diff --git a/src/main/java/dk/aau/netsec/hostage/Hostage.java b/src/main/java/dk/aau/netsec/hostage/Hostage.java index c322d92f..ad55f3e5 100644 --- a/src/main/java/dk/aau/netsec/hostage/Hostage.java +++ b/src/main/java/dk/aau/netsec/hostage/Hostage.java @@ -1,23 +1,6 @@ package dk.aau.netsec.hostage; -import java.io.IOException; -import java.lang.ref.WeakReference; -import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -import org.alfresco.jlan.smb.nt.LoadException; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.util.EntityUtils; -import org.json.JSONException; -import org.json.JSONObject; +import static dk.aau.netsec.hostage.commons.HelperUtils.getBSSID; import android.app.Notification; import android.app.NotificationChannel; @@ -50,6 +33,23 @@ import com.google.android.gms.maps.LocationSource; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + import dk.aau.netsec.hostage.commons.HelperUtils; import dk.aau.netsec.hostage.location.CustomLocationManager; import dk.aau.netsec.hostage.location.LocationException; @@ -58,8 +58,6 @@ import dk.aau.netsec.hostage.protocol.Protocol; import dk.aau.netsec.hostage.ui.activity.MainActivity; -import static dk.aau.netsec.hostage.commons.HelperUtils.getBSSID; - /** * Background service running as long as at least one protocol is active. * Service controls start and stop of protocol listener. Notifies GUI about @@ -164,7 +162,7 @@ public static Context getContext() { } static LinkedList implementedProtocols; - private CopyOnWriteArrayList listeners = new CopyOnWriteArrayList(); + private final CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); private SharedPreferences connectionInfo; private Editor connectionInfoEditor; private final IBinder mBinder = new LocalBinder(); @@ -174,7 +172,7 @@ public static Context getContext() { * * @see MainActivity #BROADCAST */ - private BroadcastReceiver netReceiver = new BroadcastReceiver() { + private final BroadcastReceiver netReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String bssid_old = connectionInfo.getString(getString(R.string.connection_info_bssid), ""); @@ -652,9 +650,7 @@ private PendingIntent intentNotificationGenerator() { intent.setAction("SHOW_HOME"); stackBuilder.addNextIntent(intent); - PendingIntent resultPendingIntent = PendingIntent.getActivity(MainActivity.getContext(), 0, intent, 0); //stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); - - return resultPendingIntent; + return PendingIntent.getActivity(MainActivity.getContext(), 0, intent, 0); } diff --git a/src/main/java/dk/aau/netsec/hostage/Listener.java b/src/main/java/dk/aau/netsec/hostage/Listener.java index 5687cf0b..d1eb4e23 100644 --- a/src/main/java/dk/aau/netsec/hostage/Listener.java +++ b/src/main/java/dk/aau/netsec/hostage/Listener.java @@ -45,21 +45,21 @@ public Listener getListener() { return this; } - private ArrayList handlers = new ArrayList<>(); + private final ArrayList handlers = new ArrayList<>(); - private Protocol protocol; + private final Protocol protocol; private ServerSocket server; private Thread thread; private Thread socketsThread; - private int port; - private Hostage service; - private ConnectionRegister conReg; + private final int port; + private final Hostage service; + private final ConnectionRegister conReg; private boolean running = false; - private static Semaphore mutex = new Semaphore(1); // to enable atomic section in portscan detection + private static final Semaphore mutex = new Semaphore(1); // to enable atomic section in portscan detection - private static Map realPorts = new LinkedHashMap<>(); + private static final Map realPorts = new LinkedHashMap<>(); /** * Constructor for the class. Instantiate class variables. @@ -342,7 +342,8 @@ private Handler newInstance(Hostage service, Listener listener, Protocol protoco * Starts a {@link Handler} with the given socket. * * @param client The socket with the accepted connection. - * @throws Exception + * @throws IllegalAccessException + * @throws InstantiationException */ private void startHandler(Socket client) throws IllegalAccessException, InstantiationException { handlers.add(newInstance(service, this, protocol.toString().equals("CIFS") ? protocol : protocol.getClass().newInstance(), client)); @@ -352,7 +353,9 @@ private void startHandler(Socket client) throws IllegalAccessException, Instanti * Creates a SSLSocket out of the given socket and starts a {@link Handler}. * * @param client The socket with the accepted connection. - * @throws Exception + * @throws InstantiationException + * @throws IllegalAccessException + * @throws IOException */ private void startSecureHandler(Socket client) throws InstantiationException, IllegalAccessException, IOException { SSLContext sslContext = ((SSLProtocol) protocol).getSSLContext(); diff --git a/src/main/java/dk/aau/netsec/hostage/MQTTListener.java b/src/main/java/dk/aau/netsec/hostage/MQTTListener.java index 7dde2df2..ad30c9c9 100644 --- a/src/main/java/dk/aau/netsec/hostage/MQTTListener.java +++ b/src/main/java/dk/aau/netsec/hostage/MQTTListener.java @@ -19,14 +19,14 @@ import static dk.aau.netsec.hostage.protocol.utils.mqttUtils.MQTTHandler.isTopicPublished; public class MQTTListener extends Listener { - private ArrayList handlers = new ArrayList(); + private final ArrayList handlers = new ArrayList<>(); private Thread thread; private Thread brokerThread; private ConnectionRegister conReg; private boolean running = false; - private int mqttport = 1883; + private final int mqttport = 1883; - private static Semaphore mutex = new Semaphore(1); + private static final Semaphore mutex = new Semaphore(1); /** * Constructor for the class. Instantiate class variables. @@ -135,31 +135,28 @@ private void fullHandler() throws InterruptedException { } private Thread brokerThread() { - brokerThread = new Thread(new Runnable() { - @Override - public void run() { - try { - if (ConnectionGuard.portscanInProgress()) - return; - - mutex.acquire(); - - if (checkPostScanInProgress()) - return; - mutex.release(); - Thread.sleep(100); // wait to see if other listeners detected a portscan - - if (ConnectionGuard.portscanInProgress()) - return; - - isTopicPublished(); - if (MQTTHandler.isAnAttackOngoing()) { - startHandler(); - conReg.newOpenConnection(); - } - } catch (InterruptedException | IOException | IllegalAccessException | InstantiationException e) { - e.printStackTrace(); + brokerThread = new Thread(() -> { + try { + if (ConnectionGuard.portscanInProgress()) + return; + + mutex.acquire(); + + if (checkPostScanInProgress()) + return; + mutex.release(); + Thread.sleep(100); // wait to see if other listeners detected a portscan + + if (ConnectionGuard.portscanInProgress()) + return; + + isTopicPublished(); + if (MQTTHandler.isAnAttackOngoing()) { + startHandler(); + conReg.newOpenConnection(); } + } catch (InterruptedException | IOException | IllegalAccessException | InstantiationException e) { + e.printStackTrace(); } }); diff --git a/src/main/java/dk/aau/netsec/hostage/commons/HelperUtils.java b/src/main/java/dk/aau/netsec/hostage/commons/HelperUtils.java index eb93454b..8f0b393c 100644 --- a/src/main/java/dk/aau/netsec/hostage/commons/HelperUtils.java +++ b/src/main/java/dk/aau/netsec/hostage/commons/HelperUtils.java @@ -111,7 +111,7 @@ public static void setIsFileInjected(boolean isFileInjected) { public static String bytesToHexString(byte[] bytes) { char[] hexArray = "0123456789ABCDEF".toCharArray(); int v; - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); for (int j = 0; j < bytes.length; j++) { v = bytes[j] & 0xFF; buffer.append(hexArray[v >>> 4]); @@ -196,7 +196,7 @@ public static byte[] fillWithZero(byte[] bytes) { */ public static byte[] fillWithZeroExtended(byte[] bytes) { byte[] zeroBytes = fillWithZero(bytes); - byte[] newBytes = new byte[zeroBytes.length + 2]; + byte[] newBytes; newBytes = HelperUtils.concat(zeroBytes, new byte[]{0x00, 0x00}); return newBytes; } @@ -352,7 +352,7 @@ public static String getSSID(Context context) { * @return MAC address of the device. */ public static String getMacAdress(Context context) { - String mac = null; + String mac; WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo connectionInfo = wifiManager.getConnectionInfo(); mac = connectionInfo.getMacAddress(); @@ -480,10 +480,10 @@ public static boolean isCellConnected(Context context) { if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { - return isMobileConn |= networkInfo.isConnected(); + return isMobileConn = networkInfo.isConnected(); } } - return isMobileConn; + return false; } public static boolean isCellurarConnected(Context context) { @@ -491,11 +491,9 @@ public static boolean isCellurarConnected(Context context) { if (context == null) return false; ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - boolean connected = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) + return connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) .isConnectedOrConnecting(); - return connected; - } /** @@ -620,13 +618,12 @@ public static int getPrefix(String[] netmask) throws UnknownHostException { public static String intToStringIp(int internalIPAddress) { - String internalIp = String.format("%d.%d.%d.%d", + + return String.format("%d.%d.%d.%d", (internalIPAddress & 0xff), (internalIPAddress >> 8 & 0xff), (internalIPAddress >> 16 & 0xff), (internalIPAddress >> 24 & 0xff)); - - return internalIp; } diff --git a/src/main/java/dk/aau/netsec/hostage/commons/JSONHelper.java b/src/main/java/dk/aau/netsec/hostage/commons/JSONHelper.java index 9e189b0b..d55fa725 100644 --- a/src/main/java/dk/aau/netsec/hostage/commons/JSONHelper.java +++ b/src/main/java/dk/aau/netsec/hostage/commons/JSONHelper.java @@ -11,12 +11,11 @@ import java.util.ArrayList; import dk.aau.netsec.hostage.logging.RecordAll; -import dk.aau.netsec.hostage.ui.activity.MainActivity; public class JSONHelper { - public void jsonWriter(JSONArray arr,File file){ + public void jsonWriter(JSONArray arr, File file) { try { int BUFFER_SIZE = 8192; String UTF8 = "utf8"; @@ -31,7 +30,7 @@ public void jsonWriter(JSONArray arr,File file){ } } - public void jsonWriter(ArrayList records,File filepath){ + public void jsonWriter(ArrayList records, File filepath) { try { int BUFFER_SIZE = 8192; String UTF8 = "utf8"; @@ -39,7 +38,7 @@ public void jsonWriter(ArrayList records,File filepath){ BufferedWriter fnw = new BufferedWriter(new OutputStreamWriter(fout, UTF8), BUFFER_SIZE); JSONArray arr = new JSONArray(); - for(RecordAll record: records) { + for (RecordAll record : records) { arr.put(record.toJSON()); } fnw.write(arr.toString()); @@ -50,7 +49,7 @@ public void jsonWriter(ArrayList records,File filepath){ } } - public String getFilePath(File file){ + public String getFilePath(File file) { return file.getAbsolutePath(); } diff --git a/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java b/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java index 5728071f..edd72384 100644 --- a/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java +++ b/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java @@ -275,7 +275,7 @@ public String[] getAllAddresses() { * Convert a packed integer address into a 4-element array */ private int[] toArray(int val) { - int ret[] = new int[4]; + int[] ret = new int[4]; for (int j = 3; j >= 0; --j) { ret[j] |= ((val >>> 8*(3-j)) & (0xff)); } @@ -302,15 +302,14 @@ private String format(int[] octets) { */ @Override public String toString() { - final StringBuilder buf = new StringBuilder(); - buf.append("CIDR Signature:\t[").append(getCidrSignature()).append("]") - .append(" Netmask: [").append(getNetmask()).append("]\n") - .append("Network:\t[").append(getNetworkAddress()).append("]\n") - .append("Broadcast:\t[").append(getBroadcastAddress()).append("]\n") - .append("First Address:\t[").append(getLowAddress()).append("]\n") - .append("Last Address:\t[").append(getHighAddress()).append("]\n") - .append("# Addresses:\t[").append(getAddressCount()).append("]\n"); - return buf.toString(); + String buf = "CIDR Signature:\t[" + getCidrSignature() + "]" + + " Netmask: [" + getNetmask() + "]\n" + + "Network:\t[" + getNetworkAddress() + "]\n" + + "Broadcast:\t[" + getBroadcastAddress() + "]\n" + + "First Address:\t[" + getLowAddress() + "]\n" + + "Last Address:\t[" + getHighAddress() + "]\n" + + "# Addresses:\t[" + getAddressCount() + "]\n"; + return buf; } } diff --git a/src/main/java/dk/aau/netsec/hostage/deprecated/UglyDbHelper.java b/src/main/java/dk/aau/netsec/hostage/deprecated/UglyDbHelper.java index d6d6fbd2..78558b35 100644 --- a/src/main/java/dk/aau/netsec/hostage/deprecated/UglyDbHelper.java +++ b/src/main/java/dk/aau/netsec/hostage/deprecated/UglyDbHelper.java @@ -28,964 +28,951 @@ * record except the SSID.
* {@link #TABLE_BSSIDS} contains the BSSID of all recorded Networks and the * corresponding SSID.
- * + * * @author Lars Pandikow */ public class UglyDbHelper extends SQLiteOpenHelper { - // All Static variables - // Database Version - private static final int DATABASE_VERSION = 1; - - // Database Name - private static final String DATABASE_NAME = "hostage.db"; - - // Contacts table names - private static final String TABLE_ATTACK_INFO = "attack"; - private static final String TABLE_RECORDS = "packet"; - private static final String TABLE_BSSIDS = "network"; - private static final String TABLE_PROFILES = "profiles"; - - // Contacts Table Columns names - public static final String KEY_ID = "_id"; - public static final String KEY_ATTACK_ID = "_attack_id"; - public static final String KEY_TYPE = "type"; - public static final String KEY_TIME = "packet_timestamp"; - public static final String KEY_PACKET = "packet"; - public static final String KEY_PROTOCOL = "protocol"; - public static final String KEY_EXTERNAL_IP = "externalIP"; - public static final String KEY_LOCAL_IP = "localIP"; - public static final String KEY_LOCAL_PORT = "localPort"; - public static final String KEY_REMOTE_IP = "remoteIP"; - public static final String KEY_REMOTE_PORT = "remotePort"; - public static final String KEY_BSSID = "_bssid"; - public static final String KEY_SSID = "ssid"; - public static final String KEY_LATITUDE = "latitude"; - public static final String KEY_LONGITUDE = "longitude"; - public static final String KEY_ACCURACY = "accuracy"; - public static final String KEY_GEO_TIMESTAMP = "geo_timestamp"; - - public static final String KEY_PROFILE_ID = "_profile_id"; - public static final String KEY_PROFILE_NAME = "profile_name"; - public static final String KEY_PROFILE_DESCRIPTION = "profile_description"; - public static final String KEY_PROFILE_ICON = "profile_icon"; - public static final String KEY_PROFILE_EDITABLE = "profile_editable"; - public static final String KEY_PROFILE_ACTIVE = "profile_active"; - public static final String KEY_PROFILE_ICON_NAME = "profile_icon_name"; - - // Database sql create statements - private static final String CREATE_PROFILE_TABLE = "CREATE TABLE " + TABLE_PROFILES + "(" + KEY_PROFILE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," - + KEY_PROFILE_NAME + " TEXT," + KEY_PROFILE_DESCRIPTION + " TEXT," + KEY_PROFILE_ICON + " TEXT," + KEY_PROFILE_ICON_NAME + " TEXT," - + KEY_PROFILE_EDITABLE + " INTEGER," + KEY_PROFILE_ACTIVE + " INTEGER" + ")"; - - private static final String CREATE_RECORD_TABLE = "CREATE TABLE " + TABLE_RECORDS + "(" + KEY_ID + " INTEGER NOT NULL," + KEY_ATTACK_ID - + " INTEGER NOT NULL," + KEY_TYPE + " TEXT," + KEY_TIME + " INTEGER," + KEY_PACKET + " TEXT," + "FOREIGN KEY(" + KEY_ATTACK_ID + ") REFERENCES " - + TABLE_ATTACK_INFO + "(" + KEY_ATTACK_ID + ")," + "PRIMARY KEY(" + KEY_ID + ", " + KEY_ATTACK_ID + ")" + ")"; - - private static final String CREATE_ATTACK_INFO_TABLE = "CREATE TABLE " + TABLE_ATTACK_INFO + "(" + KEY_ATTACK_ID + " INTEGER PRIMARY KEY," + KEY_PROTOCOL - + " TEXT," + KEY_EXTERNAL_IP + " TEXT," + KEY_LOCAL_IP + " BLOB," + KEY_LOCAL_PORT + " INTEGER," + KEY_REMOTE_IP + " BLOB," + KEY_REMOTE_PORT - + " INTEGER," + KEY_BSSID + " TEXT," + "FOREIGN KEY(" + KEY_BSSID + ") REFERENCES " + TABLE_BSSIDS + "(" + KEY_BSSID + ")" + ")"; - - private static final String CREATE_BSSID_TABLE = "CREATE TABLE " + TABLE_BSSIDS + "(" + KEY_BSSID + " TEXT PRIMARY KEY," + KEY_SSID + " TEXT," - + KEY_LATITUDE + " INTEGER," + KEY_LONGITUDE + " INTEGER," + KEY_ACCURACY + " INTEGER," + KEY_GEO_TIMESTAMP + " INTEGER" + ")"; - - public UglyDbHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - /* - * // Contacts Table Columns names private static final String KEY_ID = - * "_id"; private static final String KEY_ATTACK_ID = "_attack_id"; private - * static final String KEY_TYPE = "type"; private static final String - * KEY_TIME = "timestamp"; private static final String KEY_PACKET = - * "packet"; private static final String KEY_PROTOCOL = "protocol"; private - * static final String KEY_EXTERNAL_IP ="externalIP"; private static final - * String KEY_LOCAL_IP = "localIP"; private static final String - * KEY_LOCAL_HOSTNAME = "localHostName"; private static final String - * KEY_LOCAL_PORT = "localPort"; private static final String KEY_REMOTE_IP = - * "remoteIP"; private static final String KEY_REMOTE_HOSTNAME = - * "remoteHostName"; private static final String KEY_REMOTE_PORT = - * "remotePort"; private static final String KEY_BSSID = "_bssid"; private - * static final String KEY_SSID = "ssid"; private static final String - * KEY_LATITUDE = "latitude"; private static final String KEY_LONGITUDE = - * "longitude"; private static final String KEY_ACCURACY = "accuracy"; - */ - - /** - * Gets all received {@link Record Records} for the specified information in - * the LogFilter ordered by date. - * - * @return A ArrayList with all received {@link Record Records} for the - * LogFilter. - */ - public ArrayList getRecordsForFilter(LogFilter filter) { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")"; - - // TIMESTAMPS - selectQuery = selectQuery + " WHERE " + TABLE_RECORDS + "." + KEY_TIME; - selectQuery = selectQuery + " < " + filter.getBelowTimestamp(); - selectQuery = selectQuery + " AND " + TABLE_RECORDS + "." + KEY_TIME; - selectQuery = selectQuery + " > " + filter.getAboveTimestamp(); - - if (filter.getBSSIDs() != null && filter.getBSSIDs().size() > 0) { - selectQuery = selectQuery + " AND "; - selectQuery = selectQuery + filter.getBSSIDQueryStatement(TABLE_BSSIDS, KEY_BSSID); - } - if (filter.getESSIDs() != null && filter.getESSIDs().size() > 0) { - selectQuery = selectQuery + " AND "; - selectQuery = selectQuery + filter.getESSIDQueryStatement(TABLE_BSSIDS, KEY_SSID); - } - if (filter.getProtocols() != null && filter.getProtocols().size() > 0) { - selectQuery = selectQuery + " AND "; - selectQuery = selectQuery + filter.getProtocolsQueryStatement(TABLE_ATTACK_INFO, KEY_PROTOCOL); - } - - selectQuery = selectQuery + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; - - if (filter.getSorttype() == LogFilter.SortType.packet_timestamp) { - // DESC - selectQuery = selectQuery + " ORDER BY " + filter.getSorttype() + " DESC"; - } else { - selectQuery = selectQuery + " ORDER BY " + filter.getSorttype(); - } - - System.out.println(selectQuery); - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - - // return record list - db.close(); - return recordList; - } - - /** - * Gets all non duplicate Records For the key BSSID. - * - * @return A ArrayList with received Records. - */ - public ArrayList getUniqueBSSIDRecords() { - return this.getUniqueDataEntryForKeyType(KEY_BSSID, TABLE_BSSIDS); - } - - /** - * Gets all non duplicate Records For the key ESSID. - * - * @return A ArrayList with received Records. - */ - public ArrayList getUniqueESSIDRecords() { - return this.getUniqueDataEntryForKeyType(KEY_SSID, TABLE_BSSIDS); - } - - public ArrayList getUniqueESSIDRecordsForProtocol(String protocol) { - return this.getUniqueIDForProtocol(KEY_SSID, protocol); - } - - public ArrayList getUniqueBSSIDRecordsForProtocol(String protocol) { - return this.getUniqueIDForProtocol(KEY_BSSID, protocol); - } - - private ArrayList getUniqueIDForProtocol(String id, String protocol) { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT DISTINCT " + id + " FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ") " + " WHERE " - + TABLE_ATTACK_INFO + "." + KEY_PROTOCOL + " = " + "'" + protocol + "'" + " ORDER BY " + id; // " NATURAL JOIN " - // + - // TABLE_ATTACK_INFO - // + - // " NATURAL JOIN " - // + - // TABLE_BSSIDS - // + - // " NATURAL JOIN " - // + - // TABLE_PORTS - // + - - // ORDERED BY TIME - System.out.println(selectQuery); - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - String record = cursor.getString(0); - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - - // return record list - db.close(); - return recordList; - } - - /** - * Gets all non duplicate Data Entry For a specific KeyType ( e.g. BSSIDs). - * - * @return A ArrayList with received Records. - */ - public ArrayList getUniqueDataEntryForKeyType(String keyType, String table) { - ArrayList recordList = new ArrayList(); - // String selectQuery = "SELECT * FROM " + TABLE_RECORDS + - // " NATURAL JOIN " + TABLE_ATTACK_INFO + " NATURAL JOIN " + - // TABLE_BSSIDS + " NATURAL JOIN " + TABLE_PORTS; - String selectQuery = "SELECT DISTINCT " + keyType + " FROM " + table + " ORDER BY " + keyType; // " NATURAL JOIN " - // + - // TABLE_ATTACK_INFO - // + - // " NATURAL JOIN " - // + - // TABLE_BSSIDS - // + - // " NATURAL JOIN " - // + - // TABLE_PORTS - // + - - // ORDERED BY TIME - System.out.println(selectQuery); - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - String record = cursor.getString(0); - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - - // return record list - db.close(); - return recordList; - } - - /** - * Adds a given {@link Record} to the database. - * - * @param record - * The added {@link Record} . - */ - public void addRecord(Record record) { - SQLiteDatabase db = this.getWritableDatabase(); - - HashMap bssidValues = new HashMap(); - bssidValues.put(KEY_BSSID, record.getBssid()); - bssidValues.put(KEY_SSID, record.getSsid()); - bssidValues.put(KEY_LATITUDE, record.getLatitude()); - bssidValues.put(KEY_LONGITUDE, record.getLongitude()); - bssidValues.put(KEY_ACCURACY, record.getAccuracy()); - bssidValues.put(KEY_GEO_TIMESTAMP, record.getTimestampLocation()); - - ContentValues attackValues = new ContentValues(); - attackValues.put(KEY_ATTACK_ID, record.getAttack_id()); // Log Attack ID - attackValues.put(KEY_PROTOCOL, record.getProtocol()); - attackValues.put(KEY_EXTERNAL_IP, record.getExternalIP()); - attackValues.put(KEY_LOCAL_IP, record.getLocalIP()); // Log Local IP - attackValues.put(KEY_LOCAL_PORT, record.getLocalPort()); - attackValues.put(KEY_REMOTE_IP, record.getRemoteIP()); // Log Remote IP - attackValues.put(KEY_REMOTE_PORT, record.getRemotePort()); // Log Remote - // Port - attackValues.put(KEY_BSSID, record.getBssid()); - - ContentValues recordValues = new ContentValues(); - recordValues.put(KEY_ID, record.getId()); // Log Message Number - recordValues.put(KEY_ATTACK_ID, record.getAttack_id()); // Log Attack ID - recordValues.put(KEY_TYPE, record.getType().name()); // Log Type - recordValues.put(KEY_TIME, record.getTimestamp()); // Log Timestamp - recordValues.put(KEY_PACKET, record.getPacket()); // Log Packet - - // Inserting Rows - db.insertWithOnConflict(TABLE_ATTACK_INFO, null, attackValues, SQLiteDatabase.CONFLICT_REPLACE); - db.insert(TABLE_RECORDS, null, recordValues); - db.close(); // Closing database connection - // Update Network Information - updateNetworkInformation(bssidValues); - } - - /** - * Determines if a network with given BSSID has already been recorded as - * malicious. - * - * @param BSSID - * The BSSID of the network. - * @return True if an attack has been recorded in a network with the given - * BSSID, else false. - */ - public boolean bssidSeen(String BSSID) { - String countQuery = "SELECT * FROM " + TABLE_BSSIDS + " WHERE " + KEY_BSSID + " = " + "'" + BSSID + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - int result = cursor.getCount(); - cursor.close(); - db.close(); - return result > 0; - } - - public int numBssidSeen(String BSSID) { - String countQuery = "SELECT COUNT(*) FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ")" + " WHERE " - + TABLE_BSSIDS + "." + KEY_BSSID + " = " + "'" + BSSID + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - cursor.moveToFirst(); - int result = cursor.getInt(0); - cursor.close(); - db.close(); - return result; - } - - public int numBssidSeen(String protocol, String BSSID) { - String countQuery = "SELECT COUNT(*) FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ")" + " WHERE " - + TABLE_ATTACK_INFO + "." + KEY_PROTOCOL + " = " + "'" + protocol + "'" + " AND " + TABLE_BSSIDS + "." + KEY_BSSID + " = " + "'" + BSSID + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - cursor.moveToFirst(); - int result = cursor.getInt(0); - cursor.close(); - db.close(); - return result; - } - - /** - * Determines if an attack has been recorded on a specific protocol in a - * network with a given BSSID. - * - * @param protocol - * The - * {@link - * } to inspect. - * @param BSSID - * The BSSID of the network. - * @return True if an attack on the given protocol has been recorded in a - * network with the given BSSID, else false. - */ - public boolean bssidSeen(String protocol, String BSSID) { - String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ")" + " WHERE " + TABLE_ATTACK_INFO - + "." + KEY_PROTOCOL + " = " + "'" + protocol + "'" + " AND " + TABLE_BSSIDS + "." + KEY_BSSID + " = " + "'" + BSSID + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - int result = cursor.getCount(); - cursor.close(); - db.close(); - return result > 0; - } - - /** - * Deletes all records from {@link #TABLE_RECORDS}. - */ - public void clearData() { - SQLiteDatabase db = this.getReadableDatabase(); - db.delete(TABLE_RECORDS, null, null); - db.delete(TABLE_ATTACK_INFO, null, null); - db.delete(TABLE_PROFILES, null, null); - db.close(); - } - - /** - * Deletes all records from {@link #TABLE_RECORDS} with a specific BSSID. - * - * @param bssid - * The BSSID to match against. - */ - public void deleteByBSSID(String bssid) { - SQLiteDatabase db = this.getReadableDatabase(); - db.delete(TABLE_RECORDS, KEY_BSSID + " = ?", new String[] { bssid }); - db.delete(TABLE_ATTACK_INFO, KEY_BSSID + " = ?", new String[] { bssid }); - db.close(); - } - - // TODO Delete statement �berarbeiten - /** - * Deletes all records from {@link #TABLE_RECORDS} with a time stamp smaller - * then the given - * - * @param date - * A Date represented in milliseconds. - */ - public void deleteByDate(long date) { - SQLiteDatabase db = this.getReadableDatabase(); - String deleteQuery = "DELETE FROM " + TABLE_RECORDS + " WHERE " + KEY_TIME + " < " + date; - // TODO Delete statement �berarbeiten - // String deleteQuery2 = "DELETE " - db.execSQL(deleteQuery); - db.close(); - } - - /** - * Deletes all records from {@link #TABLE_RECORDS} with a specific Attack ID. - * - * @param attackID - * The Attack ID to match against. - */ - public void deleteByAttackID(long attackID) { - SQLiteDatabase db = this.getReadableDatabase(); - db.delete(TABLE_RECORDS, KEY_ATTACK_ID + " = ?", new String[] { String.valueOf(attackID) }); - db.delete(TABLE_ATTACK_INFO, KEY_ATTACK_ID + " = ?", new String[] { String.valueOf(attackID) }); - db.close(); - } - - /** - * Returns a String array with all BSSIDs stored in the database. - * - * @return String[] of all recorded BSSIDs. - */ - public String[] getAllBSSIDS() { - String selectQuery = "SELECT * FROM " + TABLE_BSSIDS; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - String[] bssidList = new String[cursor.getCount()]; - int counter = 0; - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - bssidList[counter] = cursor.getString(0); - counter++; - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - return bssidList; - } - - /** - * Gets all received {@link Record Records} for every attack identified by - * its attack id and ordered by date. - * - * @return A ArrayList with all received {@link Record Records} for each - * attack id in the Database. - */ - public ArrayList getAllReceivedRecordsOfEachAttack() { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")" + " WHERE " + KEY_TYPE + "='RECEIVE'" + " ORDER BY " + TABLE_RECORDS + "." + KEY_TIME; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - - // return record list - db.close(); - return recordList; - } - - /** - * Gets all {@link Record Records} saved in the database. - * - * @return A ArrayList of all the {@link Record Records} in the Database. - */ - public ArrayList getAllRecords() { - ArrayList recordList = new ArrayList(); - // Select All Query - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")"; - - SQLiteDatabase db = this.getWritableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - Log.i("Database", "Start loop"); - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Log.i("Database", "Add Record"); - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - // return record list - return recordList; - } - - /** - * Determines the number of different attack_ids in the database. - * - * @return The number of different attack_ids in the database. - */ - public int getAttackCount() { - String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); + // All Static variables + // Database Version + private static final int DATABASE_VERSION = 1; + + // Database Name + private static final String DATABASE_NAME = "hostage.db"; + + // Contacts table names + private static final String TABLE_ATTACK_INFO = "attack"; + private static final String TABLE_RECORDS = "packet"; + private static final String TABLE_BSSIDS = "network"; + private static final String TABLE_PROFILES = "profiles"; + + // Contacts Table Columns names + public static final String KEY_ID = "_id"; + public static final String KEY_ATTACK_ID = "_attack_id"; + public static final String KEY_TYPE = "type"; + public static final String KEY_TIME = "packet_timestamp"; + public static final String KEY_PACKET = "packet"; + public static final String KEY_PROTOCOL = "protocol"; + public static final String KEY_EXTERNAL_IP = "externalIP"; + public static final String KEY_LOCAL_IP = "localIP"; + public static final String KEY_LOCAL_PORT = "localPort"; + public static final String KEY_REMOTE_IP = "remoteIP"; + public static final String KEY_REMOTE_PORT = "remotePort"; + public static final String KEY_BSSID = "_bssid"; + public static final String KEY_SSID = "ssid"; + public static final String KEY_LATITUDE = "latitude"; + public static final String KEY_LONGITUDE = "longitude"; + public static final String KEY_ACCURACY = "accuracy"; + public static final String KEY_GEO_TIMESTAMP = "geo_timestamp"; + + public static final String KEY_PROFILE_ID = "_profile_id"; + public static final String KEY_PROFILE_NAME = "profile_name"; + public static final String KEY_PROFILE_DESCRIPTION = "profile_description"; + public static final String KEY_PROFILE_ICON = "profile_icon"; + public static final String KEY_PROFILE_EDITABLE = "profile_editable"; + public static final String KEY_PROFILE_ACTIVE = "profile_active"; + public static final String KEY_PROFILE_ICON_NAME = "profile_icon_name"; + + // Database sql create statements + private static final String CREATE_PROFILE_TABLE = "CREATE TABLE " + TABLE_PROFILES + "(" + KEY_PROFILE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + + KEY_PROFILE_NAME + " TEXT," + KEY_PROFILE_DESCRIPTION + " TEXT," + KEY_PROFILE_ICON + " TEXT," + KEY_PROFILE_ICON_NAME + " TEXT," + + KEY_PROFILE_EDITABLE + " INTEGER," + KEY_PROFILE_ACTIVE + " INTEGER" + ")"; + + private static final String CREATE_RECORD_TABLE = "CREATE TABLE " + TABLE_RECORDS + "(" + KEY_ID + " INTEGER NOT NULL," + KEY_ATTACK_ID + + " INTEGER NOT NULL," + KEY_TYPE + " TEXT," + KEY_TIME + " INTEGER," + KEY_PACKET + " TEXT," + "FOREIGN KEY(" + KEY_ATTACK_ID + ") REFERENCES " + + TABLE_ATTACK_INFO + "(" + KEY_ATTACK_ID + ")," + "PRIMARY KEY(" + KEY_ID + ", " + KEY_ATTACK_ID + ")" + ")"; + + private static final String CREATE_ATTACK_INFO_TABLE = "CREATE TABLE " + TABLE_ATTACK_INFO + "(" + KEY_ATTACK_ID + " INTEGER PRIMARY KEY," + KEY_PROTOCOL + + " TEXT," + KEY_EXTERNAL_IP + " TEXT," + KEY_LOCAL_IP + " BLOB," + KEY_LOCAL_PORT + " INTEGER," + KEY_REMOTE_IP + " BLOB," + KEY_REMOTE_PORT + + " INTEGER," + KEY_BSSID + " TEXT," + "FOREIGN KEY(" + KEY_BSSID + ") REFERENCES " + TABLE_BSSIDS + "(" + KEY_BSSID + ")" + ")"; + + private static final String CREATE_BSSID_TABLE = "CREATE TABLE " + TABLE_BSSIDS + "(" + KEY_BSSID + " TEXT PRIMARY KEY," + KEY_SSID + " TEXT," + + KEY_LATITUDE + " INTEGER," + KEY_LONGITUDE + " INTEGER," + KEY_ACCURACY + " INTEGER," + KEY_GEO_TIMESTAMP + " INTEGER" + ")"; + + public UglyDbHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + /* + * // Contacts Table Columns names private static final String KEY_ID = + * "_id"; private static final String KEY_ATTACK_ID = "_attack_id"; private + * static final String KEY_TYPE = "type"; private static final String + * KEY_TIME = "timestamp"; private static final String KEY_PACKET = + * "packet"; private static final String KEY_PROTOCOL = "protocol"; private + * static final String KEY_EXTERNAL_IP ="externalIP"; private static final + * String KEY_LOCAL_IP = "localIP"; private static final String + * KEY_LOCAL_HOSTNAME = "localHostName"; private static final String + * KEY_LOCAL_PORT = "localPort"; private static final String KEY_REMOTE_IP = + * "remoteIP"; private static final String KEY_REMOTE_HOSTNAME = + * "remoteHostName"; private static final String KEY_REMOTE_PORT = + * "remotePort"; private static final String KEY_BSSID = "_bssid"; private + * static final String KEY_SSID = "ssid"; private static final String + * KEY_LATITUDE = "latitude"; private static final String KEY_LONGITUDE = + * "longitude"; private static final String KEY_ACCURACY = "accuracy"; + */ + + /** + * Gets all received {@link Record Records} for the specified information in + * the LogFilter ordered by date. + * + * @return A ArrayList with all received {@link Record Records} for the + * LogFilter. + */ + public ArrayList getRecordsForFilter(LogFilter filter) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")"; + + // TIMESTAMPS + selectQuery = selectQuery + " WHERE " + TABLE_RECORDS + "." + KEY_TIME; + selectQuery = selectQuery + " < " + filter.getBelowTimestamp(); + selectQuery = selectQuery + " AND " + TABLE_RECORDS + "." + KEY_TIME; + selectQuery = selectQuery + " > " + filter.getAboveTimestamp(); + + if (filter.getBSSIDs() != null && filter.getBSSIDs().size() > 0) { + selectQuery = selectQuery + " AND "; + selectQuery = selectQuery + filter.getBSSIDQueryStatement(TABLE_BSSIDS, KEY_BSSID); + } + if (filter.getESSIDs() != null && filter.getESSIDs().size() > 0) { + selectQuery = selectQuery + " AND "; + selectQuery = selectQuery + filter.getESSIDQueryStatement(TABLE_BSSIDS, KEY_SSID); + } + if (filter.getProtocols() != null && filter.getProtocols().size() > 0) { + selectQuery = selectQuery + " AND "; + selectQuery = selectQuery + filter.getProtocolsQueryStatement(TABLE_ATTACK_INFO, KEY_PROTOCOL); + } + + selectQuery = selectQuery + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; + + if (filter.getSorttype() == LogFilter.SortType.packet_timestamp) { + // DESC + selectQuery = selectQuery + " ORDER BY " + filter.getSorttype() + " DESC"; + } else { + selectQuery = selectQuery + " ORDER BY " + filter.getSorttype(); + } + + System.out.println(selectQuery); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return record list + db.close(); + return recordList; + } + + /** + * Gets all non duplicate Records For the key BSSID. + * + * @return A ArrayList with received Records. + */ + public ArrayList getUniqueBSSIDRecords() { + return this.getUniqueDataEntryForKeyType(KEY_BSSID, TABLE_BSSIDS); + } + + /** + * Gets all non duplicate Records For the key ESSID. + * + * @return A ArrayList with received Records. + */ + public ArrayList getUniqueESSIDRecords() { + return this.getUniqueDataEntryForKeyType(KEY_SSID, TABLE_BSSIDS); + } + + public ArrayList getUniqueESSIDRecordsForProtocol(String protocol) { + return this.getUniqueIDForProtocol(KEY_SSID, protocol); + } + + public ArrayList getUniqueBSSIDRecordsForProtocol(String protocol) { + return this.getUniqueIDForProtocol(KEY_BSSID, protocol); + } + + private ArrayList getUniqueIDForProtocol(String id, String protocol) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT DISTINCT " + id + " FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ") " + " WHERE " + + TABLE_ATTACK_INFO + "." + KEY_PROTOCOL + " = " + "'" + protocol + "'" + " ORDER BY " + id; // " NATURAL JOIN " + // + + // TABLE_ATTACK_INFO + // + + // " NATURAL JOIN " + // + + // TABLE_BSSIDS + // + + // " NATURAL JOIN " + // + + // TABLE_PORTS + // + + + // ORDERED BY TIME + System.out.println(selectQuery); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + String record = cursor.getString(0); + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return record list + db.close(); + return recordList; + } + + /** + * Gets all non duplicate Data Entry For a specific KeyType ( e.g. BSSIDs). + * + * @return A ArrayList with received Records. + */ + public ArrayList getUniqueDataEntryForKeyType(String keyType, String table) { + ArrayList recordList = new ArrayList<>(); + // String selectQuery = "SELECT * FROM " + TABLE_RECORDS + + // " NATURAL JOIN " + TABLE_ATTACK_INFO + " NATURAL JOIN " + + // TABLE_BSSIDS + " NATURAL JOIN " + TABLE_PORTS; + String selectQuery = "SELECT DISTINCT " + keyType + " FROM " + table + " ORDER BY " + keyType; // " NATURAL JOIN " + // + + // TABLE_ATTACK_INFO + // + + // " NATURAL JOIN " + // + + // TABLE_BSSIDS + // + + // " NATURAL JOIN " + // + + // TABLE_PORTS + // + + + // ORDERED BY TIME + System.out.println(selectQuery); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + String record = cursor.getString(0); + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return record list + db.close(); + return recordList; + } + + /** + * Adds a given {@link Record} to the database. + * + * @param record The added {@link Record} . + */ + public void addRecord(Record record) { + SQLiteDatabase db = this.getWritableDatabase(); + + HashMap bssidValues = new HashMap<>(); + bssidValues.put(KEY_BSSID, record.getBssid()); + bssidValues.put(KEY_SSID, record.getSsid()); + bssidValues.put(KEY_LATITUDE, record.getLatitude()); + bssidValues.put(KEY_LONGITUDE, record.getLongitude()); + bssidValues.put(KEY_ACCURACY, record.getAccuracy()); + bssidValues.put(KEY_GEO_TIMESTAMP, record.getTimestampLocation()); + + ContentValues attackValues = new ContentValues(); + attackValues.put(KEY_ATTACK_ID, record.getAttack_id()); // Log Attack ID + attackValues.put(KEY_PROTOCOL, record.getProtocol()); + attackValues.put(KEY_EXTERNAL_IP, record.getExternalIP()); + attackValues.put(KEY_LOCAL_IP, record.getLocalIP()); // Log Local IP + attackValues.put(KEY_LOCAL_PORT, record.getLocalPort()); + attackValues.put(KEY_REMOTE_IP, record.getRemoteIP()); // Log Remote IP + attackValues.put(KEY_REMOTE_PORT, record.getRemotePort()); // Log Remote + // Port + attackValues.put(KEY_BSSID, record.getBssid()); + + ContentValues recordValues = new ContentValues(); + recordValues.put(KEY_ID, record.getId()); // Log Message Number + recordValues.put(KEY_ATTACK_ID, record.getAttack_id()); // Log Attack ID + recordValues.put(KEY_TYPE, record.getType().name()); // Log Type + recordValues.put(KEY_TIME, record.getTimestamp()); // Log Timestamp + recordValues.put(KEY_PACKET, record.getPacket()); // Log Packet + + // Inserting Rows + db.insertWithOnConflict(TABLE_ATTACK_INFO, null, attackValues, SQLiteDatabase.CONFLICT_REPLACE); + db.insert(TABLE_RECORDS, null, recordValues); + db.close(); // Closing database connection + // Update Network Information + updateNetworkInformation(bssidValues); + } + + /** + * Determines if a network with given BSSID has already been recorded as + * malicious. + * + * @param BSSID The BSSID of the network. + * @return True if an attack has been recorded in a network with the given + * BSSID, else false. + */ + public boolean bssidSeen(String BSSID) { + String countQuery = "SELECT * FROM " + TABLE_BSSIDS + " WHERE " + KEY_BSSID + " = " + "'" + BSSID + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + int result = cursor.getCount(); + cursor.close(); + db.close(); + return result > 0; + } + + public int numBssidSeen(String BSSID) { + String countQuery = "SELECT COUNT(*) FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ")" + " WHERE " + + TABLE_BSSIDS + "." + KEY_BSSID + " = " + "'" + BSSID + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + cursor.moveToFirst(); + int result = cursor.getInt(0); + cursor.close(); + db.close(); + return result; + } + + public int numBssidSeen(String protocol, String BSSID) { + String countQuery = "SELECT COUNT(*) FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ")" + " WHERE " + + TABLE_ATTACK_INFO + "." + KEY_PROTOCOL + " = " + "'" + protocol + "'" + " AND " + TABLE_BSSIDS + "." + KEY_BSSID + " = " + "'" + BSSID + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + cursor.moveToFirst(); + int result = cursor.getInt(0); + cursor.close(); + db.close(); + return result; + } + + /** + * Determines if an attack has been recorded on a specific protocol in a + * network with a given BSSID. + * + * @param protocol The + * {@link + * } to inspect. + * @param BSSID The BSSID of the network. + * @return True if an attack on the given protocol has been recorded in a + * network with the given BSSID, else false. + */ + public boolean bssidSeen(String protocol, String BSSID) { + String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + ")" + " WHERE " + TABLE_ATTACK_INFO + + "." + KEY_PROTOCOL + " = " + "'" + protocol + "'" + " AND " + TABLE_BSSIDS + "." + KEY_BSSID + " = " + "'" + BSSID + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + int result = cursor.getCount(); + cursor.close(); + db.close(); + return result > 0; + } + + /** + * Deletes all records from {@link #TABLE_RECORDS}. + */ + public void clearData() { + SQLiteDatabase db = this.getReadableDatabase(); + db.delete(TABLE_RECORDS, null, null); + db.delete(TABLE_ATTACK_INFO, null, null); + db.delete(TABLE_PROFILES, null, null); + db.close(); + } + + /** + * Deletes all records from {@link #TABLE_RECORDS} with a specific BSSID. + * + * @param bssid The BSSID to match against. + */ + public void deleteByBSSID(String bssid) { + SQLiteDatabase db = this.getReadableDatabase(); + db.delete(TABLE_RECORDS, KEY_BSSID + " = ?", new String[]{bssid}); + db.delete(TABLE_ATTACK_INFO, KEY_BSSID + " = ?", new String[]{bssid}); + db.close(); + } + + // TODO Delete statement �berarbeiten + + /** + * Deletes all records from {@link #TABLE_RECORDS} with a time stamp smaller + * then the given + * + * @param date A Date represented in milliseconds. + */ + public void deleteByDate(long date) { + SQLiteDatabase db = this.getReadableDatabase(); + String deleteQuery = "DELETE FROM " + TABLE_RECORDS + " WHERE " + KEY_TIME + " < " + date; + // TODO Delete statement �berarbeiten + // String deleteQuery2 = "DELETE " + db.execSQL(deleteQuery); + db.close(); + } + + /** + * Deletes all records from {@link #TABLE_RECORDS} with a specific Attack ID. + * + * @param attackID The Attack ID to match against. + */ + public void deleteByAttackID(long attackID) { + SQLiteDatabase db = this.getReadableDatabase(); + db.delete(TABLE_RECORDS, KEY_ATTACK_ID + " = ?", new String[]{String.valueOf(attackID)}); + db.delete(TABLE_ATTACK_INFO, KEY_ATTACK_ID + " = ?", new String[]{String.valueOf(attackID)}); + db.close(); + } + + /** + * Returns a String array with all BSSIDs stored in the database. + * + * @return String[] of all recorded BSSIDs. + */ + public String[] getAllBSSIDS() { + String selectQuery = "SELECT * FROM " + TABLE_BSSIDS; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + String[] bssidList = new String[cursor.getCount()]; + int counter = 0; + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + bssidList[counter] = cursor.getString(0); + counter++; + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + return bssidList; + } + + /** + * Gets all received {@link Record Records} for every attack identified by + * its attack id and ordered by date. + * + * @return A ArrayList with all received {@link Record Records} for each + * attack id in the Database. + */ + public ArrayList getAllReceivedRecordsOfEachAttack() { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")" + " WHERE " + KEY_TYPE + "='RECEIVE'" + " ORDER BY " + TABLE_RECORDS + "." + KEY_TIME; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return record list + db.close(); + return recordList; + } + + /** + * Gets all {@link Record Records} saved in the database. + * + * @return A ArrayList of all the {@link Record Records} in the Database. + */ + public ArrayList getAllRecords() { + ArrayList recordList = new ArrayList<>(); + // Select All Query + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")"; + + SQLiteDatabase db = this.getWritableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + Log.i("Database", "Start loop"); + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Log.i("Database", "Add Record"); + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + // return record list + return recordList; + } + + /** + * Determines the number of different attack_ids in the database. + * + * @return The number of different attack_ids in the database. + */ + public int getAttackCount() { + String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); if (!cursor.moveToFirst()) return 0; int result = cursor.getCount(); - cursor.close(); - - // return count - db.close(); - return result; - } - - /** - * Determines the number of different attack_ids for a specific protocol in - * the database. - * - * @param protocol - * The String representation of the - * {@link - * } - * @return The number of different attack_ids in the database. - */ - public int getAttackPerProtocolCount(String protocol) { - String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO + " WHERE " + KEY_PROTOCOL + " = " + "'" + protocol + "'"; - SQLiteDatabase db = this.getReadableDatabase(); + cursor.close(); + + // return count + db.close(); + return result; + } + + /** + * Determines the number of different attack_ids for a specific protocol in + * the database. + * + * @param protocol The String representation of the + * {@link + * } + * @return The number of different attack_ids in the database. + */ + public int getAttackPerProtocolCount(String protocol) { + String countQuery = "SELECT * FROM " + TABLE_ATTACK_INFO + " WHERE " + KEY_PROTOCOL + " = " + "'" + protocol + "'"; + SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(countQuery, null); if (!cursor.moveToFirst()) return 0; - int result = cursor.getCount(); + int result = cursor.getCount(); cursor.close(); - //db.close(); - - return result; - } - - /** - * Determines the highest attack id stored in the database. - * - * @return The highest attack id stored in the database. - */ - public long getHighestAttackId() { - String selectQuery = "SELECT MAX(" + KEY_ATTACK_ID + ") FROM " + TABLE_ATTACK_INFO; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - int result; - - if (cursor.moveToFirst()) { - result = cursor.getInt(0); - } else { - result = -1; - } - cursor.close(); - db.close(); - return result; - } - - public ArrayList> getNetworkInformation() { - String selectQuery = "SELECT * FROM " + TABLE_BSSIDS; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - ArrayList> networkInformation = new ArrayList>(); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - HashMap values = new HashMap(); - values.put(KEY_BSSID, cursor.getString(0)); - values.put(KEY_SSID, cursor.getString(1)); - values.put(KEY_LATITUDE, Double.parseDouble(cursor.getString(2))); - values.put(KEY_LONGITUDE, Double.parseDouble(cursor.getString(3))); - values.put(KEY_ACCURACY, Float.parseFloat(cursor.getString(4))); - values.put(KEY_GEO_TIMESTAMP, cursor.getLong(5)); - networkInformation.add(values); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - return networkInformation; - } - - /** - * Gets a single {@link Record} with the given ID from the database. - * - * @param id - * The ID of the {@link Record}; - * @return The {@link Record}. - */ - public Record getRecord(int id) { - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ID + " = " + id; - SQLiteDatabase db = this.getReadableDatabase(); - - Cursor cursor = db.rawQuery(selectQuery, null); - Record record = null; - if (cursor.moveToFirst()) { - record = createRecord(cursor); - } - - cursor.close(); - db.close(); - // return contact - return record; - } - - /** - * Determines the number of {@link Record Records} in the database. - * - * @return The number of {@link Record Records} in the database. - */ - public int getRecordCount() { - String countQuery = "SELECT * FROM " + TABLE_RECORDS; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - int result = cursor.getCount(); - cursor.close(); - - // return count - db.close(); - return result; - } - - /** - * Gets a single {@link Record} with the given attack id from the database. - * - * @param attack_id - * The attack id of the {@link Record}; - * @return The {@link Record}. - */ - public Record getRecordOfAttackId(long attack_id) { - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ATTACK_ID + " = " + attack_id + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - Record record = null; - - if (cursor.moveToFirst()) { - record = createRecord(cursor); - } - cursor.close(); - - // return record list - db.close(); - return record; - } - - /** - * Gets a representative {@link Record} for every attack identified by its - * attack id. - * - * @return A ArrayList with one {@link Record Records} for each attack id in - * the Database. - */ - public ArrayList getRecordOfEachAttack() { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")" + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - - // return record list - db.close(); - return recordList; - } - - /* - * Returns the Conversation of a specific attack id - * - * @param attack_id Tha attack id to match the query against. - * - * @return A arraylist with all {@link Record Records}s for an attack id. - */ - public ArrayList getConversationForAttackID(long attack_id) { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ATTACK_ID + " = " + attack_id; - - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - - db.close(); - return recordList; - } - - /** - * Gets a representative {@link Record} for every attack with a higher - * attack id than the specified. - * - * @param attack_id - * The attack id to match the query against. - * @return A ArrayList with one {@link Record Records} for each attack id - * higher than the given. - */ - public ArrayList getRecordOfEachAttack(long attack_id) { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID - + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ATTACK_ID + " > " + attack_id + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - - // return count - db.close(); - return recordList; - } - - /** - * Determines the smallest attack id stored in the database. - * - * @return The smallest attack id stored in the database. - */ - public long getSmallestAttackId() { - String selectQuery = "SELECT MIN(" + KEY_ATTACK_ID + ") FROM " + TABLE_ATTACK_INFO; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - int result; - - if (cursor.moveToFirst()) { - result = cursor.getInt(0); - } else { - result = -1; - } - cursor.close(); - db.close(); - return result; - } - - /** - * Gets the last recorded SSID to a given BSSID. - * - * @param bssid - * The BSSID to match against. - * @return A String of the last SSID or null if the BSSID is not in the - * database. - */ - public String getSSID(String bssid) { - String selectQuery = "SELECT " + KEY_SSID + " FROM " + TABLE_BSSIDS + " WHERE " + KEY_BSSID + " = " + "'" + bssid + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - String ssid = null; - if (cursor.moveToFirst()) { - ssid = cursor.getString(0); - } - cursor.close(); - db.close(); - return ssid; - } - - // Creating Tables - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL(CREATE_BSSID_TABLE); - db.execSQL(CREATE_ATTACK_INFO_TABLE); - db.execSQL(CREATE_RECORD_TABLE); - db.execSQL(CREATE_PROFILE_TABLE); - } - - // Upgrading database - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - // Drop older table if existed - db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECORDS); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTACK_INFO); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_BSSIDS); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_PROFILES); - - // Create tables again - onCreate(db); - } - - /** - * Retrieves all the profiles from the database - * - * @return list of profiles - */ - public List getAllProfiles() { - List profiles = new LinkedList(); - - // Select All Query - String selectQuery = "SELECT * FROM " + TABLE_PROFILES; - - SQLiteDatabase db = this.getWritableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Profile profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); - - if (cursor.getInt(6) == 1) { - profile.mActivated = true; - } - - profile.mIconName = cursor.getString(4); - - // Adding record to list - profiles.add(profile); - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - // return record list - return profiles; - } - - /** - * Persists the given profile into the database - * - * @param profile - * the profile which should be persisted - * - * @return - */ - public long persistProfile(Profile profile) { - SQLiteDatabase db = this.getReadableDatabase(); - - ContentValues values = new ContentValues(); - - if (profile.mId != -1) { - values.put(KEY_PROFILE_ID, profile.mId); - } - - values.put(KEY_PROFILE_NAME, profile.mLabel); - values.put(KEY_PROFILE_DESCRIPTION, profile.mText); - values.put(KEY_PROFILE_ICON, profile.mIconPath); - values.put(KEY_PROFILE_ICON_NAME, profile.mIconName); - values.put(KEY_PROFILE_ACTIVE, profile.mActivated); - values.put(KEY_PROFILE_EDITABLE, profile.mEditable); - - return db.replace(TABLE_PROFILES, null, values); - } - - /** - * private static final String CREATE_PROFILE_TABLE = "CREATE TABLE " + - * TABLE_PROFILES + "(" + KEY_PROFILE_ID + - * " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_PROFILE_NAME + " TEXT," + - * KEY_PROFILE_DESCRIPTION + " TEXT," + KEY_PROFILE_ICON + " TEXT," + - * KEY_PROFILE_ICON_ID + " INTEGER," + KEY_PROFILE_EDITABLE + " INTEGER," + - * KEY_PROFILE_ACTIVE + " INTEGER" + ")"; - */ - public Profile getProfile(int id) { - String selectQuery = "SELECT * FROM " + TABLE_PROFILES + " WHERE " + TABLE_PROFILES + "." + KEY_PROFILE_ID + " = " + id; - SQLiteDatabase db = this.getReadableDatabase(); - - Cursor cursor = db.rawQuery(selectQuery, null); - Profile profile = null; - - if (cursor.moveToFirst()) { - profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); - - if (cursor.getInt(6) == 1) { - profile.mActivated = true; - } - - profile.mIconName = cursor.getString(5); - } - - cursor.close(); - db.close(); - - // return contact - return profile; - } - - public void deleteProfile(int id) { - SQLiteDatabase db = this.getReadableDatabase(); - - db.delete(TABLE_PROFILES, KEY_PROFILE_ID + "=?", new String[] { String.valueOf(id) }); - } - - public void updateNetworkInformation(ArrayList> networkInformation) { - Log.i("DatabaseHandler", "Starte updating"); - for (HashMap values : networkInformation) { - updateNetworkInformation(values); - } - } - - public void updateNetworkInformation(HashMap networkInformation) { - SQLiteDatabase db = this.getReadableDatabase(); - String bssid = (String) networkInformation.get(KEY_BSSID); - String bssidQuery = "SELECT * FROM " + TABLE_BSSIDS + " WHERE " + KEY_BSSID + " = " + "'" + bssid + "'"; - Cursor cursor = db.rawQuery(bssidQuery, null); - int result = cursor.getCount(); - if (cursor != null && cursor.moveToFirst() && (result <= 0 || cursor.getLong(5) < (Long) networkInformation.get(KEY_GEO_TIMESTAMP))) - ; - { - ContentValues bssidValues = new ContentValues(); - bssidValues.put(KEY_BSSID, bssid); - bssidValues.put(KEY_SSID, (String) networkInformation.get(KEY_SSID)); - bssidValues.put(KEY_LATITUDE, (Double) networkInformation.get(KEY_LATITUDE)); - bssidValues.put(KEY_LONGITUDE, (Double) networkInformation.get(KEY_LONGITUDE)); - bssidValues.put(KEY_ACCURACY, (Float) networkInformation.get(KEY_ACCURACY)); - bssidValues.put(KEY_GEO_TIMESTAMP, (Long) networkInformation.get(KEY_GEO_TIMESTAMP)); - db.insertWithOnConflict(TABLE_BSSIDS, null, bssidValues, SQLiteDatabase.CONFLICT_REPLACE); - } - cursor.close(); - db.close(); - } - - /** - * Creates a {@link Record} from a Cursor. If the cursor does not show to a - * valid data structure a runtime exception is thrown. - * - * @param cursor - * @return Returns the created {@link Record} . - */ - private Record createRecord(Cursor cursor) { - Record record = new Record(); - record.setId(Integer.parseInt(cursor.getString(0))); - record.setAttack_id(cursor.getLong(1)); - record.setType(MessageRecord.TYPE.valueOf(cursor.getString(2))); - record.setTimestamp(cursor.getLong(3)); - record.setPacket(cursor.getString(4)); - record.setProtocol(cursor.getString(5)); - record.setExternalIP(cursor.getString(6)); - - record.setLocalIP(cursor.getString(7)); - record.setLocalPort(Integer.parseInt(cursor.getString(8))); - - record.setRemoteIP(cursor.getString(9)); - record.setRemotePort(Integer.parseInt(cursor.getString(10))); - - record.setBssid(cursor.getString(11)); - record.setSsid(cursor.getString(12)); - record.setLatitude(Double.parseDouble(cursor.getString(13))); - record.setLongitude(Double.parseDouble(cursor.getString(14))); - record.setAccuracy(Float.parseFloat(cursor.getString(15))); - record.setTimestampLocation(cursor.getLong(16)); - - return record; - } + //db.close(); + + return result; + } + + /** + * Determines the highest attack id stored in the database. + * + * @return The highest attack id stored in the database. + */ + public long getHighestAttackId() { + String selectQuery = "SELECT MAX(" + KEY_ATTACK_ID + ") FROM " + TABLE_ATTACK_INFO; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + int result; + + if (cursor.moveToFirst()) { + result = cursor.getInt(0); + } else { + result = -1; + } + cursor.close(); + db.close(); + return result; + } + + public ArrayList> getNetworkInformation() { + String selectQuery = "SELECT * FROM " + TABLE_BSSIDS; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + ArrayList> networkInformation = new ArrayList<>(); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + HashMap values = new HashMap<>(); + values.put(KEY_BSSID, cursor.getString(0)); + values.put(KEY_SSID, cursor.getString(1)); + values.put(KEY_LATITUDE, Double.parseDouble(cursor.getString(2))); + values.put(KEY_LONGITUDE, Double.parseDouble(cursor.getString(3))); + values.put(KEY_ACCURACY, Float.parseFloat(cursor.getString(4))); + values.put(KEY_GEO_TIMESTAMP, cursor.getLong(5)); + networkInformation.add(values); + } while (cursor.moveToNext()); + } + + cursor.close(); + db.close(); + return networkInformation; + } + + /** + * Gets a single {@link Record} with the given ID from the database. + * + * @param id The ID of the {@link Record}; + * @return The {@link Record}. + */ + public Record getRecord(int id) { + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ID + " = " + id; + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.rawQuery(selectQuery, null); + Record record = null; + if (cursor.moveToFirst()) { + record = createRecord(cursor); + } + + cursor.close(); + db.close(); + // return contact + return record; + } + + /** + * Determines the number of {@link Record Records} in the database. + * + * @return The number of {@link Record Records} in the database. + */ + public int getRecordCount() { + String countQuery = "SELECT * FROM " + TABLE_RECORDS; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + int result = cursor.getCount(); + cursor.close(); + + // return count + db.close(); + return result; + } + + /** + * Gets a single {@link Record} with the given attack id from the database. + * + * @param attack_id The attack id of the {@link Record}; + * @return The {@link Record}. + */ + public Record getRecordOfAttackId(long attack_id) { + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ATTACK_ID + " = " + attack_id + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + Record record = null; + + if (cursor.moveToFirst()) { + record = createRecord(cursor); + } + cursor.close(); + + // return record list + db.close(); + return record; + } + + /** + * Gets a representative {@link Record} for every attack identified by its + * attack id. + * + * @return A ArrayList with one {@link Record Records} for each attack id in + * the Database. + */ + public ArrayList getRecordOfEachAttack() { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")" + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return record list + db.close(); + return recordList; + } + + /* + * Returns the Conversation of a specific attack id + * + * @param attack_id Tha attack id to match the query against. + * + * @return A arraylist with all {@link Record Records}s for an attack id. + */ + public ArrayList getConversationForAttackID(long attack_id) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ATTACK_ID + " = " + attack_id; + + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + db.close(); + return recordList; + } + + /** + * Gets a representative {@link Record} for every attack with a higher + * attack id than the specified. + * + * @param attack_id The attack id to match the query against. + * @return A ArrayList with one {@link Record Records} for each attack id + * higher than the given. + */ + public ArrayList getRecordOfEachAttack(long attack_id) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + TABLE_RECORDS + " NATURAL JOIN " + TABLE_ATTACK_INFO + " JOIN " + TABLE_BSSIDS + " USING " + "(" + KEY_BSSID + + ")" + " WHERE " + TABLE_RECORDS + "." + KEY_ATTACK_ID + " > " + attack_id + " GROUP BY " + TABLE_RECORDS + "." + KEY_ATTACK_ID; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return count + db.close(); + return recordList; + } + + /** + * Determines the smallest attack id stored in the database. + * + * @return The smallest attack id stored in the database. + */ + public long getSmallestAttackId() { + String selectQuery = "SELECT MIN(" + KEY_ATTACK_ID + ") FROM " + TABLE_ATTACK_INFO; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + int result; + + if (cursor.moveToFirst()) { + result = cursor.getInt(0); + } else { + result = -1; + } + cursor.close(); + db.close(); + return result; + } + + /** + * Gets the last recorded SSID to a given BSSID. + * + * @param bssid The BSSID to match against. + * @return A String of the last SSID or null if the BSSID is not in the + * database. + */ + public String getSSID(String bssid) { + String selectQuery = "SELECT " + KEY_SSID + " FROM " + TABLE_BSSIDS + " WHERE " + KEY_BSSID + " = " + "'" + bssid + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + String ssid = null; + if (cursor.moveToFirst()) { + ssid = cursor.getString(0); + } + cursor.close(); + db.close(); + return ssid; + } + + // Creating Tables + @Override + public void onCreate(SQLiteDatabase db) { + db.execSQL(CREATE_BSSID_TABLE); + db.execSQL(CREATE_ATTACK_INFO_TABLE); + db.execSQL(CREATE_RECORD_TABLE); + db.execSQL(CREATE_PROFILE_TABLE); + } + + // Upgrading database + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // Drop older table if existed + db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECORDS); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_ATTACK_INFO); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_BSSIDS); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_PROFILES); + + // Create tables again + onCreate(db); + } + + /** + * Retrieves all the profiles from the database + * + * @return list of profiles + */ + public List getAllProfiles() { + List profiles = new LinkedList<>(); + + // Select All Query + String selectQuery = "SELECT * FROM " + TABLE_PROFILES; + + SQLiteDatabase db = this.getWritableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Profile profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); + + if (cursor.getInt(6) == 1) { + profile.mActivated = true; + } + + profile.mIconName = cursor.getString(4); + + // Adding record to list + profiles.add(profile); + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + // return record list + return profiles; + } + + /** + * Persists the given profile into the database + * + * @param profile the profile which should be persisted + * @return + */ + public long persistProfile(Profile profile) { + SQLiteDatabase db = this.getReadableDatabase(); + + ContentValues values = new ContentValues(); + + if (profile.mId != -1) { + values.put(KEY_PROFILE_ID, profile.mId); + } + + values.put(KEY_PROFILE_NAME, profile.mLabel); + values.put(KEY_PROFILE_DESCRIPTION, profile.mText); + values.put(KEY_PROFILE_ICON, profile.mIconPath); + values.put(KEY_PROFILE_ICON_NAME, profile.mIconName); + values.put(KEY_PROFILE_ACTIVE, profile.mActivated); + values.put(KEY_PROFILE_EDITABLE, profile.mEditable); + + return db.replace(TABLE_PROFILES, null, values); + } + + /** + * private static final String CREATE_PROFILE_TABLE = "CREATE TABLE " + + * TABLE_PROFILES + "(" + KEY_PROFILE_ID + + * " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_PROFILE_NAME + " TEXT," + + * KEY_PROFILE_DESCRIPTION + " TEXT," + KEY_PROFILE_ICON + " TEXT," + + * KEY_PROFILE_ICON_ID + " INTEGER," + KEY_PROFILE_EDITABLE + " INTEGER," + + * KEY_PROFILE_ACTIVE + " INTEGER" + ")"; + */ + public Profile getProfile(int id) { + String selectQuery = "SELECT * FROM " + TABLE_PROFILES + " WHERE " + TABLE_PROFILES + "." + KEY_PROFILE_ID + " = " + id; + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.rawQuery(selectQuery, null); + Profile profile = null; + + if (cursor.moveToFirst()) { + profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); + + if (cursor.getInt(6) == 1) { + profile.mActivated = true; + } + + profile.mIconName = cursor.getString(5); + } + + cursor.close(); + db.close(); + + // return contact + return profile; + } + + public void deleteProfile(int id) { + SQLiteDatabase db = this.getReadableDatabase(); + + db.delete(TABLE_PROFILES, KEY_PROFILE_ID + "=?", new String[]{String.valueOf(id)}); + } + + public void updateNetworkInformation(ArrayList> networkInformation) { + Log.i("DatabaseHandler", "Starte updating"); + for (HashMap values : networkInformation) { + updateNetworkInformation(values); + } + } + + public void updateNetworkInformation(HashMap networkInformation) { + SQLiteDatabase db = this.getReadableDatabase(); + String bssid = (String) networkInformation.get(KEY_BSSID); + String bssidQuery = "SELECT * FROM " + TABLE_BSSIDS + " WHERE " + KEY_BSSID + " = " + "'" + bssid + "'"; + Cursor cursor = db.rawQuery(bssidQuery, null); + int result = cursor.getCount(); + if (cursor != null && cursor.moveToFirst() && (result <= 0 || cursor.getLong(5) < (Long) networkInformation.get(KEY_GEO_TIMESTAMP))) + ; + { + ContentValues bssidValues = new ContentValues(); + bssidValues.put(KEY_BSSID, bssid); + bssidValues.put(KEY_SSID, (String) networkInformation.get(KEY_SSID)); + bssidValues.put(KEY_LATITUDE, (Double) networkInformation.get(KEY_LATITUDE)); + bssidValues.put(KEY_LONGITUDE, (Double) networkInformation.get(KEY_LONGITUDE)); + bssidValues.put(KEY_ACCURACY, (Float) networkInformation.get(KEY_ACCURACY)); + bssidValues.put(KEY_GEO_TIMESTAMP, (Long) networkInformation.get(KEY_GEO_TIMESTAMP)); + db.insertWithOnConflict(TABLE_BSSIDS, null, bssidValues, SQLiteDatabase.CONFLICT_REPLACE); + } + cursor.close(); + db.close(); + } + + /** + * Creates a {@link Record} from a Cursor. If the cursor does not show to a + * valid data structure a runtime exception is thrown. + * + * @param cursor + * @return Returns the created {@link Record} . + */ + private Record createRecord(Cursor cursor) { + Record record = new Record(); + record.setId(Integer.parseInt(cursor.getString(0))); + record.setAttack_id(cursor.getLong(1)); + record.setType(MessageRecord.TYPE.valueOf(cursor.getString(2))); + record.setTimestamp(cursor.getLong(3)); + record.setPacket(cursor.getString(4)); + record.setProtocol(cursor.getString(5)); + record.setExternalIP(cursor.getString(6)); + + record.setLocalIP(cursor.getString(7)); + record.setLocalPort(Integer.parseInt(cursor.getString(8))); + + record.setRemoteIP(cursor.getString(9)); + record.setRemotePort(Integer.parseInt(cursor.getString(10))); + + record.setBssid(cursor.getString(11)); + record.setSsid(cursor.getString(12)); + record.setLatitude(Double.parseDouble(cursor.getString(13))); + record.setLongitude(Double.parseDouble(cursor.getString(14))); + record.setAccuracy(Float.parseFloat(cursor.getString(15))); + record.setTimestampLocation(cursor.getLong(16)); + + return record; + } } diff --git a/src/main/java/dk/aau/netsec/hostage/event/BeaconEvent.java b/src/main/java/dk/aau/netsec/hostage/event/BeaconEvent.java index 19c8dad2..0efd54e6 100644 --- a/src/main/java/dk/aau/netsec/hostage/event/BeaconEvent.java +++ b/src/main/java/dk/aau/netsec/hostage/event/BeaconEvent.java @@ -11,7 +11,7 @@ public class BeaconEvent implements Event { private static final String PERSIST_FILENAME = "beaconInfo.json"; - File file = new File("/data/data/" + MainActivity.getContext().getPackageName() + "/" + PERSIST_FILENAME); + final File file = new File("/data/data/" + MainActivity.getContext().getPackageName() + "/" + PERSIST_FILENAME); @Override public JSONObject toJSON() { diff --git a/src/main/java/dk/aau/netsec/hostage/event/DeviceEvent.java b/src/main/java/dk/aau/netsec/hostage/event/DeviceEvent.java index edaa6d60..a570416c 100644 --- a/src/main/java/dk/aau/netsec/hostage/event/DeviceEvent.java +++ b/src/main/java/dk/aau/netsec/hostage/event/DeviceEvent.java @@ -14,12 +14,12 @@ import dk.aau.netsec.hostage.ui.activity.MainActivity; public class DeviceEvent implements Event{ - Context context; + final Context context; String manufacturer; String model; String deviceName; private static final String PERSIST_FILENAME = "deviceInfo.json"; - File file = new File("/data/data/" + MainActivity.getContext().getPackageName() + "/" + PERSIST_FILENAME); + final File file = new File("/data/data/" + MainActivity.getContext().getPackageName() + "/" + PERSIST_FILENAME); public DeviceEvent(Context context){ this.context = context; diff --git a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java index 365aae84..52e272bb 100644 --- a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java +++ b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java @@ -40,12 +40,12 @@ public class CustomLocationManager { Location mLatestLocation; - private Context mContext; - private LocationListener mLocationListener; - private LocationManager mLocationManager; - private Consumer mLocationConsumer; + private final Context mContext; + private final LocationListener mLocationListener; + private final LocationManager mLocationManager; + private final Consumer mLocationConsumer; private boolean locationPermissionDenied; - Set mListOfListeners; + final Set mListOfListeners; private boolean mReceivingUpdates = false; private static WeakReference mLocationManagerInstance; @@ -63,27 +63,19 @@ private CustomLocationManager(@NonNull Context context) { mContext = context; mListOfListeners = new HashSet<>(); - mLocationListener = new LocationListener() { - @Override - public void onLocationChanged(@NonNull Location location) { + mLocationListener = location -> { // if (true) { //only for testing - if (isBetterLocation(location)) { - mLatestLocation = location; + if (isBetterLocation(location)) { + mLatestLocation = location; - for (LocationSource.OnLocationChangedListener listener : mListOfListeners) { - listener.onLocationChanged(location); - } + for (LocationSource.OnLocationChangedListener listener : mListOfListeners) { + listener.onLocationChanged(location); } } }; - mLocationConsumer = new Consumer() { - @Override - public void accept(Location location) { - mLatestLocation = location; - } - }; + mLocationConsumer = location -> mLatestLocation = location; mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); } @@ -148,16 +140,9 @@ public void requestBackgroundLocation() { dialog.setTitle(mContext.getResources().getString(R.string.uses_background_location)); dialog.setMessage(mContext.getResources().getString(R.string.uses_background_location_reason)); dialog.setCancelable(true); - dialog.setNeutralButton(mContext.getResources().getString(R.string.ok), ((dialog1, which) -> { - showLocationRequestDialog(Manifest.permission.ACCESS_BACKGROUND_LOCATION); - })); - - dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - showLocationRequestDialog(Manifest.permission.ACCESS_BACKGROUND_LOCATION); - } - }); + dialog.setNeutralButton(mContext.getResources().getString(R.string.ok), ((dialog1, which) -> showLocationRequestDialog(Manifest.permission.ACCESS_BACKGROUND_LOCATION))); + + dialog.setOnCancelListener(dialog12 -> showLocationRequestDialog(Manifest.permission.ACCESS_BACKGROUND_LOCATION)); AlertDialog alertDialog = dialog.create(); alertDialog.show(); @@ -304,16 +289,9 @@ private void requestLocationPermission() { dialog.setTitle(mContext.getResources().getString(R.string.uses_location)); dialog.setMessage(mContext.getResources().getString(R.string.uses_location_reason)); dialog.setCancelable(true); - dialog.setNeutralButton(mContext.getResources().getString(R.string.ok), ((dialog1, which) -> { - showLocationRequestDialog(Manifest.permission.ACCESS_FINE_LOCATION); - })); - - dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { - @Override - public void onCancel(DialogInterface dialog) { - showLocationRequestDialog(Manifest.permission.ACCESS_FINE_LOCATION); - } - }); + dialog.setNeutralButton(mContext.getResources().getString(R.string.ok), ((dialog1, which) -> showLocationRequestDialog(Manifest.permission.ACCESS_FINE_LOCATION))); + + dialog.setOnCancelListener(dialog12 -> showLocationRequestDialog(Manifest.permission.ACCESS_FINE_LOCATION)); AlertDialog alertDialog = dialog.create(); alertDialog.show(); @@ -328,11 +306,11 @@ public void onCancel(DialogInterface dialog) { * @param locationPermissionType Ask for either foreground or background location permission. */ void showLocationRequestDialog(String locationPermissionType) { - if (locationPermissionType == Manifest.permission.ACCESS_FINE_LOCATION || locationPermissionType == Manifest.permission.ACCESS_COARSE_LOCATION) { + if (locationPermissionType.equals(Manifest.permission.ACCESS_FINE_LOCATION) || locationPermissionType.equals(Manifest.permission.ACCESS_COARSE_LOCATION)) { ActivityCompat.requestPermissions(MainActivity.getInstance(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MainActivity.LOCATION_PERMISSION_REQUEST_CODE); // Only relevant on newer APIs - } else if (locationPermissionType == Manifest.permission.ACCESS_BACKGROUND_LOCATION && + } else if (locationPermissionType.equals(Manifest.permission.ACCESS_BACKGROUND_LOCATION) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ActivityCompat.requestPermissions(MainActivity.getInstance(), new String[]{Manifest.permission.ACCESS_BACKGROUND_LOCATION}, MainActivity.LOCATION_BACKGROUND_PERMISSION_REQUEST_CODE); } @@ -342,8 +320,6 @@ void showLocationRequestDialog(String locationPermissionType) { * Determines whether one Location reading is better than the current Location fix * * @param location The new Location that you want to evaluate - * @param currentBestLocation The current Location fix, to which you want to compare the new - * one */ boolean isBetterLocation(Location location) { if (mLatestLocation == null) { diff --git a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationSource.java b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationSource.java index 56d47081..7a50a56b 100644 --- a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationSource.java +++ b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationSource.java @@ -15,7 +15,7 @@ */ public class CustomLocationSource implements LocationSource { - private CustomLocationManager mLocationManager; + private final CustomLocationManager mLocationManager; private OnLocationChangedListener mListener; /** diff --git a/src/main/java/dk/aau/netsec/hostage/logging/AttackRecord.java b/src/main/java/dk/aau/netsec/hostage/logging/AttackRecord.java index 435c74ac..cce814e0 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/AttackRecord.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/AttackRecord.java @@ -97,7 +97,7 @@ public AttackRecord(boolean autoincrement){ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.getContext()); SharedPreferences.Editor editor = pref.edit(); - Long attack_id = pref.getLong("ATTACK_ID_COUNTER", 0); + long attack_id = pref.getLong("ATTACK_ID_COUNTER", 0); editor.putLong("ATTACK_ID_COUNTER", attack_id + 1); editor.apply(); this.attack_id = attack_id; diff --git a/src/main/java/dk/aau/netsec/hostage/logging/LogSaveWorker.java b/src/main/java/dk/aau/netsec/hostage/logging/LogSaveWorker.java index 1ddfd468..113d95b3 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/LogSaveWorker.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/LogSaveWorker.java @@ -36,7 +36,7 @@ * Created on 21/06/2021 */ public class LogSaveWorker extends Worker { - private Context mContext; + private final Context mContext; /** * Create the LogSaveWorker and save context for later use. diff --git a/src/main/java/dk/aau/netsec/hostage/logging/Record.java b/src/main/java/dk/aau/netsec/hostage/logging/Record.java index 9252033b..371e65dc 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/Record.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/Record.java @@ -14,11 +14,11 @@ public class Record implements Serializable { private static final long serialVersionUID = 1L; // - private MessageRecord message; + private final MessageRecord message; // attack - private AttackRecord attack; + private final AttackRecord attack; // network - private NetworkRecord network; + private final NetworkRecord network; public Record(){ message = new MessageRecord(); diff --git a/src/main/java/dk/aau/netsec/hostage/logging/SyncData.java b/src/main/java/dk/aau/netsec/hostage/logging/SyncData.java index 160d0029..2f6fef6a 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/SyncData.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/SyncData.java @@ -6,11 +6,11 @@ public class SyncData implements Serializable { private static final long serialVersionUID = 1L; - public ArrayList networkRecords; - public ArrayList syncRecords; + public final ArrayList networkRecords; + public final ArrayList syncRecords; public SyncData(){ - this.networkRecords = new ArrayList(); - this.syncRecords = new ArrayList(); + this.networkRecords = new ArrayList<>(); + this.syncRecords = new ArrayList<>(); } } diff --git a/src/main/java/dk/aau/netsec/hostage/logging/SyncInfo.java b/src/main/java/dk/aau/netsec/hostage/logging/SyncInfo.java index baec4fa7..087b90d0 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/SyncInfo.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/SyncInfo.java @@ -26,7 +26,7 @@ public class SyncInfo implements Serializable { public ArrayList bssids; public SyncInfo(){ - this.deviceMap = new HashMap(); - this.bssids = new ArrayList(); + this.deviceMap = new HashMap<>(); + this.bssids = new ArrayList<>(); } } diff --git a/src/main/java/dk/aau/netsec/hostage/logging/SyncRecord.java b/src/main/java/dk/aau/netsec/hostage/logging/SyncRecord.java index d79ede22..138137b9 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/SyncRecord.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/SyncRecord.java @@ -1,9 +1,5 @@ package dk.aau.netsec.hostage.logging; -/** - * Created by Julien on 08.12.2014. - */ - import android.os.Parcel; import android.os.Parcelable; @@ -11,6 +7,10 @@ import java.util.ArrayList; + +/** + * Created by Julien on 08.12.2014. + */ public class SyncRecord implements Parcelable, Serializable { private static final long serialVersionUID = 7106818788090434192L; diff --git a/src/main/java/dk/aau/netsec/hostage/logging/formatter/DefaultFormatter.java b/src/main/java/dk/aau/netsec/hostage/logging/formatter/DefaultFormatter.java index d155fc0d..5cff3278 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/formatter/DefaultFormatter.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/formatter/DefaultFormatter.java @@ -6,7 +6,7 @@ public class DefaultFormatter extends Formatter { - private static Formatter INSTANCE = new DefaultFormatter(); + private static final Formatter INSTANCE = new DefaultFormatter(); public static Formatter getInstance() { return INSTANCE; diff --git a/src/main/java/dk/aau/netsec/hostage/logging/formatter/TraCINgFormatter.java b/src/main/java/dk/aau/netsec/hostage/logging/formatter/TraCINgFormatter.java index 4cfc0ee6..faf11cca 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/formatter/TraCINgFormatter.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/formatter/TraCINgFormatter.java @@ -6,7 +6,7 @@ public class TraCINgFormatter extends Formatter { - private static Formatter INSTANCE = new TraCINgFormatter(); + private static final Formatter INSTANCE = new TraCINgFormatter(); public static Formatter getInstance() { return INSTANCE; diff --git a/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java b/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java index 27fdf920..b42eb1ef 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java @@ -5,222 +5,217 @@ /** * SMB log view formatter. - * + * * @author Wulf Pfeiffer */ public class SMB extends ProtocolFormatter { - @Override - public String format(String packet) { - byte[] bytes = HelperUtils.hexStringToBytes(packet); - byte cmd = bytes[8]; // command code located at 8 - StringBuffer buffer = new StringBuffer(); - buffer.append("Command: "); - buffer.append(getCommandString(cmd)); - buffer.append("\n"); - buffer.append("Content: "); - buffer.append(getContent(cmd, bytes)); + @Override + public String format(String packet) { + byte[] bytes = HelperUtils.hexStringToBytes(packet); + byte cmd = bytes[8]; // command code located at 8 - return buffer.toString(); - } + String buffer = "Command: " + + getCommandString(cmd) + + "\n" + + "Content: " + + getContent(cmd, bytes); + return buffer; + } - /** - * Returns the content of a packet with command code 0x72. - * - * @param packet - * content as byte array. - * @return content as String. - */ - private String get0x72content(byte[] packet) { - byte[] content = new byte[packet.length - 39]; - System.arraycopy(packet, 39, content, 0, content.length); - return HelperUtils.byteToStr(content); - } + /** + * Returns the content of a packet with command code 0x72. + * + * @param packet content as byte array. + * @return content as String. + */ + private String get0x72content(byte[] packet) { + byte[] content = new byte[packet.length - 39]; + System.arraycopy(packet, 39, content, 0, content.length); + return HelperUtils.byteToStr(content); + } - /** - * Checks command code for its command code and returns the name of this - * command. - * - * @param command - * as byte. - * @return command name as String. - */ - private String getCommandString(byte command) { - switch (command) { - case 0x00: - return "SMB_COM_CREATE_DIRECTORY"; - case 0x01: - return "SMB_COM_DELETE_DIRECTORY"; - case 0x02: - return "SMB_COM_OPEN"; - case 0x03: - return "SMB_COM_CREATE"; - case 0x04: - return "SMB_COM_CLOSE"; - case 0x05: - return "SMB_COM_FLUSH"; - case 0x06: - return "SMB_COM_DELETE"; - case 0x07: - return "SMB_COM_RENAME"; - case 0x08: - return "SMB_COM_QUERY_INFORMATION"; - case 0x09: - return "SMB_COM_SET_INFORMATION"; - case 0x0A: - return "SMB_COM_READ"; - case 0x0B: - return "SMB_COM_WRITE"; - case 0x0C: - return "SMB_COM_LOCK_BYTE_RANGE"; - case 0x0D: - return "SMB_COM_UNLOCK_BYTE_RANGE"; - case 0x0E: - return "SMB_COM_CREATE_TEMPORARY"; - case 0x0F: - return "SMB_COM_CREATE_NEW"; - case 0x10: - return "SMB_COM_CHECK_DIRECTORY"; - case 0x11: - return "SMB_COM_PROCESS_EXIT"; - case 0x12: - return "SMB_COM_SEEK"; - case 0x13: - return "SMB_COM_LOCK_AND_READ"; - case 0x14: - return "SMB_COM_WRITE_AND_UNLOCK"; - case 0x1A: - return "SMB_COM_READ_RAW"; - case 0x1B: - return "SMB_COM_READ_MPX"; - case 0x1C: - return "SMB_COM_READ_MPX_SECONDARY"; - case 0x1D: - return "SMB_COM_WRITE_RAW"; - case 0x1E: - return "SMB_COM_WRITE_MPX"; - case 0x1F: - return "SMB_COM_WRITE_MPX_SECONDARY"; - case 0x20: - return "SMB_COM_WRITE_COMPLETE"; - case 0x21: - return "SMB_COM_QUERY_SERVER"; - case 0x22: - return "SMB_COM_SET_INFORMATION2"; - case 0x23: - return "SMB_COM_QUERY_INFORMATION2"; - case 0x24: - return "SMB_COM_LOCKING_ANDX"; - case 0x25: - return "SMB_COM_TRANSACTION"; - case 0x26: - return "SMB_COM_TRANSACTION_SECONDARY"; - case 0x27: - return "SMB_COM_IOCTL"; - case 0x28: - return "SMB_COM_IOCTL_SECONDARY"; - case 0x29: - return "SMB_COM_COPY"; - case 0x2A: - return "SMB_COM_MOVE"; - case 0x2B: - return "SMB_COM_ECHO"; - case 0x2C: - return "SMB_COM_WRITE_AND_CLOSE"; - case 0x2D: - return "SMB_COM_OPEN_ANDX"; - case 0x2E: - return "SMB_COM_READ_ANDX"; - case 0x2F: - return "SMB_COM_WRITE_ANDX"; - case 0x30: - return "SMB_COM_NEW_FILE_SIZE"; - case 0x31: - return "SMB_COM_CLOSE_AND_TREE_DISC"; - case 0x32: - return "SMB_COM_TRANSACTION2"; - case 0x33: - return "SMB_COM_TRANSACTION2_SECONDARY"; - case 0x34: - return "SMB_COM_FIND_CLOSE2"; - case 0x35: - return "SMB_COM_FIND_NOTIFY_CLOSE"; - case 0x70: - return "SMB_COM_TREE_CONNECT"; - case 0x71: - return "SMB_COM_TREE_DISCONNECT"; - case 0x72: - return "SMB_COM_NEGOTIATE"; - case 0x73: - return "SMB_COM_SESSION_SETUP_ANDX"; - case 0x74: - return "SMB_COM_LOGOFF_ANDX"; - case 0x75: - return "SMB_COM_TREE_CONNECT_ANDX"; - case (byte) 0x80: - return "SMB_COM_QUERY_INFORMATION_DISK"; - case (byte) 0x81: - return "SMB_COM_SEARCH"; - case (byte) 0x82: - return "SMB_COM_FIND"; - case (byte) 0x83: - return "SMB_COM_FIND_UNIQUE"; - case (byte) 0x84: - return "SMB_COM_FIND_CLOSE"; - case (byte) 0xA0: - return "SMB_COM_NT_TRANSACT"; - case (byte) 0xA1: - return "SMB_COM_NT_TRANSACT_SECONDARY"; - case (byte) 0xA2: - return "SMB_COM_NT_CREATE_ANDX"; - case (byte) 0xA4: - return "SMB_COM_NT_CANCEL"; - case (byte) 0xA5: - return "SMB_COM_NT_RENAME"; - case (byte) 0xC0: - return "SMB_COM_OPEN_PRINT_FILE"; - case (byte) 0xC1: - return "SMB_COM_WRITE_PRINT_FILE"; - case (byte) 0xC2: - return "SMB_COM_CLOSE_PRINT_FILE"; - case (byte) 0xC3: - return "SMB_COM_GET_PRINT_QUEUE"; - case (byte) 0xD8: - return "SMB_COM_READ_BULK"; - case (byte) 0xD9: - return "SMB_COM_WRITE_BULK"; - case (byte) 0xDA: - return "SMB_COM_WRITE_BULK_DATA"; - case (byte) 0xFF: - return "SMB_COM_NONE"; - default: - return "Unknown Command"; - } - } + /** + * Checks command code for its command code and returns the name of this + * command. + * + * @param command as byte. + * @return command name as String. + */ + private String getCommandString(byte command) { + switch (command) { + case 0x00: + return "SMB_COM_CREATE_DIRECTORY"; + case 0x01: + return "SMB_COM_DELETE_DIRECTORY"; + case 0x02: + return "SMB_COM_OPEN"; + case 0x03: + return "SMB_COM_CREATE"; + case 0x04: + return "SMB_COM_CLOSE"; + case 0x05: + return "SMB_COM_FLUSH"; + case 0x06: + return "SMB_COM_DELETE"; + case 0x07: + return "SMB_COM_RENAME"; + case 0x08: + return "SMB_COM_QUERY_INFORMATION"; + case 0x09: + return "SMB_COM_SET_INFORMATION"; + case 0x0A: + return "SMB_COM_READ"; + case 0x0B: + return "SMB_COM_WRITE"; + case 0x0C: + return "SMB_COM_LOCK_BYTE_RANGE"; + case 0x0D: + return "SMB_COM_UNLOCK_BYTE_RANGE"; + case 0x0E: + return "SMB_COM_CREATE_TEMPORARY"; + case 0x0F: + return "SMB_COM_CREATE_NEW"; + case 0x10: + return "SMB_COM_CHECK_DIRECTORY"; + case 0x11: + return "SMB_COM_PROCESS_EXIT"; + case 0x12: + return "SMB_COM_SEEK"; + case 0x13: + return "SMB_COM_LOCK_AND_READ"; + case 0x14: + return "SMB_COM_WRITE_AND_UNLOCK"; + case 0x1A: + return "SMB_COM_READ_RAW"; + case 0x1B: + return "SMB_COM_READ_MPX"; + case 0x1C: + return "SMB_COM_READ_MPX_SECONDARY"; + case 0x1D: + return "SMB_COM_WRITE_RAW"; + case 0x1E: + return "SMB_COM_WRITE_MPX"; + case 0x1F: + return "SMB_COM_WRITE_MPX_SECONDARY"; + case 0x20: + return "SMB_COM_WRITE_COMPLETE"; + case 0x21: + return "SMB_COM_QUERY_SERVER"; + case 0x22: + return "SMB_COM_SET_INFORMATION2"; + case 0x23: + return "SMB_COM_QUERY_INFORMATION2"; + case 0x24: + return "SMB_COM_LOCKING_ANDX"; + case 0x25: + return "SMB_COM_TRANSACTION"; + case 0x26: + return "SMB_COM_TRANSACTION_SECONDARY"; + case 0x27: + return "SMB_COM_IOCTL"; + case 0x28: + return "SMB_COM_IOCTL_SECONDARY"; + case 0x29: + return "SMB_COM_COPY"; + case 0x2A: + return "SMB_COM_MOVE"; + case 0x2B: + return "SMB_COM_ECHO"; + case 0x2C: + return "SMB_COM_WRITE_AND_CLOSE"; + case 0x2D: + return "SMB_COM_OPEN_ANDX"; + case 0x2E: + return "SMB_COM_READ_ANDX"; + case 0x2F: + return "SMB_COM_WRITE_ANDX"; + case 0x30: + return "SMB_COM_NEW_FILE_SIZE"; + case 0x31: + return "SMB_COM_CLOSE_AND_TREE_DISC"; + case 0x32: + return "SMB_COM_TRANSACTION2"; + case 0x33: + return "SMB_COM_TRANSACTION2_SECONDARY"; + case 0x34: + return "SMB_COM_FIND_CLOSE2"; + case 0x35: + return "SMB_COM_FIND_NOTIFY_CLOSE"; + case 0x70: + return "SMB_COM_TREE_CONNECT"; + case 0x71: + return "SMB_COM_TREE_DISCONNECT"; + case 0x72: + return "SMB_COM_NEGOTIATE"; + case 0x73: + return "SMB_COM_SESSION_SETUP_ANDX"; + case 0x74: + return "SMB_COM_LOGOFF_ANDX"; + case 0x75: + return "SMB_COM_TREE_CONNECT_ANDX"; + case (byte) 0x80: + return "SMB_COM_QUERY_INFORMATION_DISK"; + case (byte) 0x81: + return "SMB_COM_SEARCH"; + case (byte) 0x82: + return "SMB_COM_FIND"; + case (byte) 0x83: + return "SMB_COM_FIND_UNIQUE"; + case (byte) 0x84: + return "SMB_COM_FIND_CLOSE"; + case (byte) 0xA0: + return "SMB_COM_NT_TRANSACT"; + case (byte) 0xA1: + return "SMB_COM_NT_TRANSACT_SECONDARY"; + case (byte) 0xA2: + return "SMB_COM_NT_CREATE_ANDX"; + case (byte) 0xA4: + return "SMB_COM_NT_CANCEL"; + case (byte) 0xA5: + return "SMB_COM_NT_RENAME"; + case (byte) 0xC0: + return "SMB_COM_OPEN_PRINT_FILE"; + case (byte) 0xC1: + return "SMB_COM_WRITE_PRINT_FILE"; + case (byte) 0xC2: + return "SMB_COM_CLOSE_PRINT_FILE"; + case (byte) 0xC3: + return "SMB_COM_GET_PRINT_QUEUE"; + case (byte) 0xD8: + return "SMB_COM_READ_BULK"; + case (byte) 0xD9: + return "SMB_COM_WRITE_BULK"; + case (byte) 0xDA: + return "SMB_COM_WRITE_BULK_DATA"; + case (byte) 0xFF: + return "SMB_COM_NONE"; + default: + return "Unknown Command"; + } + } - /** - * Returns the content of a packet as a String value, depending on its - * command code - * - * @param command - * of the packet. - * @param packet - * content as byte array. - * @return content as a String. - */ - private String getContent(byte command, byte[] packet) { - switch (command) { - case 0x72: - return get0x72content(packet); - case 0x73: - return HelperUtils.byteToStr(packet); - case (byte) 0xa2: - return HelperUtils.byteToStr(packet); - case 0x25: - return HelperUtils.byteToStr(packet); - default: - return ""; - } - } + /** + * Returns the content of a packet as a String value, depending on its + * command code + * + * @param command of the packet. + * @param packet content as byte array. + * @return content as a String. + */ + private String getContent(byte command, byte[] packet) { + switch (command) { + case 0x72: + return get0x72content(packet); + case 0x73: + return HelperUtils.byteToStr(packet); + case (byte) 0xa2: + return HelperUtils.byteToStr(packet); + case 0x25: + return HelperUtils.byteToStr(packet); + default: + return ""; + } + } } diff --git a/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/TELNET.java b/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/TELNET.java index b50cbc95..0409e35b 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/TELNET.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/TELNET.java @@ -114,7 +114,7 @@ private String checkCommand(byte b) { * @return names of the option commands as String. */ private String checkForOptions(byte[] bytes) { - StringBuffer options = new StringBuffer(); + StringBuilder options = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { if (bytes[i] == (byte) 0xff && i + 2 < bytes.length) { options.append(checkMode(bytes[i + 1])); diff --git a/src/main/java/dk/aau/netsec/hostage/model/Profile.java b/src/main/java/dk/aau/netsec/hostage/model/Profile.java index 887ac652..9b781fad 100644 --- a/src/main/java/dk/aau/netsec/hostage/model/Profile.java +++ b/src/main/java/dk/aau/netsec/hostage/model/Profile.java @@ -45,7 +45,7 @@ public class Profile implements JSONSerializable { public String mIconName; public String mIconPath; - public boolean mEditable = false; + public boolean mEditable; @Transient public boolean mIsRandom = false; @Transient @@ -136,9 +136,8 @@ public Bitmap getIconBitmap() { if (this.mIconPath != null) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; - Bitmap bitmap = BitmapFactory.decodeFile(this.mIconPath, options); - return bitmap; + return BitmapFactory.decodeFile(this.mIconPath, options); } return null; diff --git a/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java b/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java index 685ada0a..19d6f6b7 100644 --- a/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java +++ b/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java @@ -20,7 +20,7 @@ * SocketFactory to create a SSL socket that accepts every certificate. */ public class MySSLSocketFactory extends SSLSocketFactory { - private SSLContext sslContext = SSLContext.getInstance("TLS"); + private final SSLContext sslContext = SSLContext.getInstance("TLS"); public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, diff --git a/src/main/java/dk/aau/netsec/hostage/net/MyServerSocketFactory.java b/src/main/java/dk/aau/netsec/hostage/net/MyServerSocketFactory.java index 2dcc01ae..988b45a7 100644 --- a/src/main/java/dk/aau/netsec/hostage/net/MyServerSocketFactory.java +++ b/src/main/java/dk/aau/netsec/hostage/net/MyServerSocketFactory.java @@ -4,53 +4,54 @@ import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; + import javax.net.ServerSocketFactory; + import dk.aau.netsec.hostage.commons.HelperUtils; import dk.aau.netsec.hostage.system.Device; public class MyServerSocketFactory extends ServerSocketFactory { - private String ipAddress="0.0.0.0"; - - @Override - public ServerSocket createServerSocket(int port) throws IOException { - ServerSocket socket = null; - if (port > 1023 || port == 0) { - return bindSocket(port); - } else if (Device.isRooted()) { - if (Device.isPortRedirectionAvailable()) { // use ip tables - int redirectedPort = HelperUtils.getRedirectedPort(port); - return bindSocket(redirectedPort); - } - } - return socket; - } - - private ServerSocket bindSocket(int port) throws IOException { - ServerSocket socket = new ServerSocket(); - socket.setReuseAddress(true); - socket.bind(new InetSocketAddress(ipAddress,port)); - - return socket; - } - - @Override - public ServerSocket createServerSocket(int port, int backlog) throws IOException { - return createServerSocket(port); - } - - @Override - public ServerSocket createServerSocket(int port, int backlog, InetAddress iAddress) throws IOException { - return createServerSocket(port); - } - - public String getIpAddress() { - return ipAddress; - } - - public void setIpAddress(String ipAddress) { - this.ipAddress = ipAddress; - } + private String ipAddress = "0.0.0.0"; + + @Override + public ServerSocket createServerSocket(int port) throws IOException { + if (port > 1023 || port == 0) { + return bindSocket(port); + } else if (Device.isRooted()) { + if (Device.isPortRedirectionAvailable()) { // use ip tables + int redirectedPort = HelperUtils.getRedirectedPort(port); + return bindSocket(redirectedPort); + } + } + return null; + } + + private ServerSocket bindSocket(int port) throws IOException { + ServerSocket socket = new ServerSocket(); + socket.setReuseAddress(true); + socket.bind(new InetSocketAddress(ipAddress, port)); + + return socket; + } + + @Override + public ServerSocket createServerSocket(int port, int backlog) throws IOException { + return createServerSocket(port); + } + + @Override + public ServerSocket createServerSocket(int port, int backlog, InetAddress iAddress) throws IOException { + return createServerSocket(port); + } + + public String getIpAddress() { + return ipAddress; + } + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } } diff --git a/src/main/java/dk/aau/netsec/hostage/nio/Reader.java b/src/main/java/dk/aau/netsec/hostage/nio/Reader.java index 2e9d7fcc..618bea2d 100644 --- a/src/main/java/dk/aau/netsec/hostage/nio/Reader.java +++ b/src/main/java/dk/aau/netsec/hostage/nio/Reader.java @@ -10,8 +10,8 @@ public class Reader { - BufferedInputStream in; - String protocol; + final BufferedInputStream in; + final String protocol; public Reader(InputStream in, String protocol) { this.in = new BufferedInputStream(in); diff --git a/src/main/java/dk/aau/netsec/hostage/nio/Writer.java b/src/main/java/dk/aau/netsec/hostage/nio/Writer.java index f51d804a..dcf02b4c 100644 --- a/src/main/java/dk/aau/netsec/hostage/nio/Writer.java +++ b/src/main/java/dk/aau/netsec/hostage/nio/Writer.java @@ -10,7 +10,7 @@ public class Writer { - BufferedOutputStream out; + final BufferedOutputStream out; public Writer(OutputStream out) { this.out = new BufferedOutputStream(out); diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java index 4cfee4a4..db4b57f4 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java @@ -29,9 +29,9 @@ import static dk.aau.netsec.hostage.persistence.DAO.SyncDeviceDAO.thisDevice; public class AttackRecordDAO extends DAO { - private DaoSession daoSession; + private final DaoSession daoSession; private Context context; - private int limit = 20; //limit for the details Conversation + private final int limit = 20; //limit for the details Conversation public AttackRecordDAO(DaoSession daoSession) { @@ -85,9 +85,7 @@ public ArrayList getAttackRecordsLimit(int offset, int limit) { qb.orderDesc(AttackRecordDao.Properties.Attack_id).build(); qb.offset(offset).limit(limit).build(); - ArrayList attackRecords = (ArrayList) qb.list(); - - return attackRecords; + return (ArrayList) qb.list(); } public long getRecordsCount() { @@ -102,7 +100,7 @@ public long getRecordsCount() { */ synchronized public void addAttackRecord(AttackRecord record) { this.insert(record); - ArrayList devices = new ArrayList(); + ArrayList devices = new ArrayList<>(); devices.add(SyncDevice.currentDevice()); SyncDeviceDAO deviceDAO = new SyncDeviceDAO(this.daoSession, context); if (thisDevice != null) @@ -139,9 +137,8 @@ public synchronized ArrayList getAttacksPerProtocol(String protoco AttackRecordDao recordDao = this.daoSession.getAttackRecordDao(); QueryBuilder qb = recordDao.queryBuilder().where(AttackRecordDao.Properties.Protocol.eq(protocol)); - ArrayList records = (ArrayList) qb.list(); - return records; + return (ArrayList) qb.list(); } @@ -158,9 +155,8 @@ public synchronized int getAttackPerProtocolCount(String protocol) { AttackRecordDao recordDao = this.daoSession.getAttackRecordDao(); QueryBuilder qb = recordDao.queryBuilder().where(AttackRecordDao.Properties.Protocol.eq(protocol)); - int result = (int) qb.buildCount().count(); - return result; + return (int) qb.buildCount().count(); } @@ -202,9 +198,7 @@ public synchronized int getAttackPerProtocolCount(String protocol, long attack_i qb.where(AttackRecordDao.Properties.Protocol.eq(protocol), qb.and(AttackRecordDao.Properties.Attack_id.eq(attack_id), AttackRecordDao.Properties.Bssid.eq(bssid))); - int result = (int) qb.buildCount().count(); - - return result; + return (int) qb.buildCount().count(); } @@ -274,7 +268,7 @@ public synchronized boolean bssidSeen(String protocol, String BSSID) { public synchronized int getNumAttacksSeenByBSSID(String BSSID) { AttackRecordDao recordDao = this.daoSession.getAttackRecordDao(); - int result = 0; + int result; if (BSSID != null) { QueryBuilder qb = recordDao.queryBuilder().where(AttackRecordDao.Properties.Bssid.eq(BSSID)); @@ -291,8 +285,7 @@ synchronized public int getNumAttacksSeenByBSSID(String protocol, String BSSID) QueryBuilder qb = recordDao.queryBuilder(); qb.where(AttackRecordDao.Properties.Bssid.eq(BSSID), AttackRecordDao.Properties.Protocol.eq(protocol)); - int result = (int) qb.count(); - return result; + return (int) qb.count(); } private void setMaxIDinDevices() { @@ -300,7 +293,7 @@ private void setMaxIDinDevices() { ArrayList allDevices = deviceDAO.getSyncDevices(); long highestID = 0; for (SyncDevice device : allDevices) { - Long sync_id = Long.valueOf(device.getDeviceID()); + long sync_id = Long.parseLong(device.getDeviceID()); highestID = device.getHighest_attack_id(); if (sync_id != 0 && highestID < sync_id) highestID = sync_id; @@ -331,7 +324,7 @@ private void addUpdatedRecords(List attackRecords, SyncDevice ownD private void updateDevicesNoID(SyncDevice ownDevice, long highestID) { if (highestID != ownDevice.getHighest_attack_id()) { // THERE WERE ATTACKS WITHOUT A DEVICE ID - ArrayList devices = new ArrayList(); + ArrayList devices = new ArrayList<>(); devices.add(ownDevice); SyncDeviceDAO deviceDAO = new SyncDeviceDAO(this.daoSession, this.context); deviceDAO.updateSyncDevices(devices); @@ -422,7 +415,7 @@ public synchronized ArrayList getRecordsForFilter(LogFilter filter) { MessageRecordDAO messageRecordDAO = new MessageRecordDAO(this.daoSession); ArrayList attackRecords = this.selectionQueryFromFilter(filter); ArrayList records = messageRecordDAO.selectionQueryFromFilter(filter); - ArrayList messageRecords = new ArrayList<>(); + ArrayList messageRecords; ArrayList distinctNetworkRecords = distinctNetworkRecords(filter); messageRecords = updatedMessageRecordsFields(attackRecords, distinctNetworkRecords, records); @@ -432,17 +425,16 @@ public synchronized ArrayList getRecordsForFilter(LogFilter filter) { public synchronized ArrayList getRecordsForFilterMutliStage(LogFilter filter) { MessageRecordDAO messageRecordDAO = new MessageRecordDAO(this.daoSession); - ArrayList allRecords = new ArrayList<>(messageRecordDAO.selectionQueryFromFilterMultiStage(filter)); - return allRecords; + return new ArrayList<>(messageRecordDAO.selectionQueryFromFilterMultiStage(filter)); } public synchronized ArrayList getRecordsForFilter(LogFilter filter, int offset, int limit, int attackRecordOffset, int attackRecordLimit) { MessageRecordDAO messageRecordDAO = new MessageRecordDAO(this.daoSession); ArrayList attackRecords = this.selectionQueryFromFilter(filter, attackRecordOffset, attackRecordLimit); ArrayList records = messageRecordDAO.selectionQueryFromFilter(filter, 0, limit); - ArrayList messageRecords = new ArrayList<>(); - ArrayList filterProtocolRecords = new ArrayList<>(); + ArrayList messageRecords; + ArrayList filterProtocolRecords; ArrayList distinctNetworkRecords = distinctNetworkRecords(filter); @@ -467,7 +459,7 @@ private ArrayList getProtocolsFilter(LogFilter filter, ArrayList< private ArrayList updatedMessageRecordsFields(ArrayList attackRecords, ArrayList distinctNetworkRecords, ArrayList records) { - ArrayList updatedAttackRecords = new ArrayList<>(); + ArrayList updatedAttackRecords; updatedAttackRecords = addNetworkFields(attackRecords, distinctNetworkRecords); return addMessageRecordFields(updatedAttackRecords, records); @@ -502,7 +494,7 @@ private ArrayList distinctNetworkRecords(LogFilter filter) { } private ArrayList sortLists(LogFilter filter, ArrayList messageRecords) { - ArrayList sorted = new ArrayList<>(); + ArrayList sorted; ArrayList allRecords = new ArrayList<>(); if (filter == null) { allRecords.addAll(messageRecords); @@ -674,7 +666,7 @@ public synchronized RecordAll getRecordOfAttackId(long attack_id) { AttackRecordDao recordDao = this.daoSession.getAttackRecordDao(); NetworkRecordDAO networkRecordDAO = new NetworkRecordDAO(this.daoSession); ArrayList networkRecords = networkRecordDAO.getNetworkInformation(); - ArrayList updatedAttackRecords = new ArrayList<>(); + ArrayList updatedAttackRecords; QueryBuilder qb = recordDao.queryBuilder(); qb.orderDesc(AttackRecordDao.Properties.Attack_id); @@ -687,9 +679,8 @@ public synchronized RecordAll getRecordOfAttackId(long attack_id) { return null; updatedAttackRecords = this.addNetworkFields(attackRecords, networkRecords); - AttackRecord attackRecord = updatedAttackRecords.get(0); - return attackRecord; + return updatedAttackRecords.get(0); } /** @@ -702,38 +693,37 @@ public synchronized ArrayList getUniqueIPRecords() { ArrayList ips = new ArrayList<>(); attackRecords.stream().filter(o -> ips.add(o.getRemoteIP())).collect(Collectors.toList()); - ArrayList distinctIps = (ArrayList) ips.stream().distinct().collect(Collectors.toList()); - return distinctIps; + return (ArrayList) ips.stream().distinct().collect(Collectors.toList()); } public ArrayList sortFilter(LogFilter filter, ArrayList list) { switch (filter.getSorttype().getValue()) { case 0: - Collections.sort(list, new DateRecordComparator()); + list.sort(new DateRecordComparator()); return list; case 1: - Collections.sort(list, (o1, o2) -> o1.getProtocol().compareTo(o2.getProtocol())); + list.sort(Comparator.comparing(RecordAll::getProtocol)); return list; case 2: - Collections.sort(list, (o1, o2) -> o1.getSsid().compareTo(o2.getSsid())); + list.sort(Comparator.comparing(RecordAll::getSsid)); return list; case 3: - Collections.sort(list, (o1, o2) -> o1.getBssid().compareTo(o2.getBssid())); + list.sort(Comparator.comparing(RecordAll::getBssid)); return list; case 7: - Collections.sort(list, (o1, o2) -> Long.compare(o1.getAttack_id(), o2.getAttack_id())); + list.sort(Comparator.comparingLong(MessageRecord::getAttack_id)); return list; case 8: - Collections.sort(list, (o1, o2) -> Long.compare(o1.getId(), o2.getId())); + list.sort(Comparator.comparingLong(MessageRecord::getId)); return list; default: return list; } } - class DateRecordComparator implements Comparator { + static class DateRecordComparator implements Comparator { @Override public int compare(RecordAll recordAll, RecordAll t1) { diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java index 1d513bf2..a7056d19 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java @@ -86,7 +86,7 @@ public List selectElementsByCondition(AbstractDao absDao, qb = qb.where(condition); } List items = qb.list(); - return items != null ? items : null; + return items; } public List selectElementsByConditionAndSort(AbstractDao absDao, @@ -102,7 +102,7 @@ public List selectElementsByConditionAndSort(AbstractDao absDao, } qb.orderCustom(sortProperty, sortStrategy); List items = qb.list(); - return items != null ? items : null; + return items; } public List selectElementsByConditionAndSortWithNullHandling(AbstractDao absDao, @@ -122,7 +122,7 @@ public List selectElementsByConditionAndSortWithNullHandling(AbstractDao< } qb.orderRaw("(CASE WHEN " + "T." + sortProperty.columnName + " IS NULL then 1 ELSE 0 END)," + "T." + sortProperty.columnName + " " + sortStrategy); List items = qb.list(); - return items != null ? items : null; + return items; } public List selectByJoin(AbstractDao absDao, diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAOHelper.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAOHelper.java index d53d8850..3c2b902c 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAOHelper.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAOHelper.java @@ -7,12 +7,12 @@ public class DAOHelper { private DaoSession daoSession; - private MessageRecordDAO messageRecordDAO; - private NetworkRecordDAO networkRecordDAO; - private ProfileDAO profileDAO; - private SyncInfoRecordDAO syncInfoRecordDAO; - private AttackRecordDAO attackRecordDAO; - private SyncDeviceDAO syncDeviceDAO; + private final MessageRecordDAO messageRecordDAO; + private final NetworkRecordDAO networkRecordDAO; + private final ProfileDAO profileDAO; + private final SyncInfoRecordDAO syncInfoRecordDAO; + private final AttackRecordDAO attackRecordDAO; + private final SyncDeviceDAO syncDeviceDAO; public DAOHelper(DaoSession daoSession, Context context){ this.daoSession= daoSession; diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/MessageRecordDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/MessageRecordDAO.java index 3c0afb7f..c9f17352 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/MessageRecordDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/MessageRecordDAO.java @@ -15,7 +15,7 @@ public class MessageRecordDAO extends DAO { - private DaoSession daoSession; + private final DaoSession daoSession; public MessageRecordDAO(DaoSession daoSession) { this.daoSession = daoSession; @@ -72,11 +72,10 @@ public void updateRecord(MessageRecord record) { public ArrayList getAllMessageRecords() { MessageRecordDao recordDao = this.daoSession.getMessageRecordDao(); - ArrayList messageRecords = (ArrayList) recordDao.queryBuilder() + + return (ArrayList) recordDao.queryBuilder() .orderDesc(MessageRecordDao.Properties.Id) .list(); - - return messageRecords; } @@ -86,8 +85,7 @@ public ArrayList getAllMessageRecordsLimit(int offset, int limit) qb.orderDesc(MessageRecordDao.Properties.Timestamp).build(); qb.offset(offset).limit(limit).build(); - ArrayList messageRecords = (ArrayList) qb.list(); - return messageRecords; + return (ArrayList) qb.list(); } @@ -99,9 +97,7 @@ public ArrayList getAllMessageRecordsLimit(int offset, int limit) public synchronized int getRecordCount() { MessageRecordDao recordDao = this.daoSession.getMessageRecordDao(); - int result = (int) countElements(recordDao); - - return result; + return (int) countElements(recordDao); } /** @@ -117,10 +113,8 @@ public synchronized void clearData() { public ArrayList getMessageRecords(AttackRecord attackRecord) { MessageRecordDao recordDao = this.daoSession.getMessageRecordDao(); - ArrayList records = - (ArrayList) selectElementsByCondition - (recordDao, MessageRecordDao.Properties.Attack_id.eq(attackRecord.getAttack_id())); - return records; + return (ArrayList) selectElementsByCondition + (recordDao, MessageRecordDao.Properties.Attack_id.eq(attackRecord.getAttack_id())); } @@ -144,7 +138,7 @@ public ArrayList selectionQueryFromFilter(LogFilter filter, int o } private ArrayList filterTimestamp(MessageRecordDao recordDao, LogFilter filter, int offset, int limit) { - ArrayList list = new ArrayList<>(); + ArrayList list; QueryBuilder qb = recordDao.queryBuilder(); qb.orderDesc(MessageRecordDao.Properties.Id); @@ -195,7 +189,7 @@ public ArrayList selectionQueryFromFilterMultiStage(LogFilter fil private ArrayList filterList(LogFilter filter) { MessageRecordDao recordDao = this.daoSession.getMessageRecordDao(); - ArrayList list = new ArrayList<>(); + ArrayList list; QueryBuilder qb = recordDao.queryBuilder(); qb.and(MessageRecordDao.Properties.Timestamp.lt(filter.getBelowTimestamp()), @@ -214,9 +208,7 @@ public ArrayList joinAttacks(String protocol) { qb.join(MessageRecord.class , MessageRecordDao.Properties.Attack_id); - ArrayList attacks = (ArrayList) qb.list(); - - return attacks; + return (ArrayList) qb.list(); } diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java index b1473536..a09c06bf 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/NetworkRecordDAO.java @@ -17,7 +17,7 @@ public class NetworkRecordDAO extends DAO { - private DaoSession daoSession; + private final DaoSession daoSession; public NetworkRecordDAO(DaoSession daoSession){ this.daoSession= daoSession; @@ -45,8 +45,7 @@ private ArrayList getNetworkRecordsLimit(int offset,int limit){ qb.orderDesc(NetworkRecordDao.Properties.TimestampLocation).build(); qb.offset(offset).limit(limit).build(); - ArrayList networkRecords = (ArrayList) qb.list(); - return networkRecords; + return (ArrayList) qb.list(); } @@ -89,7 +88,7 @@ public synchronized void updateNetworkInformation(NetworkRecord record) { * @return ArrayList of all recorded BSSIDs. */ public synchronized ArrayList getAllBSSIDS() { - ArrayList bssidList = new ArrayList(); + ArrayList bssidList = new ArrayList<>(); ArrayList networkRecords = this.getNetworkRecords(); for(NetworkRecord record:networkRecords){ @@ -101,7 +100,7 @@ public synchronized ArrayList getAllBSSIDS() { } public synchronized ArrayList getAllESSIDS() { - ArrayList ssidList = new ArrayList(); + ArrayList ssidList = new ArrayList<>(); ArrayList networkRecords = this.getNetworkRecords(); for(NetworkRecord record:networkRecords){ @@ -119,7 +118,7 @@ public synchronized ArrayList getAllESSIDS() { */ private synchronized ArrayList getMissingNetworkBssids(ArrayList otherBSSIDs) { ArrayList currentBSSIDs = getAllBSSIDS(); - ArrayList notPresent = new ArrayList(otherBSSIDs); + ArrayList notPresent = new ArrayList<>(otherBSSIDs); notPresent.removeAll(currentBSSIDs); return notPresent; @@ -134,7 +133,7 @@ private synchronized ArrayList getMissingNetworkBssids(ArrayList public synchronized ArrayList getMissingNetworkRecords(ArrayList otherBSSIDs) { ArrayList missingBSSIDs = getMissingNetworkBssids( otherBSSIDs); ArrayList networkRecords = this.getNetworkRecords(); - ArrayList missingNetworkRecords = new ArrayList(); + ArrayList missingNetworkRecords = new ArrayList<>(); ArrayList currentBssids= new ArrayList<>(); networkRecords.stream().filter(o -> currentBssids.add(o.getBssid())).collect(Collectors.toList()); @@ -287,9 +286,8 @@ public synchronized ArrayList getUniqueESSIDRecords() { ArrayList essids= new ArrayList<>(); networkRecords.stream().filter(o -> essids.add(o.getSsid())).collect(Collectors.toList()); - ArrayList distinctEssids = (ArrayList) essids.stream().distinct().collect(Collectors.toList()); - return distinctEssids; + return (ArrayList) essids.stream().distinct().collect(Collectors.toList()); } @@ -303,9 +301,8 @@ public synchronized ArrayList getUniqueBSSIDRecords() { ArrayList bssids= new ArrayList<>(); networkRecords.stream().filter(o -> bssids.add(o.getBssid())).collect(Collectors.toList()); - ArrayList distinctBssids = (ArrayList) bssids.stream().distinct().collect(Collectors.toList()); - return distinctBssids; + return (ArrayList) bssids.stream().distinct().collect(Collectors.toList()); } @@ -318,10 +315,9 @@ public synchronized ArrayList getUniqueESSIDRecordsForProtocol(String pr ArrayList essids= new ArrayList<>(); filterNetworkRecords.stream().filter(o -> essids.add(o.getSsid())).collect(Collectors.toList()); - ArrayList distinctEssids = (ArrayList) essids.stream().distinct().collect(Collectors.toList()); - return distinctEssids; + return (ArrayList) essids.stream().distinct().collect(Collectors.toList()); } public synchronized ArrayList getUniqueBSSIDRecordsForProtocol(String protocol) { @@ -333,10 +329,9 @@ public synchronized ArrayList getUniqueBSSIDRecordsForProtocol(String pr ArrayList bssids = new ArrayList<>(); filterNetworkRecords.stream().filter(o -> bssids.add(o.getBssid())).collect(Collectors.toList()); - ArrayList distinctBssids = (ArrayList) bssids.stream().distinct().collect(Collectors.toList()); - return distinctBssids; + return (ArrayList) bssids.stream().distinct().collect(Collectors.toList()); } @@ -348,7 +343,7 @@ public synchronized ArrayList getUniqueBSSIDRecordsForProtocol(String pr */ public synchronized ArrayList attacksPerBSSID(LogFilter filter) { AttackRecordDAO attackRecordDAO = new AttackRecordDAO(this.daoSession); - ArrayList plots = new ArrayList(); + ArrayList plots = new ArrayList<>(); if(filter == null || filter.getBSSIDs().isEmpty()) return addPlotComparison(plots,this.getNetworkRecords()); @@ -364,7 +359,7 @@ public synchronized ArrayList attacksPerBSSID(LogFilter filt public synchronized ArrayList attacksPerBSSID(LogFilter filter,int offset,int limit) { AttackRecordDAO attackRecordDAO = new AttackRecordDAO(this.daoSession); - ArrayList plots = new ArrayList(); + ArrayList plots = new ArrayList<>(); if(filter == null || filter.getBSSIDs().isEmpty()) return addPlotComparison(plots,this.getNetworkRecords()); @@ -387,7 +382,7 @@ public synchronized ArrayList attacksPerBSSID(LogFilter filt public synchronized ArrayList attacksPerESSID(LogFilter filter) { AttackRecordDAO attackRecordDAO = new AttackRecordDAO(this.daoSession); ArrayList filteredAttackRecords = attackRecordDAO.selectionQueryFromFilter(filter); - ArrayList plots = new ArrayList(); + ArrayList plots = new ArrayList<>(); if(filter == null || filter.getESSIDs().isEmpty()) @@ -402,7 +397,7 @@ public synchronized ArrayList attacksPerESSID(LogFilter filt public synchronized ArrayList attacksPerESSID(LogFilter filter,int offset,int limit) { AttackRecordDAO attackRecordDAO = new AttackRecordDAO(this.daoSession); ArrayList filteredAttackRecords = attackRecordDAO.selectionQueryFromFilter(filter,offset,limit); - ArrayList plots = new ArrayList(); + ArrayList plots = new ArrayList<>(); if(filter == null || filter.getESSIDs().isEmpty()) @@ -452,9 +447,7 @@ public ArrayList joinAttacks(String protocol){ qb.join(AttackRecord.class ,AttackRecordDao.Properties.TimestampLocation).where(AttackRecordDao.Properties.Protocol.eq(protocol)); - ArrayList attacks = (ArrayList) qb.list(); - - return attacks; + return (ArrayList) qb.list(); } diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/ProfileDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/ProfileDAO.java index 325cb757..5d4f2607 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/ProfileDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/ProfileDAO.java @@ -6,7 +6,7 @@ import dk.aau.netsec.hostage.model.ProfileDao; public class ProfileDAO extends DAO { - private DaoSession daoSession; + private final DaoSession daoSession; public ProfileDAO(DaoSession daoSession){ this.daoSession= daoSession; diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncDeviceDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncDeviceDAO.java index 75decd84..0acec076 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncDeviceDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncDeviceDAO.java @@ -26,7 +26,7 @@ public class SyncDeviceDAO extends DAO { public static SyncDevice thisDevice = null; private Context context; - private DaoSession daoSession; + private final DaoSession daoSession; public SyncDeviceDAO(DaoSession daoSession){ this.daoSession= daoSession; @@ -70,9 +70,8 @@ public synchronized void insertSyncDevices(List records){ */ public synchronized ArrayList getSyncDevices(){ SyncDeviceDao recordDao = this.daoSession.getSyncDeviceDao(); - ArrayList devices = (ArrayList) selectElements(recordDao); - return devices; + return (ArrayList) selectElements(recordDao); } @@ -116,7 +115,7 @@ public synchronized SyncInfo getOwnState(){ ArrayList devices = this.getSyncDevices(); - HashMap deviceMap = new HashMap(); + HashMap deviceMap = new HashMap<>(); for (SyncDevice device : devices){ deviceMap.put(device.getDeviceID(), device.getHighest_attack_id()); } @@ -134,7 +133,7 @@ public synchronized SyncInfo getOwnState(){ * @return list of all device ids. */ public synchronized ArrayList getAllDevicesIds(){ - ArrayList idsList = new ArrayList(); + ArrayList idsList = new ArrayList<>(); ArrayList syncDevices = this.getSyncDevices(); for(SyncDevice record:syncDevices){ @@ -183,7 +182,7 @@ synchronized public void insertSyncRecords(List records) { * @return HashMap containing device id's and the last synchronization timestamp. */ public synchronized HashMap getSyncDeviceHashMap(){ - HashMap devices = new HashMap(); + HashMap devices = new HashMap<>(); ArrayList allDevices = this.getSyncDevices(); @@ -241,7 +240,7 @@ private void createNewDevice(long attack_id, SharedPreferences pref){ editor.apply(); thisDevice.setLast_sync_timestamp(0); thisDevice.setHighest_attack_id(attack_id-1); - ArrayList devices = new ArrayList(); + ArrayList devices = new ArrayList<>(); devices.add(thisDevice); this.insertSyncDevices(devices); } @@ -254,7 +253,7 @@ private void createNewDevice(long attack_id, SharedPreferences pref){ */ public synchronized ArrayList getUpdatedDevicesFor(HashMap oldDeviceMap, boolean includeMissing){ ArrayList devices = this.getSyncDevices(); - ArrayList recordList = new ArrayList(); + ArrayList recordList = new ArrayList<>(); AttackRecordDAO attackRecordDAO = new AttackRecordDAO(this.daoSession,this.context); @@ -288,7 +287,7 @@ public synchronized ArrayList getUpdatedDevicesFor(HashMap getUnsyncedAttacksFor(HashMap deviceMap, boolean includeMissingDevices) { ArrayList updatedDevices = this.getUpdatedDevicesFor(deviceMap, includeMissingDevices); - ArrayList recordList = new ArrayList(); + ArrayList recordList = new ArrayList<>(); AttackRecordDAO attackRecordDAO = new AttackRecordDAO(this.daoSession,this.context); AttackRecordDao attackRecordDao = this.daoSession.getAttackRecordDao(); SyncRecord syncRecord= new SyncRecord(); diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncInfoRecordDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncInfoRecordDAO.java index 5a09c700..f7e06114 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncInfoRecordDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/SyncInfoRecordDAO.java @@ -8,7 +8,7 @@ public class SyncInfoRecordDAO extends DAO { - private DaoSession daoSession; + private final DaoSession daoSession; public SyncInfoRecordDAO(DaoSession daoSession){ this.daoSession= daoSession; @@ -32,9 +32,8 @@ public void insert(SyncInfoRecord record){ */ public synchronized ArrayList getSyncInfoRecords(){ SyncInfoRecordDao recordDao = this.daoSession.getSyncInfoRecordDao(); - ArrayList records = (ArrayList) selectElements(recordDao); - return records; + return (ArrayList) selectElements(recordDao); } @@ -43,9 +42,8 @@ public synchronized ArrayList getSyncInfoRecords(){ * @return ArrayList */ public synchronized ArrayList getSyncInfo(){ - ArrayList records = this.getSyncInfoRecords(); - return records; + return this.getSyncInfoRecords(); } diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java b/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java index 40a92f79..d15827a3 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java @@ -37,161 +37,163 @@ /** * Database Helper class to create, read and write the database. + * * @author Mihai Plasoianu * @author Lars Pandikow - * */ @Deprecated public class HostageDBOpenHelper extends SQLiteOpenHelper { - private static final String DATABASE_NAME = "hostage.db"; - private static final int DATABASE_VERSION = 3; - private Context context; + private static final String DATABASE_NAME = "hostage.db"; + private static final int DATABASE_VERSION = 3; + private final Context context; - static { + static { // NETWORK - StringBuilder networkSQLBuilder = new StringBuilder("CREATE TABLE ").append(HostageDBContract.NetworkEntry.TABLE_NAME).append("("); - networkSQLBuilder.append(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID).append(" TEXT PRIMARY KEY,"); - networkSQLBuilder.append(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID).append(" TEXT,"); - networkSQLBuilder.append(HostageDBContract.NetworkEntry.COLUMN_NAME_LATITUDE).append(" INTEGER,"); - networkSQLBuilder.append(HostageDBContract.NetworkEntry.COLUMN_NAME_LONGITUDE).append(" INTEGER,"); - networkSQLBuilder.append(HostageDBContract.NetworkEntry.COLUMN_NAME_ACCURACY).append(" INTEGER,"); - networkSQLBuilder.append(HostageDBContract.NetworkEntry.COLUMN_NAME_GEO_TIMESTAMP).append(" INTEGER"); - networkSQLBuilder.append(")"); - SQL_CREATE_NETWORK_ENTRIES = networkSQLBuilder.toString(); + String networkSQLBuilder = "CREATE TABLE " + HostageDBContract.NetworkEntry.TABLE_NAME + "(" + + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " TEXT PRIMARY KEY," + + HostageDBContract.NetworkEntry.COLUMN_NAME_SSID + " TEXT," + + HostageDBContract.NetworkEntry.COLUMN_NAME_LATITUDE + " INTEGER," + + HostageDBContract.NetworkEntry.COLUMN_NAME_LONGITUDE + " INTEGER," + + HostageDBContract.NetworkEntry.COLUMN_NAME_ACCURACY + " INTEGER," + + HostageDBContract.NetworkEntry.COLUMN_NAME_GEO_TIMESTAMP + " INTEGER" + + ")"; + SQL_CREATE_NETWORK_ENTRIES = networkSQLBuilder; // ATTACK - StringBuilder attackSQLBuilder = new StringBuilder("CREATE TABLE ").append(HostageDBContract.AttackEntry.TABLE_NAME).append("("); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID).append(" INTEGER PRIMARY KEY,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL).append(" TEXT,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_EXTERNAL_IP).append(" TEXT,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_LOCAL_IP).append(" BLOB,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_LOCAL_PORT).append(" INTEGER,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_REMOTE_IP).append(" BLOB,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_REMOTE_PORT).append(" INTEGER,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_INTERNAL_ATTACK).append(" INTEGER,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_BSSID).append(" TEXT,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID).append(" INTEGER,"); - attackSQLBuilder.append(HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE).append(" TEXT,"); - attackSQLBuilder.append(String.format("FOREIGN KEY(%s) REFERENCES %s(%s) ON DELETE CASCADE ON UPDATE CASCADE,", HostageDBContract.AttackEntry.COLUMN_NAME_BSSID, HostageDBContract.NetworkEntry.TABLE_NAME, - HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID)); - attackSQLBuilder.append(String.format("FOREIGN KEY(%s) REFERENCES %s(%s) ON DELETE CASCADE ON UPDATE CASCADE", HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE, HostageDBContract.SyncDeviceEntry.TABLE_NAME, - HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID)); - attackSQLBuilder.append(")"); - SQL_CREATE_ATTACK_ENTRIES = attackSQLBuilder.toString(); + String attackSQLBuilder = "CREATE TABLE " + HostageDBContract.AttackEntry.TABLE_NAME + "(" + + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " INTEGER PRIMARY KEY," + + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " TEXT," + + HostageDBContract.AttackEntry.COLUMN_NAME_EXTERNAL_IP + " TEXT," + + HostageDBContract.AttackEntry.COLUMN_NAME_LOCAL_IP + " BLOB," + + HostageDBContract.AttackEntry.COLUMN_NAME_LOCAL_PORT + " INTEGER," + + HostageDBContract.AttackEntry.COLUMN_NAME_REMOTE_IP + " BLOB," + + HostageDBContract.AttackEntry.COLUMN_NAME_REMOTE_PORT + " INTEGER," + + HostageDBContract.AttackEntry.COLUMN_NAME_INTERNAL_ATTACK + " INTEGER," + + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " TEXT," + + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID + " INTEGER," + + HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE + " TEXT," + + String.format("FOREIGN KEY(%s) REFERENCES %s(%s) ON DELETE CASCADE ON UPDATE CASCADE,", HostageDBContract.AttackEntry.COLUMN_NAME_BSSID, HostageDBContract.NetworkEntry.TABLE_NAME, + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID) + + String.format("FOREIGN KEY(%s) REFERENCES %s(%s) ON DELETE CASCADE ON UPDATE CASCADE", HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE, HostageDBContract.SyncDeviceEntry.TABLE_NAME, + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID) + + ")"; + SQL_CREATE_ATTACK_ENTRIES = attackSQLBuilder; // PACKET - StringBuilder packetSQLBuilder = new StringBuilder("CREATE TABLE ").append(HostageDBContract.PacketEntry.TABLE_NAME).append("("); - packetSQLBuilder.append(HostageDBContract.PacketEntry.COLUMN_NAME_ID).append(" INTEGER NOT NULL,"); - packetSQLBuilder.append(HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID).append(" INTEGER NOT NULL,"); - packetSQLBuilder.append(HostageDBContract.PacketEntry.COLUMN_NAME_TYPE).append(" TEXT,"); - packetSQLBuilder.append(HostageDBContract.PacketEntry.COLUMN_NAME_PACKET_TIMESTAMP).append(" INTEGER,"); - packetSQLBuilder.append(HostageDBContract.PacketEntry.COLUMN_NAME_PACKET).append(" TEXT,"); - packetSQLBuilder.append(String.format("PRIMARY KEY(%s,%s)", HostageDBContract.PacketEntry.COLUMN_NAME_ID, HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID)); - packetSQLBuilder.append(String.format("FOREIGN KEY(%s) REFERENCES %s(%s)", HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID, HostageDBContract.AttackEntry.TABLE_NAME, - HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID)); - packetSQLBuilder.append(")"); - SQL_CREATE_PACKET_ENTRIES = packetSQLBuilder.toString(); + String packetSQLBuilder = "CREATE TABLE " + HostageDBContract.PacketEntry.TABLE_NAME + "(" + + HostageDBContract.PacketEntry.COLUMN_NAME_ID + " INTEGER NOT NULL," + + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " INTEGER NOT NULL," + + HostageDBContract.PacketEntry.COLUMN_NAME_TYPE + " TEXT," + + HostageDBContract.PacketEntry.COLUMN_NAME_PACKET_TIMESTAMP + " INTEGER," + + HostageDBContract.PacketEntry.COLUMN_NAME_PACKET + " TEXT," + + String.format("PRIMARY KEY(%s,%s)", HostageDBContract.PacketEntry.COLUMN_NAME_ID, HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID) + + String.format("FOREIGN KEY(%s) REFERENCES %s(%s)", HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID, HostageDBContract.AttackEntry.TABLE_NAME, + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID) + + ")"; + SQL_CREATE_PACKET_ENTRIES = packetSQLBuilder; // SyncDeviceEntry - StringBuilder syncDevicesSQLBuilder = new StringBuilder("CREATE TABLE ").append(HostageDBContract.SyncDeviceEntry.TABLE_NAME).append("("); - syncDevicesSQLBuilder.append(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID).append(" TEXT PRIMARY KEY,"); - syncDevicesSQLBuilder.append(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP).append(" INTEGER,"); - syncDevicesSQLBuilder.append(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_HIGHEST_ATTACK_ID).append(" INTEGER"); - syncDevicesSQLBuilder.append(")"); - SQL_CREATE_SYNC_DEVICES_ENTRIES = syncDevicesSQLBuilder.toString(); + String syncDevicesSQLBuilder = "CREATE TABLE " + HostageDBContract.SyncDeviceEntry.TABLE_NAME + "(" + + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID + " TEXT PRIMARY KEY," + + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP + " INTEGER," + + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_HIGHEST_ATTACK_ID + " INTEGER" + + ")"; + SQL_CREATE_SYNC_DEVICES_ENTRIES = syncDevicesSQLBuilder; // SyncInfoEntry - StringBuilder syncInfoSQLBuilder = new StringBuilder("CREATE TABLE ").append(HostageDBContract.SyncInfoEntry.TABLE_NAME).append("("); - syncInfoSQLBuilder.append(HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID).append(" TEXT,"); - syncInfoSQLBuilder.append(HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID).append(" TEXT,"); - syncInfoSQLBuilder.append(HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_ATTACKS).append(" INTEGER,"); - syncInfoSQLBuilder.append(HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_PORTSCANS).append(" INTEGER,"); - syncInfoSQLBuilder.append(String.format("PRIMARY KEY(%s,%s)", HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID, HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID)); - syncInfoSQLBuilder.append(String.format("FOREIGN KEY(%s) REFERENCES %s(%s)", HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID, HostageDBContract.NetworkEntry.TABLE_NAME, - HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID)); - syncInfoSQLBuilder.append(")"); - SQL_CREATE_SYNC_INFO_ENTRIES = syncInfoSQLBuilder.toString(); + String syncInfoSQLBuilder = "CREATE TABLE " + HostageDBContract.SyncInfoEntry.TABLE_NAME + "(" + + HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID + " TEXT," + + HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID + " TEXT," + + HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_ATTACKS + " INTEGER," + + HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_PORTSCANS + " INTEGER," + + String.format("PRIMARY KEY(%s,%s)", HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID, HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID) + + String.format("FOREIGN KEY(%s) REFERENCES %s(%s)", HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID, HostageDBContract.NetworkEntry.TABLE_NAME, + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID) + + ")"; + SQL_CREATE_SYNC_INFO_ENTRIES = syncInfoSQLBuilder; // ProfileEntry - StringBuilder profilSQLBuilder = new StringBuilder("CREATE TABLE ").append(HostageDBContract.ProfileEntry.TABLE_NAME).append("("); - profilSQLBuilder.append(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID).append(" INTEGER PRIMARY KEY AUTOINCREMENT,"); - profilSQLBuilder.append(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_NAME).append(" TEXT,"); - profilSQLBuilder.append(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_DESCRIPTION ).append(" TEXT,"); - profilSQLBuilder.append(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON).append(" TEXT,"); - profilSQLBuilder.append(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON_NAME).append(" TEXT,"); - profilSQLBuilder.append(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_EDITABLE).append(" INTEGER,"); - profilSQLBuilder.append(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ACTIVE).append(" INTEGER"); - profilSQLBuilder.append(")"); - SQL_CREATE_PROFILE_ENTRIES = profilSQLBuilder.toString(); - } - - private static final String SQL_CREATE_NETWORK_ENTRIES; - private static final String SQL_CREATE_ATTACK_ENTRIES; - private static final String SQL_CREATE_PACKET_ENTRIES; - private static final String SQL_CREATE_PROFILE_ENTRIES; - private static final String SQL_CREATE_SYNC_DEVICES_ENTRIES; - private static final String SQL_CREATE_SYNC_INFO_ENTRIES; - - private static final String SQL_DELETE_PACKET_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.PacketEntry.TABLE_NAME; - private static final String SQL_DELETE_ATTACK_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.AttackEntry.TABLE_NAME; - private static final String SQL_DELETE_NETWORK_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.NetworkEntry.TABLE_NAME; - private static final String SQL_DELETE_PROFILE_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.ProfileEntry.TABLE_NAME; - private static final String SQL_DELETE_SYNC_DEVICES_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; - private static final String SQL_DELETE_SYNC_INFO_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.SyncInfoEntry.TABLE_NAME; - - public HostageDBOpenHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - this.context = context; + String profilSQLBuilder = "CREATE TABLE " + HostageDBContract.ProfileEntry.TABLE_NAME + "(" + + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_NAME + " TEXT," + + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_DESCRIPTION + " TEXT," + + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON + " TEXT," + + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON_NAME + " TEXT," + + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_EDITABLE + " INTEGER," + + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ACTIVE + " INTEGER" + + ")"; + SQL_CREATE_PROFILE_ENTRIES = profilSQLBuilder; + } + + private static final String SQL_CREATE_NETWORK_ENTRIES; + private static final String SQL_CREATE_ATTACK_ENTRIES; + private static final String SQL_CREATE_PACKET_ENTRIES; + private static final String SQL_CREATE_PROFILE_ENTRIES; + private static final String SQL_CREATE_SYNC_DEVICES_ENTRIES; + private static final String SQL_CREATE_SYNC_INFO_ENTRIES; + + private static final String SQL_DELETE_PACKET_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.PacketEntry.TABLE_NAME; + private static final String SQL_DELETE_ATTACK_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.AttackEntry.TABLE_NAME; + private static final String SQL_DELETE_NETWORK_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.NetworkEntry.TABLE_NAME; + private static final String SQL_DELETE_PROFILE_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.ProfileEntry.TABLE_NAME; + private static final String SQL_DELETE_SYNC_DEVICES_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; + private static final String SQL_DELETE_SYNC_INFO_ENTRIES = "DROP TABLE IF EXISTS " + HostageDBContract.SyncInfoEntry.TABLE_NAME; + + public HostageDBOpenHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + this.context = context; this.generateCurrentDevice(); - } + } - @Override - public void onCreate(SQLiteDatabase db) { + @Override + public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_SYNC_DEVICES_ENTRIES); db.execSQL(SQL_CREATE_NETWORK_ENTRIES); - db.execSQL(SQL_CREATE_ATTACK_ENTRIES); - db.execSQL(SQL_CREATE_PACKET_ENTRIES); - db.execSQL(SQL_CREATE_PROFILE_ENTRIES); - db.execSQL(SQL_CREATE_SYNC_INFO_ENTRIES); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + db.execSQL(SQL_CREATE_ATTACK_ENTRIES); + db.execSQL(SQL_CREATE_PACKET_ENTRIES); + db.execSQL(SQL_CREATE_PROFILE_ENTRIES); + db.execSQL(SQL_CREATE_SYNC_INFO_ENTRIES); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(SQL_DELETE_SYNC_DEVICES_ENTRIES); db.execSQL(SQL_DELETE_SYNC_INFO_ENTRIES); - db.execSQL(SQL_DELETE_PACKET_ENTRIES); - db.execSQL(SQL_DELETE_ATTACK_ENTRIES); - db.execSQL(SQL_DELETE_PROFILE_ENTRIES); - db.execSQL(SQL_DELETE_NETWORK_ENTRIES); - onCreate(db); - } - - private static SyncDevice thisDevice = null; - public static SyncDevice currentDevice(){ - if (thisDevice != null){ + db.execSQL(SQL_DELETE_PACKET_ENTRIES); + db.execSQL(SQL_DELETE_ATTACK_ENTRIES); + db.execSQL(SQL_DELETE_PROFILE_ENTRIES); + db.execSQL(SQL_DELETE_NETWORK_ENTRIES); + onCreate(db); + } + + private static SyncDevice thisDevice = null; + + public static SyncDevice currentDevice() { + if (thisDevice != null) { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(MainActivity.getContext()); int attack_id = pref.getInt("ATTACK_ID_COUNTER", 0); thisDevice.setHighest_attack_id(attack_id); } return thisDevice; } + /** * Returns a SyncDevice Object representing the current device. + * * @return {@link SyncDevice} */ - public SyncDevice generateCurrentDevice() - { + public SyncDevice generateCurrentDevice() { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this.context); int attack_id = pref.getInt("ATTACK_ID_COUNTER", 0); // IF THE SHARED INSTANCE IS NOT AVAILABLE GET IT - if (thisDevice == null){ + if (thisDevice == null) { String deviceUUID = pref.getString("CURRENT_DEVICE_IDENTIFIER", UUID.randomUUID().toString()); String selectQuery = "SELECT * FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME + " D " - + " WHERE " + " D." + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID + " = " + "'"+deviceUUID+"'"; + + " WHERE " + " D." + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID + " = " + "'" + deviceUUID + "'"; //HostageDBOpenHelper dbh = new HostageDBOpenHelper(MainActivity.context); SQLiteDatabase db = this.getReadableDatabase(); @@ -204,7 +206,7 @@ public SyncDevice generateCurrentDevice() record.setLast_sync_timestamp(cursor.getLong(1)); record.setHighest_attack_id(cursor.getLong(2)); thisDevice = record; - thisDevice.setHighest_attack_id(attack_id-1); + thisDevice.setHighest_attack_id(attack_id - 1); cursor.close(); db.close(); // return record list @@ -221,48 +223,46 @@ public SyncDevice generateCurrentDevice() editor.putString("CURRENT_DEVICE_IDENTIFIER", thisDevice.getDeviceID()); editor.commit(); thisDevice.setLast_sync_timestamp(0); - thisDevice.setHighest_attack_id(attack_id-1); - ArrayList devices = new ArrayList(); + thisDevice.setHighest_attack_id(attack_id - 1); + ArrayList devices = new ArrayList<>(); devices.add(thisDevice); this.insertSyncDevices(devices); } - } thisDevice.setHighest_attack_id(attack_id - 1); return thisDevice; } - /** - * Adds a given {@link MessageRecord} to the database. - * - * @param record - * The added {@link MessageRecord} . - */ - synchronized public void addMessageRecord(MessageRecord record) { - SQLiteDatabase db = this.getWritableDatabase(); + /** + * Adds a given {@link MessageRecord} to the database. + * + * @param record The added {@link MessageRecord} . + */ + synchronized public void addMessageRecord(MessageRecord record) { + SQLiteDatabase db = this.getWritableDatabase(); - this.insertMessageRecordWithOnConflict(record, db); - db.close(); // Closing database connection - } + this.insertMessageRecordWithOnConflict(record, db); + db.close(); // Closing database connection + } /** * Adds a given {@link MessageRecord}s to the database. * * @param records {@link List} - * The added {@link MessageRecord}s . + * The added {@link MessageRecord}s . */ - synchronized public void insertMessageRecords(List records){ - if(records == null) return; + synchronized public void insertMessageRecords(List records) { + if (records == null) return; SQLiteDatabase db = this.getWritableDatabase(); db.beginTransaction(); try { - for (MessageRecord record : records){ - this.insertMessageRecordWithOnConflict(record,db); + for (MessageRecord record : records) { + this.insertMessageRecordWithOnConflict(record, db); } db.setTransactionSuccessful(); } finally { @@ -270,15 +270,17 @@ synchronized public void insertMessageRecords(List records){ } db.close(); } - public void insertMessageRecords(List records, SQLiteDatabase db){ - if(records == null) return; - for (MessageRecord record : records){ - this.insertMessageRecordWithOnConflict(record,db); + public void insertMessageRecords(List records, SQLiteDatabase db) { + if (records == null) return; + + for (MessageRecord record : records) { + this.insertMessageRecordWithOnConflict(record, db); } } + //TODO is needed? - synchronized private void insertMessageRecordWithOnConflict(MessageRecord record, SQLiteDatabase db){ + synchronized private void insertMessageRecordWithOnConflict(MessageRecord record, SQLiteDatabase db) { ContentValues recordValues = new ContentValues(); recordValues.put(HostageDBContract.PacketEntry.COLUMN_NAME_ID, record.getId()); // Log Message Number recordValues.put(HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID, record.getAttack_id()); // Log Attack ID @@ -290,26 +292,25 @@ synchronized private void insertMessageRecordWithOnConflict(MessageRecord record db.insertWithOnConflict(HostageDBContract.PacketEntry.TABLE_NAME, null, recordValues, SQLiteDatabase.CONFLICT_REPLACE); } - /** - * Adds a given {@link AttackRecord} to the database. - * - * @param record - * The added {@link AttackRecord} . - */ + /** + * Adds a given {@link AttackRecord} to the database. + * + * @param record The added {@link AttackRecord} . + */ synchronized public void addAttackRecord(AttackRecord record) { - //Log.i("DBHelper", "Add Attack Record with id: " + record.getAttack_id()); - SQLiteDatabase db = this.getWritableDatabase(); - this.insertAttackRecordWithOnConflict(record,db); - db.close(); // Closing database connection - ArrayList devices = new ArrayList(); + //Log.i("DBHelper", "Add Attack Record with id: " + record.getAttack_id()); + SQLiteDatabase db = this.getWritableDatabase(); + this.insertAttackRecordWithOnConflict(record, db); + db.close(); // Closing database connection + ArrayList devices = new ArrayList<>(); devices.add(SyncDevice.currentDevice()); this.updateSyncDevices(devices); - } + } /** * Updates the own devices and connects attack records without a device to the own device */ - synchronized public void updateUntrackedAttacks(){ + synchronized public void updateUntrackedAttacks() { SQLiteDatabase db = this.getWritableDatabase(); String selectQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " A WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE + " IS NULL ORDER BY " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " DESC"; Cursor cursor = db.rawQuery(selectQuery, null); @@ -318,13 +319,13 @@ synchronized public void updateUntrackedAttacks(){ long highestID = ownDevice.getHighest_attack_id(); - ArrayList records = new ArrayList(); + ArrayList records = new ArrayList<>(); if (cursor.moveToFirst()) { do { AttackRecord record = this.createAttackRecord(cursor); record.setDevice(ownDevice.getDeviceID()); - highestID = (highestID > record.getAttack_id())? highestID : record.getAttack_id(); + highestID = Math.max(highestID, record.getAttack_id()); records.add(record); } while (cursor.moveToNext()); } @@ -333,11 +334,11 @@ synchronized public void updateUntrackedAttacks(){ // UPDATE RECORDS - if (records.size() > 0){ + if (records.size() > 0) { db.beginTransaction(); try { - for (AttackRecord record : records){ - this.insertAttackRecordWithOnConflict(record,db); + for (AttackRecord record : records) { + this.insertAttackRecordWithOnConflict(record, db); } db.setTransactionSuccessful(); } finally { @@ -345,9 +346,9 @@ synchronized public void updateUntrackedAttacks(){ } } - if (highestID != ownDevice.getHighest_attack_id()){ + if (highestID != ownDevice.getHighest_attack_id()) { // THERE WERE ATTACKS WITHOUT A DEVICE ID - ArrayList devices = new ArrayList(); + ArrayList devices = new ArrayList<>(); devices.add(ownDevice); updateSyncDevices(devices); } @@ -360,7 +361,7 @@ synchronized public void updateUntrackedAttacks(){ * Adds a given {@link AttackRecord}s to the database. * * @param records {@link List} - * The added {@link AttackRecord}s . + * The added {@link AttackRecord}s . */ synchronized public void insertAttackRecords(List records) { @@ -370,20 +371,20 @@ synchronized public void insertAttackRecords(List records) { db.beginTransaction(); try { - for (AttackRecord record : records){ - this.insertAttackRecordWithOnConflict(record,db); + for (AttackRecord record : records) { + this.insertAttackRecordWithOnConflict(record, db); } db.setTransactionSuccessful(); } finally { db.endTransaction(); } db.close(); // Closing database connection - ArrayList devices = new ArrayList(); + ArrayList devices = new ArrayList<>(); devices.add(SyncDevice.currentDevice()); this.updateSyncDevices(devices); } - synchronized private void insertAttackRecordWithOnConflict(AttackRecord record, SQLiteDatabase db){ + synchronized private void insertAttackRecordWithOnConflict(AttackRecord record, SQLiteDatabase db) { ContentValues attackValues = new ContentValues(); attackValues.put(HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID, record.getAttack_id()); // Log Attack ID attackValues.put(HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL, record.getProtocol()); @@ -405,7 +406,7 @@ synchronized private void insertAttackRecordWithOnConflict(AttackRecord record, * Adds a given {@link SyncRecord}s to the database. * * @param records {@link List} - * The added {@link SyncRecord}s . + * The added {@link SyncRecord}s . */ synchronized public void insertSyncRecords(List records) { //Log.i("DBHelper", "Add Attack Record with id: " + record.getAttack_id()); @@ -413,11 +414,11 @@ synchronized public void insertSyncRecords(List records) { db.beginTransaction(); try { - for (SyncRecord record : records){ + for (SyncRecord record : records) { AttackRecord attackRecord = record.getAttackRecord(); this.insertAttackRecordWithOnConflict(attackRecord, db); - if(record.getMessageRecords() == null){ + if (record.getMessageRecords() == null) { MessageRecord msg = new MessageRecord(true); msg.setAttack_id(attackRecord.getAttack_id()); msg.setType(MessageRecord.TYPE.RECEIVE); @@ -443,12 +444,12 @@ synchronized public void insertSyncRecords(List records) { /** * Updates the sync devices max sync id. */ - synchronized public void updateSyncDevicesMaxID(SQLiteDatabase db){ - HashMap deviceIDmap = new HashMap(); + synchronized public void updateSyncDevicesMaxID(SQLiteDatabase db) { + HashMap deviceIDmap = new HashMap<>(); - String selectQuery = "SELECT "+ HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE+ "," - + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID+" FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " A " - + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID + " NOT NULL " + " GROUP BY " + String selectQuery = "SELECT " + HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE + "," + + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID + " FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " A " + + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID + " NOT NULL " + " GROUP BY " + HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE + " HAVING " + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID + " = MAX( " + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID + " )"; @@ -467,126 +468,123 @@ synchronized public void updateSyncDevicesMaxID(SQLiteDatabase db){ cursor.close(); } - ArrayList allDevices = this.getSyncDevices(db); - for (SyncDevice device : allDevices){ - Long sync_id = deviceIDmap.get(device.getDeviceID()); - long highestID = device.getHighest_attack_id(); - if (sync_id != null && highestID < sync_id) highestID = sync_id.longValue(); - device.setHighest_attack_id(highestID); - } - this.updateSyncDevices(allDevices, db); + ArrayList allDevices = this.getSyncDevices(db); + for (SyncDevice device : allDevices) { + Long sync_id = deviceIDmap.get(device.getDeviceID()); + long highestID = device.getHighest_attack_id(); + if (sync_id != null && highestID < sync_id) highestID = sync_id.longValue(); + device.setHighest_attack_id(highestID); + } + this.updateSyncDevices(allDevices, db); } - synchronized public void updateSyncAttackCounter(AttackRecord record){ - - SQLiteDatabase db = this.getWritableDatabase(); + synchronized public void updateSyncAttackCounter(AttackRecord record) { + + SQLiteDatabase db = this.getWritableDatabase(); - //String mac = HelperUtils.getMacAdress(context); + //String mac = HelperUtils.getMacAdress(context); SyncDevice currentDevice = SyncDevice.currentDevice(); ContentValues syncDeviceValues = new ContentValues(); - syncDeviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID, currentDevice.getDeviceID()); - syncDeviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP, System.currentTimeMillis()); - syncDeviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_HIGHEST_ATTACK_ID, record.getAttack_id()); - - db.insertWithOnConflict(HostageDBContract.SyncDeviceEntry.TABLE_NAME, null, syncDeviceValues, SQLiteDatabase.CONFLICT_REPLACE); - db.close(); // Closing database connection - } - - - /** - * Determines if a network with given BSSID has already been recorded as malicious. - * - * @param BSSID - * The BSSID of the network. - * @return True if an attack has been recorded in a network with the given - * BSSID, else false. - */ - public synchronized boolean bssidSeen(String BSSID) { - String countQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, new String[] {BSSID}); - int result = cursor.getCount(); - cursor.close(); - db.close(); - return result > 0; - } - - /** - * Determines if an attack has been recorded on a specific protocol in a - * network with a given BSSID. - * - * @param protocol - * The - * {@link Protocol - * Protocol} to inspect. - * @param BSSID - * The BSSID of the network. - * @return True if an attack on the given protocol has been recorded in a - * network with the given BSSID, else false. - */ - public synchronized boolean bssidSeen(String protocol, String BSSID) { - if(BSSID == null || protocol == null){ - return false; - } - String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " - + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? AND " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, new String[]{protocol, BSSID}); - int result = cursor.getCount(); - cursor.close(); - db.close(); - return result > 0; - } - - public synchronized int getNumAttacksSeenByBSSID(String BSSID) { - String countQuery = "SELECT COUNT(*) FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " WHERE " - + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = " + "'" + BSSID + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - cursor.moveToFirst(); - int result = cursor.getInt(0); - cursor.close(); - db.close(); - return result; - } + syncDeviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID, currentDevice.getDeviceID()); + syncDeviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP, System.currentTimeMillis()); + syncDeviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_HIGHEST_ATTACK_ID, record.getAttack_id()); + + db.insertWithOnConflict(HostageDBContract.SyncDeviceEntry.TABLE_NAME, null, syncDeviceValues, SQLiteDatabase.CONFLICT_REPLACE); + db.close(); // Closing database connection + } + + + /** + * Determines if a network with given BSSID has already been recorded as malicious. + * + * @param BSSID The BSSID of the network. + * @return True if an attack has been recorded in a network with the given + * BSSID, else false. + */ + public synchronized boolean bssidSeen(String BSSID) { + String countQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, new String[]{BSSID}); + int result = cursor.getCount(); + cursor.close(); + db.close(); + return result > 0; + } + + /** + * Determines if an attack has been recorded on a specific protocol in a + * network with a given BSSID. + * + * @param protocol The + * {@link Protocol + * Protocol} to inspect. + * @param BSSID The BSSID of the network. + * @return True if an attack on the given protocol has been recorded in a + * network with the given BSSID, else false. + */ + public synchronized boolean bssidSeen(String protocol, String BSSID) { + if (BSSID == null || protocol == null) { + return false; + } + String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? AND " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, new String[]{protocol, BSSID}); + int result = cursor.getCount(); + cursor.close(); + db.close(); + return result > 0; + } + + public synchronized int getNumAttacksSeenByBSSID(String BSSID) { + String countQuery = "SELECT COUNT(*) FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " WHERE " + + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = " + "'" + BSSID + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + cursor.moveToFirst(); + int result = cursor.getInt(0); + cursor.close(); + db.close(); + return result; + } synchronized public int getNumAttacksSeenByBSSID(String protocol, String BSSID) { - String countQuery = "SELECT COUNT(*) FROM " + HostageDBContract.AttackEntry.TABLE_NAME - + " WHERE " + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = " + "'" + protocol + "'" - + " AND " + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = " + "'" + BSSID + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - cursor.moveToFirst(); - int result = cursor.getInt(0); - cursor.close(); - db.close(); - return result; - } + String countQuery = "SELECT COUNT(*) FROM " + HostageDBContract.AttackEntry.TABLE_NAME + + " WHERE " + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = " + "'" + protocol + "'" + + " AND " + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = " + "'" + BSSID + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + cursor.moveToFirst(); + int result = cursor.getInt(0); + cursor.close(); + db.close(); + return result; + } - /** - * Returns a String array with all BSSIDs stored in the database. - * - * @return ArrayList of all recorded BSSIDs. - */ - public synchronized ArrayList getAllBSSIDS() { - String selectQuery = "SELECT "+ HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID+" FROM " + HostageDBContract.NetworkEntry.TABLE_NAME; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - ArrayList bssidList = new ArrayList(); - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - String s = cursor.getString(0); + /** + * Returns a String array with all BSSIDs stored in the database. + * + * @return ArrayList of all recorded BSSIDs. + */ + public synchronized ArrayList getAllBSSIDS() { + String selectQuery = "SELECT " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " FROM " + HostageDBContract.NetworkEntry.TABLE_NAME; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + ArrayList bssidList = new ArrayList<>(); + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + String s = cursor.getString(0); bssidList.add(s); - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - return bssidList; - } + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + return bssidList; + } /** * Returns all missing network records. @@ -594,11 +592,11 @@ public synchronized ArrayList getAllBSSIDS() { * @return a list of missing network records. */ public synchronized ArrayList getMissingNetworkRecords(ArrayList otherBSSIDs) { - String prefix = " WHERE " + "N."+ HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " NOT IN "; + String prefix = " WHERE " + "N." + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " NOT IN "; String selectQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " N " + this.arrayToSQLString(otherBSSIDs, prefix); SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); - ArrayList networkInformation = new ArrayList(); + ArrayList networkInformation = new ArrayList<>(); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { @@ -611,20 +609,19 @@ public synchronized ArrayList getMissingNetworkRecords(ArrayList< return networkInformation; } - private String arrayToSQLString(ArrayList a, String prefix) - { + private String arrayToSQLString(ArrayList a, String prefix) { String sql = ""; - if (a.size() !=0){ + if (a.size() != 0) { sql = sql + prefix; sql = sql + " ( "; int i = 0; - for (String s : a){ + for (String s : a) { i++; - sql = sql + "'" +s + "'"; - if (i != a.size()){ - sql = sql + ","; + sql = sql + "'" + s + "'"; + if (i != a.size()) { + sql = sql + ","; } } sql = sql + " ) "; @@ -632,177 +629,176 @@ private String arrayToSQLString(ArrayList a, String prefix) return sql; } - /** - * Determines the number of different attacks in the database. - * - * @return The number of different attacks in the database. - */ - public synchronized int getAttackCount() { - SQLiteDatabase db = this.getReadableDatabase(); - String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + - " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " <> ?"; - Cursor cursor = db.rawQuery(countQuery, new String[]{"PORTSCAN"}); - int result = cursor.getCount(); - cursor.close(); + /** + * Determines the number of different attacks in the database. + * + * @return The number of different attacks in the database. + */ + public synchronized int getAttackCount() { + SQLiteDatabase db = this.getReadableDatabase(); + String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " <> ?"; + Cursor cursor = db.rawQuery(countQuery, new String[]{"PORTSCAN"}); + int result = cursor.getCount(); + cursor.close(); - // return count - db.close(); - return result; - } - - /** - * Determines the number of different recorded attacks in a specific access point since the given attack_id. - * The given attack_id is not included. - * @param attack_id The attack id to match the query against. - * @param bssid The BSSID of the access point. - * @return The number of different attacks in the database since the given attack_id. - */ - public synchronized int getAttackCount(int attack_id, String bssid) { - SQLiteDatabase db = this.getReadableDatabase(); - String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + - " WHERE "+ HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " <> ? " + - "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > ? " + - "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = ?"; - String[] selectArgs = new String[]{"PORTSCAN", attack_id + "", bssid}; - Cursor cursor = db.rawQuery(countQuery, selectArgs); - int result = cursor.getCount(); - cursor.close(); + // return count + db.close(); + return result; + } - // return count - db.close(); - return result; - } - - - /** - * Determines the number of different attacks for a specific protocol in - * the database. - * - * @param protocol - * The String representation of the - * {@link Protocol - * Protocol} - * @return The number of different attacks in the database. - */ - public synchronized int getAttackPerProtocolCount(String protocol) { - SQLiteDatabase db = this.getReadableDatabase(); - String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + - " WHERE "+ HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? "; - Cursor cursor = db.rawQuery(countQuery, new String[]{protocol}); - int result = cursor.getCount(); - cursor.close(); + /** + * Determines the number of different recorded attacks in a specific access point since the given attack_id. + * The given attack_id is not included. + * + * @param attack_id The attack id to match the query against. + * @param bssid The BSSID of the access point. + * @return The number of different attacks in the database since the given attack_id. + */ + public synchronized int getAttackCount(int attack_id, String bssid) { + SQLiteDatabase db = this.getReadableDatabase(); + String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " <> ? " + + "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > ? " + + "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = ?"; + String[] selectArgs = new String[]{"PORTSCAN", attack_id + "", bssid}; + Cursor cursor = db.rawQuery(countQuery, selectArgs); + int result = cursor.getCount(); + cursor.close(); - // return count - db.close(); - return result; - } - - /** - * Determines the number of attacks for a specific protocol in - * the database since the given attack_id. - * - * @param protocol - * The String representation of the - * {@link Protocol - * Protocol} - * @param attack_id The attack id to match the query against. - * @return The number of different attacks in the database since the given attack_id. - */ - public synchronized int getAttackPerProtocolCount(String protocol, int attack_id) { - SQLiteDatabase db = this.getReadableDatabase(); - String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + - " WHERE "+ HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? " + - "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > ? "; - Cursor cursor = db.rawQuery(countQuery, new String[]{protocol, attack_id + ""}); - int result = cursor.getCount(); - cursor.close(); + // return count + db.close(); + return result; + } - // return count - db.close(); - return result; - } - - /** - * Determines the number of recorded attacks for a specific protocol and accesss point since the given attack_id. - * - * @param protocol - * The String representation of the - * {@link Protocol - * Protocol} - * @param attack_id The attack id to match the query against. - * @param bssid The BSSID of the access point. - * @return The number of different attacks in the database since the given attack_id. - */ - public synchronized int getAttackPerProtocolCount(String protocol, int attack_id, String bssid) { - SQLiteDatabase db = this.getReadableDatabase(); - String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + - " WHERE "+ HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? " + - "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > ? " + - "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = ?"; - Cursor cursor = db.rawQuery(countQuery, new String[]{protocol, attack_id + "", bssid}); - int result = cursor.getCount(); - cursor.close(); - // return count - db.close(); - return result; - } - - /** - * Determines the number of portscans stored in the database. - * - * @return The number of portscans stored in the database. - */ - public synchronized int getPortscanCount() { - return getAttackPerProtocolCount("PORTSCAN"); - } - - /** - * Determines the number of recorded portscans since the given attack_id. - * @param attack_id The attack id to match the query against. - * @return The number of portscans stored in the database since the given attack_id. - */ - public synchronized int getPortscanCount(int attack_id) { - return getAttackPerProtocolCount("PORTSCAN", attack_id); - } - - /** - * Determines the number of recorded portscans in a specific access point since the given attack_id. - * @param attack_id The attack id to match the query against. - * @param bssid The BSSID of the access point. - * @return The number of portscans stored in the database since the given attack_id. - */ - public synchronized int getPortscanCount(int attack_id, String bssid) { - return getAttackPerProtocolCount("PORTSCAN", attack_id, bssid); - } - - - /** - * Determines the number of {@link Record Records} in the database. - * - * - * @return The number of {@link Record Records} in the database. - */ - public synchronized int getRecordCount() { - String countQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(countQuery, null); - int result = cursor.getCount(); - cursor.close(); + /** + * Determines the number of different attacks for a specific protocol in + * the database. + * + * @param protocol The String representation of the + * {@link Protocol + * Protocol} + * @return The number of different attacks in the database. + */ + public synchronized int getAttackPerProtocolCount(String protocol) { + SQLiteDatabase db = this.getReadableDatabase(); + String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? "; + Cursor cursor = db.rawQuery(countQuery, new String[]{protocol}); + int result = cursor.getCount(); + cursor.close(); - // return count - db.close(); - return result; - } - - //TODO ADD AGAIN ? - /** - * Returns the {@link AttackRecord} with the given attack id from the database. - * - * @param attack_id - * The attack id of the {@link Record}; - * @return The {@link Record}. - */ + // return count + db.close(); + return result; + } + + /** + * Determines the number of attacks for a specific protocol in + * the database since the given attack_id. + * + * @param protocol The String representation of the + * {@link Protocol + * Protocol} + * @param attack_id The attack id to match the query against. + * @return The number of different attacks in the database since the given attack_id. + */ + public synchronized int getAttackPerProtocolCount(String protocol, int attack_id) { + SQLiteDatabase db = this.getReadableDatabase(); + String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? " + + "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > ? "; + Cursor cursor = db.rawQuery(countQuery, new String[]{protocol, attack_id + ""}); + int result = cursor.getCount(); + cursor.close(); + + // return count + db.close(); + return result; + } + + /** + * Determines the number of recorded attacks for a specific protocol and accesss point since the given attack_id. + * + * @param protocol The String representation of the + * {@link Protocol + * Protocol} + * @param attack_id The attack id to match the query against. + * @param bssid The BSSID of the access point. + * @return The number of different attacks in the database since the given attack_id. + */ + public synchronized int getAttackPerProtocolCount(String protocol, int attack_id, String bssid) { + SQLiteDatabase db = this.getReadableDatabase(); + String countQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = ? " + + "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > ? " + + "AND " + HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = ?"; + Cursor cursor = db.rawQuery(countQuery, new String[]{protocol, attack_id + "", bssid}); + int result = cursor.getCount(); + cursor.close(); + + // return count + db.close(); + return result; + } + + /** + * Determines the number of portscans stored in the database. + * + * @return The number of portscans stored in the database. + */ + public synchronized int getPortscanCount() { + return getAttackPerProtocolCount("PORTSCAN"); + } + + /** + * Determines the number of recorded portscans since the given attack_id. + * + * @param attack_id The attack id to match the query against. + * @return The number of portscans stored in the database since the given attack_id. + */ + public synchronized int getPortscanCount(int attack_id) { + return getAttackPerProtocolCount("PORTSCAN", attack_id); + } + + /** + * Determines the number of recorded portscans in a specific access point since the given attack_id. + * + * @param attack_id The attack id to match the query against. + * @param bssid The BSSID of the access point. + * @return The number of portscans stored in the database since the given attack_id. + */ + public synchronized int getPortscanCount(int attack_id, String bssid) { + return getAttackPerProtocolCount("PORTSCAN", attack_id, bssid); + } + + + /** + * Determines the number of {@link Record Records} in the database. + * + * @return The number of {@link Record Records} in the database. + */ + public synchronized int getRecordCount() { + String countQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(countQuery, null); + int result = cursor.getCount(); + cursor.close(); + + // return count + db.close(); + return result; + } + + //TODO ADD AGAIN ? + /** + * Returns the {@link AttackRecord} with the given attack id from the database. + * + * @param attack_id + * The attack id of the {@link Record}; + * @return The {@link Record}. + */ /* public AttackRecord getRecordOfAttackId(long attack_id) { String selectQuery = "SELECT * FROM " + AttackEntry.TABLE_NAME + " WHERE " + AttackEntry.COLUMN_NAME_ATTACK_ID + " = " + attack_id; @@ -820,150 +816,149 @@ record = createAttackRecord(cursor); return record; } */ - /** - * Gets a {@link AttackRecord} for every attack identified by its attack id. - * - * @return A ArrayList with a {@link AttackRecord} for each attack id in the Database. - */ - public synchronized ArrayList getRecordOfEachAttack() { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + /** + * Gets a {@link AttackRecord} for every attack identified by its attack id. + * + * @return A ArrayList with a {@link AttackRecord} for each attack id in the Database. + */ + public synchronized ArrayList getRecordOfEachAttack() { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - AttackRecord record = createAttackRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + AttackRecord record = createAttackRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); - // return record list - db.close(); - return recordList; - } - - /** - * Gets a AttackRecord for every attack with a higher attack id than the specified. - * - * @param attack_id - * The attack id to match the query against. - * @return A ArrayList with one {@link AttackRecord} for each attack id - * higher than the given. - */ - public synchronized ArrayList getRecordOfEachAttack(long attack_id) { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > " + attack_id; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + // return record list + db.close(); + return recordList; + } - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - AttackRecord record = createAttackRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); + /** + * Gets a AttackRecord for every attack with a higher attack id than the specified. + * + * @param attack_id The attack id to match the query against. + * @return A ArrayList with one {@link AttackRecord} for each attack id + * higher than the given. + */ + public synchronized ArrayList getRecordOfEachAttack(long attack_id) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " > " + attack_id; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); - // return count - db.close(); - return recordList; - } - - /** - * Determines the highest attack id stored in the database. - * - * @return The highest attack id stored in the database. - */ - public synchronized long getHighestAttackId() { - String selectQuery = "SELECT MAX(" + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + ") FROM " + HostageDBContract.AttackEntry.TABLE_NAME; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - int result; + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + AttackRecord record = createAttackRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); - if (cursor.moveToFirst()) { - result = cursor.getInt(0); - } else { - result = -1; - } - cursor.close(); - db.close(); - return result; - } - - /** - * Determines the smallest attack id stored in the database. - * - * @return The smallest attack id stored in the database. - */ - public synchronized long getSmallestAttackId() { - String selectQuery = "SELECT MIN(" + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + ") FROM " + HostageDBContract.AttackEntry.TABLE_NAME; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - int result; + // return count + db.close(); + return recordList; + } - if (cursor.moveToFirst()) { - result = cursor.getInt(0); - } else { - result = -1; - } - cursor.close(); - db.close(); - return result; - } - - /** - * Gets the last recorded SSID to a given BSSID. - * - * @param bssid - * The BSSID to match against. - * @return A String of the last SSID or null if the BSSID is not in the - * database. - */ - public synchronized String getSSID(String bssid) { - String selectQuery = "SELECT " + HostageDBContract.NetworkEntry.COLUMN_NAME_SSID + " FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID - + " = " + "'" + bssid + "'"; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - String ssid = null; - if (cursor.moveToFirst()) { - ssid = cursor.getString(0); - } - cursor.close(); - db.close(); - return ssid; - } - - /** - * Gets all network related data stored in the database - * @return An ArrayList with an Network for all Entry in the network table. - */ - public synchronized ArrayList getNetworkInformation() { - String selectQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + /** + * Determines the highest attack id stored in the database. + * + * @return The highest attack id stored in the database. + */ + public synchronized long getHighestAttackId() { + String selectQuery = "SELECT MAX(" + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + ") FROM " + HostageDBContract.AttackEntry.TABLE_NAME; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + int result; - ArrayList networkInformation = new ArrayList(); + if (cursor.moveToFirst()) { + result = cursor.getInt(0); + } else { + result = -1; + } + cursor.close(); + db.close(); + return result; + } - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - NetworkRecord record = this.createNetworkRecord(cursor); - networkInformation.add(record); - } while (cursor.moveToNext()); - } + /** + * Determines the smallest attack id stored in the database. + * + * @return The smallest attack id stored in the database. + */ + public synchronized long getSmallestAttackId() { + String selectQuery = "SELECT MIN(" + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + ") FROM " + HostageDBContract.AttackEntry.TABLE_NAME; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + int result; - cursor.close(); - db.close(); - return networkInformation; - } + if (cursor.moveToFirst()) { + result = cursor.getInt(0); + } else { + result = -1; + } + cursor.close(); + db.close(); + return result; + } + + /** + * Gets the last recorded SSID to a given BSSID. + * + * @param bssid The BSSID to match against. + * @return A String of the last SSID or null if the BSSID is not in the + * database. + */ + public synchronized String getSSID(String bssid) { + String selectQuery = "SELECT " + HostageDBContract.NetworkEntry.COLUMN_NAME_SSID + " FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + + " = " + "'" + bssid + "'"; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + String ssid = null; + if (cursor.moveToFirst()) { + ssid = cursor.getString(0); + } + cursor.close(); + db.close(); + return ssid; + } + + /** + * Gets all network related data stored in the database + * + * @return An ArrayList with an Network for all Entry in the network table. + */ + public synchronized ArrayList getNetworkInformation() { + String selectQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + ArrayList networkInformation = new ArrayList<>(); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + NetworkRecord record = this.createNetworkRecord(cursor); + networkInformation.add(record); + } while (cursor.moveToNext()); + } + + cursor.close(); + db.close(); + return networkInformation; + } - private synchronized NetworkRecord createNetworkRecord(Cursor cursor){ + private synchronized NetworkRecord createNetworkRecord(Cursor cursor) { NetworkRecord record = new NetworkRecord(); record.setBssid(cursor.getString(0)); record.setSsid(cursor.getString(1)); @@ -974,12 +969,13 @@ private synchronized NetworkRecord createNetworkRecord(Cursor cursor){ return record; } - /** - * Updates the network table with the information contained in the parameter. - * @param networkInformation ArrayList of {@link NetworkRecord NetworkRecords} - * @see {@link HostageDBOpenHelper#updateNetworkInformation(NetworkRecord record)} - */ - public synchronized void updateNetworkInformation(ArrayList networkInformation) { + /** + * Updates the network table with the information contained in the parameter. + * + * @param networkInformation ArrayList of {@link NetworkRecord NetworkRecords} + * @see {@link HostageDBOpenHelper#updateNetworkInformation(NetworkRecord record)} + */ + public synchronized void updateNetworkInformation(ArrayList networkInformation) { SQLiteDatabase db = this.getWritableDatabase(); db.beginTransaction(); @@ -987,9 +983,9 @@ public synchronized void updateNetworkInformation(ArrayList netwo for (NetworkRecord record : networkInformation) { String bssid = record.getBssid(); - String bssidQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; - Cursor cursor = db.rawQuery(bssidQuery, new String[] {bssid}); - if (!cursor.moveToFirst() || cursor.getLong(5) < record.getTimestampLocation()){ + String bssidQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; + Cursor cursor = db.rawQuery(bssidQuery, new String[]{bssid}); + if (!cursor.moveToFirst() || cursor.getLong(5) < record.getTimestampLocation()) { ContentValues bssidValues = new ContentValues(); bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID, bssid); bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID, record.getSsid()); @@ -1007,59 +1003,62 @@ public synchronized void updateNetworkInformation(ArrayList netwo } db.close(); - } - - /** - * Updated the network table with a new {@link NetworkRecord}. - * If information about this BSSID are already in the database, - * the table will only be updated if the new {@link NetworkRecord } - * has a newer hostage.location time stamp. - * @param record The new {@link NetworkRecord}. - */ - public synchronized void updateNetworkInformation(NetworkRecord record) { - SQLiteDatabase db = this.getWritableDatabase(); - String bssid = record.getBssid(); - String bssidQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; - Cursor cursor = db.rawQuery(bssidQuery, new String[] {bssid}); - if (!cursor.moveToFirst() || cursor.getLong(5) < record.getTimestampLocation()){ - ContentValues bssidValues = new ContentValues(); - bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID, bssid); - bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID, record.getSsid()); - bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_LATITUDE, record.getLatitude()); - bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_LONGITUDE, record.getLongitude()); - bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_ACCURACY, record.getAccuracy()); - bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_GEO_TIMESTAMP, record.getTimestampLocation()); - db.insertWithOnConflict(HostageDBContract.NetworkEntry.TABLE_NAME, null, bssidValues, SQLiteDatabase.CONFLICT_REPLACE); - } - cursor.close(); - db.close(); - } - - - /** - * Updates the the timestamp of a single device id - * @param deviceID The Device id - * @param timestamp The synchronization timestamp - */ - public synchronized void updateTimestampOfSyncDevice(String deviceID, long timestamp){ - SQLiteDatabase db = this.getWritableDatabase(); - ContentValues deviceValues = new ContentValues(); - deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID, deviceID); - deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP, timestamp); - db.insertWithOnConflict(HostageDBContract.SyncDeviceEntry.TABLE_NAME, null, deviceValues, SQLiteDatabase.CONFLICT_REPLACE); - db.close(); - } - - /** - * Updates the Timestamps of synchronization devices from a HashMap. - * @param devices HashMap of device ids and their synchronization timestamps. - */ - public synchronized void updateSyncDevices(HashMap devices){ - SQLiteDatabase db = this.getWritableDatabase(); + } + + /** + * Updated the network table with a new {@link NetworkRecord}. + * If information about this BSSID are already in the database, + * the table will only be updated if the new {@link NetworkRecord } + * has a newer hostage.location time stamp. + * + * @param record The new {@link NetworkRecord}. + */ + public synchronized void updateNetworkInformation(NetworkRecord record) { + SQLiteDatabase db = this.getWritableDatabase(); + String bssid = record.getBssid(); + String bssidQuery = "SELECT * FROM " + HostageDBContract.NetworkEntry.TABLE_NAME + " WHERE " + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?"; + Cursor cursor = db.rawQuery(bssidQuery, new String[]{bssid}); + if (!cursor.moveToFirst() || cursor.getLong(5) < record.getTimestampLocation()) { + ContentValues bssidValues = new ContentValues(); + bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID, bssid); + bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID, record.getSsid()); + bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_LATITUDE, record.getLatitude()); + bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_LONGITUDE, record.getLongitude()); + bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_ACCURACY, record.getAccuracy()); + bssidValues.put(HostageDBContract.NetworkEntry.COLUMN_NAME_GEO_TIMESTAMP, record.getTimestampLocation()); + db.insertWithOnConflict(HostageDBContract.NetworkEntry.TABLE_NAME, null, bssidValues, SQLiteDatabase.CONFLICT_REPLACE); + } + cursor.close(); + db.close(); + } + + + /** + * Updates the the timestamp of a single device id + * + * @param deviceID The Device id + * @param timestamp The synchronization timestamp + */ + public synchronized void updateTimestampOfSyncDevice(String deviceID, long timestamp) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues deviceValues = new ContentValues(); + deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID, deviceID); + deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP, timestamp); + db.insertWithOnConflict(HostageDBContract.SyncDeviceEntry.TABLE_NAME, null, deviceValues, SQLiteDatabase.CONFLICT_REPLACE); + db.close(); + } + + /** + * Updates the Timestamps of synchronization devices from a HashMap. + * + * @param devices HashMap of device ids and their synchronization timestamps. + */ + public synchronized void updateSyncDevices(HashMap devices) { + SQLiteDatabase db = this.getWritableDatabase(); db.beginTransaction(); try { - for(String key : devices.keySet()){ + for (String key : devices.keySet()) { ContentValues deviceValues = new ContentValues(); deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID, key); deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP, devices.get(key)); @@ -1070,14 +1069,15 @@ public synchronized void updateSyncDevices(HashMap devices){ db.endTransaction(); } - db.close(); - } + db.close(); + } /** * Updates sync devices + * * @param devices array list of sync devices */ - public synchronized void updateSyncDevices(ArrayList devices){ + public synchronized void updateSyncDevices(ArrayList devices) { SQLiteDatabase db = this.getWritableDatabase(); this.updateSyncDevices(devices, db); db.close(); @@ -1085,14 +1085,15 @@ public synchronized void updateSyncDevices(ArrayList devices){ /** * Updates sync devices. + * * @param devices array list of sync devices - * @param db sqlite database + * @param db sqlite database */ - public synchronized void updateSyncDevices(ArrayList devices, SQLiteDatabase db){ + public synchronized void updateSyncDevices(ArrayList devices, SQLiteDatabase db) { db.beginTransaction(); try { - for(SyncDevice device : devices){ + for (SyncDevice device : devices) { ContentValues deviceValues = new ContentValues(); deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID, device.getDeviceID()); deviceValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP, device.getLast_sync_timestamp()); @@ -1107,57 +1108,61 @@ public synchronized void updateSyncDevices(ArrayList devices, SQLite /** * Returns the own state containing all registered devices ids and their max sync_id + * * @return {@link SyncInfo} */ - public synchronized SyncInfo getOwnState(){ + public synchronized SyncInfo getOwnState() { updateUntrackedAttacks(); ArrayList devices = this.getSyncDevices(); - HashMap deviceMap = new HashMap(); - for (SyncDevice device : devices){ + HashMap deviceMap = new HashMap<>(); + for (SyncDevice device : devices) { deviceMap.put(device.getDeviceID(), device.getHighest_attack_id()); } deviceMap.put(SyncDevice.currentDevice().getDeviceID(), SyncDevice.currentDevice().getHighest_attack_id()); SyncInfo syncInfo = new SyncInfo(); - syncInfo.deviceMap = deviceMap; + syncInfo.deviceMap = deviceMap; syncInfo.bssids = this.getAllBSSIDS(); return syncInfo; } - - /** - * Returns a HashMap of all devices that were previously synchronized with. - * @return HashMap containing device id's and the last synchronization timestamp. - */ - public synchronized HashMap getSyncDeviceHashMap(){ - SQLiteDatabase db = this.getReadableDatabase(); - HashMap devices = new HashMap(); - - String query = "SELECT * FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; - Cursor cursor = db.rawQuery(query, null); - - if (cursor.moveToFirst()) { - do { - devices.put(cursor.getString(0), cursor.getLong(1)); - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - return devices; - } /** * Returns a HashMap of all devices that were previously synchronized with. + * + * @return HashMap containing device id's and the last synchronization timestamp. + */ + public synchronized HashMap getSyncDeviceHashMap() { + SQLiteDatabase db = this.getReadableDatabase(); + HashMap devices = new HashMap<>(); + + String query = "SELECT * FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; + Cursor cursor = db.rawQuery(query, null); + + if (cursor.moveToFirst()) { + do { + devices.put(cursor.getString(0), cursor.getLong(1)); + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + return devices; + } + + /** + * Returns a HashMap of all devices that were previously synchronized with. + * * @return HashMap containing device id's and the last synchronization timestamp. */ - public synchronized ArrayList getSyncDevices(){ + public synchronized ArrayList getSyncDevices() { SQLiteDatabase db = this.getReadableDatabase(); ArrayList devices = this.getSyncDevices(db); db.close(); return devices; } - public synchronized ArrayList getSyncDevices(SQLiteDatabase db){ - ArrayList devices = new ArrayList(); + + public synchronized ArrayList getSyncDevices(SQLiteDatabase db) { + ArrayList devices = new ArrayList<>(); String query = "SELECT * FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; Cursor cursor = db.rawQuery(query, null); @@ -1172,46 +1177,47 @@ public synchronized ArrayList getSyncDevices(SQLiteDatabase db){ return devices; } - - /** - * Returns a ArrayList containing all information stored in the SyncInfo table. - * @return ArrayList - */ - public synchronized ArrayList getSyncInfo(){ - SQLiteDatabase db = this.getReadableDatabase(); - ArrayList syncInfo = new ArrayList(); - - String query = "SELECT * FROM " + HostageDBContract.SyncInfoEntry.TABLE_NAME; - Cursor cursor = db.rawQuery(query, null); - - if (cursor.moveToFirst()) { - do { - SyncInfoRecord info = new SyncInfoRecord(); - info.setDeviceID(cursor.getString(0)); - info.setBSSID(cursor.getString(1)); - info.setNumber_of_attacks(cursor.getLong(2)); - info.setNumber_of_portscans(cursor.getLong(3)); - syncInfo.add(info); - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - return syncInfo; - } - - - - /** - * Updates the sync_info table with the information contained in the parameter. - * @param syncInfos ArrayList of {@link SyncInfoRecord SyncInfoRecords} - * @see {@link HostageDBOpenHelper#updateSyncInfo(SyncInfoRecord syncInfo)} - */ - public synchronized void updateSyncInfo(ArrayList syncInfos){ + + /** + * Returns a ArrayList containing all information stored in the SyncInfo table. + * + * @return ArrayList + */ + public synchronized ArrayList getSyncInfo() { + SQLiteDatabase db = this.getReadableDatabase(); + ArrayList syncInfo = new ArrayList<>(); + + String query = "SELECT * FROM " + HostageDBContract.SyncInfoEntry.TABLE_NAME; + Cursor cursor = db.rawQuery(query, null); + + if (cursor.moveToFirst()) { + do { + SyncInfoRecord info = new SyncInfoRecord(); + info.setDeviceID(cursor.getString(0)); + info.setBSSID(cursor.getString(1)); + info.setNumber_of_attacks(cursor.getLong(2)); + info.setNumber_of_portscans(cursor.getLong(3)); + syncInfo.add(info); + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + return syncInfo; + } + + + /** + * Updates the sync_info table with the information contained in the parameter. + * + * @param syncInfos ArrayList of {@link SyncInfoRecord SyncInfoRecords} + * @see {@link HostageDBOpenHelper#updateSyncInfo(SyncInfoRecord syncInfo)} + */ + public synchronized void updateSyncInfo(ArrayList syncInfos) { SQLiteDatabase db = this.getWritableDatabase(); db.beginTransaction(); try { - for(SyncInfoRecord syncInfo : syncInfos){ + for (SyncInfoRecord syncInfo : syncInfos) { ContentValues syncValues = new ContentValues(); syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID, syncInfo.getBSSID()); syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID, syncInfo.getDeviceID()); @@ -1226,95 +1232,94 @@ public synchronized void updateSyncInfo(ArrayList syncInfos){ db.close(); - } - - /** - * Updated the network table with a new {@link SyncInfoRecord}. - * Conflicting rows will be replaced. - * @param syncInfo The new {@link NetworkRecord}. - */ - public synchronized void updateSyncInfo(SyncInfoRecord syncInfo){ - SQLiteDatabase db = this.getWritableDatabase(); - ContentValues syncValues = new ContentValues(); - syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID, syncInfo.getBSSID()); - syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID, syncInfo.getDeviceID()); - syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_ATTACKS, syncInfo.getNumber_of_attacks()); - syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_PORTSCANS, syncInfo.getNumber_of_portscans()); - db.insertWithOnConflict(HostageDBContract.SyncInfoEntry.TABLE_NAME, null, syncValues, SQLiteDatabase.CONFLICT_REPLACE); - db.close(); - } - - /** - * Deletes a device with given id from the device {@link HostageDBContract.SyncDeviceEntry} and also all data captured by this device in {@link HostageDBContract.SyncInfoEntry} - */ - public synchronized void clearSyncInfos(){ - SQLiteDatabase db = this.getWritableDatabase(); - db.delete(HostageDBContract.SyncDeviceEntry.TABLE_NAME, null, null); - db.delete(HostageDBContract.SyncInfoEntry.TABLE_NAME, null, null); - db.close(); - } - - - /** - * Deletes all records from {@link HostageDBContract.PacketEntry}s and {@link AttackRecord}. - */ - public synchronized void clearData() { - SQLiteDatabase db = this.getWritableDatabase(); - db.delete(HostageDBContract.PacketEntry.TABLE_NAME, null, null); - db.delete(HostageDBContract.AttackEntry.TABLE_NAME, null, null); - db.close(); - } - - /** - * Deletes all records from {@link HostageDBContract.PacketEntry}s with a specific BSSID. - * - * @param bssid - * The BSSID to match against. - */ - public synchronized void deleteByBSSID(String bssid) { - SQLiteDatabase db = this.getWritableDatabase(); - db.delete(HostageDBContract.NetworkEntry.TABLE_NAME, HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?", new String[] { bssid }); - db.delete(HostageDBContract.AttackEntry.TABLE_NAME, HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = ?", new String[]{bssid}); - db.close(); - } - - /** - * Deletes all records from {@link HostageDBContract.PacketEntry}s with a time stamp smaller - * then the given - * - * @param date - * A Date represented in milliseconds. - */ - public synchronized void deleteByDate(long date) { - SQLiteDatabase db = this.getWritableDatabase(); - String deleteQuery = "DELETE FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " WHERE " + HostageDBContract.PacketEntry.COLUMN_NAME_PACKET_TIMESTAMP + " < " + date; - db.execSQL(deleteQuery); - db.close(); - } - - /** - * Deletes all {@link AttackRecord} with a specific Attack ID. - * - * @param attackID - * The Attack ID to match against. - */ - public synchronized void deleteByAttackID(long attackID) { - SQLiteDatabase db = this.getWritableDatabase(); - db.delete(HostageDBContract.AttackEntry.TABLE_NAME, HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " = ?", new String[]{String.valueOf(attackID)}); - db.delete(HostageDBContract.PacketEntry.TABLE_NAME, HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " = ?", new String[]{String.valueOf(attackID)}); - db.close(); - } + } + + /** + * Updated the network table with a new {@link SyncInfoRecord}. + * Conflicting rows will be replaced. + * + * @param syncInfo The new {@link NetworkRecord}. + */ + public synchronized void updateSyncInfo(SyncInfoRecord syncInfo) { + SQLiteDatabase db = this.getWritableDatabase(); + ContentValues syncValues = new ContentValues(); + syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID, syncInfo.getBSSID()); + syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID, syncInfo.getDeviceID()); + syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_ATTACKS, syncInfo.getNumber_of_attacks()); + syncValues.put(HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_PORTSCANS, syncInfo.getNumber_of_portscans()); + db.insertWithOnConflict(HostageDBContract.SyncInfoEntry.TABLE_NAME, null, syncValues, SQLiteDatabase.CONFLICT_REPLACE); + db.close(); + } + + /** + * Deletes a device with given id from the device {@link HostageDBContract.SyncDeviceEntry} and also all data captured by this device in {@link HostageDBContract.SyncInfoEntry} + */ + public synchronized void clearSyncInfos() { + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(HostageDBContract.SyncDeviceEntry.TABLE_NAME, null, null); + db.delete(HostageDBContract.SyncInfoEntry.TABLE_NAME, null, null); + db.close(); + } + + + /** + * Deletes all records from {@link HostageDBContract.PacketEntry}s and {@link AttackRecord}. + */ + public synchronized void clearData() { + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(HostageDBContract.PacketEntry.TABLE_NAME, null, null); + db.delete(HostageDBContract.AttackEntry.TABLE_NAME, null, null); + db.close(); + } + + /** + * Deletes all records from {@link HostageDBContract.PacketEntry}s with a specific BSSID. + * + * @param bssid The BSSID to match against. + */ + public synchronized void deleteByBSSID(String bssid) { + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(HostageDBContract.NetworkEntry.TABLE_NAME, HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " = ?", new String[]{bssid}); + db.delete(HostageDBContract.AttackEntry.TABLE_NAME, HostageDBContract.AttackEntry.COLUMN_NAME_BSSID + " = ?", new String[]{bssid}); + db.close(); + } + + /** + * Deletes all records from {@link HostageDBContract.PacketEntry}s with a time stamp smaller + * then the given + * + * @param date A Date represented in milliseconds. + */ + public synchronized void deleteByDate(long date) { + SQLiteDatabase db = this.getWritableDatabase(); + String deleteQuery = "DELETE FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " WHERE " + HostageDBContract.PacketEntry.COLUMN_NAME_PACKET_TIMESTAMP + " < " + date; + db.execSQL(deleteQuery); + db.close(); + } + + /** + * Deletes all {@link AttackRecord} with a specific Attack ID. + * + * @param attackID The Attack ID to match against. + */ + public synchronized void deleteByAttackID(long attackID) { + SQLiteDatabase db = this.getWritableDatabase(); + db.delete(HostageDBContract.AttackEntry.TABLE_NAME, HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " = ?", new String[]{String.valueOf(attackID)}); + db.delete(HostageDBContract.PacketEntry.TABLE_NAME, HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " = ?", new String[]{String.valueOf(attackID)}); + db.close(); + } /** * Deletes all attacks for the given filter object. + * * @param filter */ - public synchronized void deleteAttacksByFilter(LogFilter filter){ + public synchronized void deleteAttacksByFilter(LogFilter filter) { String selectQuery = this.selectionQueryFromFilter(filter, "" + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID); - String deletePacketQuery = "DELETE FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " WHERE "+ HostageDBContract.PacketEntry.TABLE_NAME + "."+ HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID+" in ( "; + String deletePacketQuery = "DELETE FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " WHERE " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " in ( "; deletePacketQuery = deletePacketQuery + selectQuery + " )"; - String deleteAttacksQuery = "DELETE FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " WHERE "+ HostageDBContract.AttackEntry.TABLE_NAME + "."+ HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID+" in ( "; - deleteAttacksQuery =deleteAttacksQuery + selectQuery + " )"; + String deleteAttacksQuery = "DELETE FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " WHERE " + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " in ( "; + deleteAttacksQuery = deleteAttacksQuery + selectQuery + " )"; SQLiteDatabase db = this.getReadableDatabase(); db.execSQL(deleteAttacksQuery); @@ -1322,8 +1327,8 @@ public synchronized void deleteAttacksByFilter(LogFilter filter){ db.close(); } - public List getAllAttackIdsForFilter(LogFilter filter){ - List results = new ArrayList(); + public List getAllAttackIdsForFilter(LogFilter filter) { + List results = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); // Select All Query String selectQuery = this.selectionQueryFromFilter(filter, "" + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID); @@ -1342,13 +1347,13 @@ public List getAllAttackIdsForFilter(LogFilter filter){ return results; } - public ArrayList getMessageRecords(AttackRecord attackRecord , SQLiteDatabase db){ - ArrayList mr = new ArrayList(); + public ArrayList getMessageRecords(AttackRecord attackRecord, SQLiteDatabase db) { + ArrayList mr = new ArrayList<>(); String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " WHERE " + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " = " + attackRecord.getAttack_id(); boolean createdDB = false; - if (db == null){ + if (db == null) { db = this.getReadableDatabase(); createdDB = true; } @@ -1367,46 +1372,46 @@ public ArrayList getMessageRecords(AttackRecord attackRecord , SQ return mr; } - /** - * Creates a {@link MessageRecord} from a Cursor. If the cursor does not show to a - * valid data structure a runtime exception is thrown. - * - * @param cursor - * @return Returns the created {@link MessageRecord} . - */ - private synchronized MessageRecord createMessageRecord(Cursor cursor) { - MessageRecord record = new MessageRecord(); - record.setId(Integer.parseInt(cursor.getString(0))); - record.setAttack_id(cursor.getLong(1)); - record.setType(MessageRecord.TYPE.valueOf(cursor.getString(2))); - record.setTimestamp(cursor.getLong(3)); - record.setPacket(cursor.getString(4)); + /** + * Creates a {@link MessageRecord} from a Cursor. If the cursor does not show to a + * valid data structure a runtime exception is thrown. + * + * @param cursor + * @return Returns the created {@link MessageRecord} . + */ + private synchronized MessageRecord createMessageRecord(Cursor cursor) { + MessageRecord record = new MessageRecord(); + record.setId(Integer.parseInt(cursor.getString(0))); + record.setAttack_id(cursor.getLong(1)); + record.setType(MessageRecord.TYPE.valueOf(cursor.getString(2))); + record.setTimestamp(cursor.getLong(3)); + record.setPacket(cursor.getString(4)); - return record; - } - - /** - * Creates a {@link AttackRecord} from a Cursor. If the cursor does not show to a - * valid data structure a runtime exception is thrown. - * - * @param cursor - * @return Returns the created {@link AttackRecord} . - */ - private synchronized AttackRecord createAttackRecord(Cursor cursor) { - AttackRecord record = new AttackRecord(); - record.setAttack_id(cursor.getLong(0)); - record.setProtocol(cursor.getString(1)); - record.setExternalIP(cursor.getString(2)); - record.setLocalIP(cursor.getString(3)); - record.setLocalPort(Integer.parseInt(cursor.getString(4))); - record.setRemoteIP(cursor.getString(5)); - record.setRemotePort(Integer.parseInt(cursor.getString(6))); - record.setWasInternalAttack(cursor.getInt(7) == 1); - record.setBssid(cursor.getString(8)); + return record; + } + + /** + * Creates a {@link AttackRecord} from a Cursor. If the cursor does not show to a + * valid data structure a runtime exception is thrown. + * + * @param cursor + * @return Returns the created {@link AttackRecord} . + */ + private synchronized AttackRecord createAttackRecord(Cursor cursor) { + AttackRecord record = new AttackRecord(); + record.setAttack_id(cursor.getLong(0)); + record.setProtocol(cursor.getString(1)); + record.setExternalIP(cursor.getString(2)); + record.setLocalIP(cursor.getString(3)); + record.setLocalPort(Integer.parseInt(cursor.getString(4))); + record.setRemoteIP(cursor.getString(5)); + record.setRemotePort(Integer.parseInt(cursor.getString(6))); + record.setWasInternalAttack(cursor.getInt(7) == 1); + record.setBssid(cursor.getString(8)); record.setSync_id(cursor.getLong(9)); record.setDevice(cursor.getString(10)); - return record; - } + return record; + } /** * Creates a {@link SyncRecord} from a Cursor. If the cursor does not show to a @@ -1415,91 +1420,91 @@ private synchronized AttackRecord createAttackRecord(Cursor cursor) { * @param cursor * @return Returns the created {@link SyncRecord} . */ - private synchronized SyncRecord createSyncRecord(Cursor cursor, SQLiteDatabase db){ + private synchronized SyncRecord createSyncRecord(Cursor cursor, SQLiteDatabase db) { AttackRecord attackRecord = this.createAttackRecord(cursor); SyncRecord record = new SyncRecord(attackRecord); - ArrayList mr = this.getMessageRecords(attackRecord,db); + ArrayList mr = this.getMessageRecords(attackRecord, db); record.setMessageRecords(mr); return record; } - - /** - * Creates a {@link Record} from a Cursor. If the cursor does not show to a - * valid data structure a runtime exception is thrown. - * - * @param cursor - * @return Returns the created {@link Record} . - */ - private synchronized Record createRecord(Cursor cursor) { - Record record = new Record(); - record.setId(Integer.parseInt(cursor.getString(0))); - record.setAttack_id(cursor.getLong(1)); - record.setType(MessageRecord.TYPE.valueOf(cursor.getString(2))); - record.setTimestamp(cursor.getLong(3)); - record.setPacket(cursor.getString(4)); - record.setProtocol(cursor.getString(5)); - record.setExternalIP(cursor.getString(6)); - - record.setLocalIP(cursor.getString(7)); - record.setLocalPort(Integer.parseInt(cursor.getString(8))); - - record.setRemoteIP(cursor.getString(9)); - record.setRemotePort(Integer.parseInt(cursor.getString(10))); - - record.setWasInternalAttack(Integer.parseInt(cursor.getString(11)) == 1); - - record.setBssid(cursor.getString(12)); + + /** + * Creates a {@link Record} from a Cursor. If the cursor does not show to a + * valid data structure a runtime exception is thrown. + * + * @param cursor + * @return Returns the created {@link Record} . + */ + private synchronized Record createRecord(Cursor cursor) { + Record record = new Record(); + record.setId(Integer.parseInt(cursor.getString(0))); + record.setAttack_id(cursor.getLong(1)); + record.setType(MessageRecord.TYPE.valueOf(cursor.getString(2))); + record.setTimestamp(cursor.getLong(3)); + record.setPacket(cursor.getString(4)); + record.setProtocol(cursor.getString(5)); + record.setExternalIP(cursor.getString(6)); + + record.setLocalIP(cursor.getString(7)); + record.setLocalPort(Integer.parseInt(cursor.getString(8))); + + record.setRemoteIP(cursor.getString(9)); + record.setRemotePort(Integer.parseInt(cursor.getString(10))); + + record.setWasInternalAttack(Integer.parseInt(cursor.getString(11)) == 1); + + record.setBssid(cursor.getString(12)); record.setDevice(cursor.getString(cursor.getColumnIndex(HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE))); - record.setSync_ID(cursor.getLong(cursor.getColumnIndex(HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID))); + record.setSync_ID(cursor.getLong(cursor.getColumnIndex(HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID))); record.setSsid(cursor.getString(15)); - record.setLatitude(Double.parseDouble(cursor.getString(16))); - record.setLongitude(Double.parseDouble(cursor.getString(17))); - record.setAccuracy(Float.parseFloat(cursor.getString(18))); - record.setTimestampLocation(cursor.getLong(19)); + record.setLatitude(Double.parseDouble(cursor.getString(16))); + record.setLongitude(Double.parseDouble(cursor.getString(17))); + record.setAccuracy(Float.parseFloat(cursor.getString(18))); + record.setTimestampLocation(cursor.getLong(19)); - return record; - } - - /** - * Gets all received {@link Record Records} for the specified information in - * the LogFilter ordered by date. - * - * @return A ArrayList with all received {@link Record Records} for the - * LogFilter. - */ - public synchronized ArrayList getRecordsForFilter(LogFilter filter) { - ArrayList recordList = new ArrayList(); - String selectQuery = this.selectionQueryFromFilter(filter, "*"); + return record; + } - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + /** + * Gets all received {@link Record Records} for the specified information in + * the LogFilter ordered by date. + * + * @return A ArrayList with all received {@link Record Records} for the + * LogFilter. + */ + public synchronized ArrayList getRecordsForFilter(LogFilter filter) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = this.selectionQueryFromFilter(filter, "*"); - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); - // return record list - db.close(); - return recordList; - } + // return record list + db.close(); + return recordList; + } /** * Returns the query for the given filter. - * @param filter (LogFilter) + * + * @param filter (LogFilter) * @param selectionString (String) for everything: "*" * @return (String) query string */ - public String selectionQueryFromFilter(LogFilter filter, String selectionString) - { + public String selectionQueryFromFilter(LogFilter filter, String selectionString) { String selectQuery = "SELECT " + selectionString + " FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + ")"; @@ -1537,354 +1542,349 @@ public String selectionQueryFromFilter(LogFilter filter, String selectionString) return selectQuery; } - /** - * Returns the Conversation of a specific attack id - * - * @param attack_id Tha attack id to match the query against. - * - * @return A arraylist with all {@link Record Records}s for an attack id. - */ - public synchronized ArrayList getConversationForAttackID(long attack_id) { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID - + ")" + " WHERE " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " = " + attack_id; + /** + * Returns the Conversation of a specific attack id + * + * @param attack_id Tha attack id to match the query against. + * @return A arraylist with all {@link Record Records}s for an attack id. + */ + public synchronized ArrayList getConversationForAttackID(long attack_id) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + + ")" + " WHERE " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " = " + attack_id; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); - db.close(); - return recordList; - } - - /** - * Gets a single {@link Record} with the given attack id from the database. - * - * @param attack_id - * The attack id of the {@link Record}; - * @return The {@link Record}. - */ - public synchronized Record getRecordOfAttackId(long attack_id) { - String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID - + ")" + " WHERE " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " = " + attack_id + " GROUP BY " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ID; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); - Record record = null; + db.close(); + return recordList; + } - if (cursor.moveToFirst()) { - record = createRecord(cursor); - } - cursor.close(); + /** + * Gets a single {@link Record} with the given attack id from the database. + * + * @param attack_id The attack id of the {@link Record}; + * @return The {@link Record}. + */ + public synchronized Record getRecordOfAttackId(long attack_id) { + String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + + ")" + " WHERE " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " = " + attack_id + " GROUP BY " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ID; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + Record record = null; - // return record list - db.close(); - return record; - } - - /** - * Gets a single {@link Record} with the given ID from the database. - * - * @param id - * The ID of the {@link Record}; - * @return The {@link Record}. - */ - - public synchronized Record getRecord(int id) { - String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID - + ")" + " WHERE " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ID + " = " + id; - SQLiteDatabase db = this.getReadableDatabase(); + if (cursor.moveToFirst()) { + record = createRecord(cursor); + } + cursor.close(); - Cursor cursor = db.rawQuery(selectQuery, null); - Record record = null; - if (cursor.moveToFirst()) { - record = createRecord(cursor); - } + // return record list + db.close(); + return record; + } - cursor.close(); - db.close(); - // return contact - return record; - } - - /** - * Gets all {@link Record Records} saved in the database. - * - * @return A ArrayList of all the {@link Record Records} in the Database. - */ - public synchronized ArrayList getAllRecords() { - ArrayList recordList = new ArrayList(); - // Select All Query - String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID - + ")"; - - SQLiteDatabase db = this.getWritableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + /** + * Gets a single {@link Record} with the given ID from the database. + * + * @param id The ID of the {@link Record}; + * @return The {@link Record}. + */ - Log.i("Database", "Start loop"); - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Log.i("Database", "Add Record"); - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - // return record list - return recordList; - } - - /** - * Gets all non duplicate Records For the key BSSID. - * - * @return A ArrayList with received Records. - */ - public synchronized ArrayList getUniqueBSSIDRecords() { - return this.getUniqueDataEntryForKeyType(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID, HostageDBContract.NetworkEntry.TABLE_NAME); - } - - /** - * Gets all non duplicate Records For the key ESSID. - * - * @return A ArrayList with received Records. - */ - public synchronized ArrayList getUniqueESSIDRecords() { - return this.getUniqueDataEntryForKeyType(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID, HostageDBContract.NetworkEntry.TABLE_NAME); - } - - public synchronized ArrayList getUniqueESSIDRecordsForProtocol(String protocol) { - return this.getUniqueIDForProtocol(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID, protocol); - } - - public synchronized ArrayList getUniqueBSSIDRecordsForProtocol(String protocol) { - return this.getUniqueIDForProtocol(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID, protocol); - } - - private synchronized ArrayList getUniqueIDForProtocol(String id, String protocol) { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT DISTINCT " + id + " FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + ") " + " WHERE " - + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = " + "'" + protocol + "'" + " ORDER BY " + "'"+id+"'"; // " NATURAL JOIN " - // + - // TABLE_ATTACK_INFO - // + - // " NATURAL JOIN " - // + - // TABLE_BSSIDS - // + - // " NATURAL JOIN " - // + - // TABLE_PORTS - // + - - // ORDERED BY TIME - System.out.println(selectQuery); - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + public synchronized Record getRecord(int id) { + String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + + ")" + " WHERE " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_ID + " = " + id; + SQLiteDatabase db = this.getReadableDatabase(); - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - String record = cursor.getString(0); - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); + Cursor cursor = db.rawQuery(selectQuery, null); + Record record = null; + if (cursor.moveToFirst()) { + record = createRecord(cursor); + } - // return record list - db.close(); - return recordList; - } - - /** - * Gets all non duplicate Data Entry For a specific KeyType ( e.g. BSSIDs). - * - * @return A ArrayList with received Records. - */ - public synchronized ArrayList getUniqueDataEntryForKeyType(String keyType, String table) { - ArrayList recordList = new ArrayList(); - // String selectQuery = "SELECT * FROM " + TABLE_RECORDS + - // " NATURAL JOIN " + TABLE_ATTACK_INFO + " NATURAL JOIN " + - // TABLE_BSSIDS + " NATURAL JOIN " + TABLE_PORTS; - String selectQuery = "SELECT DISTINCT " + keyType + " FROM " + table + " ORDER BY " + keyType; // " NATURAL JOIN " - // + - // TABLE_ATTACK_INFO - // + - // " NATURAL JOIN " - // + - // TABLE_BSSIDS - // + - // " NATURAL JOIN " - // + - // TABLE_PORTS - // + - - // ORDERED BY TIME - System.out.println(selectQuery); - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + cursor.close(); + db.close(); + // return contact + return record; + } - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - String record = cursor.getString(0); - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); + /** + * Gets all {@link Record Records} saved in the database. + * + * @return A ArrayList of all the {@link Record Records} in the Database. + */ + public synchronized ArrayList getAllRecords() { + ArrayList recordList = new ArrayList<>(); + // Select All Query + String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + + ")"; - // return record list - db.close(); - return recordList; - } - - - //TODO PROFILE DATABASE QUERIES - STILL NEEDED? - - /** - * Retrieves all the profiles from the database - * - * @return list of profiles - */ - public synchronized List getAllProfiles() { - List profiles = new LinkedList(); - - // Select All Query - String selectQuery = "SELECT * FROM " + HostageDBContract.ProfileEntry.TABLE_NAME; - - SQLiteDatabase db = this.getWritableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + SQLiteDatabase db = this.getWritableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Profile profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); + Log.i("Database", "Start loop"); + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Log.i("Database", "Add Record"); + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + // return record list + return recordList; + } - if (cursor.getInt(6) == 1) { - profile.mActivated = true; - } + /** + * Gets all non duplicate Records For the key BSSID. + * + * @return A ArrayList with received Records. + */ + public synchronized ArrayList getUniqueBSSIDRecords() { + return this.getUniqueDataEntryForKeyType(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID, HostageDBContract.NetworkEntry.TABLE_NAME); + } - profile.mIconName = cursor.getString(4); + /** + * Gets all non duplicate Records For the key ESSID. + * + * @return A ArrayList with received Records. + */ + public synchronized ArrayList getUniqueESSIDRecords() { + return this.getUniqueDataEntryForKeyType(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID, HostageDBContract.NetworkEntry.TABLE_NAME); + } - // Adding record to list - profiles.add(profile); - } while (cursor.moveToNext()); - } - cursor.close(); - db.close(); - // return record list - return profiles; - } - - /** - * Persists the given profile into the database - * - * @param profile - * the profile which should be persisted - * - * @return - */ - public synchronized long persistProfile(Profile profile) { - SQLiteDatabase db = this.getWritableDatabase(); - - ContentValues values = new ContentValues(); - - if (profile.mId != -1) { - values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID, profile.mId); - } + public synchronized ArrayList getUniqueESSIDRecordsForProtocol(String protocol) { + return this.getUniqueIDForProtocol(HostageDBContract.NetworkEntry.COLUMN_NAME_SSID, protocol); + } - values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_NAME, profile.mLabel); - values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_DESCRIPTION, profile.mText); - values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON, profile.mIconPath); - values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON_NAME, profile.mIconName); - values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ACTIVE, profile.mActivated); - values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_EDITABLE, profile.mEditable); - - return db.replace(HostageDBContract.ProfileEntry.TABLE_NAME, null, values); - } - - /** - * private static final String CREATE_PROFILE_TABLE = "CREATE TABLE " + - * TABLE_PROFILES + "(" + KEY_PROFILE_ID + - * " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_PROFILE_NAME + " TEXT," + - * KEY_PROFILE_DESCRIPTION + " TEXT," + KEY_PROFILE_ICON + " TEXT," + - * KEY_PROFILE_ICON_ID + " INTEGER," + KEY_PROFILE_EDITABLE + " INTEGER," + - * KEY_PROFILE_ACTIVE + " INTEGER" + ")"; - */ - public synchronized Profile getProfile(int id) { - String selectQuery = "SELECT * FROM " + HostageDBContract.ProfileEntry.TABLE_NAME + " WHERE " + HostageDBContract.ProfileEntry.TABLE_NAME + "." + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID + " = " + id; - SQLiteDatabase db = this.getReadableDatabase(); + public synchronized ArrayList getUniqueBSSIDRecordsForProtocol(String protocol) { + return this.getUniqueIDForProtocol(HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID, protocol); + } - Cursor cursor = db.rawQuery(selectQuery, null); - Profile profile = null; + private synchronized ArrayList getUniqueIDForProtocol(String id, String protocol) { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT DISTINCT " + id + " FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + ") " + " WHERE " + + HostageDBContract.AttackEntry.TABLE_NAME + "." + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " = " + "'" + protocol + "'" + " ORDER BY " + "'" + id + "'"; // " NATURAL JOIN " + // + + // TABLE_ATTACK_INFO + // + + // " NATURAL JOIN " + // + + // TABLE_BSSIDS + // + + // " NATURAL JOIN " + // + + // TABLE_PORTS + // + + + // ORDERED BY TIME + System.out.println(selectQuery); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); - if (cursor.moveToFirst()) { - profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + String record = cursor.getString(0); + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); - if (cursor.getInt(6) == 1) { - profile.mActivated = true; - } + // return record list + db.close(); + return recordList; + } - profile.mIconName = cursor.getString(5); - } + /** + * Gets all non duplicate Data Entry For a specific KeyType ( e.g. BSSIDs). + * + * @return A ArrayList with received Records. + */ + public synchronized ArrayList getUniqueDataEntryForKeyType(String keyType, String table) { + ArrayList recordList = new ArrayList<>(); + // String selectQuery = "SELECT * FROM " + TABLE_RECORDS + + // " NATURAL JOIN " + TABLE_ATTACK_INFO + " NATURAL JOIN " + + // TABLE_BSSIDS + " NATURAL JOIN " + TABLE_PORTS; + String selectQuery = "SELECT DISTINCT " + keyType + " FROM " + table + " ORDER BY " + keyType; // " NATURAL JOIN " + // + + // TABLE_ATTACK_INFO + // + + // " NATURAL JOIN " + // + + // TABLE_BSSIDS + // + + // " NATURAL JOIN " + // + + // TABLE_PORTS + // + + + // ORDERED BY TIME + System.out.println(selectQuery); + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); - cursor.close(); - db.close(); + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + String record = cursor.getString(0); + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return record list + db.close(); + return recordList; + } + + + //TODO PROFILE DATABASE QUERIES - STILL NEEDED? - // return contact - return profile; - } - + /** + * Retrieves all the profiles from the database + * + * @return list of profiles + */ + public synchronized List getAllProfiles() { + List profiles = new LinkedList<>(); + + // Select All Query + String selectQuery = "SELECT * FROM " + HostageDBContract.ProfileEntry.TABLE_NAME; + + SQLiteDatabase db = this.getWritableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); - public synchronized void deleteProfile(int id) { - SQLiteDatabase db = this.getWritableDatabase(); + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Profile profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); + + if (cursor.getInt(6) == 1) { + profile.mActivated = true; + } + + profile.mIconName = cursor.getString(4); - db.delete(HostageDBContract.ProfileEntry.TABLE_NAME, HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID + "=?", new String[] { String.valueOf(id) }); + // Adding record to list + profiles.add(profile); + } while (cursor.moveToNext()); + } + cursor.close(); db.close(); - } - - - /** - * Gets all received {@link Record Records} for every attack identified by - * its attack id and ordered by date. - * - * @return A ArrayList with all received {@link Record Records} for each - * attack id in the Database. - */ - public synchronized ArrayList getAllReceivedRecordsOfEachAttack() { - ArrayList recordList = new ArrayList(); - String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID - + ")" + " WHERE " + HostageDBContract.PacketEntry.COLUMN_NAME_TYPE + "='RECEIVE'" + " ORDER BY " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_PACKET_TIMESTAMP; - SQLiteDatabase db = this.getReadableDatabase(); - Cursor cursor = db.rawQuery(selectQuery, null); + // return record list + return profiles; + } - // looping through all rows and adding to list - if (cursor.moveToFirst()) { - do { - Record record = createRecord(cursor); - // Adding record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - cursor.close(); + /** + * Persists the given profile into the database + * + * @param profile the profile which should be persisted + * @return + */ + public synchronized long persistProfile(Profile profile) { + SQLiteDatabase db = this.getWritableDatabase(); - // return record list - db.close(); - return recordList; - } + ContentValues values = new ContentValues(); + + if (profile.mId != -1) { + values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID, profile.mId); + } + + values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_NAME, profile.mLabel); + values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_DESCRIPTION, profile.mText); + values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON, profile.mIconPath); + values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ICON_NAME, profile.mIconName); + values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ACTIVE, profile.mActivated); + values.put(HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_EDITABLE, profile.mEditable); + + return db.replace(HostageDBContract.ProfileEntry.TABLE_NAME, null, values); + } + + /** + * private static final String CREATE_PROFILE_TABLE = "CREATE TABLE " + + * TABLE_PROFILES + "(" + KEY_PROFILE_ID + + * " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_PROFILE_NAME + " TEXT," + + * KEY_PROFILE_DESCRIPTION + " TEXT," + KEY_PROFILE_ICON + " TEXT," + + * KEY_PROFILE_ICON_ID + " INTEGER," + KEY_PROFILE_EDITABLE + " INTEGER," + + * KEY_PROFILE_ACTIVE + " INTEGER" + ")"; + */ + public synchronized Profile getProfile(int id) { + String selectQuery = "SELECT * FROM " + HostageDBContract.ProfileEntry.TABLE_NAME + " WHERE " + HostageDBContract.ProfileEntry.TABLE_NAME + "." + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID + " = " + id; + SQLiteDatabase db = this.getReadableDatabase(); + + Cursor cursor = db.rawQuery(selectQuery, null); + Profile profile = null; + + if (cursor.moveToFirst()) { + profile = new Profile(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(5) == 1); + + if (cursor.getInt(6) == 1) { + profile.mActivated = true; + } + + profile.mIconName = cursor.getString(5); + } + + cursor.close(); + db.close(); + + // return contact + return profile; + } + + + public synchronized void deleteProfile(int id) { + SQLiteDatabase db = this.getWritableDatabase(); + + db.delete(HostageDBContract.ProfileEntry.TABLE_NAME, HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID + "=?", new String[]{String.valueOf(id)}); + db.close(); + } + + + /** + * Gets all received {@link Record Records} for every attack identified by + * its attack id and ordered by date. + * + * @return A ArrayList with all received {@link Record Records} for each + * attack id in the Database. + */ + public synchronized ArrayList getAllReceivedRecordsOfEachAttack() { + ArrayList recordList = new ArrayList<>(); + String selectQuery = "SELECT * FROM " + HostageDBContract.PacketEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.AttackEntry.TABLE_NAME + " JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME + " USING " + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + + ")" + " WHERE " + HostageDBContract.PacketEntry.COLUMN_NAME_TYPE + "='RECEIVE'" + " ORDER BY " + HostageDBContract.PacketEntry.TABLE_NAME + "." + HostageDBContract.PacketEntry.COLUMN_NAME_PACKET_TIMESTAMP; + SQLiteDatabase db = this.getReadableDatabase(); + Cursor cursor = db.rawQuery(selectQuery, null); + + // looping through all rows and adding to list + if (cursor.moveToFirst()) { + do { + Record record = createRecord(cursor); + // Adding record to list + recordList.add(record); + } while (cursor.moveToNext()); + } + cursor.close(); + + // return record list + db.close(); + return recordList; + } /** * Returns PlotComparisionItems for attacks per essid. - * @param filter (LogFilter) filter object * + * @param filter (LogFilter) filter object * @return ArrayList */ public synchronized ArrayList attacksPerESSID(LogFilter filter) { @@ -1894,13 +1894,13 @@ public synchronized ArrayList attacksPerESSID(LogFilter filt filterQuery = filterQuery.split("GROUP BY")[0]; String attackPerESSID_Query = "SELECT " + HostageDBContract.NetworkEntry.COLUMN_NAME_SSID + " , " + "COUNT( " + " * " + " ) " + " " - + " FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME //AttackEntry.TABLE_NAME + " a " + " , " + NetworkEntry.TABLE_NAME - + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " IN " + " ( " + filterQuery + " ) " - + " GROUP BY " + HostageDBContract.NetworkEntry.TABLE_NAME+"."+ HostageDBContract.NetworkEntry.COLUMN_NAME_SSID; + + " FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " NATURAL JOIN " + HostageDBContract.NetworkEntry.TABLE_NAME //AttackEntry.TABLE_NAME + " a " + " , " + NetworkEntry.TABLE_NAME + + " WHERE " + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " IN " + " ( " + filterQuery + " ) " + + " GROUP BY " + HostageDBContract.NetworkEntry.TABLE_NAME + "." + HostageDBContract.NetworkEntry.COLUMN_NAME_SSID; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(attackPerESSID_Query, null); - ArrayList plots = new ArrayList(); + ArrayList plots = new ArrayList<>(); int counter = 0; @@ -1909,7 +1909,7 @@ public synchronized ArrayList attacksPerESSID(LogFilter filt String title = cursor.getString(0); // COLUMN_NAME_SSID double value = cursor.getDouble(1); // COUNT if (value == 0.) continue; - PlotComparisonItem plotItem = new PlotComparisonItem(title, this.getColor(counter), 0. , value); + PlotComparisonItem plotItem = new PlotComparisonItem(title, this.getColor(counter), 0., value); plots.add(plotItem); counter++; @@ -1986,19 +1986,20 @@ public ArrayList getUpdatedDevicesFor(List oldDevices, b /** * Returns all missing / newly inserted and updated {@link SyncDevice}s. - * @param oldDeviceMap map with device id and max sync_id for the device + * + * @param oldDeviceMap map with device id and max sync_id for the device * @param includeMissing boolean * @return array of {@link SyncDevice}s */ - public synchronized ArrayList getUpdatedDevicesFor(HashMap oldDeviceMap, boolean includeMissing){ + public synchronized ArrayList getUpdatedDevicesFor(HashMap oldDeviceMap, boolean includeMissing) { - ArrayList recordList = new ArrayList(); + ArrayList recordList = new ArrayList<>(); String selectQuery = "SELECT * FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); boolean actualiseOwnDevice = false; - if (oldDeviceMap.containsKey(currentDevice().getDeviceID()) || includeMissing){ + if (oldDeviceMap.containsKey(currentDevice().getDeviceID()) || includeMissing) { actualiseOwnDevice = true; } @@ -2011,9 +2012,9 @@ public synchronized ArrayList getUpdatedDevicesFor(HashMap getUpdatedDevicesFor(HashMap getAllDevicesIds(){ + public synchronized ArrayList getAllDevicesIds() { - String selectQuery = "SELECT "+ HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID+" FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; + String selectQuery = "SELECT " + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID + " FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); - ArrayList ids = new ArrayList(); + ArrayList ids = new ArrayList<>(); // looping through all rows and adding to list if (cursor.moveToFirst()) { do { @@ -2060,10 +2062,10 @@ public synchronized ArrayList getAllDevicesIds(){ * @param devices owned device ids * @return list of missing devices ids */ - public synchronized ArrayList getMissingDeviceIds(ArrayList devices){ - ArrayList ids = new ArrayList(); + public synchronized ArrayList getMissingDeviceIds(ArrayList devices) { + ArrayList ids = new ArrayList<>(); String prefix = " D WHERE " + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID + " NOT IN "; - String selectQuery = "SELECT "+ HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID +" FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME + this.arrayToSQLString(devices,prefix); + String selectQuery = "SELECT " + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID + " FROM " + HostageDBContract.SyncDeviceEntry.TABLE_NAME + this.arrayToSQLString(devices, prefix); SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(selectQuery, null); @@ -2082,29 +2084,30 @@ public synchronized ArrayList getMissingDeviceIds(ArrayList dev /** * Returns all new {@link AttackRecord}s for the given devices (including all missing devices). - * @param deviceMap map of device id and max sync_id of it + * + * @param deviceMap map of device id and max sync_id of it * @param includeMissingDevices boolean * @return list of {@link AttackRecord}s */ - public synchronized ArrayList getUnsyncedAttacksFor(HashMap deviceMap, boolean includeMissingDevices){ + public synchronized ArrayList getUnsyncedAttacksFor(HashMap deviceMap, boolean includeMissingDevices) { ArrayList updatedDevices = this.getUpdatedDevicesFor(deviceMap, includeMissingDevices); - ArrayList recordList = new ArrayList(); + ArrayList recordList = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); SyncDevice currentDevice = currentDevice(); String own_device_id = currentDevice.getDeviceID(); - for (SyncDevice sDevice : updatedDevices){ + for (SyncDevice sDevice : updatedDevices) { String deviceID = sDevice.getDeviceID(); Long maxID = deviceMap.get(deviceID); long checkId = -1; if (maxID != null) checkId = maxID.longValue(); String selectQuery = "SELECT * FROM " + HostageDBContract.AttackEntry.TABLE_NAME + " A " + " WHERE " - +" ( " + + " ( " + " A." + HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE + " = " + "'" + deviceID + "'" + " AND " + " A." + HostageDBContract.AttackEntry.COLUMN_NAME_SYNC_ID + " > " + checkId + " ) " @@ -2113,10 +2116,10 @@ public synchronized ArrayList getUnsyncedAttacksFor(HashMap getUnsyncedAttacksFor(HashMap */ @@ -2147,7 +2151,7 @@ public synchronized ArrayList attacksPerBSSID(LogFilter filt SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(attackPerBSSID_Query, null); - ArrayList plots = new ArrayList(); + ArrayList plots = new ArrayList<>(); int counter = 0; if (cursor.moveToFirst()) { @@ -2156,7 +2160,7 @@ public synchronized ArrayList attacksPerBSSID(LogFilter filt double value = cursor.getDouble(1); // COUNT if (value == 0.) continue; - PlotComparisonItem plotItem = new PlotComparisonItem(title, this.getColor(counter), 0. , value); + PlotComparisonItem plotItem = new PlotComparisonItem(title, this.getColor(counter), 0., value); plots.add(plotItem); counter++; @@ -2171,15 +2175,16 @@ public synchronized ArrayList attacksPerBSSID(LogFilter filt /** * Inserts the given devices in the database with save. + * * @param devices list of {@link SyncDevice}s */ - public synchronized void insertSyncDevices(List devices){ + public synchronized void insertSyncDevices(List devices) { SQLiteDatabase db = this.getWritableDatabase(); db.beginTransaction(); try { - for (SyncDevice device : devices){ + for (SyncDevice device : devices) { insertSyncDevice(device, db); } db.setTransactionSuccessful(); @@ -2192,10 +2197,11 @@ public synchronized void insertSyncDevices(List devices){ /** * Inserts the given dives in the given SQLite Database without save. + * * @param device {@link SyncDevice} - * @param db {@link android.database.sqlite.SQLiteDatabase} + * @param db {@link android.database.sqlite.SQLiteDatabase} */ - private void insertSyncDevice(SyncDevice device, SQLiteDatabase db){ + private void insertSyncDevice(SyncDevice device, SQLiteDatabase db) { ContentValues recordValues = new ContentValues(); recordValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID, device.getDeviceID()); recordValues.put(HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP, device.getLast_sync_timestamp()); @@ -2206,8 +2212,11 @@ private void insertSyncDevice(SyncDevice device, SQLiteDatabase db){ } - /** Returns the color for the given index - * @return int color*/ + /** + * Returns the color for the given index + * + * @return int color + */ public Integer getColor(int index) { return ColorSequenceGenerator.getColorForIndex(index); } @@ -2218,13 +2227,15 @@ public Integer getColor(int index) { * * ***************************/ //Moved from RecordOverviewFragment.java, deprecated test method. Some lines commented because they don't work on this class. + /** * This will clear the database at first and than add new attacks. - * @param createNetworks number of networks to create - * @param attacksPerNetwork maximal number of attack per network + * + * @param createNetworks number of networks to create + * @param attacksPerNetwork maximal number of attack per network * @param maxMessagePerAttack maximal number of messages per attack - * */ - private void addRecordToDB( int createNetworks, int attacksPerNetwork, int maxMessagePerAttack) { + */ + private void addRecordToDB(int createNetworks, int attacksPerNetwork, int maxMessagePerAttack) { //if ((daoHelper.getMessageRecordDAO().getRecordCount() > 0)) daoHelper.getAttackRecordDAO().clearData(); Calendar cal = Calendar.getInstance(); @@ -2243,12 +2254,12 @@ private void addRecordToDB( int createNetworks, int attacksPerNetwork, int maxMe int attackId = 0; - ArrayList networkRecords = new ArrayList(); - ArrayList attackRecords = new ArrayList(); - ArrayList messageRecords = new ArrayList(); + ArrayList networkRecords = new ArrayList<>(); + ArrayList attackRecords = new ArrayList<>(); + ArrayList messageRecords = new ArrayList<>(); - for (int numOfNetworks = 0; numOfNetworks < createNetworks; numOfNetworks++){ + for (int numOfNetworks = 0; numOfNetworks < createNetworks; numOfNetworks++) { String ssidName = "WiFi" + ((numOfNetworks) + 1); String bssidName = "127.0.0." + ((numOfNetworks) + 1); @@ -2277,7 +2288,7 @@ private void addRecordToDB( int createNetworks, int attacksPerNetwork, int maxMe // ATTACKS PER NETWORK for (int attackNumber = 0; attackNumber < numOfAttackPerNetwork; attackNumber++) { - int numRecordsPerAttack = (Math.abs(random.nextInt()) % (Math.max( maxMessagePerAttack, 1))) + 1; + int numRecordsPerAttack = (Math.abs(random.nextInt()) % (Math.max(maxMessagePerAttack, 1))) + 1; if (maxMessagePerAttack <= 0) numRecordsPerAttack = 0; @@ -2300,7 +2311,7 @@ private void addRecordToDB( int createNetworks, int attacksPerNetwork, int maxMe message.setTimestamp(cal.getTimeInMillis() - ((messageID * 60 * 60 * 24) * 1000) + (1000 * ((messageID - attackId) + 1))); - if ((messageID - attackId) % 2 == 0){ + if ((messageID - attackId) % 2 == 0) { message.setType(MessageRecord.TYPE.RECEIVE); } else { message.setType(MessageRecord.TYPE.SEND); @@ -2310,7 +2321,7 @@ private void addRecordToDB( int createNetworks, int attacksPerNetwork, int maxMe messageRecords.add(message); } - attackId+=numRecordsPerAttack; + attackId += numRecordsPerAttack; } } diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java b/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java index 5fa4fdaa..733ac0fe 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java @@ -76,10 +76,10 @@ public class ProfileManager { /** * Holds all the available profiles. The key in the map is the ID of the profile. */ - public HashMap mProfiles; + public final HashMap mProfiles; - private SharedPreferences mSharedPreferences; - private SharedPreferences.Editor mSharedEditor; + private final SharedPreferences mSharedPreferences; + private final SharedPreferences.Editor mSharedEditor; /** * Since the profile manager should only have one instance in the whole app, we are using the singleton pattern. @@ -103,7 +103,7 @@ public static ProfileManager getInstance() { * A private constructor, that can/should only be called by getInstance, since we want to enforce the usage of the singleton. */ private ProfileManager() { - mProfiles = new HashMap(); + mProfiles = new HashMap<>(); String sharedPreferencePath = MainActivity.getContext().getString(R.string.shared_preference_path); mSharedPreferences = MainActivity.getContext().getSharedPreferences(sharedPreferencePath, Hostage.MODE_PRIVATE); @@ -250,7 +250,7 @@ public void persistData() { * @return a list that holds all the profiles */ public List getProfilesList() { - return new ArrayList(getProfilesCollection()); + return new ArrayList<>(getProfilesCollection()); } /** @@ -259,7 +259,7 @@ public List getProfilesList() { * @return a collection of all the profiles */ public Collection getProfilesCollection() { - if (mProfiles.size() == 0 || mProfiles == null) { + if (mProfiles == null || mProfiles.size() == 0) { this.loadData(); } @@ -281,7 +281,7 @@ public Map getMapProfiles() { * @param profile the profile to randomize the protocols for */ public void randomizeProtocols(Profile profile) { - LinkedList protocols = new LinkedList(Arrays.asList(MainActivity.getContext().getResources().getStringArray(R.array.protocols))); + LinkedList protocols = new LinkedList<>(Arrays.asList(MainActivity.getContext().getResources().getStringArray(R.array.protocols))); profile.mActiveProtocols.clear(); Random rand = new Random(); @@ -518,7 +518,7 @@ public int getNumberOfProfiles() { */ public Set pickRandom(int n, int s, int k) { Random random = new Random(); // if this method is used often, perhaps define random at class level - Set picked = new HashSet(); + Set picked = new HashSet<>(); while (picked.size() < n) { picked.add(random.nextInt(k - s) + s); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/COAP.java b/src/main/java/dk/aau/netsec/hostage/protocol/COAP.java index d3361fed..f3c39198 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/COAP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/COAP.java @@ -156,9 +156,8 @@ public CoapServer startServerProfile(String temperature, String abnormality) thr * @param server the server instance. */ public CoapClient getSimpleClient(InetSocketAddress serverAddress, CoapServer server) { - CoapClient client = CoapClientBuilder.clientFor(serverAddress, server); - return client; + return CoapClientBuilder.clientFor(serverAddress, server); } /** diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/ECHO.java b/src/main/java/dk/aau/netsec/hostage/protocol/ECHO.java index c1ae60fc..3ec83aaf 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/ECHO.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/ECHO.java @@ -33,7 +33,7 @@ public boolean isSecure() { @Override public List processMessage(Packet requestPacket) { - List responsePackets = new ArrayList(); + List responsePackets = new ArrayList<>(); responsePackets.add(requestPacket); return responsePackets; } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/FTP.java b/src/main/java/dk/aau/netsec/hostage/protocol/FTP.java index 6cd6ce11..7148c154 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/FTP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/FTP.java @@ -60,7 +60,7 @@ public List processMessage(Packet requestPacket) { if (requestPacket != null) { request = requestPacket.toString(); } - List responsePackets = new ArrayList(); + List responsePackets = new ArrayList<>(); switch (state) { case NONE: if (request == null) { diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java b/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java index 16afc33d..2f8a8ae6 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/GHOST.java @@ -63,7 +63,7 @@ public boolean isSecure() { @Override public List processMessage(Packet requestPacket) { - List responsePackets = new ArrayList(); + List responsePackets = new ArrayList<>(); try { if (mirroredConnection == null) { mirroredConnection = new Socket(attackerIP, currentPort); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java b/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java index e94d48ca..cb0b522c 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java @@ -53,7 +53,7 @@ private String getServerTime() { private String request = ""; // version stuff - private String[][][] possibleHttpVersions = { + private final String[][][] possibleHttpVersions = { {{ "Apache/2.0." }, { "28", "32", "35", "36", "39", "40", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "58", "59", "61", "63", "64", @@ -65,7 +65,7 @@ private String getServerTime() { { { "Apache/2.4." }, { "1", "2", "3", "4", "6" } }, { { "Microsoft-IIS/" }, { "5.1", "7.0", "8.0" } } }; - private String serverVersion = initServerVersion(); + private final String serverVersion = initServerVersion(); private String initServerVersion() { SecureRandom rndm = new SecureRandom(); @@ -97,8 +97,8 @@ private String initServerVersion() { return version; } - private String httpVersion = "HTTP/1.1"; - private String httpVersion_2 = "HTTP/2"; + private final String httpVersion = "HTTP/1.1"; + private final String httpVersion_2 = "HTTP/2"; private static String htmlDocumentContent = HelperUtils.getRandomString(32, false); private static String htmlTitleContent = HelperUtils.getRandomString(32, false); @@ -130,23 +130,23 @@ public static void setHtmlDocumentContent(String htmlDocumentContent,String html } // html header pre and suffix - private String headerPrefix = "Date: " + getServerTime() + "\r\n" + private final String headerPrefix = "Date: " + getServerTime() + "\r\n" + "Server: " + serverVersion + " \r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: "; - private String headerSuffix = "\r\n" + "Keep-Alive: timeout=5, max=100\r\n" + private final String headerSuffix = "\r\n" + "Keep-Alive: timeout=5, max=100\r\n" + "Connection: Keep-Alive\r\n" + "Content-Type: text/html\r\n" + "\r\n"; // html website - private String htmlDocument = "\n" + "\n" + private final String htmlDocument = "\n" + "\n" + "\n" + "\n" + "" + htmlTitleContent + "\n" + "" + htmlDocumentContent + "\n" + "\n" + ""; // html error pre and suffix - private String errorHtmlPrefix = "\n" + private final String errorHtmlPrefix = "\n" + "\n" + "\n" + "\n" + ""; - private String errorHtmlSuffix = "\n" + "\n" + ""; + private final String errorHtmlSuffix = "\n" + "\n" + ""; private int port = 80; @@ -288,7 +288,7 @@ public TALK_FIRST whoTalksFirst() { * @return the html response */ private Packet buildPacket(String code, String type) { - String document = ""; + String document; switch (type) { case GET: document = htmlDocument; @@ -317,7 +317,7 @@ private Packet buildPacket(String code, String type) { private class QotdTask extends AsyncTask { @Override protected String doInBackground(String... unused) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); String[] sources = new String[]{"djxmmx.net"}; //, "alpha.mike-r.com"}; SecureRandom rndm = new SecureRandom(); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java b/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java index e4b0fd4d..47e6dad7 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java @@ -9,17 +9,21 @@ /** * Created by Shreyas Srinivasa on 25.05.15. - * + *

* Modbus serial communications protocol on industrial PLCs */ public class MODBUS implements Protocol { private int port = 502; @Override - public int getPort() { return port; } + public int getPort() { + return port; + } @Override - public void setPort(int port){ this.port = port;} + public void setPort(int port) { + this.port = port; + } public boolean isClosed() { return false; @@ -29,7 +33,7 @@ public boolean isSecure() { return false; } - private StringBuffer command = new StringBuffer(); + private final StringBuffer command = new StringBuffer(); @Override @@ -44,24 +48,23 @@ public TALK_FIRST whoTalksFirst() { //Declarations - HashMap coil = new HashMap(); - HashMap register = new HashMap(); - HashMap discreteInput = new HashMap(); - + final HashMap coil = new HashMap<>(); + final HashMap register = new HashMap<>(); + final HashMap discreteInput = new HashMap<>(); //Function Request Codes public static final int READ_COILS = 1; public static final int READ_INPUT_DISCRETES = 2; - public static final int READ_HOLDING_REGISTERS=3; + public static final int READ_HOLDING_REGISTERS = 3; public static final int READ_INPUT_REGISTERS = 4; public static final int WRITE_COIL = 5; public static final int WRITE_SINGLE_REGISTER = 6; public static final int MODBUS_SERVICE = 17; //for detection using metasploit module - public static final int MODBUS_DISCOVER=1; + public static final int MODBUS_DISCOVER = 1; - public int sid=1; // Denotes the Unit Number or Slave_ID of the device + public int sid = 1; // Denotes the Unit Number or Slave_ID of the device public static final int COIL_MAX_DATA_ADDRESS = 128; // Max coil data address @@ -82,19 +85,17 @@ public TALK_FIRST whoTalksFirst() { @Override public List processMessage(Packet requestPacket) { - List responsePackets = new ArrayList(); - + List responsePackets = new ArrayList<>(); - byte[] request = null; + byte[] request; if (requestPacket != null) { request = requestPacket.getBytes(); - // getRequestType(request); - - responsePackets=processRequest(request,getRequestType(request)); + // getRequestType(request); + responsePackets = processRequest(request, getRequestType(request)); } @@ -104,87 +105,65 @@ public List processMessage(Packet requestPacket) { } + private List processRequest(byte[] request, int requestType) { - private List processRequest(byte[] request,int requestType) { - - List responsePackets = new ArrayList(); - switch (requestType){ + List responsePackets = new ArrayList<>(); + switch (requestType) { case MODBUS_SERVICE: - responsePackets.add(new Packet(getDeviceInfo()+"\r\n","EE:FF:66:88:GH:JI:DJ")); + responsePackets.add(new Packet(getDeviceInfo() + "\r\n", "EE:FF:66:88:GH:JI:DJ")); break; case READ_INPUT_REGISTERS: - sid=(request[6]); + sid = (request[6]); int registerAddress = (request[9]); - - if(sid==1){ - //Exception packet - } - - else if(sid==2 && registerAddress >= ANALOG_INPUT_START_ADDRESS && registerAddress<=ANALOG_INPUT_MAX_DATA_ADDRESS) { + if (sid == 2 && registerAddress >= ANALOG_INPUT_START_ADDRESS && registerAddress <= ANALOG_INPUT_MAX_DATA_ADDRESS) { request[9] = (byte) readRegister(registerAddress); responsePackets.add(new Packet(request, getDeviceInfo())); } - else if(sid==2 && registerAddress < ANALOG_INPUT_START_ADDRESS || registerAddress > ANALOG_INPUT_MAX_DATA_ADDRESS ){ - //Exception packet - } - break; case READ_HOLDING_REGISTERS: - sid=request[6]; - int holdingRegisterAddress=request[9]; - - if (sid==1){ - //exception packet - } + sid = request[6]; + int holdingRegisterAddress = request[9]; - else if (sid==2 && holdingRegisterAddress >=HOLDING_REGISTERS_START_ADDRESS && holdingRegisterAddress <= HOLDING_REGISTERS_MAX_ADDRESS){ + if (sid == 2 && holdingRegisterAddress >= HOLDING_REGISTERS_START_ADDRESS && holdingRegisterAddress <= HOLDING_REGISTERS_MAX_ADDRESS) { request[9] = (byte) readRegister(holdingRegisterAddress); responsePackets.add(new Packet(request, getDeviceInfo())); } - else if(sid==2 && holdingRegisterAddress < HOLDING_REGISTERS_START_ADDRESS || holdingRegisterAddress > HOLDING_REGISTERS_MAX_ADDRESS ){ - //Exception packet - } - case READ_COILS: - sid= (request[6]); + sid = (request[6]); int address = (request[9]); - if(sid==1&&address=COIL_START_ADDRESS){ + if (sid == 1 && address < COIL_MAX_DATA_ADDRESS && address >= COIL_START_ADDRESS) { - request[5]=4; + request[5] = 4; - request[9]=(byte)readCoil(address); - responsePackets.add(new Packet(request,getDeviceInfo())); + request[9] = (byte) readCoil(address); + responsePackets.add(new Packet(request, getDeviceInfo())); } //Imitating Siemens Simatic S7-200 Architecture - else if(sid==1 && addressCOIL_MAX_DATA_ADDRESS){ - - request[7]=(byte)129; - request[8]=(byte)2; - request[9]=0; - request[10]=0; - request[11]=0; + else if (sid == 1 && address < COIL_START_ADDRESS || address > COIL_MAX_DATA_ADDRESS) { - responsePackets.add(new Packet(request,getDeviceInfo())); + request[7] = (byte) 129; + request[8] = (byte) 2; + request[9] = 0; + request[10] = 0; + request[11] = 0; - } + responsePackets.add(new Packet(request, getDeviceInfo())); - else if(sid==2){ - //Exception packet } @@ -193,50 +172,36 @@ else if(sid==2){ case READ_INPUT_DISCRETES: - sid =request[6]; + sid = request[6]; int inputAddress = (request[9]); - if(sid==1&& inputAddress>DISCRETE_MAX_DATA_ADDRESS || inputAddress=DISCRETE_START_ADDRESS){ + if (sid == 1 && inputAddress > DISCRETE_MAX_DATA_ADDRESS || inputAddress < DISCRETE_START_ADDRESS) { + request[7] = (byte) 129; + request[8] = (byte) 2; + request[9] = 0; + request[10] = 0; + request[11] = 0; + responsePackets.add(new Packet(request, getDeviceInfo())); + } else if (sid == 1 && inputAddress < DISCRETE_MAX_DATA_ADDRESS && inputAddress >= DISCRETE_START_ADDRESS) { - request[5]=4; - request[9]=(byte)readDiscrete(inputAddress); - responsePackets.add(new Packet(request,getDeviceInfo())); - } + request[5] = 4; + request[9] = (byte) readDiscrete(inputAddress); + responsePackets.add(new Packet(request, getDeviceInfo())); - else if(sid==2){ - //Exception packet } break; case WRITE_COIL: - sid=request[6]; + sid = request[6]; int coilAddress = (request[9]); int coilData = (request[10]); - if(sid==2){ - //Exception packet - } - - else if(sid==1 && coilAddress>COIL_MAX_DATA_ADDRESS){ - //exception packet - } - - else if(sid==1 && coilAddress<=COIL_MAX_DATA_ADDRESS && coilAddress>=COIL_START_ADDRESS) { + if (sid == 1 && coilAddress <= COIL_MAX_DATA_ADDRESS && coilAddress >= COIL_START_ADDRESS) { writeCoil(coilAddress, coilData); responsePackets.add(new Packet(request, getDeviceInfo())); } @@ -246,36 +211,18 @@ else if(sid==1 && coilAddress<=COIL_MAX_DATA_ADDRESS && coilAddress>=COIL_START_ case WRITE_SINGLE_REGISTER: sid = request[6]; - int regAddress=(request[9]); - int regData=(request[10]); + int regAddress = (request[9]); + int regData = (request[10]); - if (sid==1){ - //exception - } - - else if(sid==2 && regAddress >= ANALOG_INPUT_START_ADDRESS && regAddress<=ANALOG_INPUT_MAX_DATA_ADDRESS) { - - writeSingleRegister(regAddress,regData); - responsePackets.add(new Packet(request,getDeviceInfo())); - - - } - - else if(sid==2 && regAddress < ANALOG_INPUT_START_ADDRESS || regAddress > ANALOG_INPUT_MAX_DATA_ADDRESS ){ - //Exception packet - } + if (sid == 2 && regAddress >= ANALOG_INPUT_START_ADDRESS && regAddress <= ANALOG_INPUT_MAX_DATA_ADDRESS) { - else if (sid==2 && regAddress >=HOLDING_REGISTERS_START_ADDRESS && regAddress <= HOLDING_REGISTERS_MAX_ADDRESS){ - - - writeSingleRegister(regAddress,regData); - responsePackets.add(new Packet(request,getDeviceInfo())); - - } + writeSingleRegister(regAddress, regData); + responsePackets.add(new Packet(request, getDeviceInfo())); - else if(sid==2 && regAddress < HOLDING_REGISTERS_START_ADDRESS || regAddress > HOLDING_REGISTERS_MAX_ADDRESS ) { + } else if (sid == 2 && regAddress >= HOLDING_REGISTERS_START_ADDRESS && regAddress <= HOLDING_REGISTERS_MAX_ADDRESS) { - //Exception Packet + writeSingleRegister(regAddress, regData); + responsePackets.add(new Packet(request, getDeviceInfo())); } @@ -285,18 +232,17 @@ else if(sid==2 && regAddress < HOLDING_REGISTERS_START_ADDRESS || regAddress > H break; } - return responsePackets; + return responsePackets; } //Read Coil function public int readCoil(int address) { - address+=1;//has an offset 1 + address += 1;//has an offset 1 if (coil.containsKey(address)) { - int val = coil.get(address); - return val; + return coil.get(address); } else { coil.put(address, rand()); //System.out.println(coil); @@ -306,11 +252,11 @@ public int readCoil(int address) { return val; } } + //Random input of 0 & 1 for coils private int rand() { - int num =(Math.random()<0.5)?0:1; - return num; + return (Math.random() < 0.5) ? 0 : 1; } @@ -324,15 +270,12 @@ private String getDeviceInfo() { } - - private int readRegister(int registerAddress) { - // registerAddress+=30001; //Offset of 30001 Check the packet in wireshark and decide to put offset + // registerAddress+=30001; //Offset of 30001 Check the packet in wireshark and decide to put offset if (register.containsKey(registerAddress)) { - int val = register.get(registerAddress); - return val; + return register.get(registerAddress); } else { register.put(registerAddress, randvalue()); int val = register.get(registerAddress); @@ -341,49 +284,42 @@ private int readRegister(int registerAddress) { } - } - private int randvalue(){ + private int randvalue() { - int num =(Math.random()<0.5)?0:255; //Max Hex value that can be stored in 10 bit Binary is 255 - return num; + return (Math.random() < 0.5) ? 0 : 255; } - - private int writeSingleRegister(int regAddress, int regData){ + private int writeSingleRegister(int regAddress, int regData) { //regData+=30001; register.put(regAddress, regData); - int val = register.get(regAddress); - return val; + return register.get(regAddress); } private int writeCoil(int coilAddress, int coilData) { - coilAddress+=1;//offset 1 + coilAddress += 1;//offset 1 - coil.put(coilAddress,coilData); + coil.put(coilAddress, coilData); - int val= coil.get(coilAddress); - return val; + return coil.get(coilAddress); } - //Read Coil function public int readDiscrete(int address) { - address+=1;//offset 1 + address += 1;//offset 1 if (discreteInput.containsKey(address)) { - int val = discreteInput.get(address); - return val; + return discreteInput.get(address); } else { discreteInput.put(address, rand()); //System.out.println(coil); @@ -395,12 +331,9 @@ public int readDiscrete(int address) { } - - - /* gets the type of request made from the master */ private int getRequestType(byte[] request) { - if(request.length !=0) { + if (request.length != 0) { int requestType = request[7]; if (requestType == 17) { @@ -421,14 +354,11 @@ private int getRequestType(byte[] request) { System.out.println(requestType); return requestType; } - int requestType = MODBUS_SERVICE; - return requestType; + return MODBUS_SERVICE; } - - } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java b/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java index 0f46d6c3..4472b761 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java @@ -25,14 +25,14 @@ public class MQTT implements Protocol { private static final String TAG = "MQTT"; private int port = 1883; - private String defaultPort = "1883"; - private String defaultAddress = "0.0.0.0"; + private final String defaultPort = "1883"; + private final String defaultAddress = "0.0.0.0"; private static final int brokerPort = 1883; private static boolean brokerStarted = false; //prevents the server from starting multiple times from the threads // private static final String MQTT_URI = "broker.mqttdashboard.com"; private static final String MQTT_URI = "localhost"; private static final io.moquette.broker.Server broker = new io.moquette.broker.Server(); - private MQTTHandler handler = new MQTTHandler(); + private final MQTTHandler handler = new MQTTHandler(); public MQTT() { if (!brokerStarted) @@ -75,14 +75,13 @@ public TALK_FIRST whoTalksFirst() { * @return a MQTT5 client */ public Mqtt5BlockingClient clientMQtt5() { - Mqtt5BlockingClient client = Mqtt5Client.builder() + + return Mqtt5Client.builder() .identifier(UUID.randomUUID().toString()) .serverHost(MQTT_URI) .serverPort(brokerPort) .buildBlocking(); - return client; - } /** @@ -91,14 +90,13 @@ public Mqtt5BlockingClient clientMQtt5() { * @return a MQTT3 client */ public Mqtt3BlockingClient client(String clientId) { - Mqtt3BlockingClient client = Mqtt3Client.builder() + + return Mqtt3Client.builder() .identifier(clientId) .serverHost(MQTT_URI) .serverPort(brokerPort) .buildBlocking(); - return client; - } /** diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/MySQL.java b/src/main/java/dk/aau/netsec/hostage/protocol/MySQL.java index 10915719..b5d065d8 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/MySQL.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/MySQL.java @@ -12,184 +12,187 @@ /** * MySQL protocol. * Implementation of https://dev.mysql.com/doc/internals/en/client-server-protocol.html. + * * @author Wulf Pfeiffer */ public class MySQL implements Protocol { - /** - * Represents the states of the protocol - */ - private enum STATE { - NONE, CONNECTED, LOGIN_INFO, CLOSED - } - - /** - * Denotes in which state the protocol is right now - */ - private STATE state = STATE.NONE; - - /** last request from client */ - private byte[] lastReceivedMessage; - - // version stuff - private String[][][] possibleMysqlVersions = { - { { "5.7." }, { "1", "2" } }, - { - { "5.6." }, - { "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", - "13", "14" } }, - { { "5.5." }, { "27", "28", "29", "30", "31", "32", "33", "34" } } }; - - private String serverVersion = initMysqlVersion(); - - private String initMysqlVersion() { - SecureRandom rndm = new SecureRandom(); - int majorVersion = rndm.nextInt(possibleMysqlVersions.length); - return possibleMysqlVersions[majorVersion][0][0] - + possibleMysqlVersions[majorVersion][1][rndm - .nextInt(possibleMysqlVersions[majorVersion][1].length)]; - } - - private int port = 3306; - - @Override - public int getPort() { return port; } - - @Override - public void setPort(int port){ this.port = port;} - - @Override - public boolean isClosed() { - return state == STATE.CLOSED; - } - - @Override - public boolean isSecure() { - return false; - } - - @Override - public List processMessage(Packet requestPacket) { - byte[] request = null; - if (requestPacket != null) { - request = requestPacket.getBytes(); - } - List responsePackets = new ArrayList(); - if (request != null && request.length !=0) - lastReceivedMessage = request; - - switch (state) { - case NONE: - responsePackets.add(greeting()); - state = STATE.CONNECTED; - break; - case CONNECTED: - responsePackets.add(responseOK()); - state = STATE.LOGIN_INFO; - break; - case LOGIN_INFO: - if (this.lastReceivedMessage[4] == 0x01) { - state = STATE.CLOSED; - } else { - responsePackets.add(responseError()); - } - break; - default: - state = STATE.CLOSED; - break; - } - - return responsePackets; - } - - @Override - public String toString() { - return "MySQL"; - } - - @Override - public TALK_FIRST whoTalksFirst() { - return TALK_FIRST.SERVER; - } - - /** - * Builds the greeting packet that the server sends as first packet - * - * @return greeting packet - */ - private Packet greeting() { - byte[] protocol = { 0x0a }; - byte[] version = serverVersion.getBytes(); - byte[] versionFin = { 0x00 }; - byte[] thread = { 0x2a, 0x00, 0x00, 0x00 }; - byte[] salt = { 0x44, 0x64, 0x49, 0x7e, 0x60, 0x48, 0x25, 0x7e, 0x00 }; - byte[] capabilities = { (byte) 0xff, (byte) 0xf7 }; - byte[] language = { 0x08 }; - byte[] status = { 0x02, 0x00 }; - byte[] unused = { 0x0f, (byte) 0x80, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - byte[] salt2 = { 0x6c, 0x26, 0x71, 0x2c, 0x25, 0x72, 0x31, 0x3d, 0x7d, - 0x21, 0x26, 0x3b, 0x00 }; - String payload = "mysql_native_password"; - byte[] fin = { 0x00 }; - - byte[] response = HelperUtils.concat(protocol, version, versionFin, - thread, salt, capabilities, language, status, unused, salt2, - payload.getBytes(), fin); - return wrapPacket(response); - } - - /** - * Builds the error-response packet - * - * @return error-response packet - */ - private Packet responseError() { - byte[] fill1 = { (byte) 0xff }; - byte[] code = { 0x17, 0x04 }; - byte[] fill2 = { 0x23 }; - String state = "08S01"; - String msg = "Unknown command"; - - byte[] response = HelperUtils.concat(fill1, code, fill2, - state.getBytes(), msg.getBytes()); - return wrapPacket(response); - } - - /** - * Builds the ok-response packet - * - * @return ok-response packet - */ - private Packet responseOK() { - byte[] affectedRows = { 0x00, 0x00, 0x00 }; - byte[] status = { 0x02, 0x00 }; - byte[] warnings = { 0x00, 0x00 }; - - byte[] response = HelperUtils.concat(affectedRows, status, warnings); - return wrapPacket(response); - } - - /** - * Wraps the response packet with the packet length and number - * - * @param response - * that is wrapped - * @return wrapped packet - */ - private Packet wrapPacket(byte[] response) { - if (response.length == 0){ - - } - byte[] buffer = ByteBuffer.allocate(4).putInt(response.length).array(); - byte[] packetLength = { buffer[3], buffer[2], buffer[1] }; - byte[] packetNumber = new byte[1]; - if (lastReceivedMessage != null && lastReceivedMessage.length != 0) - packetNumber[0] = (byte) (lastReceivedMessage[3] + 1); - else - packetNumber[0] = 0x00; - - byte[] wrappedResponse = HelperUtils.concat(packetLength, packetNumber, - response); - return new Packet(wrappedResponse, toString()); - } + /** + * Represents the states of the protocol + */ + private enum STATE { + NONE, CONNECTED, LOGIN_INFO, CLOSED + } + + /** + * Denotes in which state the protocol is right now + */ + private STATE state = STATE.NONE; + + /** + * last request from client + */ + private byte[] lastReceivedMessage; + + // version stuff + private final String[][][] possibleMysqlVersions = { + {{"5.7."}, {"1", "2"}}, + { + {"5.6."}, + {"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", + "13", "14"}}, + {{"5.5."}, {"27", "28", "29", "30", "31", "32", "33", "34"}}}; + + private final String serverVersion = initMysqlVersion(); + + private String initMysqlVersion() { + SecureRandom rndm = new SecureRandom(); + int majorVersion = rndm.nextInt(possibleMysqlVersions.length); + return possibleMysqlVersions[majorVersion][0][0] + + possibleMysqlVersions[majorVersion][1][rndm + .nextInt(possibleMysqlVersions[majorVersion][1].length)]; + } + + private int port = 3306; + + @Override + public int getPort() { + return port; + } + + @Override + public void setPort(int port) { + this.port = port; + } + + @Override + public boolean isClosed() { + return state == STATE.CLOSED; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public List processMessage(Packet requestPacket) { + byte[] request = null; + if (requestPacket != null) { + request = requestPacket.getBytes(); + } + List responsePackets = new ArrayList<>(); + if (request != null && request.length != 0) + lastReceivedMessage = request; + + switch (state) { + case NONE: + responsePackets.add(greeting()); + state = STATE.CONNECTED; + break; + case CONNECTED: + responsePackets.add(responseOK()); + state = STATE.LOGIN_INFO; + break; + case LOGIN_INFO: + if (this.lastReceivedMessage[4] == 0x01) { + state = STATE.CLOSED; + } else { + responsePackets.add(responseError()); + } + break; + default: + state = STATE.CLOSED; + break; + } + + return responsePackets; + } + + @Override + public String toString() { + return "MySQL"; + } + + @Override + public TALK_FIRST whoTalksFirst() { + return TALK_FIRST.SERVER; + } + + /** + * Builds the greeting packet that the server sends as first packet + * + * @return greeting packet + */ + private Packet greeting() { + byte[] protocol = {0x0a}; + byte[] version = serverVersion.getBytes(); + byte[] versionFin = {0x00}; + byte[] thread = {0x2a, 0x00, 0x00, 0x00}; + byte[] salt = {0x44, 0x64, 0x49, 0x7e, 0x60, 0x48, 0x25, 0x7e, 0x00}; + byte[] capabilities = {(byte) 0xff, (byte) 0xf7}; + byte[] language = {0x08}; + byte[] status = {0x02, 0x00}; + byte[] unused = {0x0f, (byte) 0x80, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + byte[] salt2 = {0x6c, 0x26, 0x71, 0x2c, 0x25, 0x72, 0x31, 0x3d, 0x7d, + 0x21, 0x26, 0x3b, 0x00}; + String payload = "mysql_native_password"; + byte[] fin = {0x00}; + + byte[] response = HelperUtils.concat(protocol, version, versionFin, + thread, salt, capabilities, language, status, unused, salt2, + payload.getBytes(), fin); + return wrapPacket(response); + } + + /** + * Builds the error-response packet + * + * @return error-response packet + */ + private Packet responseError() { + byte[] fill1 = {(byte) 0xff}; + byte[] code = {0x17, 0x04}; + byte[] fill2 = {0x23}; + String state = "08S01"; + String msg = "Unknown command"; + + byte[] response = HelperUtils.concat(fill1, code, fill2, + state.getBytes(), msg.getBytes()); + return wrapPacket(response); + } + + /** + * Builds the ok-response packet + * + * @return ok-response packet + */ + private Packet responseOK() { + byte[] affectedRows = {0x00, 0x00, 0x00}; + byte[] status = {0x02, 0x00}; + byte[] warnings = {0x00, 0x00}; + + byte[] response = HelperUtils.concat(affectedRows, status, warnings); + return wrapPacket(response); + } + + /** + * Wraps the response packet with the packet length and number + * + * @param response that is wrapped + * @return wrapped packet + */ + private Packet wrapPacket(byte[] response) { + byte[] buffer = ByteBuffer.allocate(4).putInt(response.length).array(); + byte[] packetLength = {buffer[3], buffer[2], buffer[1]}; + byte[] packetNumber = new byte[1]; + if (lastReceivedMessage != null && lastReceivedMessage.length != 0) + packetNumber[0] = (byte) (lastReceivedMessage[3] + 1); + else + packetNumber[0] = 0x00; + + byte[] wrappedResponse = HelperUtils.concat(packetLength, packetNumber, + response); + return new Packet(wrappedResponse, toString()); + } } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/S7COMM.java b/src/main/java/dk/aau/netsec/hostage/protocol/S7COMM.java index 509c946c..4092bbf6 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/S7COMM.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/S7COMM.java @@ -54,9 +54,9 @@ public boolean isSecure() { @Override public List processMessage(Packet requestPacket) { - List responsePackets = new ArrayList(); + List responsePackets = new ArrayList<>(); - byte[] request = null; + byte[] request; if (requestPacket != null) { request = requestPacket.getBytes(); @@ -75,9 +75,7 @@ public List processMessage(Packet requestPacket) { private List processRequest(byte[] request, int requestType) { - List responsePackets = new ArrayList(); - - return responsePackets; + return new ArrayList<>(); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/SIP.java b/src/main/java/dk/aau/netsec/hostage/protocol/SIP.java index 910de13c..15867155 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/SIP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/SIP.java @@ -10,150 +10,149 @@ * SIP protocol. Implementation of RFC document 3261 It can handle the * following requests: REGISTER, INVITE, ACK, BYE. For all other requests * '400 Bad Request' will be replied. + * * @author Wulf Pfeiffer */ public class SIP implements Protocol { - - private enum STATE { - NONE, CLOSED - } - - private STATE state = STATE.NONE; - - private static final String VERSION = "SIP/2.0"; - private static final String REGISTER = "REGISTER"; - private static final String INVITE = "INVITE"; - private static final String ACK= "ACK"; - private static final String BYE = "BYE"; - private static final String STATUS_CODE_200 = "200 OK"; - private static final String STATUS_CODE_400 = "400 Bad Request"; - private static final String STATUS_CODE_505 = "505 Version Not Supported"; - - private String header; - private String sdpPayload; - - private int port = 5060; - - @Override - public int getPort() { return port; } - - @Override - public void setPort(int port){ this.port = port;} - - @Override - public boolean isClosed() { - return (state == STATE.CLOSED); - } - - @Override - public boolean isSecure() { - return false; - } - - @Override - public List processMessage(Packet requestPacket) { - String request = null; - if (requestPacket != null) { - request = requestPacket.toString(); - } - List responsePackets = new ArrayList(); - String[] lines = request.split("\r\n"); - extractLines(lines); - - if(!lines[0].contains(VERSION)) { - responsePackets.add(getVersionNotSupportedResponse()); - return responsePackets; - } else if(lines[0].contains(REGISTER)) { - responsePackets.add(getOkResponse()); - } else if(lines[0].contains(INVITE)) { - responsePackets.add(getOkResponseWithSDP()); - } else if(lines[0].contains(BYE)) { - responsePackets.add(getOkResponse()); - state = STATE.CLOSED; - } else if(lines[0].contains(ACK)) { - //nothing to do here - } else { - responsePackets.add(getBadRequestResponse()); - } - - return responsePackets; - } - - @Override - public TALK_FIRST whoTalksFirst() { - return TALK_FIRST.CLIENT; - } - - @Override - public String toString() { - return "SIP"; - } - - private void extractLines(String[] lines) { - header = ""; - sdpPayload = ""; - StringBuffer sbHeader = new StringBuffer(); - StringBuffer sbSdp = new StringBuffer(); - boolean recordHeader = false; - boolean recordSdp = false; - for (String line : lines) { - if (line.startsWith("Via:")) { - recordHeader = true; - } else if (line.startsWith("Max-Forwards")) { - recordHeader = false; - header = sbHeader.toString(); - } else if(line.startsWith("v=")) { - recordSdp = true; - } else if(line.startsWith("a=")) { - sbSdp.append(line + "\r\n"); - sdpPayload = sbSdp.toString(); - break; - } - if(recordHeader) { - sbHeader.append(line + "\r\n"); - } else if(recordSdp) { - sbSdp.append(line + "\r\n"); - } - } - } - - private Packet getOkResponseWithSDP() { - StringBuffer sb = new StringBuffer(); - sb.append(VERSION + " " + STATUS_CODE_200 + "\r\n"); - sb.append(header); - sb.append("Content-Type: application/sdp\r\n"); - sb.append("Content-Length: " + sdpPayload.length() + "\r\n"); - sb.append("\r\n"); - sb.append(sdpPayload); - - return new Packet(sb.toString(), toString()); - } - - private Packet getOkResponse() { - StringBuffer sb = new StringBuffer(); - sb.append(VERSION + " " + STATUS_CODE_200 + "\r\n"); - sb.append(header); - sb.append("Content-Length: 0\r\n"); - - return new Packet(sb.toString(), toString()); - } - - private Packet getBadRequestResponse() { - StringBuffer sb = new StringBuffer(); - sb.append(VERSION + " " + STATUS_CODE_400 + "\r\n"); - sb.append(header); - sb.append("Content-Length: 0\r\n"); - - return new Packet(sb.toString(), toString()); - } - - private Packet getVersionNotSupportedResponse() { - StringBuffer sb = new StringBuffer(); - sb.append(VERSION + " " + STATUS_CODE_505 + "\r\n"); - sb.append(header); - sb.append("Content-Length: 0\r\n"); - - return new Packet(sb.toString(), toString()); - } + + private enum STATE { + NONE, CLOSED + } + + private STATE state = STATE.NONE; + + private static final String VERSION = "SIP/2.0"; + private static final String REGISTER = "REGISTER"; + private static final String INVITE = "INVITE"; + private static final String ACK = "ACK"; + private static final String BYE = "BYE"; + private static final String STATUS_CODE_200 = "200 OK"; + private static final String STATUS_CODE_400 = "400 Bad Request"; + private static final String STATUS_CODE_505 = "505 Version Not Supported"; + + private String header; + private String sdpPayload; + + private int port = 5060; + + @Override + public int getPort() { + return port; + } + + @Override + public void setPort(int port) { + this.port = port; + } + + @Override + public boolean isClosed() { + return (state == STATE.CLOSED); + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public List processMessage(Packet requestPacket) { + String request = null; + if (requestPacket != null) { + request = requestPacket.toString(); + } + List responsePackets = new ArrayList<>(); + String[] lines = request.split("\r\n"); + extractLines(lines); + + if (!lines[0].contains(VERSION)) { + responsePackets.add(getVersionNotSupportedResponse()); + return responsePackets; + } else if (lines[0].contains(REGISTER)) { + responsePackets.add(getOkResponse()); + } else if (lines[0].contains(INVITE)) { + responsePackets.add(getOkResponseWithSDP()); + } else if (lines[0].contains(BYE)) { + responsePackets.add(getOkResponse()); + state = STATE.CLOSED; + } else { + responsePackets.add(getBadRequestResponse()); + } + + return responsePackets; + } + + @Override + public TALK_FIRST whoTalksFirst() { + return TALK_FIRST.CLIENT; + } + + @Override + public String toString() { + return "SIP"; + } + + private void extractLines(String[] lines) { + header = ""; + sdpPayload = ""; + StringBuilder sbHeader = new StringBuilder(); + StringBuilder sbSdp = new StringBuilder(); + boolean recordHeader = false; + boolean recordSdp = false; + for (String line : lines) { + if (line.startsWith("Via:")) { + recordHeader = true; + } else if (line.startsWith("Max-Forwards")) { + recordHeader = false; + header = sbHeader.toString(); + } else if (line.startsWith("v=")) { + recordSdp = true; + } else if (line.startsWith("a=")) { + sbSdp.append(line).append("\r\n"); + sdpPayload = sbSdp.toString(); + break; + } + if (recordHeader) { + sbHeader.append(line).append("\r\n"); + } else if (recordSdp) { + sbSdp.append(line).append("\r\n"); + } + } + } + + private Packet getOkResponseWithSDP() { + + String sb = VERSION + " " + STATUS_CODE_200 + "\r\n" + + header + + "Content-Type: application/sdp\r\n" + + "Content-Length: " + sdpPayload.length() + "\r\n" + + "\r\n" + + sdpPayload; + return new Packet(sb, toString()); + } + + private Packet getOkResponse() { + + String sb = VERSION + " " + STATUS_CODE_200 + "\r\n" + + header + + "Content-Length: 0\r\n"; + return new Packet(sb, toString()); + } + + private Packet getBadRequestResponse() { + + String sb = VERSION + " " + STATUS_CODE_400 + "\r\n" + + header + + "Content-Length: 0\r\n"; + return new Packet(sb, toString()); + } + + private Packet getVersionNotSupportedResponse() { + + String sb = VERSION + " " + STATUS_CODE_505 + "\r\n" + + header + + "Content-Length: 0\r\n"; + return new Packet(sb, toString()); + } } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java b/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java index 3fdcff07..20f80cae 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java @@ -7,7 +7,6 @@ import org.snmp4j.agent.MOGroup; import org.snmp4j.agent.ManagedObject; import org.snmp4j.agent.mo.MOAccessImpl; -import org.snmp4j.agent.mo.MOTableRow; import org.snmp4j.agent.mo.snmp.RowStatus; import org.snmp4j.agent.mo.snmp.SnmpCommunityMIB; import org.snmp4j.agent.mo.snmp.SnmpNotificationMIB; @@ -109,9 +108,9 @@ protected void addCommunities(SnmpCommunityMIB snmpCommunityMIB) { new Integer32(RowStatus.active) // row status }; - MOTableRow row = snmpCommunityMIB.getSnmpCommunityEntry().createRow( + SnmpCommunityMIB.SnmpCommunityEntryRow row = snmpCommunityMIB.getSnmpCommunityEntry().createRow( new OctetString("public2public").toSubIndex(true), com2sec); - snmpCommunityMIB.getSnmpCommunityEntry().addRow((SnmpCommunityMIB.SnmpCommunityEntryRow) row); + snmpCommunityMIB.getSnmpCommunityEntry().addRow(row); } @Override diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java b/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java index 02c49317..74f03e58 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java @@ -44,7 +44,7 @@ private enum STATE { private boolean useEncryption = false; // version stuff - private String[][][] possibleSshTypes = { + private final String[][][] possibleSshTypes = { {{"3."}, {"4", "5", "6", "7", "8", "9"}}, {{"4."}, {"0", "1", "2", "3", "4", "5", "6", "7", "9"}}, {{"5."}, {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}}, @@ -61,17 +61,17 @@ private String initSshType() { // server infos private static final String serverVersion = "SSH-2.0-"; - private String serverType = initSshType(); - private String serverName = HelperUtils.getRandomString(16, false); + private final String serverType = initSshType(); + private final String serverName = HelperUtils.getRandomString(16, false); private int packetNumber = 0; private int recipientChannel; private String userName; private String terminalPrefix; private StringBuffer command = new StringBuffer(); - private SecureRandom random = new SecureRandom(); + private final SecureRandom random = new SecureRandom(); // SSH Parameters for Kex etc. - private byte[] V_S = (serverVersion + serverType).getBytes(); + private final byte[] V_S = (serverVersion + serverType).getBytes(); private byte[] V_C; private byte[] I_S; private byte[] I_C; @@ -92,7 +92,7 @@ private String initSshType() { private static final String COMP_ALG_C = "none"; private static final String COMP_ALG_S = "none"; - private int cipherBlockSize = 16; + private final int cipherBlockSize = 16; // for en- and decryption private DESede desEncryption; @@ -135,7 +135,7 @@ public TALK_FIRST whoTalksFirst() { @Override public List processMessage(Packet requestPacket) { - List responsePackets = new ArrayList(); + List responsePackets = new ArrayList<>(); byte[] request = null; if (requestPacket != null) { request = requestPacket.getBytes(); @@ -222,8 +222,7 @@ private Packet wrapPacket(byte[] response) { int paddingLengthCBS = cipherBlockSize - (packetLength % cipherBlockSize); int paddingLength8 = 8 - (packetLength % 8); - int paddingLength = paddingLengthCBS > paddingLength8 ? paddingLengthCBS - : paddingLength8; + int paddingLength = Math.max(paddingLengthCBS, paddingLength8); if (paddingLength < 4) paddingLength += cipherBlockSize; // add padding string length to packet length @@ -596,9 +595,8 @@ private void extractPayload(byte[] request) { request[3 + position]}); int paddingLength = byteToInt(new byte[]{request[4 + position]}); byte[] payload = new byte[packetLength - paddingLength - 1]; - for (int i = 5; i < packetLength - paddingLength - 1; i++) { - payload[i - 5] = request[i + position]; - } + if (packetLength - paddingLength - 1 - 5 >= 0) + System.arraycopy(request, 5 + position, payload, 0, packetLength - paddingLength - 1 - 5); I_C = payload; } @@ -610,9 +608,7 @@ private void extractPayload(byte[] request) { private void extractPubKey(byte[] request) { e = new byte[byteToInt(new byte[]{request[6], request[7], request[8], request[9]})]; - for (int i = 0; i < e.length; i++) { - e[i] = request[i + 10]; - } + if (e.length >= 0) System.arraycopy(request, 10, e, 0, e.length); } /** @@ -623,9 +619,9 @@ private void extractPubKey(byte[] request) { */ private static int byteToInt(byte[] bytes) { int convertedInteger = 0; - for (int i = 0; i < bytes.length; i++) { + for (byte aByte : bytes) { convertedInteger <<= 8; - convertedInteger |= bytes[i] & 0xFF; + convertedInteger |= aByte & 0xFF; } return convertedInteger; } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/TELNET.java b/src/main/java/dk/aau/netsec/hostage/protocol/TELNET.java index 115bf422..0e3c3d67 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/TELNET.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/TELNET.java @@ -36,13 +36,13 @@ private enum STATE { private byte[] command; /** name of the server */ - private String serverName = HelperUtils.getRandomString(16, false); + private final String serverName = HelperUtils.getRandomString(16, false); - private String serverVersion = initServerVersion(); + private final String serverVersion = initServerVersion(); - private String login = initLogin(); + private final String login = initLogin(); - private String serverBanner = initServerBanner(); + private final String serverBanner = initServerBanner(); /** command line prefix */ private static byte[] sessionToken = null; @@ -88,7 +88,7 @@ public List processMessage(Packet requestPacket) { if (requestPacket != null && requestPacket.getBytes().length > 0) { // ignore empty packets request = requestPacket.getBytes(); } - List responsePackets = new ArrayList(); + List responsePackets = new ArrayList<>(); switch (state) { case NONE: @@ -210,11 +210,10 @@ public TALK_FIRST whoTalksFirst() { private static String initServerVersion() { String sharedPreferencePath = Hostage.getContext().getString( R.string.shared_preference_path); - String profile = Hostage + return Hostage .getContext() .getSharedPreferences(sharedPreferencePath, Context.MODE_PRIVATE).getString("os", ""); - return profile; } private String initServerBanner() { @@ -259,7 +258,7 @@ private boolean checkForByte(byte[] bytes, byte b) { * @return accepted and unaccepted options */ private byte[] getOptionResponse(byte[] request) { - List responseList = new ArrayList(); + List responseList = new ArrayList<>(); byte[] requestInverse; for (int i = 0; i < request.length - 2; i += 3) { if (request[i] == (byte) 0xff && request[i + 2] != 0x03 diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/commons/logWatchers/LogBackWatcher.java b/src/main/java/dk/aau/netsec/hostage/protocol/commons/logWatchers/LogBackWatcher.java index c0f40c28..b4fa4fbf 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/commons/logWatchers/LogBackWatcher.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/commons/logWatchers/LogBackWatcher.java @@ -18,7 +18,7 @@ */ public class LogBackWatcher { private CyclicBufferAppender listAppender; - private static ArrayList packets= new ArrayList<>(); + private static final ArrayList packets= new ArrayList<>(); /** * Registers a watcher, when the pattern matches the filter is accepted. diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/amqpUtils/AMQPHandler.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/amqpUtils/AMQPHandler.java index f6c69611..6f45baeb 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/amqpUtils/AMQPHandler.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/amqpUtils/AMQPHandler.java @@ -17,7 +17,7 @@ import dk.aau.netsec.hostage.protocol.commons.patterns.IpPattern; public class AMQPHandler { - private static ArrayList packets = LogBackWatcher.getList(); + private static final ArrayList packets = LogBackWatcher.getList(); public static boolean isAnAttackOngoing(){ return !packets.isEmpty(); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/CifsServer.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/CifsServer.java index a3162bae..bc5e89f5 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/CifsServer.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/CifsServer.java @@ -32,9 +32,9 @@ public class CifsServer { protected final dk.aau.netsec.hostage.protocol.SMB SMB; protected final FileInject fileInject; - ServerConfiguration cfg = new JLANFileServerConfiguration(); + final ServerConfiguration cfg = new JLANFileServerConfiguration(); - private int defaultPort=1025; + private final int defaultPort=1025; public CifsServer(SMB SMB, FileInject fileInject) throws InvalidConfigurationException, DeviceContextException { super(); @@ -44,9 +44,7 @@ public CifsServer(SMB SMB, FileInject fileInject) throws InvalidConfigurationExc public void run() throws IOException { SMBServer smbServer = new SMBServer(cfg); - smbServer.addServerListener((server1, event) -> { - System.out.println("Server started with users: "+ server1.getSecurityConfiguration().getUserAccounts().getUserAt(0)); - }); + smbServer.addServerListener((server1, event) -> System.out.println("Server started with users: "+ server1.getSecurityConfiguration().getUserAccounts().getUserAt(0))); InterceptSysout interceptPackets = new InterceptSysout(System.out); System.setOut(interceptPackets); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/PseudoJavaFileDiskDriver.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/PseudoJavaFileDiskDriver.java index d6ac1001..411a4f41 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/PseudoJavaFileDiskDriver.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/PseudoJavaFileDiskDriver.java @@ -1,8 +1,6 @@ package dk.aau.netsec.hostage.protocol.utils.cifs; -import android.content.Context; - import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.FragmentManager; @@ -24,7 +22,6 @@ import java.security.NoSuchAlgorithmException; import java.util.Set; - import dk.aau.netsec.hostage.commons.HelperUtils; import dk.aau.netsec.hostage.logging.MessageRecord; import dk.aau.netsec.hostage.protocol.SMB; @@ -36,10 +33,11 @@ /** * HostageV3 * ================ + * * @author Alexander Brakowski * @author Daniel Lazar * @author Shreyas Srinivasa - * + *

* This is a pseudo file disk driver, which overwrites the libs JavaFileDiskDriver, * so that we can get more information about the attack */ @@ -49,7 +47,7 @@ private static class PseudoJavaNetworkFile extends JavaNetworkFile { protected final dk.aau.netsec.hostage.protocol.SMB SMB; private final SrvSession sess; boolean wasWrittenTo = false; - private final FileInject fileInject; + private final FileInject fileInject; public PseudoJavaNetworkFile(File file, String netPath, SMB SMB, SrvSession sess, FileInject fileInject) { super(file, netPath); @@ -61,11 +59,12 @@ public PseudoJavaNetworkFile(File file, String netPath, SMB SMB, SrvSession sess /** * method that checks if the file was just written, then gets the MD5 checksum of the * file and logs it. Afterwards the file gets deleted. + * * @throws java.io.IOException */ public void closeFile() throws java.io.IOException { super.closeFile(); - if(wasWrittenTo){ + if (wasWrittenTo) { HelperUtils.setIsFileInjected(true); try { MessageDigest digest = MessageDigest.getInstance("SHA256"); @@ -73,7 +72,7 @@ public void closeFile() throws java.io.IOException { byte[] buffer = new byte[8192]; int numOfBytesRead; - while( (numOfBytesRead = fis.read(buffer)) > 0){ + while ((numOfBytesRead = fis.read(buffer)) > 0) { digest.update(buffer, 0, numOfBytesRead); } @@ -90,18 +89,16 @@ public void closeFile() throws java.io.IOException { for (ReportScan report : Report) { - if (report.getDetected().contentEquals("true")){ - - if (report.getVendor().contentEquals("McAfee")||report.getVendor().contentEquals("Microsoft")||report.getVendor().contentEquals("AVG")||report.getVendor().contentEquals("Symantec")||report.getVendor().contentEquals("CAT-QuickHeal")||report.getVendor().contentEquals("TrendMicro")||report.getVendor().contentEquals("Kaspersky")) + if (report.getDetected().contentEquals("true")) { - { - sb.append("\n\nVendor: " + report.getVendor() + " \nDetected: " + report.getDetected() + " \nMalware Name: " + report.getMalwarename()); + if (report.getVendor().contentEquals("McAfee") || report.getVendor().contentEquals("Microsoft") || report.getVendor().contentEquals("AVG") || report.getVendor().contentEquals("Symantec") || report.getVendor().contentEquals("CAT-QuickHeal") || report.getVendor().contentEquals("TrendMicro") || report.getVendor().contentEquals("Kaspersky")) { + sb.append("\n\nVendor: ").append(report.getVendor()).append(" \nDetected: ").append(report.getDetected()).append(" \nMalware Name: ").append(report.getMalwarename()); } } } //Setting the display component with the results obtained from Virustotal - String message = "File received: " + m_file.getName() + "\n\nCHECKSUM:\n" + checksum+"\n Scroll Down for Malware Details"+sb.toString(); + String message = "File received: " + m_file.getName() + "\n\nCHECKSUM:\n" + checksum + "\n Scroll Down for Malware Details" + sb.toString(); fileInject.log(MessageRecord.TYPE.RECEIVE, message, 445, sess.getRemoteAddress(), 445); HelperUtils.setFileName(m_file.getName()); @@ -173,10 +170,8 @@ private static void displayAlert() { final AppCompatActivity activity = MainActivity.getInstance(); final FragmentManager fragmentManager = activity.getSupportFragmentManager(); - if (fragmentManager != null) { - FileAlertDialogFragment fileAlertDialogFragment = new FileAlertDialogFragment(); - fileAlertDialogFragment.show(fragmentManager.beginTransaction(), fileAlertDialogFragment.getTag()); - } + FileAlertDialogFragment fileAlertDialogFragment = new FileAlertDialogFragment(); + fileAlertDialogFragment.show(fragmentManager.beginTransaction(), fileAlertDialogFragment.getTag()); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBDS.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBDS.java index 37e31878..c8f8cb5c 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBDS.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBDS.java @@ -11,18 +11,18 @@ */ public class NBDS { - private String dst; - private byte[] type; - private byte[] flags; + private final String dst; + private final byte[] type; + private final byte[] flags; private byte[] transactID; - private byte[] srcIP; - private byte[] srcPort; - private byte[] length; - private byte[] offset; - private byte[] srcName; + private final byte[] srcIP; + private final byte[] srcPort; + private final byte[] length; + private final byte[] offset; + private final byte[] srcName; private byte[] dstName; private int nbdstype; - private SMBPacket smb; + private final SMBPacket smb; public NBDS(byte[] addr, String src, String dst) { this.dst = dst; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNS.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNS.java index 02f19239..4dda34d6 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNS.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNS.java @@ -7,200 +7,209 @@ /** * NetBIOS Name Service. + * * @author Wulf Pfeiffer */ public class NBNS { - - private byte[] transactID; - private byte[] flags; - private byte[] questions; - private byte[] answerRRs; - private byte[] authorityRRs; - private byte[] additionalRRs; - private byte[] payload; - private byte[] additional; - private byte[] addr; - private byte[] name; - private int type; - private int service; - - public NBNS(byte[] addr) { - this.addr = addr; - } - - /** - * Prepares the content for the next packet regarding of the set type. - */ - private void preparePacket() { - transactID = NMB.getAndIncTransactID(); - switch (type) { - case NBNSType.REGISTRATION_UNIQUE: - prepareRegistrationPacket(); - break; - case NBNSType.REGISTRATION_GROUP: - prepareRegistrationPacket(); - break; - case NBNSType.NAME_QUERY: - prepareNameQueryPacket(); - break; - case NBNSType.REGISTRATION_MSBROWSE: - prepareRegistrationMsBrowse(); - break; - default: - } - } - - /** - * Prepares the content for the next registration packet. - */ - private void prepareRegistrationPacket() { - flags = new byte[]{0x29, 0x10}; - questions = new byte[]{0x00, 0x01}; - answerRRs = new byte[]{0x00, 0x00}; - authorityRRs = new byte[]{0x00, 0x00}; - additionalRRs = new byte[]{0x00, 0x01}; - payload = getPayload(); - additional = getAdditionalRecords(); - } - - /** - * Prepares the content for the next name query packet. - */ - private void prepareNameQueryPacket() { - flags = new byte[] {0x01, 0x10}; - questions = new byte[]{0x00, 0x01}; - answerRRs = new byte[]{0x00, 0x00}; - authorityRRs = new byte[]{0x00, 0x00}; - additionalRRs = new byte[]{0x00, 0x00}; - payload = getPayload(); - } - - /** - * Prepares the content for the next MSBROWSE registration packet. - */ - private void prepareRegistrationMsBrowse() { - flags = new byte[]{0x29, 0x10}; - questions = new byte[]{0x00, 0x01}; - answerRRs = new byte[]{0x00, 0x00}; - authorityRRs = new byte[]{0x00, 0x00}; - additionalRRs = new byte[]{0x00, 0x01}; - payload = HelperUtils.concat(new byte[]{0x20, 0x41, 0x42, 0x41, 0x43}, name, - new byte[]{0x41, 0x43, 0x41, 0x42, 0x00, 0x00, 0x20, 0x00, 0x01}); - additional = getAdditionalRecords(); - } - - /** - * Prepares the content for the next response packet. - */ - public void prepareResponsePacket(byte[] packet, byte[] myAddr) { - this.transactID = new byte[]{packet[0], packet[1]}; - flags = new byte[]{(byte) 0x85, (byte) 0x80}; - questions = new byte[]{0x00, 0x00}; - answerRRs = new byte[]{0x00, 0x01}; - authorityRRs = new byte[]{0x00, 0x00}; - additionalRRs = new byte[]{0x00, 0x00}; - byte[] nameBytes = new byte[32]; - System.arraycopy(packet, 13, nameBytes, 0, 32); - String name = NMBStringCoder.decodeNBNSName(nameBytes); - byte[] query = new byte[50]; - System.arraycopy(packet, 12, query, 0, 38); - // time to live - query[38] = 0x00; - query[39] = 0x00; - query[40] = 0x02; - query[41] = 0x58; - // data length - query[42] = 0x00; - query[43] = 0x06; - // name flags - query[44] = (byte) 0x80; - query[45] = 0x00; - // addr - query[46] = myAddr[0]; - query[47] = myAddr[1]; - query[48] = myAddr[2]; - query[49] = myAddr[3]; - payload = query; - } - - /** - * Builds the payload for the packet. - * @return payload. - */ - private byte[] getPayload() { - byte[] payload = NMBStringCoder.wrapNBNSName(this.name, service); - byte[] type = {0x00, 0x20}; - byte[] nbnsclass = {0x00, 0x01}; - return HelperUtils.concat(payload, type, nbnsclass); - } - - /** - * Builds the additional records field. - * @return additional records. - */ - private byte[] getAdditionalRecords() { - byte[] name = {(byte) 0xc0, 0x0c}; - byte[] type = {0x00, 0x20}; - byte[] nbnsclass = {0x00, 0x01}; - byte[] timeToLive = {0x00, 0x00, 0x00, 0x00}; - byte[] nameFlags = ((this.type == NBNSType.REGISTRATION_UNIQUE) ? new byte[]{0x00, 0x00} : new byte[]{(byte) 0x80, 0x00}); - byte[] buffer = ByteBuffer.allocate(4).putInt(nameFlags.length + addr.length).array(); - byte[] length = {buffer[2], buffer[3]}; - return HelperUtils.concat(name, type, nbnsclass, timeToLive, length, nameFlags, addr); - } - - /** - * Returns the next packet. - * Use only after the name, type and service were set. - * @return next packet. - */ - public byte[] getNextPacket() { - preparePacket(); - return getBytes(); - } - - /** - * Returns the next response packet. - * @param packet request packet. - * @param myAddr your current ip in bytes. - * @return next response packet. - */ - public byte[] getNextResponse(byte[] packet, byte[] myAddr) { - prepareResponsePacket(packet, myAddr); - return getBytes(); - } - - /** - * Returns the content of the packet in bytes. - * @return packet content. - */ - private byte[] getBytes() { - return HelperUtils.concat(transactID, flags, questions, answerRRs, authorityRRs, additionalRRs, payload, additional); - } - - /** - * Set the name for the payload. - * @param name - */ - public void setName(String name) { - this.name = name.getBytes(); - this.name = NMBStringCoder.encodeNBNSName(this.name); - } - - /** - * Set the NBNSType. - * @param type NBNSType. - */ - public void setType(int type) { - this.type = type; - } - - /** - * Set the NBNSService. - * @param service NBNSService. - */ - public void setService(int service) { - this.service = service; - } + + private byte[] transactID; + private byte[] flags; + private byte[] questions; + private byte[] answerRRs; + private byte[] authorityRRs; + private byte[] additionalRRs; + private byte[] payload; + private byte[] additional; + private final byte[] addr; + private byte[] name; + private int type; + private int service; + + public NBNS(byte[] addr) { + this.addr = addr; + } + + /** + * Prepares the content for the next packet regarding of the set type. + */ + private void preparePacket() { + transactID = NMB.getAndIncTransactID(); + switch (type) { + case NBNSType.REGISTRATION_UNIQUE: + prepareRegistrationPacket(); + break; + case NBNSType.REGISTRATION_GROUP: + prepareRegistrationPacket(); + break; + case NBNSType.NAME_QUERY: + prepareNameQueryPacket(); + break; + case NBNSType.REGISTRATION_MSBROWSE: + prepareRegistrationMsBrowse(); + break; + default: + } + } + + /** + * Prepares the content for the next registration packet. + */ + private void prepareRegistrationPacket() { + flags = new byte[]{0x29, 0x10}; + questions = new byte[]{0x00, 0x01}; + answerRRs = new byte[]{0x00, 0x00}; + authorityRRs = new byte[]{0x00, 0x00}; + additionalRRs = new byte[]{0x00, 0x01}; + payload = getPayload(); + additional = getAdditionalRecords(); + } + + /** + * Prepares the content for the next name query packet. + */ + private void prepareNameQueryPacket() { + flags = new byte[]{0x01, 0x10}; + questions = new byte[]{0x00, 0x01}; + answerRRs = new byte[]{0x00, 0x00}; + authorityRRs = new byte[]{0x00, 0x00}; + additionalRRs = new byte[]{0x00, 0x00}; + payload = getPayload(); + } + + /** + * Prepares the content for the next MSBROWSE registration packet. + */ + private void prepareRegistrationMsBrowse() { + flags = new byte[]{0x29, 0x10}; + questions = new byte[]{0x00, 0x01}; + answerRRs = new byte[]{0x00, 0x00}; + authorityRRs = new byte[]{0x00, 0x00}; + additionalRRs = new byte[]{0x00, 0x01}; + payload = HelperUtils.concat(new byte[]{0x20, 0x41, 0x42, 0x41, 0x43}, name, + new byte[]{0x41, 0x43, 0x41, 0x42, 0x00, 0x00, 0x20, 0x00, 0x01}); + additional = getAdditionalRecords(); + } + + /** + * Prepares the content for the next response packet. + */ + public void prepareResponsePacket(byte[] packet, byte[] myAddr) { + this.transactID = new byte[]{packet[0], packet[1]}; + flags = new byte[]{(byte) 0x85, (byte) 0x80}; + questions = new byte[]{0x00, 0x00}; + answerRRs = new byte[]{0x00, 0x01}; + authorityRRs = new byte[]{0x00, 0x00}; + additionalRRs = new byte[]{0x00, 0x00}; + byte[] nameBytes = new byte[32]; + System.arraycopy(packet, 13, nameBytes, 0, 32); + String name = NMBStringCoder.decodeNBNSName(nameBytes); + byte[] query = new byte[50]; + System.arraycopy(packet, 12, query, 0, 38); + // time to live + query[38] = 0x00; + query[39] = 0x00; + query[40] = 0x02; + query[41] = 0x58; + // data length + query[42] = 0x00; + query[43] = 0x06; + // name flags + query[44] = (byte) 0x80; + query[45] = 0x00; + // addr + query[46] = myAddr[0]; + query[47] = myAddr[1]; + query[48] = myAddr[2]; + query[49] = myAddr[3]; + payload = query; + } + + /** + * Builds the payload for the packet. + * + * @return payload. + */ + private byte[] getPayload() { + byte[] payload = NMBStringCoder.wrapNBNSName(this.name, service); + byte[] type = {0x00, 0x20}; + byte[] nbnsclass = {0x00, 0x01}; + return HelperUtils.concat(payload, type, nbnsclass); + } + + /** + * Builds the additional records field. + * + * @return additional records. + */ + private byte[] getAdditionalRecords() { + byte[] name = {(byte) 0xc0, 0x0c}; + byte[] type = {0x00, 0x20}; + byte[] nbnsclass = {0x00, 0x01}; + byte[] timeToLive = {0x00, 0x00, 0x00, 0x00}; + byte[] nameFlags = ((this.type == NBNSType.REGISTRATION_UNIQUE) ? new byte[]{0x00, 0x00} : new byte[]{(byte) 0x80, 0x00}); + byte[] buffer = ByteBuffer.allocate(4).putInt(nameFlags.length + addr.length).array(); + byte[] length = {buffer[2], buffer[3]}; + return HelperUtils.concat(name, type, nbnsclass, timeToLive, length, nameFlags, addr); + } + + /** + * Returns the next packet. + * Use only after the name, type and service were set. + * + * @return next packet. + */ + public byte[] getNextPacket() { + preparePacket(); + return getBytes(); + } + + /** + * Returns the next response packet. + * + * @param packet request packet. + * @param myAddr your current ip in bytes. + * @return next response packet. + */ + public byte[] getNextResponse(byte[] packet, byte[] myAddr) { + prepareResponsePacket(packet, myAddr); + return getBytes(); + } + + /** + * Returns the content of the packet in bytes. + * + * @return packet content. + */ + private byte[] getBytes() { + return HelperUtils.concat(transactID, flags, questions, answerRRs, authorityRRs, additionalRRs, payload, additional); + } + + /** + * Set the name for the payload. + * + * @param name + */ + public void setName(String name) { + this.name = name.getBytes(); + this.name = NMBStringCoder.encodeNBNSName(this.name); + } + + /** + * Set the NBNSType. + * + * @param type NBNSType. + */ + public void setType(int type) { + this.type = type; + } + + /** + * Set the NBNSService. + * + * @param service NBNSService. + */ + public void setService(int service) { + this.service = service; + } } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNSService.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNSService.java index 08b226ea..284774c8 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNSService.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBNSService.java @@ -2,36 +2,36 @@ /** * NetBios Name Service services. + * * @author Wulf Pfeiffer. */ public class NBNSService { - public static final int SERVER = 0; - public static final int MESSENGER = 1; - public static final int WORKSTATION = 2; - public static final int BROWSER_ELECTION = 3; - public static final int LOCAL_MASTER_BROWSER = 4; - public static final int BROWSER = 5; + public static final int SERVER = 0; + public static final int MESSENGER = 1; + public static final int WORKSTATION = 2; + public static final int BROWSER_ELECTION = 3; + public static final int LOCAL_MASTER_BROWSER = 4; + public static final int BROWSER = 5; - /** - * Returns the proper bytes that are used in the wrapping of netbios names for the NBNSService. - * @param service NBNSService. - * @return bytes. - */ - public static byte[] getServiceBytes(int service) { - switch (service) { - case NBNSService.SERVER: - return new byte[]{0x43, 0x41}; - case NBNSService.MESSENGER: - return new byte[]{0x41, 0x44}; - case NBNSService.WORKSTATION: - return new byte[]{0x41, 0x41}; - case NBNSService.BROWSER_ELECTION: - return new byte[]{0x42, 0x4f}; - case NBNSService.LOCAL_MASTER_BROWSER: - return new byte[]{0x42, 0x4e}; - default: - return new byte[]{0x43, 0x41}; - } - } + /** + * Returns the proper bytes that are used in the wrapping of netbios names for the NBNSService. + * + * @param service NBNSService. + * @return bytes. + */ + public static byte[] getServiceBytes(int service) { + switch (service) { + case NBNSService.MESSENGER: + return new byte[]{0x41, 0x44}; + case NBNSService.WORKSTATION: + return new byte[]{0x41, 0x41}; + case NBNSService.BROWSER_ELECTION: + return new byte[]{0x42, 0x4f}; + case NBNSService.LOCAL_MASTER_BROWSER: + return new byte[]{0x42, 0x4e}; + default: + return new byte[]{0x43, 0x41}; + } + } } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java index cb600a28..6239bfe0 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java @@ -21,7 +21,7 @@ */ public class NBSS extends Thread { - private int nbssPort; + private final int nbssPort; private ServerSocket nbssServer; private Socket nbssSocket; private Reader reader; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java index 3848b15c..059c8c28 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java @@ -35,7 +35,7 @@ public class NMB extends Thread { private NBDS nbds; private boolean isMaster; private byte[] addr = new byte[4]; - private static byte[] transactID = HelperUtils.randomBytes(2); + private static final byte[] transactID = HelperUtils.randomBytes(2); public NMB(String ip, String username, String workgroup) { try { @@ -281,9 +281,9 @@ public void run() { nbdsSocket.close(); } - private byte[] buffer = new byte[2048]; + private final byte[] buffer = new byte[2048]; private boolean masterAnswered = false; - private DatagramPacket receive = new DatagramPacket(buffer, buffer.length); + private final DatagramPacket receive = new DatagramPacket(buffer, buffer.length); /** * Check if the specified workgroup is already existing. diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMBStringCoder.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMBStringCoder.java index 7dade5b8..d5079136 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMBStringCoder.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMBStringCoder.java @@ -36,11 +36,10 @@ public static String decodeNBNSName(byte[] name) { */ public static byte[] encodeNBNSName(byte[] name) { byte a_ascii = (byte) 'A'; - byte[] bytes = name; - byte[] converted = new byte[bytes.length * 2]; - for (int i = 0, j = 0; i < bytes.length && j < converted.length; i++, j += 2) { - converted[j] = (byte) (bytes[i] >> 4); - converted[j + 1] = (byte) (bytes[i] & 0x0F); + byte[] converted = new byte[name.length * 2]; + for (int i = 0, j = 0; i < name.length && j < converted.length; i++, j += 2) { + converted[j] = (byte) (name[i] >> 4); + converted[j + 1] = (byte) (name[i] & 0x0F); } byte[] addedA = new byte[converted.length]; for (int i = 0; i < converted.length; i++) { diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java index 591cb861..f81835c7 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/SMBPacket.java @@ -15,7 +15,7 @@ */ public class SMBPacket { - private String[] serverVersion; + private final String[] serverVersion; private static byte[] serverName; private byte[] message = null; private static final byte[] serverGUID = HelperUtils.randomBytes(16); @@ -159,12 +159,12 @@ public byte[] getClose() { public byte[] getDceRpc(byte[] transSub, int length) { byte[] majorVersion = { 0x05 }; byte[] minorVersion = { 0x00 }; - byte[] packetType = null; + byte[] packetType; byte[] packetFlags = { 0x03 }; byte[] dataRepres = { 0x10, 0x00, 0x00, 0x00 }; - byte[] fragLength = null; + byte[] fragLength; byte[] authLength = { 0x00, 0x00 }; - byte[] callID = null; + byte[] callID; byte[] response = null; if (transSub[0] == 0x00 && transSub[1] == 0x0b) { @@ -241,7 +241,6 @@ public byte[] getNego() { byte[] timeZone = getTimeZoneInBytes(); byte[] keyLength = { 0x00 }; byte[] byteCount = { 0x3a, 0x00 }; - byte[] guid = serverGUID; byte[] secBlob = { 0x60, 0x28, 0x06, 0x06 }; byte[] oid = { 0x2b, 0x06, 0x01, 0x05, 0x05, 0x02 }; byte[] protectNeg = { (byte) 0xa0, 0x1e }; @@ -253,7 +252,7 @@ public byte[] getNego() { byte[] response = HelperUtils.concat(wordCount, dialect, secMode, maxMpxC, maxVcs, maxBufSize, maxRawBuf, sessionKey, - capabilities, sysTime, timeZone, keyLength, byteCount, guid, + capabilities, sysTime, timeZone, keyLength, byteCount, serverGUID, secBlob, oid, protectNeg, negToken, mechType, mechType2); return wrapNetbios(wrapHeader(response)); } @@ -294,7 +293,7 @@ public byte[] getNTCreate() { /** * Builds the session setup packet * - * @ret urn session setup packet + * @return urn session setup packet */ public byte[] getSessSetup() { if (authenticateNext) { @@ -457,7 +456,7 @@ public byte[] getTrans() { byte[] reserved2 = { 0x00, 0x00 }; byte[] paramCount = { 0x00, 0x00 }; byte[] paramOffset = { 0x00, 0x00 }; - byte[] dataCount = new byte[2]; + byte[] dataCount; byte[] dataOffset = { 0x56, 0x00 }; byte[] setupCount = { 0x03 }; byte[] reserved3 = { 0x00 }; @@ -469,7 +468,7 @@ public byte[] getTrans() { byte[] size = new byte[2]; byte[] name = HelperUtils.concat("\\MAILSLOT\\BROWSE".getBytes(), new byte[]{0x00}); - byte[] windowsBrowser = null; + byte[] windowsBrowser; if (type == NBDSType.BROWSER) { windowsBrowser = getBrowser(); } else if (type == NBDSType.REQUEST_ANNOUNCEMENT) { @@ -532,7 +531,7 @@ public byte[] getTrans() { byte[] dataDisplace = { 0x00, 0x00 }; byte[] setupCount = { 0x00 }; byte[] reserved2 = { 0x00 }; - byte[] byteCount = new byte[2]/* = {0x21, 0x01} */; + byte[] byteCount /* = {0x21, 0x01} */; byte[] padding = { 0x00 }; byte[] dcerpc = new byte[24]; @@ -600,7 +599,7 @@ public byte[] getTrans() { * @return trans2 packet */ public byte[] getTrans2() { - byte[] response = null; + byte[] response; byte[] wordCount = { 0x00 }; byte[] andXCommand = { 0x00, 0x00 }; ntStat = new byte[] { 0x22, 0x00, 0x00, (byte) 0xc0 }; @@ -614,7 +613,7 @@ public byte[] getTrans2() { * @return trans sub packet */ private byte[] getTransSub() { - byte[] transSub = new byte[2]; + byte[] transSub; if (smbCommand[0] == 0x32) transSub = new byte[] { message[66], message[65] }; else if (smbCommand[0] == 0x25 && message != null) @@ -632,7 +631,7 @@ else if (smbCommand[0] == 0x25 && message == null) */ private byte[] getAnnouncement() { //Microsoft Windows Browser - byte[] command = null; + byte[] command; if(type == NBDSType.LOCAL_MASTER_ANNOUNCEMENT_ALL || type == NBDSType.LOCAL_MASTER_ANNOUNCEMENT) { command = new byte[]{0x0f}; } else if (type == NBDSType.DOMAIN_ANNOUNCEMENT) { @@ -651,7 +650,7 @@ private byte[] getAnnouncement() { } else if (type == NBDSType.LOCAL_MASTER_ANNOUNCEMENT) { updatePeriodicity = new byte[]{0x00, 0x00, 0x00, 0x00}; } - byte[] hostName = null; + byte[] hostName; if (type == NBDSType.DOMAIN_ANNOUNCEMENT) { hostName = workgroup; } else { @@ -673,7 +672,7 @@ private byte[] getAnnouncement() { byte[] browserProtocolMajorVer = new byte[]{0x0f}; byte[] browserProtocolMinorVer = new byte[]{0x01}; byte[] signature = new byte[]{0x55, (byte) 0xaa}; - byte[] hostComment = null; + byte[] hostComment; if (type == NBDSType.DOMAIN_ANNOUNCEMENT) { hostComment = HelperUtils.concat(serverName, new byte[]{0x00}); } else { @@ -706,7 +705,7 @@ public byte[] getTreeCon() { String str = HelperUtils.byteToStr(message); byte[] wordCount = { 0x00 }; byte[] andXCommand = { 0x00, 0x00 }; - byte[] response = null; + byte[] response; if (str.contains("IPC$") || str.contains("C$")) { wordCount = new byte[] { 0x07 }; andXCommand = new byte[] { (byte) 0xff }; @@ -782,7 +781,7 @@ private static byte[] getTimeInBytes() { */ private static byte[] getTimeZoneInBytes() { // get current timezone offset in minutes - Integer offset = new GregorianCalendar().getTimeZone().getRawOffset() / 1000 / 60; + int offset = new GregorianCalendar().getTimeZone().getRawOffset() / 1000 / 60; char[] offsetChars = Integer.toBinaryString(offset).toCharArray(); boolean invert = false; for (int i = offsetChars.length - 1; i > -1; i--) { @@ -796,9 +795,7 @@ private static byte[] getTimeZoneInBytes() { for (int i = 0; i < extendedChars.length - offsetChars.length; i++) { extendedChars[i] = '1'; } - for (int i = 0; i < offsetChars.length; i++) { - extendedChars[i + extendedChars.length - offsetChars.length] = offsetChars[i]; - } + System.arraycopy(offsetChars, 0, extendedChars, 0 + extendedChars.length - offsetChars.length, offsetChars.length); int timezone = Integer.parseInt(new String(extendedChars), 2); byte[] timezoneBytes = new byte[2]; timezoneBytes[1] = (byte) (timezone >> 8); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java index 19fe5110..e03bfa0b 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java @@ -21,7 +21,7 @@ import dk.aau.netsec.hostage.protocol.Protocol; public class COAPHandler extends CoapResource { - private static ArrayList requests = new ArrayList<>(); + private static final ArrayList requests = new ArrayList<>(); private static final ArrayList fullRequests = new ArrayList<>(); private String value="Response"; @@ -95,9 +95,7 @@ public static void removeCurrentConnected(){ * @param BSSID the BSSID * @param internalIPAddress the internal IpAddress * @return - * @throws UnknownHostException */ - public synchronized static AttackRecord createAttackRecord(Long attack_id, String externalIP, Protocol protocol, int subnetMask, String BSSID, int internalIPAddress){ AttackRecord record = new AttackRecord(); String internalIp = HelperUtils.intToStringIp(internalIPAddress); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java index 128c419c..d468711d 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java @@ -38,25 +38,25 @@ */ public class MQTTConfig { - private String port ="port"; + private final String port ="port"; private String portValue="1883"; - private String host="host"; + private final String host="host"; private String hostValue="0.0.0.0"; - private String websocket_port="websocket_port"; + private final String websocket_port="websocket_port"; private String websocket_port_value="8080"; - private String password_file= "password_file"; + private final String password_file= "password_file"; private String password_file_value= "password_file.conf"; - private String ssl_port="ssl_port"; + private final String ssl_port="ssl_port"; private String ssl_port_value="8883"; - private String jks_path="jks_path"; + private final String jks_path="jks_path"; private String jks_path_value="serverkeystore.jks"; - private String key_store_password="key_store_password"; + private final String key_store_password="key_store_password"; private String key_store_passwordValue="passw0rdsrv"; - private String key_manager_password="key_manager_password"; + private final String key_manager_password="key_manager_password"; private String key_manager_passwordValue="passw0rdsrv"; - private String allow_anonymous="allow_anonymous"; + private final String allow_anonymous="allow_anonymous"; private String allow_anonymous_value="true"; - private String reauthorize_subscriptions_on_connect="reauthorize_subscriptions_on_connect"; + private final String reauthorize_subscriptions_on_connect="reauthorize_subscriptions_on_connect"; private String reauthorize_subscriptions_on_connectValue="false"; public MQTTConfig(String portValue, String hostValue, String websocket_port_value, String password_file_value, String ssl_port_value, String jks_path_value, String key_store_passwordValue, String key_manager_passwordValue, String allow_anonymous_value, String reauthorize_subscriptions_on_connectValue) { diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java index 16899a13..f9b587fd 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java @@ -30,20 +30,20 @@ import io.moquette.interception.messages.InterceptUnsubscribeMessage; public class MQTTHandler { - private static ArrayList publishMessages = new ArrayList<>(); - private static ArrayList currentPublishMessages = new ArrayList<>(); + private static final ArrayList publishMessages = new ArrayList<>(); + private static final ArrayList currentPublishMessages = new ArrayList<>(); - private static ArrayList interceptConnectMessages = new ArrayList<>(); - private static ArrayList currentConnectedMessages = new ArrayList<>(); + private static final ArrayList interceptConnectMessages = new ArrayList<>(); + private static final ArrayList currentConnectedMessages = new ArrayList<>(); - private static ArrayList interceptDisconnectMessages = new ArrayList<>(); - private static ArrayList interceptConnectionLostMessages = new ArrayList<>(); + private static final ArrayList interceptDisconnectMessages = new ArrayList<>(); + private static final ArrayList interceptConnectionLostMessages = new ArrayList<>(); - private static ArrayList interceptSubscribeMessages = new ArrayList<>(); - private static ArrayList currentSubscribeMessages = new ArrayList<>(); + private static final ArrayList interceptSubscribeMessages = new ArrayList<>(); + private static final ArrayList currentSubscribeMessages = new ArrayList<>(); - private static ArrayList interceptUnsubscribeMessages = new ArrayList<>(); - private static ArrayList interceptAcknowledgedMessages = new ArrayList<>(); + private static final ArrayList interceptUnsubscribeMessages = new ArrayList<>(); + private static final ArrayList interceptAcknowledgedMessages = new ArrayList<>(); private final static int brokerPort = 1883; private static String packet = ""; @@ -58,7 +58,7 @@ public InterceptHandler getHandler(){ InterceptConnectionLostMessage.class, InterceptPublishMessage.class, InterceptSubscribeMessage.class, InterceptUnsubscribeMessage.class, InterceptAcknowledgedMessage.class}; - InterceptHandler handler = new InterceptHandler() { + return new InterceptHandler() { @Override public String getID() { return null; @@ -106,7 +106,6 @@ public void onMessageAcknowledged(InterceptAcknowledgedMessage interceptAcknowle interceptAcknowledgedMessages.add(interceptAcknowledgedMessage); } }; - return handler; } public static ArrayList getPublishMessages() { @@ -190,8 +189,7 @@ private synchronized static boolean isAnAttackerConnected(){ private synchronized static boolean discoverOtherClients(){ CopyOnWriteArrayList clients = new CopyOnWriteArrayList<> (getCurrentConnectedMessages()); if(!clients.isEmpty()) { - for (Iterator iterator = clients.iterator(); iterator.hasNext();) { - InterceptConnectMessage item = iterator.next(); + for (InterceptConnectMessage item : clients) { if (item != null) { if (!item.getClientID().equals(SensorProfile.getClientID())) { return true; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/SensorProfile.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/SensorProfile.java index 2a2fa5e9..cb8cb7c2 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/SensorProfile.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/SensorProfile.java @@ -8,8 +8,8 @@ import dk.aau.netsec.hostage.protocol.MQTT; public class SensorProfile { - private double temperature = ThreadLocalRandom.current().nextDouble(10, 30 + 1); - private int humidity= ThreadLocalRandom.current().nextInt(55, 80 + 1); + private final double temperature = ThreadLocalRandom.current().nextDouble(10, 30 + 1); + private final int humidity= ThreadLocalRandom.current().nextInt(55, 80 + 1); private final static String clientId = UUID.randomUUID().toString(); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java index f11636df..1bf09bf5 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java @@ -95,12 +95,7 @@ private SimpleSmtpServer(ServerSocket serverSocket) { this.receivedMail = new ArrayList<>(); this.serverSocket = serverSocket; this.workerThread = new Thread( - new Runnable() { - @Override - public void run() { - performWork(); - } - }); + () -> performWork()); this.workerThread.start(); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpActionType.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpActionType.java index 8870c929..aed7d613 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpActionType.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpActionType.java @@ -21,7 +21,7 @@ */ public class SmtpActionType { /** Internal value for the action type. */ - private byte value; + private final byte value; /** Internal representation of the CONNECT action. */ private static final byte CONNECT_BYTE = (byte) 1; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpMessage.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpMessage.java index c1eb5106..6a55d1ba 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpMessage.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpMessage.java @@ -30,9 +30,9 @@ */ public class SmtpMessage { /** Headers: Map of List of String hashed on header name. */ - private Map> headers; + private final Map> headers; /** Message body. */ - private StringBuilder body; + private final StringBuilder body; /** Constructor. Initializes headers Map and body buffer. */ public SmtpMessage() { @@ -116,11 +116,7 @@ public String getBody() { * @param value header value */ private void addHeader(String name, String value) { - List valueList = headers.get(name); - if (valueList == null) { - valueList = new ArrayList<>(1); - headers.put(name, valueList); - } + List valueList = headers.computeIfAbsent(name, k -> new ArrayList<>(1)); valueList.add(value); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpRequest.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpRequest.java index 5daf0428..bb455ac1 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpRequest.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpRequest.java @@ -44,11 +44,11 @@ */ public class SmtpRequest { /** SMTP action received from client. */ - private SmtpActionType action; + private final SmtpActionType action; /** Current state of the SMTP state table. */ - private SmtpState state; + private final SmtpState state; /** Additional information passed from the client with the SMTP action. */ - String params; + final String params; /** * Create a new SMTP client request. diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpResponse.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpResponse.java index a297a4d2..94c7cbe2 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpResponse.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpResponse.java @@ -24,11 +24,11 @@ */ public class SmtpResponse extends Packet { /** Response code - see RFC-2821. */ - private int code; + private final int code; /** Response message. */ - private String message; + private final String message; /** New state of the SMTP server once the request has been executed. */ - private SmtpState nextState; + private final SmtpState nextState; /** * Constructor. diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpState.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpState.java index f0c16c18..35917aeb 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpState.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SmtpState.java @@ -22,7 +22,7 @@ */ public class SmtpState { /** Internal representation of the state. */ - private byte value; + private final byte value; /** Internal representation of the CONNECT state. */ private static final byte CONNECT_BYTE = (byte) 1; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOTableBuilder.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOTableBuilder.java index fa8fa534..585eab9e 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOTableBuilder.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/snmpUtils/MOTableBuilder.java @@ -20,16 +20,16 @@ */ public class MOTableBuilder { - private MOTableSubIndex[] subIndexes = new MOTableSubIndex[] { new MOTableSubIndex( + private final MOTableSubIndex[] subIndexes = new MOTableSubIndex[] { new MOTableSubIndex( SMIConstants.SYNTAX_INTEGER) }; - private MOTableIndex indexDef = new MOTableIndex(subIndexes, false); + private final MOTableIndex indexDef = new MOTableIndex(subIndexes, false); - private final List columns = new ArrayList(); - private final List tableRows = new ArrayList(); + private final List columns = new ArrayList<>(); + private final List tableRows = new ArrayList<>(); private int currentRow = 0; private int currentCol = 0; - private OID tableRootOid; + private final OID tableRootOid; private int colTypeCnt = 0; diff --git a/src/main/java/dk/aau/netsec/hostage/provider/HostageContentProvider.java b/src/main/java/dk/aau/netsec/hostage/provider/HostageContentProvider.java index 133c90b8..fa0f68fc 100644 --- a/src/main/java/dk/aau/netsec/hostage/provider/HostageContentProvider.java +++ b/src/main/java/dk/aau/netsec/hostage/provider/HostageContentProvider.java @@ -102,8 +102,7 @@ public Cursor query(Uri uri, String[] projection, String selection, String[] sel queryBuilder.appendWhere(MessageRecordDao.Properties.Id + "=" + rowID); } SQLiteDatabase db = getDatabase(); - Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); - return cursor; + return queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder); } @Override diff --git a/src/main/java/dk/aau/netsec/hostage/publisher/FilePublisher.java b/src/main/java/dk/aau/netsec/hostage/publisher/FilePublisher.java index f31bb80b..796dc8f8 100644 --- a/src/main/java/dk/aau/netsec/hostage/publisher/FilePublisher.java +++ b/src/main/java/dk/aau/netsec/hostage/publisher/FilePublisher.java @@ -17,14 +17,14 @@ public class FilePublisher { private final static int MAX_FILE_SIZE = 10 * 1024*1024; -private static Logger log = LoggerFactory.getLogger(FilePublisher.class); +private static final Logger log = LoggerFactory.getLogger(FilePublisher.class); public static void printUsage() { System.err.println("usage: -h -p -i -s -c -f "); } - public static void main(String args[]) throws IOException, Hpfeeds.EOSException, Hpfeeds.ReadTimeOutException, Hpfeeds.LargeMessageException, Hpfeeds.InvalidStateException { + public static void main(String[] args) throws IOException, Hpfeeds.EOSException, Hpfeeds.ReadTimeOutException, Hpfeeds.LargeMessageException, Hpfeeds.InvalidStateException { Map argMap = new HashMap<>(); argMap.put("-h", null); argMap.put("-p", null); diff --git a/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java b/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java index 2761820e..8ad69d87 100644 --- a/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java +++ b/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java @@ -1,4 +1,8 @@ package dk.aau.netsec.hostage.publisher; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; @@ -12,333 +16,331 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - public class Hpfeeds { - - private final static int MAX_MESSAGE_SIZE = 16 * 1024*1024; - private final static int TIMEOUT = 3000; - - public final static byte OP_ERROR = 0; - public final static byte OP_INFO = 1; - public final static byte OP_AUTH = 2; - public final static byte OP_PUBLISH = 3; - public final static byte OP_SUBSCRIBE = 4; - - - private static Charset charset = Charset.forName("UTF-8"); - private static CharsetEncoder charsetEncoder = charset.newEncoder(); - private static CharsetDecoder charsetDecoder = charset.newDecoder(); - - - private String host, ident, secret; - private int port; - - private SocketChannel sc; - private Reader reader; - private boolean run = false; - - private long writtenMessages = 0; - private long writtenBytes = 0; - private String brokerName; - - - private static Logger log = LoggerFactory.getLogger(Hpfeeds.class); - - public static interface MessageHandler { - void onMessage(String ident, String channel, ByteBuffer msg); - } - - public static interface ErrorHandler { - void onError(ByteBuffer msg); - } - - public static class InvalidStateException extends Exception { - public InvalidStateException() { - super(); - } - public InvalidStateException(String string) { - super(string); - } - } - public static class EOSException extends Exception {} - public static class ReadTimeOutException extends Exception {} - public static class LargeMessageException extends Exception {} - - public Hpfeeds(String host, int port, String ident, String secret) { - this.host = host; - this.port = port; - this.ident = ident; - this.secret = secret; - } - - public void connect() throws IOException, EOSException, ReadTimeOutException, LargeMessageException, InvalidStateException { - sc = SocketChannel.open(); - sc.socket().connect(new InetSocketAddress(host, port), TIMEOUT); - - Reader oldReader = reader; - reader = new Reader(sc); - if (oldReader != null) { - reader.setReadMessages(oldReader.getReadMessages()); - reader.setReadBytes(oldReader.getReadBytes()); - } - - Message msg = reader.next(); - if (msg.opcode != OP_INFO) throw new InvalidStateException("expected OP_INFO"); - - String name; - ByteBuffer rand; - ByteBuffer buf = ByteBuffer.wrap(msg.content); - int nameLen = buf.get(); - ByteBuffer nameBuf = buf.slice(); - nameBuf.limit(nameLen); - name = decodeString(nameBuf); - buf.position(1 + nameLen); - rand = buf.slice(); - - brokerName = name; - - writtenBytes += sc.write(msgauth(rand, ident, secret)); - writtenMessages++; - } - - public void subscribe(String[] channels) throws IOException, InvalidStateException { - if (!sc.isConnected()) throw new InvalidStateException("not connected"); - for (String c : channels) { - writtenBytes += sc.write(msgsubscribe(ident, c)); - writtenMessages++; - } - } - - public void run(MessageHandler messageHandler, ErrorHandler errorHandler) throws IOException, EOSException, ReadTimeOutException, LargeMessageException, InvalidStateException { - if (!sc.isConnected()) throw new InvalidStateException("not connected"); - - run = true; - while (run) { - Message msg; - try { - msg = reader.next(); - } - catch (IOException | ReadTimeOutException | EOSException | LargeMessageException e) { - if (!run) return; - else throw e; - } - - if (msg.opcode == OP_PUBLISH) { - String ident, chan; - ByteBuffer buf = ByteBuffer.wrap(msg.content); - - int identLen = buf.get(); - ByteBuffer identBuf = buf.slice(); - identBuf.limit(identLen); - ident = decodeString(identBuf); - buf.position(1 + identLen); - buf = buf.slice(); - int chanLen = buf.get(); - ByteBuffer chanBuf = buf.slice(); - chanBuf.limit(chanLen); - chan = decodeString(chanBuf); - buf.position(1 + chanLen); - buf = buf.slice(); - - messageHandler.onMessage(ident, chan, buf); - } - else if (msg.opcode == OP_ERROR) { - errorHandler.onError(ByteBuffer.wrap(msg.content)); - } - else { - throw new InvalidStateException("expected OP_PUBLISH or OP_ERROR"); - } - } - } - - public void publish(String[] channels, ByteBuffer content) throws IOException, InvalidStateException, LargeMessageException { - if (!sc.isConnected()) throw new InvalidStateException("not connected"); - for (String c : channels) { - writtenBytes += sc.write(msgpublish(ident, c, content)); - writtenMessages++; - } - } - - public void stop() { - run = false; - } - - public void disconnect() throws IOException { - sc.close(); - } - - - public long getReadMessages() { - if (reader == null) return 0; - return reader.getReadMessages(); - } - - public long getReadBytes() { - if (reader == null) return 0; - return reader.getReadBytes(); - } - - public long getWrittenMessages() { - return writtenMessages; - } - - public long getWrittenBytes() { - return writtenBytes; - } - - - public static ByteBuffer msghdr(byte opcode, ByteBuffer content) { - int msgLen = content.remaining() + 5; - ByteBuffer msg = ByteBuffer.allocate(msgLen); - msg.putInt(msgLen); - msg.put(opcode); - msg.put(content); - msg.flip(); - return msg; - } - - public static ByteBuffer msgsubscribe(String ident, String channel) { - byte identLen = (byte) encodeString(ident).remaining(); - ByteBuffer buf = encodeString(ident + channel); - ByteBuffer msg = ByteBuffer.allocate(1 + buf.remaining()); - msg.put(identLen); - msg.put(buf); - msg.flip(); - return msghdr(OP_SUBSCRIBE, msg); - } - - public static ByteBuffer msgauth(ByteBuffer rand, String ident, String secret) { - ByteBuffer identBuf = encodeString(ident); - byte identLen = (byte) identBuf.remaining(); - MessageDigest md; - try { - md = MessageDigest.getInstance("SHA-1"); - } - catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - md.update(rand); - md.update(encodeString(secret)); - ByteBuffer hashBuf = ByteBuffer.wrap(md.digest()); - ByteBuffer msg = ByteBuffer.allocate(1 + identLen + hashBuf.remaining()); - msg.put(identLen); - msg.put(identBuf); - msg.put(hashBuf); - msg.flip(); - return msghdr(OP_AUTH, msg); - } - - public static ByteBuffer msgpublish(String ident, String channel, ByteBuffer content) throws LargeMessageException { - ByteBuffer identBuf = encodeString(ident); - byte identLen = (byte) identBuf.remaining(); - ByteBuffer chanBuf = encodeString(channel); - byte chanLen = (byte) chanBuf.remaining(); - int msgLen = 1 + identLen + 1 + chanLen + content.remaining(); - if (msgLen > MAX_MESSAGE_SIZE) throw new LargeMessageException(); - ByteBuffer buf = ByteBuffer.allocate(msgLen); - buf.put(identLen); - buf.put(identBuf); - buf.put(chanLen); - buf.put(chanBuf); - buf.put(content); - buf.flip(); - return msghdr(OP_PUBLISH, buf); - } - - public static ByteBuffer encodeString(String s) { - try { - return charsetEncoder.encode(CharBuffer.wrap(s)); - } - catch (CharacterCodingException e) { - throw new RuntimeException(e); - } - } - - public static String decodeString(ByteBuffer b) throws CharacterCodingException { - return charsetDecoder.decode(b.duplicate()).toString(); - } - - public static class Reader { - private ReadableByteChannel stream; - private int maxMessageSize; - - private long readMessages = 0; - private long readBytes = 0; - - public Reader(ReadableByteChannel stream) { - this(stream, MAX_MESSAGE_SIZE); - } - - public Reader(ReadableByteChannel stream, int maxMessageSize) { - this.stream = stream; - this.maxMessageSize = maxMessageSize; - } - - public Message next() throws IOException, EOSException, ReadTimeOutException, LargeMessageException { - ByteBuffer headerBuf = ByteBuffer.allocate(5); - fetch(headerBuf); - headerBuf.flip(); - int len = headerBuf.getInt(); - byte opcode = headerBuf.get(); - - if (len > maxMessageSize) throw new LargeMessageException(); - - byte[] content = new byte[len - 5]; - fetch(ByteBuffer.wrap(content)); - - readMessages++; - return new Message(len, opcode, content); - } - - private void fetch(ByteBuffer buf) throws IOException, EOSException, ReadTimeOutException { - int s = buf.remaining(); - int n = 0, r; - - while ((r = stream.read(buf)) != -1) { - if (r == 0) throw new ReadTimeOutException(); - n += r; - readBytes += r; - if (n < s) { - continue; - } - else { - return; - } - } - throw new EOSException(); - } - - - public long getReadMessages() { - return readMessages; - } - - public long getReadBytes() { - return readBytes; - } - - public void setReadMessages(long readMessages) { - this.readMessages = readMessages; - } - - public void setReadBytes(long readBytes) { - this.readBytes = readBytes; - } - } - - - public static class Message { - public int len; - public byte opcode; - public byte[] content; - - public Message(int len, byte opcode, byte[] content) { - this.len = len; - this.opcode = opcode; - this.content = content; - } - } + + private final static int MAX_MESSAGE_SIZE = 16 * 1024 * 1024; + private final static int TIMEOUT = 3000; + + public final static byte OP_ERROR = 0; + public final static byte OP_INFO = 1; + public final static byte OP_AUTH = 2; + public final static byte OP_PUBLISH = 3; + public final static byte OP_SUBSCRIBE = 4; + + + private static final Charset charset = Charset.forName("UTF-8"); + private static final CharsetEncoder charsetEncoder = charset.newEncoder(); + private static final CharsetDecoder charsetDecoder = charset.newDecoder(); + + + private final String host; + private final String ident; + private final String secret; + private final int port; + + private SocketChannel sc; + private Reader reader; + private boolean run = false; + + private long writtenMessages = 0; + private long writtenBytes = 0; + private String brokerName; + + + private static final Logger log = LoggerFactory.getLogger(Hpfeeds.class); + + public static interface MessageHandler { + void onMessage(String ident, String channel, ByteBuffer msg); + } + + public static interface ErrorHandler { + void onError(ByteBuffer msg); + } + + public static class InvalidStateException extends Exception { + public InvalidStateException() { + super(); + } + + public InvalidStateException(String string) { + super(string); + } + } + + public static class EOSException extends Exception { + } + + public static class ReadTimeOutException extends Exception { + } + + public static class LargeMessageException extends Exception { + } + + public Hpfeeds(String host, int port, String ident, String secret) { + this.host = host; + this.port = port; + this.ident = ident; + this.secret = secret; + } + + public void connect() throws IOException, EOSException, ReadTimeOutException, LargeMessageException, InvalidStateException { + sc = SocketChannel.open(); + sc.socket().connect(new InetSocketAddress(host, port), TIMEOUT); + + Reader oldReader = reader; + reader = new Reader(sc); + if (oldReader != null) { + reader.setReadMessages(oldReader.getReadMessages()); + reader.setReadBytes(oldReader.getReadBytes()); + } + + Message msg = reader.next(); + if (msg.opcode != OP_INFO) throw new InvalidStateException("expected OP_INFO"); + + String name; + ByteBuffer rand; + ByteBuffer buf = ByteBuffer.wrap(msg.content); + int nameLen = buf.get(); + ByteBuffer nameBuf = buf.slice(); + nameBuf.limit(nameLen); + name = decodeString(nameBuf); + buf.position(1 + nameLen); + rand = buf.slice(); + + brokerName = name; + + writtenBytes += sc.write(msgauth(rand, ident, secret)); + writtenMessages++; + } + + public void subscribe(String[] channels) throws IOException, InvalidStateException { + if (!sc.isConnected()) throw new InvalidStateException("not connected"); + for (String c : channels) { + writtenBytes += sc.write(msgsubscribe(ident, c)); + writtenMessages++; + } + } + + public void run(MessageHandler messageHandler, ErrorHandler errorHandler) throws IOException, EOSException, ReadTimeOutException, LargeMessageException, InvalidStateException { + if (!sc.isConnected()) throw new InvalidStateException("not connected"); + + run = true; + while (run) { + Message msg; + try { + msg = reader.next(); + } catch (IOException | ReadTimeOutException | EOSException | LargeMessageException e) { + if (!run) return; + else throw e; + } + + if (msg.opcode == OP_PUBLISH) { + String ident, chan; + ByteBuffer buf = ByteBuffer.wrap(msg.content); + + int identLen = buf.get(); + ByteBuffer identBuf = buf.slice(); + identBuf.limit(identLen); + ident = decodeString(identBuf); + buf.position(1 + identLen); + buf = buf.slice(); + int chanLen = buf.get(); + ByteBuffer chanBuf = buf.slice(); + chanBuf.limit(chanLen); + chan = decodeString(chanBuf); + buf.position(1 + chanLen); + buf = buf.slice(); + + messageHandler.onMessage(ident, chan, buf); + } else if (msg.opcode == OP_ERROR) { + errorHandler.onError(ByteBuffer.wrap(msg.content)); + } else { + throw new InvalidStateException("expected OP_PUBLISH or OP_ERROR"); + } + } + } + + public void publish(String[] channels, ByteBuffer content) throws IOException, InvalidStateException, LargeMessageException { + if (!sc.isConnected()) throw new InvalidStateException("not connected"); + for (String c : channels) { + writtenBytes += sc.write(msgpublish(ident, c, content)); + writtenMessages++; + } + } + + public void stop() { + run = false; + } + + public void disconnect() throws IOException { + sc.close(); + } + + + public long getReadMessages() { + if (reader == null) return 0; + return reader.getReadMessages(); + } + + public long getReadBytes() { + if (reader == null) return 0; + return reader.getReadBytes(); + } + + public long getWrittenMessages() { + return writtenMessages; + } + + public long getWrittenBytes() { + return writtenBytes; + } + + + public static ByteBuffer msghdr(byte opcode, ByteBuffer content) { + int msgLen = content.remaining() + 5; + ByteBuffer msg = ByteBuffer.allocate(msgLen); + msg.putInt(msgLen); + msg.put(opcode); + msg.put(content); + msg.flip(); + return msg; + } + + public static ByteBuffer msgsubscribe(String ident, String channel) { + byte identLen = (byte) encodeString(ident).remaining(); + ByteBuffer buf = encodeString(ident + channel); + ByteBuffer msg = ByteBuffer.allocate(1 + buf.remaining()); + msg.put(identLen); + msg.put(buf); + msg.flip(); + return msghdr(OP_SUBSCRIBE, msg); + } + + public static ByteBuffer msgauth(ByteBuffer rand, String ident, String secret) { + ByteBuffer identBuf = encodeString(ident); + byte identLen = (byte) identBuf.remaining(); + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA-1"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + md.update(rand); + md.update(encodeString(secret)); + ByteBuffer hashBuf = ByteBuffer.wrap(md.digest()); + ByteBuffer msg = ByteBuffer.allocate(1 + identLen + hashBuf.remaining()); + msg.put(identLen); + msg.put(identBuf); + msg.put(hashBuf); + msg.flip(); + return msghdr(OP_AUTH, msg); + } + + public static ByteBuffer msgpublish(String ident, String channel, ByteBuffer content) throws LargeMessageException { + ByteBuffer identBuf = encodeString(ident); + byte identLen = (byte) identBuf.remaining(); + ByteBuffer chanBuf = encodeString(channel); + byte chanLen = (byte) chanBuf.remaining(); + int msgLen = 1 + identLen + 1 + chanLen + content.remaining(); + if (msgLen > MAX_MESSAGE_SIZE) throw new LargeMessageException(); + ByteBuffer buf = ByteBuffer.allocate(msgLen); + buf.put(identLen); + buf.put(identBuf); + buf.put(chanLen); + buf.put(chanBuf); + buf.put(content); + buf.flip(); + return msghdr(OP_PUBLISH, buf); + } + + public static ByteBuffer encodeString(String s) { + try { + return charsetEncoder.encode(CharBuffer.wrap(s)); + } catch (CharacterCodingException e) { + throw new RuntimeException(e); + } + } + + public static String decodeString(ByteBuffer b) throws CharacterCodingException { + return charsetDecoder.decode(b.duplicate()).toString(); + } + + public static class Reader { + private final ReadableByteChannel stream; + private final int maxMessageSize; + + private long readMessages = 0; + private long readBytes = 0; + + public Reader(ReadableByteChannel stream) { + this(stream, MAX_MESSAGE_SIZE); + } + + public Reader(ReadableByteChannel stream, int maxMessageSize) { + this.stream = stream; + this.maxMessageSize = maxMessageSize; + } + + public Message next() throws IOException, EOSException, ReadTimeOutException, LargeMessageException { + ByteBuffer headerBuf = ByteBuffer.allocate(5); + fetch(headerBuf); + headerBuf.flip(); + int len = headerBuf.getInt(); + byte opcode = headerBuf.get(); + + if (len > maxMessageSize) throw new LargeMessageException(); + + byte[] content = new byte[len - 5]; + fetch(ByteBuffer.wrap(content)); + + readMessages++; + return new Message(len, opcode, content); + } + + private void fetch(ByteBuffer buf) throws IOException, EOSException, ReadTimeOutException { + int s = buf.remaining(); + int n = 0, r; + + while ((r = stream.read(buf)) != -1) { + if (r == 0) throw new ReadTimeOutException(); + n += r; + readBytes += r; + if (n >= s) { + return; + } + } + throw new EOSException(); + } + + + public long getReadMessages() { + return readMessages; + } + + public long getReadBytes() { + return readBytes; + } + + public void setReadMessages(long readMessages) { + this.readMessages = readMessages; + } + + public void setReadBytes(long readBytes) { + this.readBytes = readBytes; + } + } + + + public static class Message { + public final int len; + public final byte opcode; + public final byte[] content; + + public Message(int len, byte opcode, byte[] content) { + this.len = len; + this.opcode = opcode; + this.content = content; + } + } } diff --git a/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java b/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java index c4dd1186..ebb12d03 100644 --- a/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java +++ b/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java @@ -18,14 +18,14 @@ public class PublishHelper { - private DaoSession dbSession; - private DAOHelper daoHelper; - private int offset=0; - private int limit=20; - private int attackRecordOffset=0; - private int attackRecordLimit=999; - LogFilter filter = null; - JSONHelper jsonHelper = new JSONHelper(); + private final DaoSession dbSession; + private final DAOHelper daoHelper; + private final int offset=0; + private final int limit=20; + private final int attackRecordOffset=0; + private final int attackRecordLimit=999; + final LogFilter filter = null; + final JSONHelper jsonHelper = new JSONHelper(); private String host = "130.225.57.113"; private int port = 20000; private String ident = "hostage"; @@ -33,7 +33,7 @@ public class PublishHelper { private String channel = "hostage"; private static final String PERSIST_FILENAME = "publish.json"; - File hpfeedsFile = new File("/data/data/" + MainActivity.getContext().getPackageName() + "/" + PERSIST_FILENAME); + final File hpfeedsFile = new File("/data/data/" + MainActivity.getContext().getPackageName() + "/" + PERSIST_FILENAME); public PublishHelper(){ this.dbSession = HostageApplication.getInstances().getDaoSession(); diff --git a/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java b/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java index 9e8ad9c4..b30849de 100644 --- a/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java +++ b/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.List; import dk.aau.netsec.hostage.Hostage; @@ -51,8 +52,8 @@ public class MultiStage extends Service { private DAOHelper daoHelper; Notification notification; NotificationManager manager; - private static int offset = 0; - private int limit = 50; + private static final int offset = 0; + private final int limit = 50; private int size; List recordArray = new ArrayList<>(); @@ -72,13 +73,12 @@ public void onCreate() { dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession, this); startCustomForeground(); - fetchData(); } else { dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession, this); startForeground(1, new Notification()); - fetchData(); } + fetchData(); } @Override @@ -166,9 +166,7 @@ public void log(MessageRecord.TYPE type, String message, String externalIP, Stri private void sortListIPs() { if (!recordArray.isEmpty()) - Collections.sort(recordArray, (one, other) -> { - return one.getRemoteIP().compareTo(other.getRemoteIP()); - }); + recordArray.sort(Comparator.comparing(RecordAll::getRemoteIP)); } diff --git a/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java b/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java index f968c3e3..e2cf12db 100644 --- a/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java +++ b/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java @@ -208,7 +208,6 @@ private void copyFilesToUserStorage(boolean copyLastFile) { } } catch (ParseException pe) { pe.printStackTrace(); - continue; } } @@ -282,20 +281,9 @@ private static void closeStream(Closeable stream) { * @throws IOException */ private static void copyFiles(FileInputStream fromFileStream, FileOutputStream toFileStream) throws IOException { - FileChannel source = null; - FileChannel destination = null; - try { - source = fromFileStream.getChannel(); - destination = toFileStream.getChannel(); + try (FileChannel source = fromFileStream.getChannel(); FileChannel destination = toFileStream.getChannel()) { destination.transferFrom(source, 0, source.size()); - } finally { - if (source != null) { - source.close(); - } - if (destination != null) { - destination.close(); - } } } @@ -347,7 +335,7 @@ public void run() { BufferedReader outputReader = new BufferedReader(new InputStreamReader(processOutput)); char[] outputChar = new char[4096]; int outputLength; - StringBuffer outputBuffer = new StringBuffer(); + StringBuilder outputBuffer = new StringBuilder(); try { fileOutputStream = openFileForWriting("pcapLog"); diff --git a/src/main/java/dk/aau/netsec/hostage/services/Stackbean.java b/src/main/java/dk/aau/netsec/hostage/services/Stackbean.java index 453deee8..d0bc0ac8 100644 --- a/src/main/java/dk/aau/netsec/hostage/services/Stackbean.java +++ b/src/main/java/dk/aau/netsec/hostage/services/Stackbean.java @@ -6,10 +6,10 @@ * Bean class to store objects of multistage attack */ public class Stackbean { - private String remoteip; - private String localip; + private final String remoteip; + private final String localip; private String protocol; - private int remoteport; + private final int remoteport; private int localport; private String BSSID; private String SSID; diff --git a/src/main/java/dk/aau/netsec/hostage/system/Decompress.java b/src/main/java/dk/aau/netsec/hostage/system/Decompress.java index 8def8517..cc4dfe86 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/Decompress.java +++ b/src/main/java/dk/aau/netsec/hostage/system/Decompress.java @@ -4,7 +4,6 @@ import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; @@ -14,8 +13,8 @@ * Created by shankar on 16.05.14. */ public class Decompress { - private String _zipFile; - private String _location; + private final String _zipFile; + private final String _location; public Decompress(String zipFile, String location) { _zipFile = zipFile; @@ -28,7 +27,7 @@ public void unzip() { try { FileInputStream fin = new FileInputStream(_zipFile); ZipInputStream zin = new ZipInputStream(fin); - ZipEntry ze = null; + ZipEntry ze; while ((ze = zin.getNextEntry()) != null) { Log.v("Decompress", "Unzipping " + ze.getName()); diff --git a/src/main/java/dk/aau/netsec/hostage/system/Device.java b/src/main/java/dk/aau/netsec/hostage/system/Device.java index ba475ee4..da04e67f 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/Device.java +++ b/src/main/java/dk/aau/netsec/hostage/system/Device.java @@ -92,7 +92,7 @@ public static void executePortRedirectionScript() { if (deployAsset("payload/redirect-ports.sh", "redirect-ports.sh")) { String scriptFilePath = new File(MainActivity.getInstance().getFilesDir(), "redirect-ports.sh").getAbsolutePath(); - Process p = null; + Process p; try { Runtime.getRuntime().exec("chmod " + mode + " " + scriptFilePath).waitFor(); diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java index dade5328..4686f538 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java @@ -84,10 +84,10 @@ public final class Api { private static final String[] staticChains = {"", "-input", "-3g", "-wifi", "-reject", "-vpn", "-3g-tether", "-3g-home", "-3g-roam", "-wifi-tether", "-wifi-wan", "-wifi-lan", "-tor", "-tor-reject", "-tether"}; //for custom scripts - private static String charsetName = "UTF8"; - private static String algorithm = "DES"; - private static int base64Mode = Base64.DEFAULT; - private static String CHAIN_NAME = "customRules"; + private static final String charsetName = "UTF8"; + private static final String algorithm = "DES"; + private static final int base64Mode = Base64.DEFAULT; + private static final String CHAIN_NAME = "customRules"; /** @@ -610,7 +610,7 @@ public static String loadData(final Context context, BufferedReader reader = new BufferedReader(new InputStreamReader( inputStream, StandardCharsets.UTF_8)); String line; - StringBuffer data = new StringBuffer(); + StringBuilder data = new StringBuilder(); while ((line = reader.readLine()) != null) { data.append(line); } diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java index 4bb0a4b6..f331fbb5 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java @@ -52,6 +52,7 @@ public RootCommand clone() { rootCommand = (RootCommand) super.clone(); rootCommand.isv6 = true; } catch (CloneNotSupportedException e) { + e.printStackTrace(); } return rootCommand; } diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java index f7915243..f5db0165 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java @@ -59,7 +59,7 @@ public class RootShellService extends Service implements Cloneable { private static Context mContext; private static NotificationManager notificationManager; private static ShellState rootState = ShellState.INIT; - private static LinkedList waitQueue = new LinkedList<>(); + private static final LinkedList waitQueue = new LinkedList<>(); private static NotificationCompat.Builder builder; @Override @@ -68,6 +68,7 @@ public RootShellService clone() { try { rootShellService = (RootShellService) super.clone(); } catch (CloneNotSupportedException e) { + e.printStackTrace(); } return rootShellService; } @@ -96,33 +97,31 @@ private static void complete(final RootCommand state, int exitCode) { private static void runNextSubmission() { - do { - RootCommand state; - try { - state = waitQueue.remove(); - } catch (NoSuchElementException e) { - // nothing left to do - if (rootState == ShellState.BUSY) { - rootState = ShellState.READY; - } - break; + RootCommand state; + try { + state = waitQueue.remove(); + } catch (NoSuchElementException e) { + // nothing left to do + if (rootState == ShellState.BUSY) { + rootState = ShellState.READY; } - if (state != null) { - //same as last one. ignore it - Log.i(TAG, "Start processing next state"); - if (enableProfiling) { - state.startTime = new Date(); - } - if (rootState == ShellState.FAIL) { - // if we don't have root, abort all queued commands - complete(state, EXIT_NO_ROOT_ACCESS); - continue; - } else if (rootState == ShellState.READY) { - rootState = ShellState.BUSY; - processCommands(state); - } + return; + } + if (state != null) { + //same as last one. ignore it + Log.i(TAG, "Start processing next state"); + if (enableProfiling) { + state.startTime = new Date(); + } + if (rootState == ShellState.FAIL) { + // if we don't have root, abort all queued commands + complete(state, EXIT_NO_ROOT_ACCESS); + } else if (rootState == ShellState.READY) { + rootState = ShellState.BUSY; + processCommands(state); } - } while (false); + } + } private static void processCommands(final RootCommand state) { @@ -149,9 +148,9 @@ private static void processCommands(final RootCommand state) { String line = iter.next(); if (line != null && !line.equals("")) { if (state.res != null) { - state.res.append(line + "\n"); + state.res.append(line).append("\n"); } - state.lastCommandResult.append(line + "\n"); + state.lastCommandResult.append(line).append("\n"); } } } @@ -203,12 +202,12 @@ private static void sendUpdate(final RootCommand state2) { LocalBroadcastManager.getInstance(mContext).sendBroadcast(broadcastIntent); }).start(); } - + @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent == null) { // if crash restart... Log.i(TAG, "Restarting RootShell..."); - List cmds = new ArrayList(); + List cmds = new ArrayList<>(); cmds.add("true"); new RootCommand().setFailureToast(R.string.error_su) .setReopenShell(true).run(getApplicationContext(), cmds); @@ -258,8 +257,8 @@ private void reOpenShell(Context context) { try { Intent intent = new Intent(context, RootShellService.class); context.startService(intent); - } catch (Exception e){ - Log.e(TAG, e.getMessage(),e); + } catch (Exception e) { + Log.e(TAG, e.getMessage(), e); } } } diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java index 3bc0c378..8339443c 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java @@ -58,7 +58,7 @@ public class RootShellService2 extends Service { private static Shell.Interactive rootSession; private static Context mContext; private static ShellState rootState = ShellState.INIT; - private static LinkedList waitQueue = new LinkedList<>(); + private static final LinkedList waitQueue = new LinkedList<>(); private static void complete(final RootCommand state, int exitCode) { if (enableProfiling) { @@ -81,33 +81,30 @@ private static void complete(final RootCommand state, int exitCode) { private static void runNextSubmission() { - do { - RootCommand state; - try { - state = waitQueue.remove(); - } catch (NoSuchElementException e) { - // nothing left to do - if (rootState == ShellState.BUSY) { - rootState = ShellState.READY; - } - break; + RootCommand state; + try { + state = waitQueue.remove(); + } catch (NoSuchElementException e) { + // nothing left to do + if (rootState == ShellState.BUSY) { + rootState = ShellState.READY; } - if (state != null) { - //same as last one. ignore it - Log.i(TAG, "Start processing next state"); - if (enableProfiling) { - state.startTime = new Date(); - } - if (rootState == ShellState.FAIL) { - // if we don't have root, abort all queued commands - complete(state, EXIT_NO_ROOT_ACCESS); - continue; - } else if (rootState == ShellState.READY) { - rootState = ShellState.BUSY; - processCommands(state); - } + return; + } + if (state != null) { + //same as last one. ignore it + Log.i(TAG, "Start processing next state"); + if (enableProfiling) { + state.startTime = new Date(); + } + if (rootState == ShellState.FAIL) { + // if we don't have root, abort all queued commands + complete(state, EXIT_NO_ROOT_ACCESS); + } else if (rootState == ShellState.READY) { + rootState = ShellState.BUSY; + processCommands(state); } - } while (false); + } } private static void processCommands(final RootCommand state) { @@ -133,9 +130,9 @@ private static void processCommands(final RootCommand state) { String line = iter.next(); if (line != null && !line.equals("")) { if (state.res != null) { - state.res.append(line + "\n"); + state.res.append(line).append("\n"); } - state.lastCommandResult.append(line + "\n"); + state.lastCommandResult.append(line).append("\n"); } } } @@ -192,7 +189,7 @@ private static void sendUpdate(final RootCommand state2) { public int onStartCommand(Intent intent, int flags, int startId) { if (intent == null) { // if crash restart... Log.i(TAG, "Restarting RootShell..."); - List cmds = new ArrayList(); + List cmds = new ArrayList<>(); cmds.add("true"); new RootCommand().setFailureToast(R.string.error_su) .setReopenShell(true).run(getApplicationContext(), cmds); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java index e52a9a26..52254273 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java @@ -57,7 +57,7 @@ import dk.aau.netsec.hostage.ui.fragment.SettingsFragment; import dk.aau.netsec.hostage.ui.fragment.StatisticsFragment; import dk.aau.netsec.hostage.ui.fragment.ThreatMapFragment; -import dk.aau.netsec.hostage.ui.fragment.UpNavigatibleFragment; +import dk.aau.netsec.hostage.ui.fragment.UpNavigableFragment; import dk.aau.netsec.hostage.ui.fragment.opengl.ThreatIndicatorGLRenderer; import dk.aau.netsec.hostage.ui.model.DrawerListItem; import dk.aau.netsec.hostage.ui.model.LogFilter; @@ -138,7 +138,7 @@ public class MainActivity extends AppCompatActivity { * * @see Hostage */ - private ServiceConnection mConnection = new ServiceConnection() { + private final ServiceConnection mConnection = new ServiceConnection() { /** * After the service is bound, check which has been clicked and start * it. @@ -528,22 +528,18 @@ public boolean onOptionsItemSelected(MenuItem item) { * Navigates up to the parent fragment of the current fragment */ public void navigateBack() { - if (!(this.mDisplayedFragment instanceof UpNavigatibleFragment)) { + if (!(this.mDisplayedFragment instanceof UpNavigableFragment)) { mDrawerToggle.setDrawerIndicatorEnabled(true); return; } - UpNavigatibleFragment upNav = (UpNavigatibleFragment) this.mDisplayedFragment; + UpNavigableFragment upNav = (UpNavigableFragment) this.mDisplayedFragment; getSupportFragmentManager().popBackStackImmediate(upNav.getUpFragment().getName(), 0); this.mDisplayedFragment = getSupportFragmentManager().findFragmentById(R.id.content_frame); configureFragment(); - if (!(this.mDisplayedFragment instanceof UpNavigatibleFragment) || !((UpNavigatibleFragment) this.mDisplayedFragment).isUpNavigable()) { - mDrawerToggle.setDrawerIndicatorEnabled(true); - } else { - mDrawerToggle.setDrawerIndicatorEnabled(false); - } + mDrawerToggle.setDrawerIndicatorEnabled(!(this.mDisplayedFragment instanceof UpNavigableFragment) || !((UpNavigableFragment) this.mDisplayedFragment).isUpNavigable()); } /** @@ -630,8 +626,8 @@ public void injectFragment(Fragment fragment) { this.mCloseWarning = false; // set the action bar up navigation according to the nature of the given fragment - if (fragment instanceof UpNavigatibleFragment) { - UpNavigatibleFragment upFrag = (UpNavigatibleFragment) fragment; + if (fragment instanceof UpNavigableFragment) { + UpNavigableFragment upFrag = (UpNavigableFragment) fragment; if (upFrag.getUpFragment() == null) { upFrag.setUpFragment(this.mDisplayedFragment.getClass()); } @@ -704,11 +700,7 @@ public void onBackPressed() { this.mDisplayedFragment = getSupportFragmentManager().findFragmentById(R.id.content_frame); configureFragment(); - if (!(this.mDisplayedFragment instanceof UpNavigatibleFragment) || !((UpNavigatibleFragment) this.mDisplayedFragment).isUpNavigable()) { - mDrawerToggle.setDrawerIndicatorEnabled(true); - } else { - mDrawerToggle.setDrawerIndicatorEnabled(false); - } + mDrawerToggle.setDrawerIndicatorEnabled(!(this.mDisplayedFragment instanceof UpNavigableFragment) || !((UpNavigableFragment) this.mDisplayedFragment).isUpNavigable()); } } @@ -817,8 +809,8 @@ public enum MainMenuItem { PRIVACY(8, PrivacyFragment.class); - private int value; - private Class klass; + private final int value; + private final Class klass; MainMenuItem(int value, Class klass) { this.value = value; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java b/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java index a8836682..de0390f1 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/adapter/ProfileRecyclerAdapter.java @@ -130,7 +130,7 @@ public void addProfile(Profile profile) { * Launch a {@link ProfileEditActivity} to change properties of an existing profile. * * @param mContext application context - * @param profile {@link Profile} to be edited + * @param profile {@link Profile} to be edited */ public void editProfile(Context mContext, Profile profile) { Intent intent = new Intent(mContext, ProfileEditActivity.class); @@ -148,7 +148,6 @@ public void editProfile(Context mContext, Profile profile) { public void removeProfile(Profile profile) { // TODO revisit - this is not currently supported from the UI list.remove(profile); - return; } /** @@ -177,9 +176,9 @@ public static class ProfileRowViewHolder extends RecyclerView.ViewHolder impleme /** * Create a reference to a single row in Profile Manager RecyclerView. * - * @param itemView root view for the row + * @param itemView root view for the row * @param onProfileClickedListener {@link OnProfileClickedListener} implementation to handle - * clicks from fragment + * clicks from fragment */ public ProfileRowViewHolder(View itemView, OnProfileClickedListener onProfileClickedListener) { super(itemView); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/adapter/RecordListAdapter.java b/src/main/java/dk/aau/netsec/hostage/ui/adapter/RecordListAdapter.java index cf2ed994..c2f5bb52 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/adapter/RecordListAdapter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/adapter/RecordListAdapter.java @@ -1,6 +1,5 @@ package dk.aau.netsec.hostage.ui.adapter; -import android.content.Context; import android.view.View; import android.widget.TextView; @@ -15,14 +14,14 @@ import dk.aau.netsec.hostage.ui.model.ExpandableListItem; public class RecordListAdapter extends ExpandableListAdapter { - private DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); - private DAOHelper daoHelper = new DAOHelper(dbSession); + private final DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); + private final DAOHelper daoHelper = new DAOHelper(dbSession); /** * Constructor - * @param context the context + * * @param listSectionHeaders the section titles - * @param dataMapping HashMap> the data to visualise + * @param dataMapping HashMap> the data to visualise */ public RecordListAdapter(List listSectionHeaders, HashMap> dataMapping) { super(listSectionHeaders, dataMapping); @@ -38,7 +37,7 @@ public RecordListAdapter(List listSectionHeaders, HashMap objects) { /** * method to save important information from parent fragment * - * @param activity activity from parent fragment * @param servicesSwitch the switch from parent fragment * @param mainListener Listener from parent fragment */ @@ -260,7 +259,7 @@ private void setRealPortListening(ViewHolder holder, ServicesListItem item) { /** * ViewHolder stands for a row in the view */ - private class ViewHolder { + private static class ViewHolder { public TextView protocolName; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java b/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java index 631f31bb..773051ab 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/adapter/StatisticListAdapter.java @@ -22,7 +22,7 @@ public class StatisticListAdapter extends ArrayAdapter { /** * Holds all necessary subviews in the rootview. */ - private class ViewHolder { + private static class ViewHolder { public TextView titleView; public TextView valueView; public TextView colorView; @@ -56,7 +56,7 @@ public void setValueFormatter(ValueFormatter formatter){ */ public StatisticListAdapter(Context context, List objects) { super(context, getLayoutID(), objects); - List list = objects == null ? new ArrayList() : objects; + List list = objects == null ? new ArrayList<>() : objects; this.context = context; this.values = list; } @@ -75,7 +75,7 @@ public View getView(final int position, View convertView, ViewGroup parent) { .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rowView = convertView; - ViewHolder holder = null; + ViewHolder holder; final PlotComparisonItem item = values.get(position); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java b/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java index 7d972a35..dc682678 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java @@ -14,34 +14,37 @@ import dk.aau.netsec.hostage.ui.activity.MainActivity; //import android.content.Intent; + /** * Created by Julien on 16.02.14. */ @SuppressLint("ValidFragment") public class ChecklistDialog extends DialogFragment { - - private ArrayList mSelectedItems; - private ArrayList itemTitles; + + private final ArrayList mSelectedItems; + private final ArrayList itemTitles; private ChecklistDialogListener mListener; - + private int selectedIndex; - private boolean isMultipleChoice; - - public String title; - - /** + private final boolean isMultipleChoice; + + public final String title; + + /** * The ChecklistDialogListener will be called if the user clicked a "cancel" or "ok" button. - * */ + */ @SuppressLint("ValidFragment") - public interface ChecklistDialogListener { + public interface ChecklistDialogListener { /** * Called if the user tapped "ok" + * * @param dialog {@link ChecklistDialog ChecklistDialog} */ void onDialogPositiveClick(ChecklistDialog dialog); /** * Called if the user tapped "cancel". + * * @param dialog {@link ChecklistDialog ChecklistDialog} */ void onDialogNegativeClick(ChecklistDialog dialog); @@ -49,151 +52,128 @@ public interface ChecklistDialogListener { /** * Returns the dialog title + * * @return title String */ - public String getTitle(){ - return this.title; + public String getTitle() { + return this.title; } /** * Returns true if the checklist dialog is a multiple choice dialog. + * * @return boolean isMultipleChoice - * */ - public boolean isMultipleChoice(){ - return this.isMultipleChoice; + */ + public boolean isMultipleChoice() { + return this.isMultipleChoice; } /*CONSTRUCTOR*/ + /** * The Constructor Method - * @param title String - * @param itemTitles ArrayList item titles list - * @param selected boolean[] an array of booleans describing the position of all the selected titles. - * @param isMultipleChoice boolean isMultipleChoice - * @param listener ChecklistDialogListener an user "event" listener * - * */ - public ChecklistDialog(String title, ArrayList itemTitles, boolean[] selected, boolean isMultipleChoice , ChecklistDialogListener listener){ - mListener = listener; - this.mSelectedItems = new ArrayList(); - - this.isMultipleChoice = isMultipleChoice; - this.title = title; - this.itemTitles = itemTitles; - - - - boolean[] selectedArray = new boolean[this.itemTitles.size()]; - - if(this.isMultipleChoice){ - for(int i = 0; i < this.itemTitles.size(); i++){ - boolean isSelected = selected[i]; - selectedArray[i] = isSelected; - if(isSelected) this.mSelectedItems.add(i); - } - } else { - for(int i = 0; i < this.itemTitles.size(); i++){ - boolean isSelected = selected[i]; - selectedArray[i] = isSelected; - if(isSelected) this.selectedIndex = i; - } - } + * @param title String + * @param itemTitles ArrayList item titles list + * @param selected boolean[] an array of booleans describing the position of all the selected titles. + * @param isMultipleChoice boolean isMultipleChoice + * @param listener ChecklistDialogListener an user "event" listener + */ + public ChecklistDialog(String title, ArrayList itemTitles, boolean[] selected, boolean isMultipleChoice, ChecklistDialogListener listener) { + mListener = listener; + this.mSelectedItems = new ArrayList<>(); + + this.isMultipleChoice = isMultipleChoice; + this.title = title; + this.itemTitles = itemTitles; + + + if (this.isMultipleChoice) { + for (int i = 0; i < this.itemTitles.size(); i++) { + boolean isSelected = selected[i]; + if (isSelected) this.mSelectedItems.add(i); + } + } else { + for (int i = 0; i < this.itemTitles.size(); i++) { + boolean isSelected = selected[i]; + if (isSelected) this.selectedIndex = i; + } + } } - + @Override public void onAttach(Activity activity) { super.onAttach(activity); - - if(this.mListener == null) - try { - - if (activity.getClass().equals(MainActivity.class)){ - mListener = (ChecklistDialogListener) (((MainActivity)activity).getDisplayedFragment()); - } else { - mListener = (ChecklistDialogListener) activity; + + if (this.mListener == null) + try { + + if (activity.getClass().equals(MainActivity.class)) { + mListener = (ChecklistDialogListener) (((MainActivity) activity).getDisplayedFragment()); + } else { + mListener = (ChecklistDialogListener) activity; + } + } catch (ClassCastException e) { + throw new ClassCastException(activity.toString() + + " must implement ChecklistDialogListener"); } - } catch (ClassCastException e) { - throw new ClassCastException(activity.toString() - + " must implement ChecklistDialogListener"); - } } /** * Return the selected titles. + * * @return ArrayList */ - public ArrayList getSelectedItemTitles(){ - ArrayList list = new ArrayList(); - if (this.mSelectedItems == null){ - return list; + public ArrayList getSelectedItemTitles() { + ArrayList list = new ArrayList<>(); + if (this.mSelectedItems == null) { + return list; } - for(Integer i : this.mSelectedItems){ - list.add(this.itemTitles.get(i.intValue())); - } - if (this.mSelectedItems.size() == 0 && !this.isMultipleChoice){ + for (Integer i : this.mSelectedItems) { + list.add(this.itemTitles.get(i.intValue())); + } + if (this.mSelectedItems.size() == 0 && !this.isMultipleChoice) { list.add(this.itemTitles.get(this.selectedIndex)); - } - return list; + } + return list; } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - - CharSequence[] titles = this.itemTitles.toArray(new CharSequence[this.itemTitles.size()]); - - boolean[] selectedArray = new boolean[this.itemTitles.size()]; - for(Integer selection : this.mSelectedItems){ - selectedArray[selection.intValue()] = true; - } - - if(this.isMultipleChoice){ - builder.setTitle(title).setMultiChoiceItems(titles, selectedArray, - new DialogInterface.OnMultiChoiceClickListener() { - public void onClick(DialogInterface dialog, int which, - boolean isChecked) { - if (isChecked) { - mSelectedItems.add(which); - } else if (mSelectedItems.contains(which)) { - mSelectedItems.remove(Integer.valueOf(which)); - } - } - }).setPositiveButton(R.string.button_title_apply, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - mListener.onDialogPositiveClick(ChecklistDialog.this); - } - }) - .setNegativeButton(R.string.button_title_cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - mListener.onDialogNegativeClick(ChecklistDialog.this); - } - }); - - } else { - - builder.setTitle(title).setSingleChoiceItems(titles, this.selectedIndex, - new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - mSelectedItems.clear(); - mSelectedItems.add(id); - } - }) - .setPositiveButton(R.string.button_title_apply, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - mListener.onDialogPositiveClick(ChecklistDialog.this); - } - }) - .setNegativeButton(R.string.button_title_cancel, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int id) { - mListener.onDialogNegativeClick(ChecklistDialog.this); - } - }); - } - - return builder.create(); - } + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + + CharSequence[] titles = this.itemTitles.toArray(new CharSequence[this.itemTitles.size()]); + + boolean[] selectedArray = new boolean[this.itemTitles.size()]; + for (Integer selection : this.mSelectedItems) { + selectedArray[selection.intValue()] = true; + } + + if (this.isMultipleChoice) { + builder.setTitle(title).setMultiChoiceItems(titles, selectedArray, + (dialog, which, isChecked) -> { + if (isChecked) { + mSelectedItems.add(which); + } else if (mSelectedItems.contains(which)) { + mSelectedItems.remove(Integer.valueOf(which)); + } + }).setPositiveButton(R.string.button_title_apply, (dialog, id) -> mListener.onDialogPositiveClick(ChecklistDialog.this)) + .setNegativeButton(R.string.button_title_cancel, (dialog, id) -> mListener.onDialogNegativeClick(ChecklistDialog.this)); + + } else { + + builder.setTitle(title).setSingleChoiceItems(titles, this.selectedIndex, + (dialog, id) -> { + mSelectedItems.clear(); + mSelectedItems.add(id); + }) + .setPositiveButton(R.string.button_title_apply, (dialog, id) -> mListener.onDialogPositiveClick(ChecklistDialog.this)) + .setNegativeButton(R.string.button_title_cancel, (dialog, id) -> mListener.onDialogNegativeClick(ChecklistDialog.this)); + } + + return builder.create(); + } } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java b/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java index 099ea783..6085aedd 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java @@ -42,20 +42,17 @@ public static void showDateTimePicker(@NonNull Context context, boolean filterFr final Calendar currentDate = Calendar.getInstance(); date = Calendar.getInstance(); - new DatePickerDialog(context, R.style.CustomDateTimePicker, new DatePickerDialog.OnDateSetListener() { - @Override - public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { - date.set(year, monthOfYear, dayOfMonth); - new TimePickerDialog(context, R.style.CustomDateTimePicker, new TimePickerDialog.OnTimeSetListener() { - @Override - public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - date.set(Calendar.HOUR_OF_DAY, hourOfDay); - date.set(Calendar.MINUTE, minute); - - callback.dateTimeSelected(date, filterFrom); - } - }, currentDate.get(Calendar.HOUR_OF_DAY), currentDate.get(Calendar.MINUTE), true).show(); - } + new DatePickerDialog(context, R.style.CustomDateTimePicker, (view, year, monthOfYear, dayOfMonth) -> { + date.set(year, monthOfYear, dayOfMonth); + new TimePickerDialog(context, R.style.CustomDateTimePicker, new TimePickerDialog.OnTimeSetListener() { + @Override + public void onTimeSet(TimePicker view, int hourOfDay, int minute) { + date.set(Calendar.HOUR_OF_DAY, hourOfDay); + date.set(Calendar.MINUTE, minute); + + callback.dateTimeSelected(date, filterFrom); + } + }, currentDate.get(Calendar.HOUR_OF_DAY), currentDate.get(Calendar.MINUTE), true).show(); }, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE)).show(); } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java index 9ce605a1..33db5e06 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java @@ -70,9 +70,7 @@ private MaterialAlertDialogBuilder getConnectionInfoDialog(String ssid){ builder.setView(view); builder.setTitle(R.string.title_connection_info); builder.setIcon(getResources().getDrawable(R.drawable.ic_info_dark_grey_icon)); - builder.setPositiveButton(R.string.show_records, (dialog, which) -> { - showRecords(filterSSID); - }); + builder.setPositiveButton(R.string.show_records, (dialog, which) -> showRecords(filterSSID)); builder.setNegativeButton(R.string.close, null); return builder; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java index 2f1c4e3a..2cc9737a 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java @@ -1,8 +1,6 @@ package dk.aau.netsec.hostage.ui.fragment; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import static dk.aau.netsec.hostage.ui.fragment.opengl.ThreatIndicatorGLRenderer.ThreatLevel.LIVE_THREAT; import android.annotation.SuppressLint; import android.app.AlertDialog; @@ -12,7 +10,6 @@ import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Bundle; - import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -21,7 +18,6 @@ import android.widget.ImageView; import android.widget.TextView; - import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; @@ -29,6 +25,10 @@ import com.google.android.material.switchmaterial.SwitchMaterial; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import dk.aau.netsec.hostage.HostageApplication; import dk.aau.netsec.hostage.R; import dk.aau.netsec.hostage.commons.HelperUtils; @@ -40,8 +40,6 @@ import dk.aau.netsec.hostage.ui.fragment.opengl.ThreatIndicatorGLRenderer; import dk.aau.netsec.hostage.ui.model.LogFilter; -import static dk.aau.netsec.hostage.ui.fragment.opengl.ThreatIndicatorGLRenderer.ThreatLevel.LIVE_THREAT; - /** * @author Alexander Brakowski @@ -74,7 +72,7 @@ public class HomeFragment extends Fragment { private DAOHelper daoHelper; private boolean mReceiverRegistered; - private boolean mRestoredFromSaved = false; + private final boolean mRestoredFromSaved = false; private boolean isActive = false; private boolean isConnected = false; private static boolean updatedImageView = false; @@ -91,18 +89,6 @@ public void setContext(Context context) { private Thread updateUIThread; private static ThreatIndicatorGLRenderer.ThreatLevel mThreatLevel = ThreatIndicatorGLRenderer.ThreatLevel.NOT_MONITORING; - @Override - public void onAttach(Context context) { - super.onAttach(context); - - AppCompatActivity a; - - if (context instanceof AppCompatActivity) { - a = (AppCompatActivity) context; - } - - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); @@ -148,9 +134,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa MainActivity.getInstance().injectFragment(fragment); }); - View.OnClickListener attackClickListener = v -> { - loadAttackListener(); - }; + View.OnClickListener attackClickListener = v -> loadAttackListener(); mHomeTextAttacks.setOnClickListener(attackClickListener); mHomeTextSecurity.setOnClickListener(attackClickListener); @@ -245,9 +229,7 @@ private void startUpdateUiThread() { updateUIThread = new Thread() { @Override public void run() { - MainActivity.getInstance().runOnUiThread(() -> { - updateUI(); - }); + MainActivity.getInstance().runOnUiThread(() -> updateUI()); } }; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java index 3e28e6d3..d8cccd82 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PreferenceHostageFragment.java @@ -42,7 +42,7 @@ public class PreferenceHostageFragment extends PreferenceFragmentCompat implemen * Contains preferences for which to display a preview of the value in the summary */ private HashSet mPrefValuePreviewSet; - MultiStageAlarm alarm = new MultiStageAlarm(); + final MultiStageAlarm alarm = new MultiStageAlarm(); private static Boolean enabledHpfeeds = false; private static Boolean enabledMultistage = false; @@ -222,9 +222,7 @@ private MaterialAlertDialogBuilder confirmHpfeeds(CheckBoxPreference checkboxPre builder.setMessage("The data collected from HosTaGe attack records will be stored for Advanced Collaborative Threat Intelligence. GDPR sensitive data include but are not limited to the public IP address of the publishing HosTaGe device. Please note that the physical geographical location of the participating HosTaGe publisher can be determined with the public IP address. Furthermore, hpfeeds include the IP address and the ports of the attack sources. Exclusive access to the hpfeeds repository is provided only with an internal review process.\n" + "\n" + "By enabling hpfeeds, the user of this app agrees to send Aalborg University (Denmark) attack data and provides his consent to use this data to process threat intelligence. The user has the right to ask for the deletion of the data published by him/her. Please contact hostage@es.aau.dk for queries and more information."); - builder.setPositiveButton(R.string.enable, (dialog, which) -> { - enabledHpfeeds = true; - }); + builder.setPositiveButton(R.string.enable, (dialog, which) -> enabledHpfeeds = true); builder.setNegativeButton(R.string.close, (dialog, which) -> { checkboxPrefHpFeeds.setChecked(false); enabledHpfeeds = false; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java index 690cdf5f..cdf28a6f 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java @@ -5,7 +5,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; -import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -22,20 +21,19 @@ * Shows Privacy information * Added as a part for fix in Android 11 * Created by Shreyas Srinivasa on 01-03-2021 - * - * */ public class PrivacyFragment extends Fragment { private View rootView; private LayoutInflater inflater; private ViewGroup container; private Bundle savedInstanceState; + @SuppressLint("SetTextI18n") - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); this.inflater = inflater; - this.container= container; + this.container = container; this.savedInstanceState = savedInstanceState; final Activity activity = getActivity(); if (activity != null) { @@ -51,7 +49,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa e.printStackTrace(); } - String policyText = "

Last updated: July 20, 2021

\n" + + String policyText = "

Last updated: July 20, 2021

\n" + "\n" + " \n" + " \n" + @@ -76,17 +74,17 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa " anyone except as described in this Privacy Policy.\n" + "

\n" + " The users can consent for the following:\n" + - "

    \n "+ - "
  • The right to be forgotten – to get your data deleted. The right to have incorrect data corrected.
  • \n "+ - "
  • The right to know what data a controller have on you.
  • \n "+ - "
  • The right to have your data shared with another organization, if requested be the subject.
  • \n "+ - "
  • The right to not be profiled, the right to object.
  • \n "+ - "
\n "+ + "
    \n " + + "
  • The right to be forgotten – to get your data deleted. The right to have incorrect data corrected.
  • \n " + + "
  • The right to know what data a controller have on you.
  • \n " + + "
  • The right to have your data shared with another organization, if requested be the subject.
  • \n " + + "
  • The right to not be profiled, the right to object.
  • \n " + + "
\n " + "

\n" + " The terms used in this Privacy Policy have the same meanings\n" + " as in our Terms and Conditions, which is accessible at\n" + " HosTaGe unless otherwise defined in this Privacy Policy.\n" + - " The Privacy Policy of Aalborg University can be accessed at https://www.en.aau.dk/privacy-policy-cookies#370625\n"+ + " The Privacy Policy of Aalborg University can be accessed at https://www.en.aau.dk/privacy-policy-cookies#370625\n" + "

Information Collection and Use

\n" + " For a better experience, while using our Service, we\n" + " may require you to provide us with certain personally\n" + @@ -169,14 +167,14 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa "

This policy is effective as of 2021-03-08

Contact Us

\n" + " If you have any questions or suggestions about our\n" + " Privacy Policy, do not hesitate to contact us at hostage@es.aau.dk.\n" + - "Data subjects have the right to submit a complaint about how their personal data is processed\n"+ - "to the Danish Data Protection Agency at dt@datatilsynet.dk or by post to Datatilsynet/the \n"+ - "Danish Data Protection Agency, Borgergade 28, 5., 1300 Copenhagen K.\n"+ - "Please contact our Data Protection Officer if you have any question about the processing of \n"+ - "your personal data at dpo@aau.dk\n"+ - "However, before contacting the Danish Data Protection Agency, we recommend that you \n"+ - "contact Aalborg University’s data protection officer who may be able to solve the matter.\n"+ - "\n"+ + "Data subjects have the right to submit a complaint about how their personal data is processed\n" + + "to the Danish Data Protection Agency at dt@datatilsynet.dk or by post to Datatilsynet/the \n" + + "Danish Data Protection Agency, Borgergade 28, 5., 1300 Copenhagen K.\n" + + "Please contact our Data Protection Officer if you have any question about the processing of \n" + + "your personal data at dpo@aau.dk\n" + + "However, before contacting the Danish Data Protection Agency, we recommend that you \n" + + "contact Aalborg University’s data protection officer who may be able to solve the matter.\n" + + "\n" + " \n" + " \n" + " "; @@ -185,19 +183,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa policy.setText(HtmlCompat.fromHtml(policyText, 0)); - - return rootView; } - @Override public void onDestroy() { super.onDestroy(); - if(rootView!=null) { + if (rootView != null) { unbindDrawables(rootView); - rootView=null; + rootView = null; } } @@ -205,24 +200,24 @@ public void onDestroy() { @Override public void onResume() { super.onResume(); - onCreateView(inflater,container,savedInstanceState); + onCreateView(inflater, container, savedInstanceState); } @Override public void onPause() { super.onPause(); - if(rootView!=null) { + if (rootView != null) { unbindDrawables(rootView); - rootView=null; + rootView = null; } } @Override public void onStop() { super.onStop(); - if(rootView!=null) { + if (rootView != null) { unbindDrawables(rootView); - rootView=null; + rootView = null; } } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java index ad4b197a..6e6bba4f 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java @@ -70,11 +70,11 @@ public void onCreate(Bundle savedInstanceState) { // add click listener for the save button doneButton.setOnClickListener(v -> { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(requireActivity()); - ProfileManager pmanager = null; + ProfileManager pmanager; pmanager = ProfileManager.getInstance(); - Profile profile = null; + Profile profile; profile = getProfile(); @@ -112,7 +112,7 @@ public void onCreate(Bundle savedInstanceState) { profile.mGhostActive = false; } - profile.mActiveProtocols = new HashMap(mProfileProtocols); + profile.mActiveProtocols = new HashMap<>(mProfileProtocols); // persist the changes of the profile if (createNew) { @@ -144,7 +144,7 @@ public void onCreate(Bundle savedInstanceState) { */ @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - Profile profile = null; + Profile profile; profile = getProfile(); mPrefs = PreferenceManager.getDefaultSharedPreferences(requireActivity()).edit(); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileManagerFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileManagerFragment.java index d341572d..9f70b0dc 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileManagerFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileManagerFragment.java @@ -67,15 +67,14 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, profileManager.loadData(); String sharedPreferencePath = MainActivity.getContext().getString(R.string.shared_preference_path); - /** - * Holds the shared preferences for the app - */ + +// Holds the shared preferences for the app SharedPreferences mSharedPreferences = MainActivity.getContext().getSharedPreferences(sharedPreferencePath, Hostage.MODE_PRIVATE); - /** - * Get list of profiles to be displayed in the recyclerview - */ - List strList = null; + +// Get list of profiles to be displayed in the recyclerview + + List strList; assert profileManager != null; strList = new LinkedList<>(profileManager.getProfilesList()); @@ -97,9 +96,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, recyclerView.setLayoutManager(new LinearLayoutManager(container.getContext())); recyclerView.setAdapter(profileRecyclerAdapter); - /** - * Implement Swipe-to-edit functionality (swipe left to launch a ProfileEditFragment) - */ +// Implement Swipe-to-edit functionality (swipe left to launch a ProfileEditFragment) SwipeToEditCallback swipeHandler = new SwipeToEditCallback(container.getContext()) { @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java index 4785bfb7..2a7df9ae 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java @@ -38,17 +38,15 @@ /** - * Displays detailed informations about an record. + * Displays detailed informations about a record. * * @author Fabio Arnold * @author Alexander Brakowski * @author Julien Clauter - */ - -/** + *

* Created by Shreyas Srinivasa on 01.10.15. */ -public class RecordDetailFragment extends UpNavigatibleFragment { +public class RecordDetailFragment extends UpNavigableFragment { /** * Hold the record of which the detail informations should be shown */ @@ -244,9 +242,7 @@ private void addConversationText(View row, String from, String to, RecordAll r) * @param conversationContent the conversion content view */ private void changeHexToText(Button button, RecordAll record, TextView conversationContent) { - button.setOnClickListener(view -> { - conversationContent.setText(record.convertPacketFromHex(record.getPacket())); - }); + button.setOnClickListener(view -> conversationContent.setText(record.convertPacketFromHex(record.getPacket()))); } /** @@ -257,9 +253,7 @@ private void changeHexToText(Button button, RecordAll record, TextView conversat * @param conversationContent the conversion content view */ private void changeTextToHex(Button button, RecordAll record, TextView conversationContent) { - button.setOnClickListener(view -> { - conversationContent.setText(record.convertPacketFromText(record.getPacket())); - }); + button.setOnClickListener(view -> conversationContent.setText(record.convertPacketFromText(record.getPacket()))); } private void deleteDialog() { @@ -359,7 +353,7 @@ private void getConversation() throws IOException { for (RecordAll r : conversation) { String mydata = r.getPacket(); - ArrayList myTokensList = new ArrayList(); + ArrayList myTokensList = new ArrayList<>(); String[] tokens = mydata.split("\n"); for (String tok : tokens) { if (tok.contains("Protocol:")) { @@ -367,11 +361,8 @@ private void getConversation() throws IOException { } } - ArrayList myPortList = new ArrayList(); + ArrayList myPortList = new ArrayList<>(); for (String tok : myTokensList) { - if (tok.contentEquals("PORTSCAN")) { - - } myPortList.add(protocol2Port(tok)); } System.out.print(myPortList); @@ -406,15 +397,13 @@ private String createSignature(String packet, String protocol) { int port = protocol2Port(protocol); String sigPort = String.valueOf(port); - String sigmatch = packet; - String modbusSignature = "signature-" + protocol + "-sig {\n" + + + return "signature-" + protocol + "-sig {\n" + " ip-proto == tcp\n" + " dst-port ==" + sigPort + "\n" + - " payload /" + sigmatch + "/" + "\n" + + " payload /" + packet + "/" + "\n" + " event \"" + protocol + " Attack!!\"\n" + "}"; - - return modbusSignature; } @@ -425,7 +414,7 @@ private String createMultistageSignature(String ip, ArrayList portList) { for (Object tok : portList) { - portArray.append(tok + "/tcp"); + portArray.append(tok).append("/tcp"); portListSize++; if (portListSize != portList.size()) { portArray.append(","); @@ -433,7 +422,7 @@ private String createMultistageSignature(String ip, ArrayList portList) { } - String MultiStageSignature = "@load base/frameworks/notice\n" + + return "@load base/frameworks/notice\n" + "\n" + "\n" + "\n" + @@ -489,8 +478,6 @@ private String createMultistageSignature(String ip, ArrayList portList) { "\n" + "\n" + "}\n"; - - return MultiStageSignature; } private void createPolicyFile(String signature, String protocol) throws IOException { @@ -517,7 +504,6 @@ private void createPolicyFile(String signature, String protocol) throws IOExcept } else { //TODO extract string Snackbar.make(mRootView, "Could not write to SD Card", Snackbar.LENGTH_SHORT).show(); - return; } } @@ -525,8 +511,8 @@ private void createPolicyFile(String signature, String protocol) throws IOExcept //write to file and store in SD Card private void createSignatureFile(String signature, String protocol) throws IOException { FileOutputStream sig; - Long tsLong = System.currentTimeMillis() / 1000; - String ts = tsLong.toString(); + long tsLong = System.currentTimeMillis() / 1000; + String ts = Long.toString(tsLong); String fileName = protocol + "Bro_Sig" + ts + ".sig"; // TODO adjust this, since storage setting has been removed String externalLocation = pref.getString("pref_external_location", ""); @@ -546,7 +532,6 @@ private void createSignatureFile(String signature, String protocol) throws IOExc } else { // TODO extract string Snackbar.make(mRootView, "Could not write to SD Card", Snackbar.LENGTH_SHORT).show(); - return; } } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java index abf2c97e..540984b5 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java @@ -38,8 +38,8 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; -import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -65,7 +65,7 @@ import dk.aau.netsec.hostage.ui.popup.SplitPopupItem; -public class RecordOverviewFragment extends UpNavigatibleFragment implements ChecklistDialog.ChecklistDialogListener, DateTimePickerDialog.DateTimeSelected { +public class RecordOverviewFragment extends UpNavigableFragment implements ChecklistDialog.ChecklistDialogListener, DateTimePickerDialog.DateTimeSelected { static final String FILTER_MENU_TITLE_BSSID = MainActivity.getContext().getString(R.string.BSSID); static final String FILTER_MENU_TITLE_ESSID = MainActivity.getContext().getString(R.string.ESSID); static final String FILTER_MENU_TITLE_IPS = MainActivity.getContext().getString(R.string.RecordIP); @@ -97,9 +97,9 @@ public class RecordOverviewFragment extends UpNavigatibleFragment implements Che private DaoSession dbSession; private DAOHelper daoHelper; - private int offset = 0; + private final int offset = 0; private int limit = 20; - private int attackRecordOffset = 0; + private final int attackRecordOffset = 0; private int attackRecordLimit = 999;//needs Different limit because the attackRecords are smaller than messageRecords. private final int realLimit = 20; private String sectionToOpen = ""; @@ -396,11 +396,7 @@ public void onFilterMenuItemSelected(AbstractPopupItem item) { if (item instanceof SplitPopupItem) { SplitPopupItem splitItem = (SplitPopupItem) item; - if (splitItem.wasRightTouch) { - DateTimePickerDialog.showDateTimePicker(getContext(), false, this); - } else { - DateTimePickerDialog.showDateTimePicker(getContext(), true, this); - } + DateTimePickerDialog.showDateTimePicker(getContext(), !splitItem.wasRightTouch, this); return; } @@ -699,7 +695,7 @@ private RecordListAdapter populateListViewFromDB(ExpandableListView mylist) { ArrayList groupTitle = new ArrayList<>(); HashMap> sectionData = this.fetchDataForFilter(this.filter, groupTitle); - RecordListAdapter adapter = null; + RecordListAdapter adapter; if (mylist.getAdapter() != null && mylist.getAdapter() instanceof RecordListAdapter) { adapter = (RecordListAdapter) mylist.getAdapter(); adapter.setData(sectionData); @@ -748,7 +744,7 @@ private void changeAttackLimitOffset(long recordsSize) { } private HashMap> fetchDataForFilter(LogFilter filter, ArrayList groupTitle) { - HashMap> sectionData = new HashMap>(); + HashMap> sectionData = new HashMap<>(); // Adding Items to ListView String[] keys = new String[]{RecordOverviewFragment.this.getString(R.string.RecordIP), RecordOverviewFragment.this.getString(R.string.RecordSSID), RecordOverviewFragment.this.getString(R.string.RecordProtocol), RecordOverviewFragment.this.getString(R.string.RecordTimestamp)}; int[] ids = new int[]{R.id.RecordTextFieldBSSID, R.id.RecordTextFieldIP, R.id.RecordTextFieldProtocol, R.id.RecordTextFieldTimestamp}; @@ -805,9 +801,9 @@ private HashMap> fetchDataForFilter(LogFil if (this.groupingKey.equals(this.groupingTitles().get(DEFAULT_GROUPING_KEY_INDEX))) { - Collections.sort(groupTitle, new DateStringComparator()); + groupTitle.sort(new DateStringComparator()); } else { - Collections.sort(groupTitle, String::compareToIgnoreCase); + groupTitle.sort(String::compareToIgnoreCase); } return sectionData; @@ -1066,7 +1062,6 @@ private String getDateAsDayString(long timestamp) { */ private Date convertStringToDate(String dateString) { if (dateString != null && dateString.length() != 0) { - SimpleDateFormat dateFormat = groupingDateFormatter; //new SimpleDateFormat(localDatePattern); Date date; try { if (dateString.equals(TODAY)) { @@ -1076,7 +1071,7 @@ private Date convertStringToDate(String dateString) { long millisec = RecordOverviewFragment.this.yesterdayMilliseconds(); date = new Date(millisec); } else { - date = dateFormat.parse(dateString); + date = groupingDateFormatter.parse(dateString); } return date; @@ -1320,7 +1315,7 @@ public List getGroupTitles() { if (adapter != null) { return adapter.getSectionHeaders(); } - return new ArrayList(); + return new ArrayList<>(); } } @@ -1354,7 +1349,7 @@ private void openFilterPopupMenuOnView(View v) { }); filterMenu.setTitle(FILTER_MENU_POPUP_TITLE); for (String title : RecordOverviewFragment.this.filterMenuTitles()) { - AbstractPopupItem item = null; + AbstractPopupItem item; if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) continue; if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { item = new SplitPopupItem(this.getActivity()); @@ -1420,7 +1415,7 @@ private void clearFilter() { * @return ArrayList tiles */ public ArrayList groupingTitles() { - ArrayList titles = new ArrayList(); + ArrayList titles = new ArrayList<>(); titles.add(MainActivity.getContext().getString(R.string.date)); titles.add(MainActivity.getContext().getString(R.string.rec_protocol)); titles.add(MainActivity.getContext().getString(R.string.IP)); @@ -1452,10 +1447,8 @@ public boolean[] selectedGroup() { */ public ArrayList protocolTitles() { ArrayList titles = new ArrayList<>(); - for (String protocol : this.getResources().getStringArray( - R.array.protocols)) { - titles.add(protocol); - } + titles.addAll(Arrays.asList(this.getResources().getStringArray( + R.array.protocols))); titles.add("PORTSCAN"); titles.add("FILE INJECTION"); @@ -1674,9 +1667,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { * Paints the filter button if the current filter object is set. */ private void actualiseFilterButton() { - if (optionsMenu == null) { - return; - } else { + if (optionsMenu != null) { MenuItem filterItem = optionsMenu.findItem(R.id.records_action_filter); if (filterItem == null) { return; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java index 68936ed6..cb52f2a3 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java @@ -51,8 +51,8 @@ public class ServicesFragment extends TrackerFragment { private ServicesListAdapter adapter; private ArrayList protocolList; - private DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); - private DAOHelper daoHelper = new DAOHelper(dbSession, getActivity()); + private final DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); + private final DAOHelper daoHelper = new DAOHelper(dbSession, getActivity()); private String[] protocols; private SharedPreferences mConnectionInfo; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java index ab318623..35cddb8f 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java @@ -1,7 +1,6 @@ package dk.aau.netsec.hostage.ui.fragment; import android.app.AlertDialog; -import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; @@ -25,7 +24,7 @@ * @created 24.02.14 23:37 * @modified Shreyas Srinivasa, Filip Adamik */ -public class SettingsFragment extends UpNavigatibleFragment { +public class SettingsFragment extends UpNavigableFragment { private View v; private Bundle savedInstanceState; private PcapLoggingManager mPcapLoggingManager; @@ -159,9 +158,7 @@ private void initialiseLoggingSwitch() { */ private void initialiseLocationSelector() { LinearLayout locationSelector = v.findViewById(R.id.pcap_location_preference); - locationSelector.setOnClickListener((View v) -> { - mPcapLoggingManager.selectLocation(this); - }); + locationSelector.setOnClickListener((View v) -> mPcapLoggingManager.selectLocation(this)); setLocationSummaryText(); } @@ -172,9 +169,7 @@ private void initialiseLocationSelector() { */ private void initialiseRotationPeriodSelector() { LinearLayout logRotationSelector = v.findViewById(R.id.pcap_log_rotation_preference); - logRotationSelector.setOnClickListener((View v) -> { - showLogRotationSelectionDialog(); - }); + logRotationSelector.setOnClickListener((View v) -> showLogRotationSelectionDialog()); setLogRotationPeriod(); } @@ -197,13 +192,10 @@ private void showLogRotationSelectionDialog() { // Create and display the dialog AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); builder.setTitle(R.string.pcap_log_rotation_dialog); - builder.setItems(durationItems, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - mPcapLoggingManager.logRotationPeriodSelected(durations[which]); + builder.setItems(durationItems, (dialog, which) -> { + mPcapLoggingManager.logRotationPeriodSelected(durations[which]); - setLogRotationPeriod(); - } + setLogRotationPeriod(); }); builder.show(); } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java index 6df17c68..3853cea1 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java @@ -37,6 +37,7 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; @@ -105,7 +106,7 @@ public class StatisticsFragment extends TrackerFragment implements ChecklistDial static final String OTHER_CHART_TITLE = MainActivity.getContext().getString(R.string.stats_other); // MINIMAL 2 - static int MAX_NUMBER_OF_CHART_OBJECTS = 6; + static final int MAX_NUMBER_OF_CHART_OBJECTS = 6; private boolean wasBelowTimePicker; private LogFilter filter; @@ -148,7 +149,7 @@ public enum ChartType { BAR_CHART(1), LINE_CHART(2); - private int value; + private final int value; ChartType(int value) { this.value = value; @@ -171,19 +172,10 @@ public String toString() { } - /** - * Returns the FilterButton. - * - * @return ImageButton filterButton - */ -// private ImageButton getFilterButton() { -// return (ImageButton) this.rootView.findViewById(R.id.FilterButton); -// } - /** * Returns the layout ID * - * @Return int layoutID + * @return int layoutID */ public int getLayoutID() { return R.layout.fragment_statistics; @@ -241,7 +233,7 @@ public boolean onOptionsItemSelected(@NonNull MenuItem item) { openBarSelectionMenuOnView(rootView); return true; - } else if (item.getItemId() == R.id.statistics_action_filter){ + } else if (item.getItemId() == R.id.statistics_action_filter) { openFilterMenuOnView(rootView); return true; @@ -617,7 +609,6 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { String fragTitle = "" + getCurrentSelectedProtocol() + ": " + selectedCompareData; setTitle(fragTitle); - return; } } @@ -692,9 +683,7 @@ private boolean[] selectedData(ArrayList data) { * Paints the filter button if the current filter object is set. */ private void actualiseFilterButton() { - if (optionsMenu == null) { - return; - } else { + if (optionsMenu != null) { MenuItem filterItem = optionsMenu.findItem(R.id.statistics_action_filter); @@ -717,21 +706,6 @@ private void actualiseFilterButton() { onPrepareOptionsMenu(optionsMenu); } } - - -// if ((this.filter.isSet() && (!(this.currentPlotView instanceof BarGraph)) || (this.filter.hasATimestamp() || this.filter.hasBSSIDs() || this.filter.hasESSIDs()))) { -// ImageButton filterButton = this.getFilterButton(); -// if (filterButton != null) { -// filterButton.setImageResource(R.drawable.ic_filter_pressed); -// filterButton.invalidate(); -// } -// } else { -// ImageButton filterButton = this.getFilterButton(); -// if (filterButton != null) { -// filterButton.setImageResource(R.drawable.ic_filter); -// filterButton.invalidate(); -// } -// } } /** @@ -749,7 +723,7 @@ private void openFilterMenuOnView(View anchor) { filterMenu.setTitle(FILTER_MENU_POPUP_TITLE); for (String title : StatisticsFragment.this.filterMenuTitles()) { - AbstractPopupItem item = null; + AbstractPopupItem item; if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) continue; if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { item = new SplitPopupItem(getActivity()); @@ -781,11 +755,7 @@ private void onFilterMenuItemSelected(AbstractPopupItem item) { if (item instanceof SplitPopupItem) { SplitPopupItem sItem = (SplitPopupItem) item; wasBelowTimePicker = sItem.wasRightTouch; - if (wasBelowTimePicker) { - DateTimePickerDialog.showDateTimePicker(getContext(), false, this); - } else { - DateTimePickerDialog.showDateTimePicker(getContext(), true, this); - } + DateTimePickerDialog.showDateTimePicker(getContext(), !wasBelowTimePicker, this); return; } String title = item.getTitle(); @@ -1153,9 +1123,9 @@ public void setBarGraphData(BarGraph bargraph) { for (PlotComparisonItem item : currentData) { Bar d = new Bar(); d.setColor(item.getColor()); - Long value2 = item.getValue2().longValue(); + long value2 = item.getValue2().longValue(); d.setName(""); - d.setValue(value2.floatValue()); + d.setValue((float) value2); bars.add(d); } @@ -1343,7 +1313,7 @@ public ArrayList getBarData() { return attacksPerBSSID(protocol); } // Nothing available - return new ArrayList(); + return new ArrayList<>(); } /** @@ -1368,7 +1338,7 @@ public ArrayList getLineData() { * @return ArrayList */ public synchronized ArrayList attacksPerProtocols() { - ArrayList plotItems = new ArrayList(); + ArrayList plotItems = new ArrayList<>(); int index = 0; for (String title : getSelectedProtocolTitles()) { int attacksCount = daoHelper.getAttackRecordDAO().getAttackPerProtocolCount(title); @@ -1377,7 +1347,7 @@ public synchronized ArrayList attacksPerProtocols() { plotItems.add(item); index++; } - Collections.sort(plotItems, (s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); + plotItems.sort((s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); return resizeData(plotItems); } @@ -1400,7 +1370,7 @@ public ArrayList attacksPerTime() { ArrayList records = getFetchedRecords(); for (RecordAll record : records) { long timestamp = record.getTimestamp(); - long time = 0; + long time; if (shouldUseDate) { time = getDateFromMilliseconds(timestamp); } else { @@ -1444,7 +1414,7 @@ public ArrayList attacksPerTime() { numbOfAttacks += list.size(); } - Collections.sort(singleLineItems, (s1, s2) -> s1.getValue1().compareTo(s2.getValue1())); + singleLineItems.sort(Comparator.comparing(PlotComparisonItem::getValue1)); double itemValue = (((double) numbOfAttacks / (double) records.size()) * 100.); PlotComparisonItem item = new PlotComparisonItem(groupKey, getColor(index), (double) numbOfAttacks, itemValue); @@ -1452,7 +1422,7 @@ public ArrayList attacksPerTime() { plotItems.add(item); index++; } - Collections.sort(plotItems, (s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); + plotItems.sort((s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); return plotItems; } @@ -1477,12 +1447,7 @@ public ArrayList attacksPerBSSID(String protocol) { ArrayList plotItems = daoHelper.getNetworkRecordDAO().attacksPerBSSID(filter); - Collections.sort(plotItems, new Comparator() { - @Override - public int compare(PlotComparisonItem s1, PlotComparisonItem s2) { - return s2.getValue2().compareTo(s1.getValue2()); - } - }); + plotItems.sort((s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); return resizeData(plotItems); } @@ -1496,13 +1461,13 @@ public ArrayList attacksPerESSID(String protocol) { filter.setAboveTimestamp(this.filter.getAboveTimestamp()); filter.setBelowTimestamp(this.filter.getBelowTimestamp()); filter.setESSIDs(this.filter.getESSIDs()); - ArrayList protocollist = new ArrayList(); + ArrayList protocollist = new ArrayList<>(); protocollist.add(protocol); filter.setProtocols(protocollist); ArrayList plotItems = this.daoHelper.getNetworkRecordDAO().attacksPerESSID(filter); //new ArrayList(); - Collections.sort(plotItems, (s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); + plotItems.sort((s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); return resizeData(plotItems); } @@ -1537,7 +1502,7 @@ private ArrayList resizeData(ArrayList p otherItem.setChildItems(others); copy.add(otherItem); - Collections.sort(copy, (s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); + copy.sort((s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); return copy; } @@ -1570,10 +1535,8 @@ private String getCurrentSelectedProtocol() { */ public ArrayList protocolTitles() { ArrayList titles = new ArrayList<>(); - for (String protocol : getResources().getStringArray( - R.array.protocols)) { - titles.add(protocol); - } + titles.addAll(Arrays.asList(getResources().getStringArray( + R.array.protocols))); titles.add("PORTSCAN"); @@ -1707,10 +1670,9 @@ public long getDayHourFromDate(long timeInMillis) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(timeInMillis); - int hour = calendar.get(Calendar.HOUR_OF_DAY); //int min = calendar.get(Calendar.MINUTE); - return hour; + return calendar.get(Calendar.HOUR_OF_DAY); } @@ -1761,9 +1723,6 @@ private String getDateAsString(long timeStamp) { return sdf.format(netDate); } - /** - * USERINTERACTION - */ /** * Will be called if the users taps on a list row. * diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java index 8afc1bc6..090b2547 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java @@ -68,7 +68,7 @@ public class ThreatMapFragment extends TrackerFragment implements GoogleMap.OnIn private MapView mapView = null; private View rootView = null; private Thread mLoader = null; - private HashMap sMarkerIDToSSID = new HashMap<>(); + private final HashMap sMarkerIDToSSID = new HashMap<>(); private String mLocationProvider; private LayoutInflater inflater; @@ -423,7 +423,6 @@ private void animateMapToUserLocation() { // Location is probably not ready yet, do nothing. } else { - return; } } catch (LocationException le) { le.printStackTrace(); @@ -464,7 +463,7 @@ private void unbindDrawables(View view) { * helper class * easier to use than LatLng */ - private class Point { + private static class Point { public double x, y; @@ -481,7 +480,8 @@ public Point(double sx, double sy) { */ private class SSIDArea { - private Point mMinimum, mMaximum; + private final Point mMinimum; + private final Point mMaximum; public int numPoints; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigatibleFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigableFragment.java similarity index 91% rename from src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigatibleFragment.java rename to src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigableFragment.java index bbd68550..e9fa353f 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigatibleFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/UpNavigableFragment.java @@ -7,7 +7,7 @@ * @author Alexander Brakowski * @created 12.03.14 16:20 */ -public abstract class UpNavigatibleFragment extends Fragment { +public abstract class UpNavigableFragment extends Fragment { private Class mUpFragment; private boolean mIsUpNavigable = false; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java index e068dcc2..f7aec697 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java @@ -16,365 +16,368 @@ /** * @author Fabio Arnold - * + *

* Animated Mesh * This class reads a mesh in the AMSH binary format and creates the necessary OpenGL objects for drawing */ public class AnimatedMesh { - private ByteBuffer data; - - private int vertexOffset; - private int vertexSize; - private int triangleOffset; - private int triangleCount; - - private int vertexBuffer; // vbo - private int indexBuffer; - - private ArrayList bones; - private float[] matrices; // matrix palette for skinning - - private ArrayList actions; - private Action currentAction; - private int currentFrame; - private boolean loopAction = false; - private boolean reverseAction = false; - - /** - * start play an animation (action) - * @param actionName name in the AMSH file - * @param loop loop the animation - * @param reverse play the animation backwards - */ - public void startAction(String actionName, boolean loop, boolean reverse) { - if (!(currentAction != null && currentAction.name.equals(actionName) && reverse)) // keep the current frame - currentFrame = 0; - loopAction = loop; - reverseAction = reverse; - currentAction = null; - // find the action - for (Action action : actions) { - if (action.name.equals(actionName)) { - currentAction = action; - break; - } - } - if (currentAction != null && reverseAction) - if (!(currentAction != null && currentAction.name.equals(actionName) && reverse)) // keep the current frame - currentFrame = currentAction.numFrames - 1; - } - - /** - * @return true if completed OR hasn't started yet. - */ - public boolean isActionDone() { - if (currentAction == null) - return true; - return currentFrame <= 1 || currentFrame >= currentAction.numFrames - 1; + private ByteBuffer data; + + private int vertexOffset; + private int vertexSize; + private int triangleOffset; + private int triangleCount; + + private int vertexBuffer; // vbo + private int indexBuffer; + + private ArrayList bones; + private float[] matrices; // matrix palette for skinning + + private ArrayList actions; + private Action currentAction; + private int currentFrame; + private boolean loopAction = false; + private boolean reverseAction = false; + + /** + * start play an animation (action) + * + * @param actionName name in the AMSH file + * @param loop loop the animation + * @param reverse play the animation backwards + */ + public void startAction(String actionName, boolean loop, boolean reverse) { + if (!(currentAction != null && currentAction.name.equals(actionName) && reverse)) // keep the current frame + currentFrame = 0; + loopAction = loop; + reverseAction = reverse; + currentAction = null; + // find the action + for (Action action : actions) { + if (action.name.equals(actionName)) { + currentAction = action; + break; + } + } + if (currentAction != null && reverseAction) + if (!(currentAction.name.equals(actionName))) // keep the current frame + currentFrame = currentAction.numFrames - 1; + } + + /** + * @return true if completed OR hasn't started yet. + */ + public boolean isActionDone() { + if (currentAction == null) + return true; + return currentFrame <= 1 || currentFrame >= currentAction.numFrames - 1; /* if (reverseAction) return currentFrame <= 0; else return currentFrame >= currentAction.numFrames - 1; */ - } - - // private classes. don't use these. - - private class Bone { - @SuppressWarnings("unused") - public String name; // 15 bytes - public int parentIndex; // 1 byte - public float[] invBindPose; // 64 bytes - - Bone(ByteBuffer data) { - name = ""; - boolean stop = false; - for (int i = 0; i < 15; i++) { - char c; - if ((c = (char)data.get()) == '\0') stop = true; - if (!stop) name += c; - } - // Log.i("bone", name); - parentIndex = data.get(); - invBindPose = new float[16]; - data.asFloatBuffer().get(invBindPose); - data.position(data.position() + 64); - } - } - - private class Action { - public String name; // 16 bytes - public int numFrames; - public ArrayList tracks; - - public static final int kHeaderSize = 28; - - Action(ByteBuffer data) { - name = ""; - boolean stop = false; - for (int i = 0; i < 16; i++) { - char c; - if ((c = (char)data.get()) == '\0') stop = true; - if (!stop) name += c; - } - Log.i("action", name); - numFrames = data.getInt(); - int trackOffset = data.getInt(); - int trackCount = data.getInt(); - tracks = new ArrayList(); - for (int i = 0; i < trackCount; i++) { - data.position(trackOffset + i * Track.kHeaderSize); - tracks.add(new Track(data)); - } - } - } - - private class Track { - @SuppressWarnings("unused") - public int boneIndex; - public ArrayList poses; - - public static final int kHeaderSize = 12; - - Track(ByteBuffer data) { - boneIndex = data.getInt(); - int jointPoseOffset = data.getInt(); - int jointPoseCount = data.getInt(); - poses = new ArrayList(); - data.position(jointPoseOffset); - for (int i = 0; i < jointPoseCount; i++) { - //data.position(jointPoseOffset + i * JointPose::kSize); // joint pose size == 32 - poses.add(new JointPose(data)); - } - } - } - - private class JointPose { - public Quaternion rotation; - public float[] translation; - @SuppressWarnings("unused") - float scale; - - public static final int kSize = 32; - - JointPose() { // empty pose == identity - rotation = new Quaternion(); - translation = new float[3]; - translation[0] = translation[1] = translation[2] = 0.0f; - scale = 1.0f; - } - - JointPose(ByteBuffer data) { - FloatBuffer floatData = data.asFloatBuffer(); - data.position(data.position() + kSize); - - // quat data is x y z w, because of glm - float x = floatData.get(); - float y = floatData.get(); - float z = floatData.get(); - float w = floatData.get(); - rotation = new Quaternion(w, x, y, z); - translation = new float[3]; - floatData.get(translation); - scale = floatData.get(); - } - - float[] toMatrix() { // TODO: scale - float[] matrix = new float[16]; - Matrix.setIdentityM(matrix, 0); - - Quaternion q = rotation; - matrix[0 * 4 + 0] = 1.0f - 2.0f * q.y * q.y - 2.0f * q.z * q.z; - matrix[0 * 4 + 1] = 2.0f * q.x * q.y + 2.0f * q.w * q.z; - matrix[0 * 4 + 2] = 2.0f * q.x * q.z - 2.0f * q.w * q.y; - - matrix[1 * 4 + 0] = 2.0f * q.x * q.y - 2.0f * q.w * q.z; - matrix[1 * 4 + 1] = 1.0f - 2.0f * q.x * q.x - 2.0f * q.z * q.z; - matrix[1 * 4 + 2] = 2.0f * q.y * q.z + 2.0f * q.w * q.x; - - matrix[2 * 4 + 0] = 2.0f * q.x * q.z + 2 * q.w * q.y; - matrix[2 * 4 + 1] = 2.0f * q.y * q.z - 2 * q.w * q.x; - matrix[2 * 4 + 2] = 1.0f - 2.0f * q.x * q.x - 2.0f * q.y * q.y; - - matrix[3 * 4 + 0] = translation[0]; - matrix[3 * 4 + 1] = translation[1]; - matrix[3 * 4 + 2] = translation[2]; - - return matrix; - } - } - - /** - * create an animmesh from an inputstream - * @param is the inputstream - */ - public AnimatedMesh(InputStream is) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try { - final int EOF = -1; - int len; - byte[] buffer = new byte[1 << 12]; - while (EOF != (len = is.read(buffer))) - out.write(buffer, 0, len); - } catch (IOException e) { - e.printStackTrace(); - return; - } - - //data = ByteBuffer.wrap(out.toByteArray()); // doesn't work data needs to be direct - data = ByteBuffer.allocateDirect(out.size()); - data.order(ByteOrder.nativeOrder()); - data.put(out.toByteArray()); - data.position(0); - - // header - int magicNum = data.getInt(); - int version = data.getInt(); - //assert(magicNum == ('A' << 24 | 'M' << 16 | 'S' << 8 | 'H') && version == 1); - - vertexSize = 48; - vertexOffset = data.getInt(); - int vertexCount = data.getInt(); - triangleOffset = data.getInt(); - triangleCount = data.getInt(); - int boneOffset = data.getInt(); - int boneCount = data.getInt(); - int actionOffset = data.getInt(); - int actionCount = data.getInt(); - - // vertices and indices data - IntBuffer buffers = IntBuffer.allocate(2); - GLES20.glGenBuffers(2, buffers); // buffer names - vertexBuffer = buffers.get(); - indexBuffer = buffers.get(); - - data.position(vertexOffset); - GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer); - GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexSize * vertexCount, data.asFloatBuffer(), GLES20.GL_STATIC_DRAW); - GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); - - // convert int indices to short - // TODO: more efficient way? - data.position(triangleOffset); - ShortBuffer indexBufferData = ShortBuffer.allocate(3 * triangleCount); - for (int i = 0; i < 3 * triangleCount; i++) - indexBufferData.put((short)data.getInt()); - indexBufferData.position(0); - - GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer); - GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 6 * triangleCount, indexBufferData, GLES20.GL_STATIC_DRAW); - GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); - - // bones - bones = new ArrayList(); - data.position(boneOffset); - for (int i = 0; i < boneCount; i++) - bones.add(new Bone(data)); - - matrices = new float[16 * boneCount]; - - // actions - actions = new ArrayList(); - for (int i = 0; i < actionCount; i++) { - data.position(actionOffset + i * Action.kHeaderSize); // action header size == 28 - actions.add(new Action(data)); - } - - currentAction = null; - currentFrame = 0; - loopAction = false; - } - - public static float[] addVec3(final float[] v1, final float[] v2) { - float[] v3 = new float[3]; - v3[0] = v1[0] + v2[0]; - v3[1] = v1[1] + v2[1]; - v3[2] = v1[2] + v2[2]; - return v3; - } - - /** - * update the bone transforms of the mesh and advance one frame - */ - public void tick() { - // empty pose - ArrayList pose = new ArrayList(); - for (int i = 0; i < bones.size(); i++) - pose.add(new JointPose()); - - if (currentAction != null) { - // fill pose with action - for (int i = 0; i < currentAction.tracks.size(); i++) { - // TODO: do lerp or something nice - pose.get(i).rotation = currentAction.tracks.get(i).poses.get(currentFrame).rotation; - pose.get(i).translation = currentAction.tracks.get(i).poses.get(currentFrame).translation; - } - - // advance one frame - if (reverseAction) { - if (currentFrame > 0) { - currentFrame--; - } else if (loopAction) { - currentFrame = currentAction.numFrames - 1; - } - } else { - if (currentFrame < currentAction.numFrames - 1) { - currentFrame++; - } else if (loopAction) { - currentFrame = 0; - } - } - } - - // convert pose to skinning matrices - for (int i = 0; i < bones.size(); i++) { - int parentIndex = bones.get(i).parentIndex; - if (parentIndex != -1) { // bone has parent - JointPose parentPose = pose.get(parentIndex); - pose.get(i).rotation = parentPose.rotation.multiply(pose.get(i).rotation); - pose.get(i).translation = addVec3(parentPose.translation, parentPose.rotation.multiply(pose.get(i).translation)); - } - Matrix.multiplyMM(matrices, i * 16, pose.get(i).toMatrix(), 0, bones.get(i).invBindPose, 0); - } - } - - /** - * draws the mesh - * @param program the currently bound shader program - */ - public void draw(int program) { - GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(program, "boneMatrices"), bones.size(), false, matrices, 0); - - // TODO: cache attrib locations - int positionIndex = GLES20.glGetAttribLocation(program, "position"); - int normalIndex = GLES20.glGetAttribLocation(program, "normal"); - int texCoordIndex = GLES20.glGetAttribLocation(program, "texCoord"); - int boneIndicesIndex = GLES20.glGetAttribLocation(program, "boneIndices"); - int boneWeightsIndex = GLES20.glGetAttribLocation(program, "boneWeights"); - - GLES20.glEnableVertexAttribArray(positionIndex); - GLES20.glEnableVertexAttribArray(normalIndex); - GLES20.glEnableVertexAttribArray(texCoordIndex); - GLES20.glEnableVertexAttribArray(boneIndicesIndex); - GLES20.glEnableVertexAttribArray(boneWeightsIndex); - - GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer); - GLES20.glVertexAttribPointer(positionIndex, 3, GLES20.GL_FLOAT, false, vertexSize, 0); - GLES20.glVertexAttribPointer(normalIndex, 3, GLES20.GL_FLOAT, false, vertexSize, 12); - GLES20.glVertexAttribPointer(texCoordIndex, 2, GLES20.GL_FLOAT, false, vertexSize, 24); - GLES20.glVertexAttribPointer(boneIndicesIndex, 4, GLES20.GL_UNSIGNED_BYTE, false, vertexSize, 32); - GLES20.glVertexAttribPointer(boneWeightsIndex, 3, GLES20.GL_FLOAT, false, vertexSize, 36); - GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer); - GLES20.glDrawElements(GLES20.GL_TRIANGLES, 3 * triangleCount, GLES20.GL_UNSIGNED_SHORT, 0); - GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0); - GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); - - GLES20.glDisableVertexAttribArray(positionIndex); - GLES20.glDisableVertexAttribArray(normalIndex); - GLES20.glDisableVertexAttribArray(texCoordIndex); - GLES20.glDisableVertexAttribArray(boneIndicesIndex); - GLES20.glDisableVertexAttribArray(boneWeightsIndex); - } + } + + // private classes. don't use these. + + private static class Bone { + @SuppressWarnings("unused") + public String name; // 15 bytes + public final int parentIndex; // 1 byte + public final float[] invBindPose; // 64 bytes + + Bone(ByteBuffer data) { + name = ""; + boolean stop = false; + for (int i = 0; i < 15; i++) { + char c; + if ((c = (char) data.get()) == '\0') stop = true; + if (!stop) name += c; + } + // Log.i("bone", name); + parentIndex = data.get(); + invBindPose = new float[16]; + data.asFloatBuffer().get(invBindPose); + data.position(data.position() + 64); + } + } + + private class Action { + public String name; // 16 bytes + public final int numFrames; + public final ArrayList tracks; + + public static final int kHeaderSize = 28; + + Action(ByteBuffer data) { + name = ""; + boolean stop = false; + for (int i = 0; i < 16; i++) { + char c; + if ((c = (char) data.get()) == '\0') stop = true; + if (!stop) name += c; + } + Log.i("action", name); + numFrames = data.getInt(); + int trackOffset = data.getInt(); + int trackCount = data.getInt(); + tracks = new ArrayList<>(); + for (int i = 0; i < trackCount; i++) { + data.position(trackOffset + i * Track.kHeaderSize); + tracks.add(new Track(data)); + } + } + } + + private class Track { + @SuppressWarnings("unused") + public int boneIndex; + public final ArrayList poses; + + public static final int kHeaderSize = 12; + + Track(ByteBuffer data) { + boneIndex = data.getInt(); + int jointPoseOffset = data.getInt(); + int jointPoseCount = data.getInt(); + poses = new ArrayList<>(); + data.position(jointPoseOffset); + for (int i = 0; i < jointPoseCount; i++) { + //data.position(jointPoseOffset + i * JointPose::kSize); // joint pose size == 32 + poses.add(new JointPose(data)); + } + } + } + + private static class JointPose { + public Quaternion rotation; + public float[] translation; + @SuppressWarnings("unused") + float scale; + + public static final int kSize = 32; + + JointPose() { // empty pose == identity + rotation = new Quaternion(); + translation = new float[3]; + translation[0] = translation[1] = translation[2] = 0.0f; + scale = 1.0f; + } + + JointPose(ByteBuffer data) { + FloatBuffer floatData = data.asFloatBuffer(); + data.position(data.position() + kSize); + + // quat data is x y z w, because of glm + float x = floatData.get(); + float y = floatData.get(); + float z = floatData.get(); + float w = floatData.get(); + rotation = new Quaternion(w, x, y, z); + translation = new float[3]; + floatData.get(translation); + scale = floatData.get(); + } + + float[] toMatrix() { // TODO: scale + float[] matrix = new float[16]; + Matrix.setIdentityM(matrix, 0); + + Quaternion q = rotation; + matrix[0 * 4 + 0] = 1.0f - 2.0f * q.y * q.y - 2.0f * q.z * q.z; + matrix[0 * 4 + 1] = 2.0f * q.x * q.y + 2.0f * q.w * q.z; + matrix[0 * 4 + 2] = 2.0f * q.x * q.z - 2.0f * q.w * q.y; + + matrix[1 * 4 + 0] = 2.0f * q.x * q.y - 2.0f * q.w * q.z; + matrix[1 * 4 + 1] = 1.0f - 2.0f * q.x * q.x - 2.0f * q.z * q.z; + matrix[1 * 4 + 2] = 2.0f * q.y * q.z + 2.0f * q.w * q.x; + + matrix[2 * 4 + 0] = 2.0f * q.x * q.z + 2 * q.w * q.y; + matrix[2 * 4 + 1] = 2.0f * q.y * q.z - 2 * q.w * q.x; + matrix[2 * 4 + 2] = 1.0f - 2.0f * q.x * q.x - 2.0f * q.y * q.y; + + matrix[3 * 4 + 0] = translation[0]; + matrix[3 * 4 + 1] = translation[1]; + matrix[3 * 4 + 2] = translation[2]; + + return matrix; + } + } + + /** + * create an animmesh from an inputstream + * + * @param is the inputstream + */ + public AnimatedMesh(InputStream is) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + final int EOF = -1; + int len; + byte[] buffer = new byte[1 << 12]; + while (EOF != (len = is.read(buffer))) + out.write(buffer, 0, len); + } catch (IOException e) { + e.printStackTrace(); + return; + } + + //data = ByteBuffer.wrap(out.toByteArray()); // doesn't work data needs to be direct + data = ByteBuffer.allocateDirect(out.size()); + data.order(ByteOrder.nativeOrder()); + data.put(out.toByteArray()); + data.position(0); + + // header + int magicNum = data.getInt(); + int version = data.getInt(); + //assert(magicNum == ('A' << 24 | 'M' << 16 | 'S' << 8 | 'H') && version == 1); + + vertexSize = 48; + vertexOffset = data.getInt(); + int vertexCount = data.getInt(); + triangleOffset = data.getInt(); + triangleCount = data.getInt(); + int boneOffset = data.getInt(); + int boneCount = data.getInt(); + int actionOffset = data.getInt(); + int actionCount = data.getInt(); + + // vertices and indices data + IntBuffer buffers = IntBuffer.allocate(2); + GLES20.glGenBuffers(2, buffers); // buffer names + vertexBuffer = buffers.get(); + indexBuffer = buffers.get(); + + data.position(vertexOffset); + GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer); + GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexSize * vertexCount, data.asFloatBuffer(), GLES20.GL_STATIC_DRAW); + GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); + + // convert int indices to short + // TODO: more efficient way? + data.position(triangleOffset); + ShortBuffer indexBufferData = ShortBuffer.allocate(3 * triangleCount); + for (int i = 0; i < 3 * triangleCount; i++) + indexBufferData.put((short) data.getInt()); + indexBufferData.position(0); + + GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer); + GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, 6 * triangleCount, indexBufferData, GLES20.GL_STATIC_DRAW); + GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); + + // bones + bones = new ArrayList<>(); + data.position(boneOffset); + for (int i = 0; i < boneCount; i++) + bones.add(new Bone(data)); + + matrices = new float[16 * boneCount]; + + // actions + actions = new ArrayList<>(); + for (int i = 0; i < actionCount; i++) { + data.position(actionOffset + i * Action.kHeaderSize); // action header size == 28 + actions.add(new Action(data)); + } + + currentAction = null; + currentFrame = 0; + loopAction = false; + } + + public static float[] addVec3(final float[] v1, final float[] v2) { + float[] v3 = new float[3]; + v3[0] = v1[0] + v2[0]; + v3[1] = v1[1] + v2[1]; + v3[2] = v1[2] + v2[2]; + return v3; + } + + /** + * update the bone transforms of the mesh and advance one frame + */ + public void tick() { + // empty pose + ArrayList pose = new ArrayList<>(); + for (int i = 0; i < bones.size(); i++) + pose.add(new JointPose()); + + if (currentAction != null) { + // fill pose with action + for (int i = 0; i < currentAction.tracks.size(); i++) { + // TODO: do lerp or something nice + pose.get(i).rotation = currentAction.tracks.get(i).poses.get(currentFrame).rotation; + pose.get(i).translation = currentAction.tracks.get(i).poses.get(currentFrame).translation; + } + + // advance one frame + if (reverseAction) { + if (currentFrame > 0) { + currentFrame--; + } else if (loopAction) { + currentFrame = currentAction.numFrames - 1; + } + } else { + if (currentFrame < currentAction.numFrames - 1) { + currentFrame++; + } else if (loopAction) { + currentFrame = 0; + } + } + } + + // convert pose to skinning matrices + for (int i = 0; i < bones.size(); i++) { + int parentIndex = bones.get(i).parentIndex; + if (parentIndex != -1) { // bone has parent + JointPose parentPose = pose.get(parentIndex); + pose.get(i).rotation = parentPose.rotation.multiply(pose.get(i).rotation); + pose.get(i).translation = addVec3(parentPose.translation, parentPose.rotation.multiply(pose.get(i).translation)); + } + Matrix.multiplyMM(matrices, i * 16, pose.get(i).toMatrix(), 0, bones.get(i).invBindPose, 0); + } + } + + /** + * draws the mesh + * + * @param program the currently bound shader program + */ + public void draw(int program) { + GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(program, "boneMatrices"), bones.size(), false, matrices, 0); + + // TODO: cache attrib locations + int positionIndex = GLES20.glGetAttribLocation(program, "position"); + int normalIndex = GLES20.glGetAttribLocation(program, "normal"); + int texCoordIndex = GLES20.glGetAttribLocation(program, "texCoord"); + int boneIndicesIndex = GLES20.glGetAttribLocation(program, "boneIndices"); + int boneWeightsIndex = GLES20.glGetAttribLocation(program, "boneWeights"); + + GLES20.glEnableVertexAttribArray(positionIndex); + GLES20.glEnableVertexAttribArray(normalIndex); + GLES20.glEnableVertexAttribArray(texCoordIndex); + GLES20.glEnableVertexAttribArray(boneIndicesIndex); + GLES20.glEnableVertexAttribArray(boneWeightsIndex); + + GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer); + GLES20.glVertexAttribPointer(positionIndex, 3, GLES20.GL_FLOAT, false, vertexSize, 0); + GLES20.glVertexAttribPointer(normalIndex, 3, GLES20.GL_FLOAT, false, vertexSize, 12); + GLES20.glVertexAttribPointer(texCoordIndex, 2, GLES20.GL_FLOAT, false, vertexSize, 24); + GLES20.glVertexAttribPointer(boneIndicesIndex, 4, GLES20.GL_UNSIGNED_BYTE, false, vertexSize, 32); + GLES20.glVertexAttribPointer(boneWeightsIndex, 3, GLES20.GL_FLOAT, false, vertexSize, 36); + GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer); + GLES20.glDrawElements(GLES20.GL_TRIANGLES, 3 * triangleCount, GLES20.GL_UNSIGNED_SHORT, 0); + GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0); + GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); + + GLES20.glDisableVertexAttribArray(positionIndex); + GLES20.glDisableVertexAttribArray(normalIndex); + GLES20.glDisableVertexAttribArray(texCoordIndex); + GLES20.glDisableVertexAttribArray(boneIndicesIndex); + GLES20.glDisableVertexAttribArray(boneWeightsIndex); + } } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/GLFont.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/GLFont.java index 58a31a3f..6eae264d 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/GLFont.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/GLFont.java @@ -16,13 +16,13 @@ * Created by Fabio Arnold on 13.02.15. */ public class GLFont { - private class GlyphMetric { + private static class GlyphMetric { float x0,y0,s0,t0; // top-left float x1,y1,s1,t1; // bottom-right float advance; } - private int mTexture; + private final int mTexture; private int mVertexBuffer; private GlyphMetric[] mMetrics; @@ -31,7 +31,7 @@ public GLFont(String texFilePath, String metricsFilePath) { mTexture = ThreatIndicatorGLRenderer.loadTexture(texFilePath); - InputStream is = null; + InputStream is; try { is = assets.open(metricsFilePath); } catch (IOException e) { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/Quaternion.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/Quaternion.java index d545ff18..ab6c14a9 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/Quaternion.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/Quaternion.java @@ -4,7 +4,10 @@ * some basic quaternion class because android doesn't provide any */ public class Quaternion { - public float w, x, y, z; + public final float w; + public final float x; + public final float y; + public final float z; Quaternion() { // identity w = 1.0f; x = y = z = 0.0f; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/ThreatIndicatorGLRenderer.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/ThreatIndicatorGLRenderer.java index 81d0935a..3911cd30 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/ThreatIndicatorGLRenderer.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/ThreatIndicatorGLRenderer.java @@ -65,7 +65,7 @@ public static void setBackgroundColor(int color) { mBackgroundColor[2] = (float) Color.blue(color) / 255.0f; } - private static float[] mBackgroundColor = new float[3]; + private static final float[] mBackgroundColor = new float[3]; // OpenGL data private int mAnimatedProgram; @@ -94,7 +94,7 @@ public static void setBackgroundColor(int color) { private static boolean sPlayGreetingAnimation = true; // greet the first time - private long mStartTimeMillis; // for animation + private final long mStartTimeMillis; // for animation public ThreatIndicatorGLRenderer() { mStartTimeMillis = System.currentTimeMillis(); @@ -379,11 +379,10 @@ public void onDrawFrame(GL10 arg0) { float textHeight = 40.0f; float bubbleDiameter = 256.0f; float bubbleWidth = textWidth + 0.75f * bubbleDiameter; - float bubbleHeight = bubbleDiameter; float y = 0.8f * 1024.0f + 32.0f * (float) Math.sin(2.0 * animTime); float x = 0.5f * 1024.0f + 16.0f * (float) Math.cos(1.0 * animTime); - drawSpeechBubble(speechBubbleTexture, x - 0.5f * bubbleWidth, y - 0.5f * bubbleHeight, - bubbleWidth, bubbleHeight); + drawSpeechBubble(speechBubbleTexture, x - 0.5f * bubbleWidth, y - 0.5f * bubbleDiameter, + bubbleWidth, bubbleDiameter); GLES20.glUniform4f(colorUniformLoc, 0.0f, 0.0f, 0.0f, 1.0f); font.drawText(mTexturedProgram, message, x - 0.5f * textWidth, y - 0.5f * textHeight); @@ -406,14 +405,12 @@ public void onDrawFrame(GL10 arg0) { * Informs renderer of changed surface dimensions */ public void onSurfaceChanged(GL10 arg0, int w, int h) { - int width = w; - int height = h; float aspectRatio = (float) w / (float) h; //Matrix.orthoM(mProjection, 0, -aspectRatio, aspectRatio, -1.0f, 1.0f, -1.0f, 1.0f); float near = 0.1f; float fov = 2.0f; Matrix.frustumM(mProjection, 0, near * -aspectRatio, near * aspectRatio, -near, near, fov * near, 100.0f); - GLES20.glViewport(0, 0, width, height); + GLES20.glViewport(0, 0, w, h); } // some helper functions diff --git a/src/main/java/dk/aau/netsec/hostage/ui/helper/SwipeToEditCallback.java b/src/main/java/dk/aau/netsec/hostage/ui/helper/SwipeToEditCallback.java index 36bd3da6..567694a9 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/helper/SwipeToEditCallback.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/helper/SwipeToEditCallback.java @@ -2,7 +2,6 @@ import android.content.Context; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -52,11 +51,11 @@ public SwipeToEditCallback(Context context) { @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { //TODO once swipe hint is implemented, this should be enabled or removed - /** - * To disable "swipe" for specific item return 0 here. - * For example: - * if (viewHolder?.itemViewType == YourAdapter.SOME_TYPE) return 0 - * if (viewHolder?.adapterPosition == 0) return 0 + /* + To disable "swipe" for specific item return 0 here. + For example: + if (viewHolder?.itemViewType == YourAdapter.SOME_TYPE) return 0 + if (viewHolder?.adapterPosition == 0) return 0 */ // if (viewHolder?.adapterPosition == 10) return 0 diff --git a/src/main/java/dk/aau/netsec/hostage/ui/layouts/FlowLayout.java b/src/main/java/dk/aau/netsec/hostage/ui/layouts/FlowLayout.java index 639e2b0c..e5a19e8e 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/layouts/FlowLayout.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/layouts/FlowLayout.java @@ -291,7 +291,7 @@ private Paint createPaint(int color) { } public static class LayoutParams extends ViewGroup.LayoutParams { - private static int NO_SPACING = -1; + private static final int NO_SPACING = -1; private int x; private int y; private int horizontalSpacing = NO_SPACING; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/model/DrawerListItem.java b/src/main/java/dk/aau/netsec/hostage/ui/model/DrawerListItem.java index 74ccc268..e81b3f09 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/model/DrawerListItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/model/DrawerListItem.java @@ -11,12 +11,12 @@ public class DrawerListItem { /** * The icon of the item */ - public int icon; + public final int icon; /** * The text of the item */ - public int text; + public final int text; public DrawerListItem(int text, int icon){ this.text = text; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/model/LogFilter.java b/src/main/java/dk/aau/netsec/hostage/ui/model/LogFilter.java index 64a6c145..07729179 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/model/LogFilter.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/model/LogFilter.java @@ -66,10 +66,10 @@ public void clear() { this.belowTimestamp = Long.MAX_VALUE; this.aboveTimestamp = Long.MIN_VALUE; this.sorttype = SortType.packet_timestamp; - this.BSSIDs = new ArrayList(); - this.ESSIDs = new ArrayList(); - this.IPs = new ArrayList(); - this.protocols = new ArrayList(); + this.BSSIDs = new ArrayList<>(); + this.ESSIDs = new ArrayList<>(); + this.IPs = new ArrayList<>(); + this.protocols = new ArrayList<>(); } @Override @@ -80,7 +80,7 @@ public int describeContents() { // write filter's data to the passed-in Parcel @Override public void writeToParcel(Parcel out, int flags) { - HashMap> values = new HashMap>(); + HashMap> values = new HashMap<>(); if (this.BSSIDs != null && this.BSSIDs.size() > 0) { values.put(BSSID_KEY, this.getBSSIDs()); } @@ -119,7 +119,7 @@ public LogFilter[] newArray(int size) { * @param in {@link Parcel parcel} * */ private LogFilter(Parcel in) { - HashMap> values = new HashMap>(); + HashMap> values = new HashMap<>(); in.readMap(values, ArrayList.class.getClassLoader()); this.BSSIDs = values.get(BSSID_KEY); @@ -128,13 +128,13 @@ private LogFilter(Parcel in) { this.protocols = values.get(protocols); if (this.BSSIDs == null) - this.BSSIDs = new ArrayList(); + this.BSSIDs = new ArrayList<>(); if(this.IPs == null) this.IPs = new ArrayList<>(); if (this.ESSIDs == null) - this.ESSIDs = new ArrayList(); + this.ESSIDs = new ArrayList<>(); if (this.protocols == null) - this.protocols = new ArrayList(); + this.protocols = new ArrayList<>(); this.sorttype = SortType.values()[Math.min(in.readInt(), SortType.values().length)]; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/model/PlotComparisonItem.java b/src/main/java/dk/aau/netsec/hostage/ui/model/PlotComparisonItem.java index f06e88a0..677cb52b 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/model/PlotComparisonItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/model/PlotComparisonItem.java @@ -7,12 +7,12 @@ */ public class PlotComparisonItem{ - private Double value1; - private Double value2; + private final Double value1; + private final Double value2; - private String title; + private final String title; - private Integer color = 0; + private Integer color; private ArrayList childItems; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/model/ProfileListItem.java b/src/main/java/dk/aau/netsec/hostage/ui/model/ProfileListItem.java index 3d5f394d..857c16d6 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/model/ProfileListItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/model/ProfileListItem.java @@ -11,11 +11,11 @@ * @created 14.01.14 18:04 */ public class ProfileListItem { - public String label; - public String text; + public final String label; + public final String text; - public boolean activated; - public Bitmap icon; + public final boolean activated; + public final Bitmap icon; public boolean isBackVisible = false; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/model/ServicesListItem.java b/src/main/java/dk/aau/netsec/hostage/ui/model/ServicesListItem.java index 1a915575..cd71d949 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/model/ServicesListItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/model/ServicesListItem.java @@ -7,11 +7,11 @@ * defines a service list item */ public class ServicesListItem { - public String protocol; + public final String protocol; public int attacks; - public int port; + public final int port; - public boolean activated; + public final boolean activated; /** * constructor of a service list item diff --git a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java index ddeefb4d..e0fff873 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopup.java @@ -34,11 +34,11 @@ public interface OnPopupItemClickListener { void onItemClick(Object data); } - private PopupWindow popupWindow; - private Activity context; - private OnPopupItemClickListener onPopupItemClickListener; + private final PopupWindow popupWindow; + private final Activity context; + private final OnPopupItemClickListener onPopupItemClickListener; private LinearLayout rootView; - private LayoutInflater lInf; + private final LayoutInflater lInf; private View lastItemView; /** @@ -64,11 +64,11 @@ public interface OnPopupItemClickListener { public AbstractPopup(Context context, OnPopupItemClickListener listener) { super(); this.context = (Activity) context; - this.onPopupItemClickListener = listener; - this.popupWindow = new PopupWindow(context); - this.popupWindow.setOutsideTouchable(true); - this.popupWindow.setFocusable(true); - this.lInf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + onPopupItemClickListener = listener; + popupWindow = new PopupWindow(context); + popupWindow.setOutsideTouchable(true); + popupWindow.setFocusable(true); + lInf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @@ -96,29 +96,26 @@ public View getRootView() { public void addItem(final AbstractPopupItem item) { View view = item.getRootView(); - if (this.rootView == null) { - this.rootView = (LinearLayout) this.lInf.inflate(this.getLayoutId(), null); - this.configureView(this.rootView); + if (rootView == null) { + rootView = (LinearLayout) lInf.inflate(this.getLayoutId(), null); + configureView(rootView); } - if (this.rootView != null) { - this.getScrollableItemLayout().addView(view); + if (rootView != null) { + getScrollableItemLayout().addView(view); lastItemView = view; //this.rootView.addView(view); - view.setOnTouchListener(new View.OnTouchListener() { - @Override - public boolean onTouch(View view, MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - item.onItemSelect(event); - } else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_MOVE) { - item.onItemDeselect(event); - } else if (event.getAction() == MotionEvent.ACTION_UP) { - item.onItemDeselect(event); - AbstractPopup.this.onPopupItemClickListener.onItemClick(item.onClickedResult(event)); - AbstractPopup.this.popupWindow.dismiss(); - } - return true; + view.setOnTouchListener((view1, event) -> { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + item.onItemSelect(event); + } else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_MOVE) { + item.onItemDeselect(event); + } else if (event.getAction() == MotionEvent.ACTION_UP) { + item.onItemDeselect(event); + AbstractPopup.this.onPopupItemClickListener.onItemClick(item.onClickedResult(event)); + AbstractPopup.this.popupWindow.dismiss(); } + return true; }); } @@ -131,10 +128,10 @@ public boolean onTouch(View view, MotionEvent event) { * @return View the root view */ public View getPopupView() { - if (this.rootView == null) { - this.rootView = (LinearLayout) this.lInf.inflate(this.getLayoutId(), null); + if (rootView == null) { + rootView = (LinearLayout) lInf.inflate(getLayoutId(), null); } - return this.rootView; + return rootView; } /** @@ -143,17 +140,17 @@ public View getPopupView() { * @param anchorView View */ public void showOnView(final View anchorView) { - if (this.rootView == null) { - this.rootView = (LinearLayout) this.lInf.inflate(this.getLayoutId(), null); + if (rootView == null) { + rootView = (LinearLayout) lInf.inflate(getLayoutId(), null); } - if (this.rootView != null) { - AbstractPopup.this.popupWindow.dismiss(); + if (rootView != null) { + popupWindow.dismiss(); - this.popupWindow.setContentView(this.rootView); + popupWindow.setContentView(rootView); final Rect windowFrame = new Rect(); - Window window = this.context.getWindow(); + Window window = context.getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(windowFrame); //int orientation = this.context.getResources().getConfiguration().orientation; int windowWidth = windowFrame.width(); @@ -163,9 +160,9 @@ public void showOnView(final View anchorView) { anchorView.getLocationOnScreen(position); final int anchorWidth = anchorView.getWidth(); - this.rootView.measure(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT); - int width = this.rootView.getMeasuredWidth(); - int height = this.rootView.getMeasuredHeight(); + rootView.measure(WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT); + int width = rootView.getMeasuredWidth(); + int height = rootView.getMeasuredHeight(); //int alh = (position[0] + width) - windowFrame.width(); //if (alh < 0) alh = 0; @@ -176,21 +173,21 @@ public void showOnView(final View anchorView) { height += (offset / 2); - width = windowWidth < width ? windowWidth : width; + width = Math.min(windowWidth, width); x = Math.max(0, x); x = Math.min(windowWidth - width, x); - height = (windowHeight < height ? windowHeight : height) - 10; + height = (Math.min(windowHeight, height)) - 10; y = Math.max(0, y); y = Math.min(windowHeight - height, y); - AbstractPopup.this.configureView(this.rootView); + configureView(rootView); int smallBottomOffset = 45; - this.popupWindow.setWidth(width); - this.popupWindow.setHeight(height); + popupWindow.setWidth(width); + popupWindow.setHeight(height); if (lastItemView != null) { View v = lastItemView.findViewById(R.id.bottom_separator); @@ -200,7 +197,7 @@ public void showOnView(final View anchorView) { } } - this.popupWindow.showAtLocation(anchorView, Gravity.NO_GRAVITY, x, y - smallBottomOffset); + popupWindow.showAtLocation(anchorView, Gravity.NO_GRAVITY, x, y - smallBottomOffset); } } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java index d25a5b89..9c885133 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java @@ -16,9 +16,9 @@ public abstract class AbstractPopupItem { private View rootView; - private LayoutInflater lInf; + private final LayoutInflater lInf; - public HashMap data; + public final HashMap data; /** * Override to return the layout id. @@ -40,8 +40,8 @@ public abstract class AbstractPopupItem { */ public void setValue(String key, Object value){ if (key != null && value != null){ - this.data.put(key, value); - if (this.rootView != null) this.configureItemView(this.rootView); + data.put(key, value); + if (rootView != null) this.configureItemView(rootView); } } @@ -54,16 +54,16 @@ public void setMultipleData(HashMap map){ for(Object key : map.keySet()){ this.data.put(key, map.get(key)); } - if (this.rootView != null) this.configureItemView(this.rootView); + if (rootView != null) this.configureItemView(rootView); } } public void setTitle(String title){ - this.title = title; - if (this.rootView != null) this.configureItemView(this.rootView); + title = title; + if (rootView != null) this.configureItemView(rootView); } public String getTitle(){ - return this.title; + return title; } /** @@ -89,8 +89,8 @@ public int getItemId() { */ public AbstractPopupItem(Context context) { super(); - this.lInf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - this.data = new HashMap(); + lInf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + data = new HashMap<>(); } /** @@ -99,12 +99,12 @@ public AbstractPopupItem(Context context) { * @return View rootview */ public View getRootView(){ - if (this.rootView == null){ - this.rootView = this.lInf.inflate(this.getLayoutId(), null); + if (rootView == null){ + rootView = lInf.inflate(getLayoutId(), null); } - this.configureItemView(this.rootView); + configureItemView(rootView); - return this.rootView; + return rootView; } /** diff --git a/src/main/java/dk/aau/netsec/hostage/ui/popup/SimplePopupItem.java b/src/main/java/dk/aau/netsec/hostage/ui/popup/SimplePopupItem.java index da7f10c6..f84154c6 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/popup/SimplePopupItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/popup/SimplePopupItem.java @@ -15,7 +15,7 @@ public class SimplePopupItem extends AbstractPopupItem { public boolean selected; - private Context context; + private final Context context; private View container; /** diff --git a/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java b/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java index 69f165f4..d5fe4063 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/popup/SplitPopupItem.java @@ -20,7 +20,7 @@ public class SplitPopupItem extends AbstractPopupItem { public boolean wasRightTouch; - private Context context; + private final Context context; private View left_container; private View right_container; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java b/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java index 35a49c41..c078e2f8 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/task/LoaderTask.java @@ -8,7 +8,7 @@ */ public class LoaderTask extends AsyncTask { - private TaskListener listener; + private final TaskListener listener; @SuppressLint("ValidFragment") public interface TaskListener { diff --git a/src/main/java/dk/aau/netsec/hostage/wrapper/Packet.java b/src/main/java/dk/aau/netsec/hostage/wrapper/Packet.java index e834b797..2353cd4f 100644 --- a/src/main/java/dk/aau/netsec/hostage/wrapper/Packet.java +++ b/src/main/java/dk/aau/netsec/hostage/wrapper/Packet.java @@ -9,8 +9,8 @@ */ public class Packet { - private byte[] payload; - private String protocol; + private final byte[] payload; + private final String protocol; /** * Constructs Packet from byte[] From 6d5b4c1b80b61a1fdbe922b0e3e43e010b957dcb Mon Sep 17 00:00:00 2001 From: zafodB Date: Wed, 18 Aug 2021 14:06:03 +0200 Subject: [PATCH 05/26] second set of java style and logic changes --- .../com/echo/holographlibrary/BarGraph.java | 15 +++++---- .../dk/aau/netsec/hostage/AMQPListener.java | 2 +- .../dk/aau/netsec/hostage/COAPListener.java | 2 +- .../java/dk/aau/netsec/hostage/Hostage.java | 3 +- .../netsec/hostage/HostageApplication.java | 10 +++--- .../dk/aau/netsec/hostage/MQTTListener.java | 6 ++-- .../netsec/hostage/commons/SubnetUtils.java | 3 +- .../dk/aau/netsec/hostage/event/Event.java | 2 +- .../location/CustomLocationManager.java | 1 - .../dk/aau/netsec/hostage/logging/Logger.java | 5 ++- .../logging/formatter/protocol/SMB.java | 3 +- .../hostage/net/MySSLSocketFactory.java | 4 +-- .../persistence/DAO/AttackRecordDAO.java | 3 +- .../netsec/hostage/persistence/DAO/DAO.java | 9 ++---- .../persistence/HostageDBOpenHelper.java | 18 ++++------- .../hostage/persistence/ProfileManager.java | 3 +- .../dk/aau/netsec/hostage/protocol/HTTP.java | 30 +++++++++--------- .../aau/netsec/hostage/protocol/MODBUS.java | 8 ++--- .../dk/aau/netsec/hostage/protocol/MQTT.java | 4 +-- .../dk/aau/netsec/hostage/protocol/SNMP.java | 2 +- .../dk/aau/netsec/hostage/protocol/SSH.java | 31 +++++++------------ .../protocol/utils/cifs/smbutils/NBSS.java | 18 +++++------ .../protocol/utils/cifs/smbutils/NMB.java | 6 ++-- .../protocol/utils/coapUtils/COAPHandler.java | 1 - .../protocol/utils/mqttUtils/MQTTConfig.java | 24 +++----------- .../protocol/utils/mqttUtils/MQTTHandler.java | 1 - .../utils/smptUtils/SimpleSmtpServer.java | 5 ++- .../aau/netsec/hostage/publisher/Hpfeeds.java | 3 +- .../hostage/publisher/PublishHelper.java | 13 ++++---- .../netsec/hostage/services/MultiStage.java | 3 +- .../hostage/services/PcapLoggingService.java | 2 +- .../dk/aau/netsec/hostage/system/Device.java | 5 ++- .../hostage/ui/activity/MainActivity.java | 22 +++---------- .../hostage/ui/dialog/ChecklistDialog.java | 3 +- .../ui/dialog/DateTimePickerDialog.java | 14 +++------ .../hostage/ui/fragment/HomeFragment.java | 9 +----- .../ui/fragment/RecordDetailFragment.java | 25 +++------------ .../ui/fragment/RecordOverviewFragment.java | 22 +++---------- .../hostage/ui/fragment/ServicesFragment.java | 10 +----- .../hostage/ui/fragment/SettingsFragment.java | 7 ++--- .../ui/fragment/StatisticsFragment.java | 20 ++---------- .../ui/fragment/ThreatMapFragment.java | 5 ++- .../ui/fragment/opengl/AnimatedMesh.java | 11 +++---- .../hostage/ui/popup/AbstractPopupItem.java | 2 +- 44 files changed, 126 insertions(+), 269 deletions(-) diff --git a/src/main/java/com/echo/holographlibrary/BarGraph.java b/src/main/java/com/echo/holographlibrary/BarGraph.java index 06d4fb6a..1882234c 100644 --- a/src/main/java/com/echo/holographlibrary/BarGraph.java +++ b/src/main/java/com/echo/holographlibrary/BarGraph.java @@ -47,7 +47,6 @@ public class BarGraph extends View { private ArrayList mBars = new ArrayList<>(); private final Paint mPaint = new Paint(); - private Rect mRectangle = null; private boolean mShowBarText = true; private boolean mShowAxis = true; private int mIndexSelected = -1; @@ -57,7 +56,7 @@ public class BarGraph extends View { private int popupImageID; - private Context mContext; + private final Context mContext; /** @@ -150,8 +149,8 @@ public void onDraw(Canvas ca) { maxValue = bar.getValue(); } } - - mRectangle = new Rect(); + + Rect mRectangle = new Rect(); int count = 0; for (final Bar bar : mBars) { @@ -176,7 +175,7 @@ public void onDraw(Canvas ca) { // Draw x-axis label text if (mShowAxis){ this.mPaint.setTextSize(AXIS_LABEL_FONT_SIZE * mContext.getResources().getDisplayMetrics().scaledDensity); - int x = (int)(((mRectangle.left+mRectangle.right)/2)-(this.mPaint.measureText(bar.getName())/2)); + int x = (int)(((mRectangle.left+ mRectangle.right)/2)-(this.mPaint.measureText(bar.getName())/2)); int y = (int) (getHeight()-3 * mContext.getResources().getDisplayMetrics().scaledDensity); canvas.drawText(bar.getName(), x, y, this.mPaint); } @@ -188,13 +187,13 @@ public void onDraw(Canvas ca) { Rect r2 = new Rect(); this.mPaint.getTextBounds(bar.getValueString(), 0, 1, r2); - int boundLeft = (int) (((mRectangle.left+mRectangle.right)/2)-(this.mPaint.measureText(bar.getValueString())/2)-5 * mContext.getResources().getDisplayMetrics().density); + int boundLeft = (int) (((mRectangle.left+ mRectangle.right)/2)-(this.mPaint.measureText(bar.getValueString())/2)-5 * mContext.getResources().getDisplayMetrics().density); int boundTop = (int) (mRectangle.top+(r2.top-r2.bottom)-18 * mContext.getResources().getDisplayMetrics().density); - int boundRight = (int)(((mRectangle.left+mRectangle.right)/2)+(this.mPaint.measureText(bar.getValueString())/2)+5 * mContext.getResources().getDisplayMetrics().density); + int boundRight = (int)(((mRectangle.left+ mRectangle.right)/2)+(this.mPaint.measureText(bar.getValueString())/2)+5 * mContext.getResources().getDisplayMetrics().density); popup.setBounds(boundLeft, boundTop, boundRight, mRectangle.top); popup.draw(canvas); - canvas.drawText(bar.getValueString(), (int)(((mRectangle.left+mRectangle.right)/2)-(this.mPaint.measureText(bar.getValueString()))/2), mRectangle.top-(mRectangle.top - boundTop)/2f+(float)Math.abs(r2.top-r2.bottom)/2f*0.7f, this.mPaint); + canvas.drawText(bar.getValueString(), (int)(((mRectangle.left+ mRectangle.right)/2)-(this.mPaint.measureText(bar.getValueString()))/2), mRectangle.top-(mRectangle.top - boundTop)/2f+(float)Math.abs(r2.top-r2.bottom)/2f*0.7f, this.mPaint); } if (mIndexSelected == count && mListener != null) { this.mPaint.setColor(Color.parseColor("#33B5E5")); diff --git a/src/main/java/dk/aau/netsec/hostage/AMQPListener.java b/src/main/java/dk/aau/netsec/hostage/AMQPListener.java index 8cf0ed3c..5f5907fc 100644 --- a/src/main/java/dk/aau/netsec/hostage/AMQPListener.java +++ b/src/main/java/dk/aau/netsec/hostage/AMQPListener.java @@ -18,7 +18,6 @@ public class AMQPListener extends Listener { private Thread serverThread; private ConnectionRegister conReg; private boolean running = false; - private final int defaultPort =5672; private static final Semaphore mutex = new Semaphore(1); /** @@ -103,6 +102,7 @@ private boolean notifyUI(boolean running){ public void stop() { stopServer();} public void stopServer(){ + int defaultPort = 5672; if(super.getPort() == defaultPort) { AMQP.stopBroker(); if(serverThread!=null) diff --git a/src/main/java/dk/aau/netsec/hostage/COAPListener.java b/src/main/java/dk/aau/netsec/hostage/COAPListener.java index fafb987c..55a08490 100644 --- a/src/main/java/dk/aau/netsec/hostage/COAPListener.java +++ b/src/main/java/dk/aau/netsec/hostage/COAPListener.java @@ -17,7 +17,6 @@ public class COAPListener extends Listener { private Thread serverThread; private ConnectionRegister conReg; private boolean running = false; - private final int defaultPort =5683; private static final Semaphore mutex = new Semaphore(1); /** @@ -102,6 +101,7 @@ private boolean notifyUI(boolean running){ public void stop() { stopServer();} public void stopServer(){ + int defaultPort = 5683; if(super.getPort() == defaultPort) { COAP.serverStop(); if(serverThread!=null) diff --git a/src/main/java/dk/aau/netsec/hostage/Hostage.java b/src/main/java/dk/aau/netsec/hostage/Hostage.java index ad55f3e5..7f2c713b 100644 --- a/src/main/java/dk/aau/netsec/hostage/Hostage.java +++ b/src/main/java/dk/aau/netsec/hostage/Hostage.java @@ -71,7 +71,6 @@ public class Hostage extends Service implements LocationSource.OnLocationChangedListener { private HashMap mProtocolActiveAttacks; - private DaoSession dbSession; static boolean implementedProtocolsReady; @@ -594,7 +593,7 @@ private synchronized void createNotification() { } private void checkNetworkPreviousInfection() { - dbSession = HostageApplication.getInstances().getDaoSession(); + DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); AttackRecordDAO attackRecordDAO = new AttackRecordDAO(dbSession); for (Listener listener : listeners) { diff --git a/src/main/java/dk/aau/netsec/hostage/HostageApplication.java b/src/main/java/dk/aau/netsec/hostage/HostageApplication.java index 1a03024b..c8bbef05 100644 --- a/src/main/java/dk/aau/netsec/hostage/HostageApplication.java +++ b/src/main/java/dk/aau/netsec/hostage/HostageApplication.java @@ -16,10 +16,8 @@ */ public class HostageApplication extends Application { private Tracker mAppTracker = null; - private DaoMaster.DevOpenHelper mHelper; - private SQLiteDatabase db; - private DaoMaster mDaoMaster; - private DaoSession mDaoSession; + private SQLiteDatabase db; + private DaoSession mDaoSession; public static HostageApplication instances; @@ -50,10 +48,10 @@ private void crashlyticsSetup(){ */ private void setDatabase() { // Note: The default DaoMaster.DevOpenHelper deletes all tables when the database is upgraded, meaning that this will result in data loss. - mHelper = new DaoMaster.DevOpenHelper(this, "hostage-db", null); + DaoMaster.DevOpenHelper mHelper = new DaoMaster.DevOpenHelper(this, "hostage-db", null); db = mHelper.getWritableDatabase(); // Note: This database connection belongs to DaoMaster, so multiple sessions refer to the same database connection. - mDaoMaster = new DaoMaster(db); + DaoMaster mDaoMaster = new DaoMaster(db); mDaoSession = mDaoMaster.newSession(); } diff --git a/src/main/java/dk/aau/netsec/hostage/MQTTListener.java b/src/main/java/dk/aau/netsec/hostage/MQTTListener.java index ad30c9c9..f3ab0acc 100644 --- a/src/main/java/dk/aau/netsec/hostage/MQTTListener.java +++ b/src/main/java/dk/aau/netsec/hostage/MQTTListener.java @@ -24,7 +24,6 @@ public class MQTTListener extends Listener { private Thread brokerThread; private ConnectionRegister conReg; private boolean running = false; - private final int mqttport = 1883; private static final Semaphore mutex = new Semaphore(1); @@ -112,6 +111,7 @@ public void stop() { } public void stopMqttBroker() { + int mqttport = 1883; if (super.getPort() == mqttport) { MQTT.brokerStop(); if (brokerThread != null) @@ -155,7 +155,7 @@ private Thread brokerThread() { startHandler(); conReg.newOpenConnection(); } - } catch (InterruptedException | IOException | IllegalAccessException | InstantiationException e) { + } catch (InterruptedException | IllegalAccessException | InstantiationException e) { e.printStackTrace(); } }); @@ -189,7 +189,7 @@ private void monitorSensorProfile() { sensorProfile.startSensor(); } - private boolean checkPostScanInProgress() throws IOException { + private boolean checkPostScanInProgress() { if (ConnectionGuard.portscanInProgress()) { mutex.release(); return true; diff --git a/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java b/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java index edd72384..fdbd72f5 100644 --- a/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java +++ b/src/main/java/dk/aau/netsec/hostage/commons/SubnetUtils.java @@ -302,14 +302,13 @@ private String format(int[] octets) { */ @Override public String toString() { - String buf = "CIDR Signature:\t[" + getCidrSignature() + "]" + + return "CIDR Signature:\t[" + getCidrSignature() + "]" + " Netmask: [" + getNetmask() + "]\n" + "Network:\t[" + getNetworkAddress() + "]\n" + "Broadcast:\t[" + getBroadcastAddress() + "]\n" + "First Address:\t[" + getLowAddress() + "]\n" + "Last Address:\t[" + getHighAddress() + "]\n" + "# Addresses:\t[" + getAddressCount() + "]\n"; - return buf; } } diff --git a/src/main/java/dk/aau/netsec/hostage/event/Event.java b/src/main/java/dk/aau/netsec/hostage/event/Event.java index b8547b94..02ae8386 100644 --- a/src/main/java/dk/aau/netsec/hostage/event/Event.java +++ b/src/main/java/dk/aau/netsec/hostage/event/Event.java @@ -9,6 +9,6 @@ public interface Event { String deviceId = UUID.randomUUID().toString(); - JSONObject toJSON() throws JSONException; + JSONObject toJSON(); void writeData(); } diff --git a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java index 52e272bb..fa123744 100644 --- a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java +++ b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java @@ -3,7 +3,6 @@ import android.Manifest; import android.annotation.SuppressLint; import android.content.Context; -import android.content.DialogInterface; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; diff --git a/src/main/java/dk/aau/netsec/hostage/logging/Logger.java b/src/main/java/dk/aau/netsec/hostage/logging/Logger.java index f0b49d45..3776b415 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/Logger.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/Logger.java @@ -99,8 +99,7 @@ public static void logMultiStageAttack(Context context,AttackRecord attackRecord } - private DaoSession dbSession; - private DAOHelper daoHelper; + private DAOHelper daoHelper; public Logger() { super("Logger"); } @@ -108,7 +107,7 @@ public Logger() { @Override public void onCreate() { super.onCreate(); - dbSession = HostageApplication.getInstances().getDaoSession(); + DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession,this); } diff --git a/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java b/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java index b42eb1ef..77d0800b 100644 --- a/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java +++ b/src/main/java/dk/aau/netsec/hostage/logging/formatter/protocol/SMB.java @@ -15,12 +15,11 @@ public String format(String packet) { byte[] bytes = HelperUtils.hexStringToBytes(packet); byte cmd = bytes[8]; // command code located at 8 - String buffer = "Command: " + + return "Command: " + getCommandString(cmd) + "\n" + "Content: " + getContent(cmd, bytes); - return buffer; } /** diff --git a/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java b/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java index 19d6f6b7..c4cdf1d7 100644 --- a/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java +++ b/src/main/java/dk/aau/netsec/hostage/net/MySSLSocketFactory.java @@ -31,12 +31,12 @@ public MySSLSocketFactory(KeyStore truststore) @Override public void checkClientTrusted(X509Certificate[] chain, - String authType) throws CertificateException { + String authType) { } @Override public void checkServerTrusted(X509Certificate[] chain, - String authType) throws CertificateException { + String authType) { } @Override diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java index db4b57f4..c1d76765 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/AttackRecordDAO.java @@ -31,7 +31,6 @@ public class AttackRecordDAO extends DAO { private final DaoSession daoSession; private Context context; - private final int limit = 20; //limit for the details Conversation public AttackRecordDAO(DaoSession daoSession) { @@ -619,6 +618,8 @@ public synchronized ArrayList getConversationForAttackID(long attack_ MessageRecordDao recordDao = this.daoSession.getMessageRecordDao(); QueryBuilder qb = recordDao.queryBuilder(); + //limit for the details Conversation + int limit = 20; qb.limit(limit); qb.where(MessageRecordDao.Properties.Attack_id.eq(attack_id)); ArrayList attackRecords = (ArrayList) qb.list(); diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java index a7056d19..b0f393d9 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/DAO/DAO.java @@ -85,8 +85,7 @@ public List selectElementsByCondition(AbstractDao absDao, for (WhereCondition condition : conditions) { qb = qb.where(condition); } - List items = qb.list(); - return items; + return qb.list(); } public List selectElementsByConditionAndSort(AbstractDao absDao, @@ -101,8 +100,7 @@ public List selectElementsByConditionAndSort(AbstractDao absDao, qb = qb.where(condition); } qb.orderCustom(sortProperty, sortStrategy); - List items = qb.list(); - return items; + return qb.list(); } public List selectElementsByConditionAndSortWithNullHandling(AbstractDao absDao, @@ -121,8 +119,7 @@ public List selectElementsByConditionAndSortWithNullHandling(AbstractDao< qb = qb.where(condition); } qb.orderRaw("(CASE WHEN " + "T." + sortProperty.columnName + " IS NULL then 1 ELSE 0 END)," + "T." + sortProperty.columnName + " " + sortStrategy); - List items = qb.list(); - return items; + return qb.list(); } public List selectByJoin(AbstractDao absDao, diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java b/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java index d15827a3..a3c2e56f 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/HostageDBOpenHelper.java @@ -50,7 +50,7 @@ public class HostageDBOpenHelper extends SQLiteOpenHelper { static { // NETWORK - String networkSQLBuilder = "CREATE TABLE " + HostageDBContract.NetworkEntry.TABLE_NAME + "(" + + SQL_CREATE_NETWORK_ENTRIES = "CREATE TABLE " + HostageDBContract.NetworkEntry.TABLE_NAME + "(" + HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID + " TEXT PRIMARY KEY," + HostageDBContract.NetworkEntry.COLUMN_NAME_SSID + " TEXT," + HostageDBContract.NetworkEntry.COLUMN_NAME_LATITUDE + " INTEGER," + @@ -58,10 +58,9 @@ public class HostageDBOpenHelper extends SQLiteOpenHelper { HostageDBContract.NetworkEntry.COLUMN_NAME_ACCURACY + " INTEGER," + HostageDBContract.NetworkEntry.COLUMN_NAME_GEO_TIMESTAMP + " INTEGER" + ")"; - SQL_CREATE_NETWORK_ENTRIES = networkSQLBuilder; // ATTACK - String attackSQLBuilder = "CREATE TABLE " + HostageDBContract.AttackEntry.TABLE_NAME + "(" + + SQL_CREATE_ATTACK_ENTRIES = "CREATE TABLE " + HostageDBContract.AttackEntry.TABLE_NAME + "(" + HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID + " INTEGER PRIMARY KEY," + HostageDBContract.AttackEntry.COLUMN_NAME_PROTOCOL + " TEXT," + HostageDBContract.AttackEntry.COLUMN_NAME_EXTERNAL_IP + " TEXT," + @@ -78,10 +77,9 @@ public class HostageDBOpenHelper extends SQLiteOpenHelper { String.format("FOREIGN KEY(%s) REFERENCES %s(%s) ON DELETE CASCADE ON UPDATE CASCADE", HostageDBContract.AttackEntry.COLUMN_NAME_DEVICE, HostageDBContract.SyncDeviceEntry.TABLE_NAME, HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID) + ")"; - SQL_CREATE_ATTACK_ENTRIES = attackSQLBuilder; // PACKET - String packetSQLBuilder = "CREATE TABLE " + HostageDBContract.PacketEntry.TABLE_NAME + "(" + + SQL_CREATE_PACKET_ENTRIES = "CREATE TABLE " + HostageDBContract.PacketEntry.TABLE_NAME + "(" + HostageDBContract.PacketEntry.COLUMN_NAME_ID + " INTEGER NOT NULL," + HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID + " INTEGER NOT NULL," + HostageDBContract.PacketEntry.COLUMN_NAME_TYPE + " TEXT," + @@ -91,18 +89,16 @@ public class HostageDBOpenHelper extends SQLiteOpenHelper { String.format("FOREIGN KEY(%s) REFERENCES %s(%s)", HostageDBContract.PacketEntry.COLUMN_NAME_ATTACK_ID, HostageDBContract.AttackEntry.TABLE_NAME, HostageDBContract.AttackEntry.COLUMN_NAME_ATTACK_ID) + ")"; - SQL_CREATE_PACKET_ENTRIES = packetSQLBuilder; // SyncDeviceEntry - String syncDevicesSQLBuilder = "CREATE TABLE " + HostageDBContract.SyncDeviceEntry.TABLE_NAME + "(" + + SQL_CREATE_SYNC_DEVICES_ENTRIES = "CREATE TABLE " + HostageDBContract.SyncDeviceEntry.TABLE_NAME + "(" + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_ID + " TEXT PRIMARY KEY," + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_DEVICE_TIMESTAMP + " INTEGER," + HostageDBContract.SyncDeviceEntry.COLUMN_NAME_HIGHEST_ATTACK_ID + " INTEGER" + ")"; - SQL_CREATE_SYNC_DEVICES_ENTRIES = syncDevicesSQLBuilder; // SyncInfoEntry - String syncInfoSQLBuilder = "CREATE TABLE " + HostageDBContract.SyncInfoEntry.TABLE_NAME + "(" + + SQL_CREATE_SYNC_INFO_ENTRIES = "CREATE TABLE " + HostageDBContract.SyncInfoEntry.TABLE_NAME + "(" + HostageDBContract.SyncInfoEntry.COLUMN_NAME_DEVICE_ID + " TEXT," + HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID + " TEXT," + HostageDBContract.SyncInfoEntry.COLUMN_NAME_NUMBER_ATTACKS + " INTEGER," + @@ -111,10 +107,9 @@ public class HostageDBOpenHelper extends SQLiteOpenHelper { String.format("FOREIGN KEY(%s) REFERENCES %s(%s)", HostageDBContract.SyncInfoEntry.COLUMN_NAME_BSSID, HostageDBContract.NetworkEntry.TABLE_NAME, HostageDBContract.NetworkEntry.COLUMN_NAME_BSSID) + ")"; - SQL_CREATE_SYNC_INFO_ENTRIES = syncInfoSQLBuilder; // ProfileEntry - String profilSQLBuilder = "CREATE TABLE " + HostageDBContract.ProfileEntry.TABLE_NAME + "(" + + SQL_CREATE_PROFILE_ENTRIES = "CREATE TABLE " + HostageDBContract.ProfileEntry.TABLE_NAME + "(" + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_NAME + " TEXT," + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_DESCRIPTION + " TEXT," + @@ -123,7 +118,6 @@ public class HostageDBOpenHelper extends SQLiteOpenHelper { HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_EDITABLE + " INTEGER," + HostageDBContract.ProfileEntry.COLUMN_NAME_PROFILE_ACTIVE + " INTEGER" + ")"; - SQL_CREATE_PROFILE_ENTRIES = profilSQLBuilder; } private static final String SQL_CREATE_NETWORK_ENTRIES; diff --git a/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java b/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java index 733ac0fe..7c752cf7 100644 --- a/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java +++ b/src/main/java/dk/aau/netsec/hostage/persistence/ProfileManager.java @@ -78,7 +78,6 @@ public class ProfileManager { */ public final HashMap mProfiles; - private final SharedPreferences mSharedPreferences; private final SharedPreferences.Editor mSharedEditor; /** @@ -106,7 +105,7 @@ private ProfileManager() { mProfiles = new HashMap<>(); String sharedPreferencePath = MainActivity.getContext().getString(R.string.shared_preference_path); - mSharedPreferences = MainActivity.getContext().getSharedPreferences(sharedPreferencePath, Hostage.MODE_PRIVATE); + SharedPreferences mSharedPreferences = MainActivity.getContext().getSharedPreferences(sharedPreferencePath, Hostage.MODE_PRIVATE); mSharedEditor = mSharedPreferences.edit(); mSharedEditor.apply(); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java b/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java index cb0b522c..d32427e8 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/HTTP.java @@ -98,8 +98,7 @@ private String initServerVersion() { } private final String httpVersion = "HTTP/1.1"; - private final String httpVersion_2 = "HTTP/2"; - private static String htmlDocumentContent = HelperUtils.getRandomString(32, false); + private static String htmlDocumentContent = HelperUtils.getRandomString(32, false); private static String htmlTitleContent = HelperUtils.getRandomString(32, false); @@ -133,22 +132,13 @@ public static void setHtmlDocumentContent(String htmlDocumentContent,String html private final String headerPrefix = "Date: " + getServerTime() + "\r\n" + "Server: " + serverVersion + " \r\n" + "Vary: Accept-Encoding\r\n" + "Content-Length: "; - private final String headerSuffix = "\r\n" + "Keep-Alive: timeout=5, max=100\r\n" - + "Connection: Keep-Alive\r\n" + "Content-Type: text/html\r\n" - + "\r\n"; - // html website + // html website private final String htmlDocument = "\n" + "\n" + "\n" + "\n" + "" + htmlTitleContent + "\n" + "" + htmlDocumentContent + "\n" + "\n" + ""; - // html error pre and suffix - private final String errorHtmlPrefix = "\n" - + "\n" + "\n" - + "\n" + ""; - private final String errorHtmlSuffix = "\n" + "\n" + ""; - - private int port = 80; + private int port = 80; @Override public int getPort() { return port; } @@ -176,7 +166,8 @@ public List processMessage(Packet requestPacket) { this.request = request; assert request != null; - if (request.isEmpty()) { + String httpVersion_2 = "HTTP/2"; + if (request.isEmpty()) { //weird if clause but required for https responsePackets.add(buildPacket(STATUS_CODE_200, GET)); checkProfile(); @@ -289,7 +280,11 @@ public TALK_FIRST whoTalksFirst() { */ private Packet buildPacket(String code, String type) { String document; - switch (type) { + String errorHtmlSuffix = "\n" + "\n" + "";// html error pre and suffix + String errorHtmlPrefix = "\n" + + "\n" + "\n" + + "\n" + ""; + switch (type) { case GET: document = htmlDocument; break; @@ -305,7 +300,10 @@ private Packet buildPacket(String code, String type) { break; } - return new Packet(httpVersion + " " + code + headerPrefix + String headerSuffix = "\r\n" + "Keep-Alive: timeout=5, max=100\r\n" + + "Connection: Keep-Alive\r\n" + "Content-Type: text/html\r\n" + + "\r\n"; + return new Packet(httpVersion + " " + code + headerPrefix + document.length() + headerSuffix + document, toString()); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java b/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java index 47e6dad7..076b7145 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/MODBUS.java @@ -260,13 +260,11 @@ private int rand() { } - //Device Information - private String DeviceInfo = getDeviceInfo(); - private String getDeviceInfo() { - DeviceInfo = "5369656d656e732053494d415449432053372d323030"; // Hex value for Simatic S7 200 - return DeviceInfo; + //Device Information + String deviceInfo = "5369656d656e732053494d415449432053372d323030"; // Hex value for Simatic S7 200 + return deviceInfo; } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java b/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java index 4472b761..5ba51a81 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/MQTT.java @@ -25,8 +25,6 @@ public class MQTT implements Protocol { private static final String TAG = "MQTT"; private int port = 1883; - private final String defaultPort = "1883"; - private final String defaultAddress = "0.0.0.0"; private static final int brokerPort = 1883; private static boolean brokerStarted = false; //prevents the server from starting multiple times from the threads // private static final String MQTT_URI = "broker.mqttdashboard.com"; @@ -124,6 +122,8 @@ private void broker() { * @return */ private MemoryConfig getConfig() { + String defaultAddress = "0.0.0.0"; + String defaultPort = "1883"; MQTTConfig config = new MQTTConfig(defaultPort, defaultAddress); return config.configBroker(); } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java b/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java index 20f80cae..ec4e845c 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/SNMP.java @@ -88,7 +88,7 @@ public String toString() { private String address; - public SNMP(String address) throws IOException { + public SNMP(String address) { super(new File("conf.agent"), new File("bootCounter.agent"), new CommandProcessor( diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java b/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java index 74f03e58..3d6c11f8 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/SSH.java @@ -65,7 +65,6 @@ private String initSshType() { private final String serverName = HelperUtils.getRandomString(16, false); private int packetNumber = 0; private int recipientChannel; - private String userName; private String terminalPrefix; private StringBuffer command = new StringBuffer(); private final SecureRandom random = new SecureRandom(); @@ -76,11 +75,6 @@ private String initSshType() { private byte[] I_S; private byte[] I_C; private byte[] e; - private BigInteger f; - private byte[] h; - private BigInteger k; - private byte[] K_S; - private byte[] signature; // allowed algorithms for kexinit private static final String KEX_ALG = "diffie-hellman-group1-sha1"; @@ -92,11 +86,6 @@ private String initSshType() { private static final String COMP_ALG_C = "none"; private static final String COMP_ALG_S = "none"; - private final int cipherBlockSize = 16; - - // for en- and decryption - private DESede desEncryption; - private DESede desDecryption; private CBCMode cbcEncryption; private CBCMode cbcDecryption; private MAC macEncryption; @@ -219,6 +208,7 @@ public String toString() { private Packet wrapPacket(byte[] response) { // 4 byte packet length, 1 byte padding length, payload length int packetLength = 5 + response.length; + int cipherBlockSize = 16; int paddingLengthCBS = cipherBlockSize - (packetLength % cipherBlockSize); int paddingLength8 = 8 - (packetLength % 8); @@ -332,16 +322,16 @@ private Packet dhKexReply() { DhExchange dhx = new DhExchange(); dhx.serverInit(1, random); dhx.setE(new BigInteger(e)); - f = dhx.getF(); + BigInteger f = dhx.getF(); DSAPrivateKey dsa = (DSAPrivateKey) PEMDecoder.decode(dsaPem, null); - K_S = DSASHA1Verify.encodeSSHDSAPublicKey(dsa.getPublicKey()); - h = dhx.calculateH(V_C, V_S, I_C, I_S, K_S); - k = dhx.getK(); + byte[] k_S = DSASHA1Verify.encodeSSHDSAPublicKey(dsa.getPublicKey()); + byte[] h = dhx.calculateH(V_C, V_S, I_C, I_S, k_S); + BigInteger k = dhx.getK(); DSASignature ds = DSASHA1Verify.generateSignature(h, dsa, random); - signature = DSASHA1Verify.encodeSSHDSASignature(ds); + byte[] signature = DSASHA1Verify.encodeSSHDSASignature(ds); TypesWriter tw = new TypesWriter(); tw.writeByte(31); - tw.writeString(K_S, 0, K_S.length); + tw.writeString(k_S, 0, k_S.length); tw.writeMPInt(f); tw.writeString(signature, 0, signature.length); response = tw.getBytes(); @@ -351,8 +341,9 @@ private Packet dhKexReply() { // keylength, blocklength, maclength KeyMaterial km = KeyMaterial.create("SHA1", h, k, h, 24, 8, 20, 24, 8, 20); - desEncryption = new DESede(); - desDecryption = new DESede(); + // for en- and decryption + DESede desEncryption = new DESede(); + DESede desDecryption = new DESede(); desEncryption.init(true, km.enc_key_server_to_client); desDecryption.init(false, km.enc_key_client_to_server); cbcEncryption = new CBCMode(desEncryption, @@ -418,7 +409,7 @@ private Packet connectionReply(byte[] request) { } try { TypesReader tr = new TypesReader(request, 6); - userName = tr.readString(); + String userName = tr.readString(); terminalPrefix = "[" + userName + "@" + serverName + " ~]$ "; } catch (IOException e) { e.printStackTrace(); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java index 6239bfe0..b55c9319 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NBSS.java @@ -20,16 +20,12 @@ * @author Wulf Pfeiffer */ public class NBSS extends Thread { - - private final int nbssPort; - private ServerSocket nbssServer; - private Socket nbssSocket; - private Reader reader; - private Writer writer; - private SMB smb; + + private ServerSocket nbssServer; + private SMB smb; public NBSS() { - nbssPort = 139; + int nbssPort = 139; MyServerSocketFactory factory = new MyServerSocketFactory(); try { nbssServer = factory.createServerSocket(nbssPort); @@ -41,7 +37,7 @@ public NBSS() { @Override public void run() { try { - nbssSocket = nbssServer.accept(); + Socket nbssSocket = nbssServer.accept(); smb = new SMB(); talkToClient(nbssSocket.getInputStream(), nbssSocket.getOutputStream()); } catch (IOException e) { @@ -56,8 +52,8 @@ public void run() { * @throws IOException */ private void talkToClient(InputStream in, OutputStream out) throws IOException { - reader = new Reader(in, smb.toString()); - writer = new Writer(out); + Reader reader = new Reader(in, smb.toString()); + Writer writer = new Writer(out); Packet inputLine; List<Packet> outputLine; if (smb.whoTalksFirst() == Protocol.TALK_FIRST.SERVER) { diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java index 059c8c28..e72a03db 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/cifs/smbutils/NMB.java @@ -23,7 +23,6 @@ public class NMB extends Thread { private DatagramSocket nbdsSocket; private DatagramPacket packet; private String ip; - private String[] ipParts; private InetAddress dst; private final int nbnsOriginPort = 137; private final int nbdsOriginPort = 138; @@ -34,7 +33,6 @@ public class NMB extends Thread { private NBNS nbns; private NBDS nbds; private boolean isMaster; - private byte[] addr = new byte[4]; private static final byte[] transactID = HelperUtils.randomBytes(2); public NMB(String ip, String username, String workgroup) { @@ -43,10 +41,10 @@ public NMB(String ip, String username, String workgroup) { this.username = username; this.workgroup = workgroup; this.ip = ip; - ipParts = ip.split("\\."); + String[] ipParts = ip.split("\\."); String newHostAddr = ipParts[0] + "." + ipParts[1] + "." + ipParts[2] + ".255"; dst = InetAddress.getByName(newHostAddr); - addr = addressToBytes(ip); + byte[] addr = addressToBytes(ip); nbns = new NBNS(addr); nbds = new NBDS(addr, username, workgroup); } catch (UnknownHostException e) { diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java index e03bfa0b..142141d9 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/coapUtils/COAPHandler.java @@ -7,7 +7,6 @@ import com.mbed.coap.utils.CoapResource; import java.net.InetSocketAddress; -import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Objects; import java.util.UUID; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java index d468711d..05c0ecdf 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTConfig.java @@ -38,38 +38,20 @@ */ public class MQTTConfig { - private final String port ="port"; private String portValue="1883"; - private final String host="host"; private String hostValue="0.0.0.0"; private final String websocket_port="websocket_port"; - private String websocket_port_value="8080"; private final String password_file= "password_file"; - private String password_file_value= "password_file.conf"; private final String ssl_port="ssl_port"; - private String ssl_port_value="8883"; private final String jks_path="jks_path"; - private String jks_path_value="serverkeystore.jks"; private final String key_store_password="key_store_password"; - private String key_store_passwordValue="passw0rdsrv"; private final String key_manager_password="key_manager_password"; - private String key_manager_passwordValue="passw0rdsrv"; private final String allow_anonymous="allow_anonymous"; - private String allow_anonymous_value="true"; private final String reauthorize_subscriptions_on_connect="reauthorize_subscriptions_on_connect"; - private String reauthorize_subscriptions_on_connectValue="false"; public MQTTConfig(String portValue, String hostValue, String websocket_port_value, String password_file_value, String ssl_port_value, String jks_path_value, String key_store_passwordValue, String key_manager_passwordValue, String allow_anonymous_value, String reauthorize_subscriptions_on_connectValue) { this.portValue = portValue; this.hostValue = hostValue; - this.websocket_port_value = websocket_port_value; - this.password_file_value = password_file_value; - this.ssl_port_value = ssl_port_value; - this.jks_path_value = jks_path_value; - this.key_store_passwordValue = key_store_passwordValue; - this.key_manager_passwordValue = key_manager_passwordValue; - this.allow_anonymous_value = allow_anonymous_value; - this.reauthorize_subscriptions_on_connectValue = reauthorize_subscriptions_on_connectValue; } public MQTTConfig(String portValue, String hostValue) { @@ -79,8 +61,10 @@ public MQTTConfig(String portValue, String hostValue) { public MemoryConfig configBroker(){ MemoryConfig memoryConfig = new MemoryConfig(new Properties()); - memoryConfig.setProperty(this.port,this.portValue); - memoryConfig.setProperty(this.host,this.hostValue); + String port = "port"; + memoryConfig.setProperty(port,this.portValue); + String host = "host"; + memoryConfig.setProperty(host,this.hostValue); return memoryConfig; } diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java index f9b587fd..2d58b471 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/mqttUtils/MQTTHandler.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; import java.util.Objects; import java.util.UUID; import java.util.concurrent.CopyOnWriteArrayList; diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java index 1bf09bf5..a9c93922 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java @@ -95,7 +95,7 @@ private SimpleSmtpServer(ServerSocket serverSocket) { this.receivedMail = new ArrayList<>(); this.serverSocket = serverSocket; this.workerThread = new Thread( - () -> performWork()); + this::performWork); this.workerThread.start(); } @@ -196,9 +196,8 @@ private void performWork() { * @param out output stream * @param input input stream * @return List of SmtpMessage - * @throws IOException */ - private static List<SmtpMessage> handleTransaction(PrintWriter out, Iterator<String> input) throws IOException { + private static List<SmtpMessage> handleTransaction(PrintWriter out, Iterator<String> input) { // Initialize the state machine SmtpState smtpState = SmtpState.CONNECT; SmtpRequest smtpRequest = new SmtpRequest(SmtpActionType.CONNECT, "", smtpState); diff --git a/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java b/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java index 8ad69d87..2d5988c7 100644 --- a/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java +++ b/src/main/java/dk/aau/netsec/hostage/publisher/Hpfeeds.java @@ -44,7 +44,6 @@ public class Hpfeeds { private long writtenMessages = 0; private long writtenBytes = 0; - private String brokerName; private static final Logger log = LoggerFactory.getLogger(Hpfeeds.class); @@ -107,7 +106,7 @@ public void connect() throws IOException, EOSException, ReadTimeOutException, La buf.position(1 + nameLen); rand = buf.slice(); - brokerName = name; + String brokerName = name; writtenBytes += sc.write(msgauth(rand, ident, secret)); writtenMessages++; diff --git a/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java b/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java index ebb12d03..6062a80d 100644 --- a/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java +++ b/src/main/java/dk/aau/netsec/hostage/publisher/PublishHelper.java @@ -18,12 +18,7 @@ public class PublishHelper { - private final DaoSession dbSession; private final DAOHelper daoHelper; - private final int offset=0; - private final int limit=20; - private final int attackRecordOffset=0; - private final int attackRecordLimit=999; final LogFilter filter = null; final JSONHelper jsonHelper = new JSONHelper(); private String host = "130.225.57.113"; @@ -36,7 +31,7 @@ public class PublishHelper { final File hpfeedsFile = new File("/data/data/" + MainActivity.getContext().getPackageName() + "/" + PERSIST_FILENAME); public PublishHelper(){ - this.dbSession = HostageApplication.getInstances().getDaoSession(); + DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); this.daoHelper = new DAOHelper(dbSession); //initializeHpFeedsCredentials(); //hpfeeds disabled } @@ -89,7 +84,11 @@ private void publisher() throws Hpfeeds.ReadTimeOutException, Hpfeeds.EOSExcepti * @return a list of the last inserted records from a current attack */ private ArrayList<RecordAll> getLastInsertedRecords(){ - return daoHelper.getAttackRecordDAO().getRecordsForFilter(filter,offset,limit,attackRecordOffset,attackRecordLimit); + int attackRecordLimit = 999; + int attackRecordOffset = 0; + int limit = 20; + int offset = 0; + return daoHelper.getAttackRecordDAO().getRecordsForFilter(filter, offset, limit, attackRecordOffset, attackRecordLimit); } } diff --git a/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java b/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java index b30849de..68bd266b 100644 --- a/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java +++ b/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java @@ -15,7 +15,6 @@ import androidx.annotation.RequiresApi; import java.util.ArrayList; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -48,7 +47,6 @@ public class MultiStage extends Service { int stackLport; String stackssid; String stackbssid; - private DaoSession dbSession; private DAOHelper daoHelper; Notification notification; NotificationManager manager; @@ -69,6 +67,7 @@ public IBinder onBind(Intent intent) { @Override public void onCreate() { super.onCreate(); + DaoSession dbSession; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession, this); diff --git a/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java b/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java index e2cf12db..6f19e92b 100644 --- a/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java +++ b/src/main/java/dk/aau/netsec/hostage/services/PcapLoggingService.java @@ -61,7 +61,6 @@ public class PcapLoggingService extends Service { private File filesDir; private Process tcpdumpProcess; - private Thread tcpdumpThread; private Thread fileCopyThread = null; private static final int PCAP_NOTIFICATION_ID = 765; @@ -91,6 +90,7 @@ public int onStartCommand(Intent intent, int flags, int startId) { filesDir = getFilesDir(); // Determine thread based on logging type. + Thread tcpdumpThread; if (captureType == LOG_TYPE_TEXT) { tcpdumpThread = new TextLogThread(); } else { diff --git a/src/main/java/dk/aau/netsec/hostage/system/Device.java b/src/main/java/dk/aau/netsec/hostage/system/Device.java index da04e67f..b36a1a3e 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/Device.java +++ b/src/main/java/dk/aau/netsec/hostage/system/Device.java @@ -13,13 +13,12 @@ public class Device { - private static boolean initialized = false; - private static boolean root = false; // device is rooted + private static boolean root = false; // device is rooted private static boolean iptables = false; // iptables redirection confirmed working public static void checkCapabilities() { // assume worst case - initialized = false; + boolean initialized = false; root = false; iptables = false; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java index 52254273..217abdcd 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java @@ -165,11 +165,6 @@ public void onServiceDisconnected(ComponentName name) { }; - /** - * Holds an profile manager instance - */ - private ProfileManager mProfileManager; - /** * Holds the root fragment for our hierarchical fragment navigation */ @@ -218,18 +213,6 @@ public void onStart() { } } - @Override - protected void onPause() { - super.onPause(); -// if (locationManager != null) -// locationManager.stopUpdates(); - } - - @Override - protected void onResume() { - super.onResume(); - } - /** * {@inheritDoc} */ @@ -376,7 +359,10 @@ private void onFirstRun() { } private void addProfileManager() { - mProfileManager = ProfileManager.getInstance(); + /** + * Holds an profile manager instance + */ + ProfileManager mProfileManager = ProfileManager.getInstance(); } private void loadFirstRun() { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java b/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java index dc682678..a27daa1c 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/dialog/ChecklistDialog.java @@ -5,7 +5,6 @@ import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; -import android.content.DialogInterface; import android.os.Bundle; import java.util.ArrayList; @@ -143,7 +142,7 @@ public ArrayList<String> getSelectedItemTitles() { public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - CharSequence[] titles = this.itemTitles.toArray(new CharSequence[this.itemTitles.size()]); + CharSequence[] titles = this.itemTitles.toArray(new CharSequence[0]); boolean[] selectedArray = new boolean[this.itemTitles.size()]; for (Integer selection : this.mSelectedItems) { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java b/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java index 6085aedd..18c714fa 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/dialog/DateTimePickerDialog.java @@ -3,7 +3,6 @@ import android.app.DatePickerDialog; import android.app.TimePickerDialog; import android.content.Context; -import android.widget.DatePicker; import android.widget.TimePicker; import androidx.annotation.NonNull; @@ -44,14 +43,11 @@ public static void showDateTimePicker(@NonNull Context context, boolean filterFr date = Calendar.getInstance(); new DatePickerDialog(context, R.style.CustomDateTimePicker, (view, year, monthOfYear, dayOfMonth) -> { date.set(year, monthOfYear, dayOfMonth); - new TimePickerDialog(context, R.style.CustomDateTimePicker, new TimePickerDialog.OnTimeSetListener() { - @Override - public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - date.set(Calendar.HOUR_OF_DAY, hourOfDay); - date.set(Calendar.MINUTE, minute); - - callback.dateTimeSelected(date, filterFrom); - } + new TimePickerDialog(context, R.style.CustomDateTimePicker, (view1, hourOfDay, minute) -> { + date.set(Calendar.HOUR_OF_DAY, hourOfDay); + date.set(Calendar.MINUTE, minute); + + callback.dateTimeSelected(date, filterFrom); }, currentDate.get(Calendar.HOUR_OF_DAY), currentDate.get(Calendar.MINUTE), true).show(); }, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE)).show(); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java index 2cc9737a..be910d53 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java @@ -57,9 +57,6 @@ public class HomeFragment extends Fragment { private ImageView mHomeConnectionInfoButton; private ImageView mHomeAndroidImage; private View mRootView; - private LayoutInflater inflater; - private ViewGroup container; - private Bundle savedInstanceState; private BroadcastReceiver mReceiver; @@ -68,7 +65,6 @@ public class HomeFragment extends Fragment { private ProfileManager mProfileManager; private SharedPreferences mConnectionInfo; - private DaoSession dbSession; private DAOHelper daoHelper; private boolean mReceiverRegistered; @@ -98,7 +94,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa activity.setTitle(getActivity().getString(R.string.drawer_overview)); } - dbSession = HostageApplication.getInstances().getDaoSession(); + DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession, getActivity()); @@ -106,9 +102,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa mProfileManager = ProfileManager.getInstance(); - this.inflater = inflater; - this.container = container; - this.savedInstanceState = savedInstanceState; mRootView = inflater.inflate(R.layout.fragment_home, container, false); assignViews(); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java index 2a7df9ae..360b3f5d 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java @@ -51,10 +51,6 @@ public class RecordDetailFragment extends UpNavigableFragment { * Hold the record of which the detail informations should be shown */ private RecordAll mRecord; - /** - * The database helper to retrieve data from the database - */ - private DaoSession dbSession; private DAOHelper daoHelper; /** * The layout inflater @@ -72,9 +68,6 @@ public class RecordDetailFragment extends UpNavigableFragment { private TextView mRecordDetailsTextProtocol; private Button textButton; private Button hexButton; - private LayoutInflater inflater; - private ViewGroup container; - private Bundle savedInstanceState; public SharedPreferences pref; public int port; @@ -122,15 +115,14 @@ public void onCreate(Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); - this.inflater = inflater; - this.container = container; - this.savedInstanceState = savedInstanceState; - mInflater = inflater; if (mRecord != null) getActivity().setTitle(mRecord.getSsid()); - dbSession = HostageApplication.getInstances().getDaoSession(); + /** + * The database helper to retrieve data from the database + */ + DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession, getActivity()); this.mRootView = inflater.inflate(this.getLayoutId(), container, false); @@ -140,15 +132,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa return mRootView; } - /** - * {@inheritDoc} - */ - @Override - public void onStart() { - super.onStart(); - - } - /** * Retrieves all the views from the given view * diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java index 540984b5..08e9bd2f 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java @@ -86,7 +86,6 @@ public class RecordOverviewFragment extends UpNavigableFragment implements Check private LogFilter filter; private boolean showFilterButton; private View rootView; - private View footer; private int mListPosition = -1; private int mItemPosition = -1; public String groupingKey; @@ -94,7 +93,6 @@ public class RecordOverviewFragment extends UpNavigableFragment implements Check private ProgressBar spinner; private Snackbar noDataNotificationSnackbar; - private DaoSession dbSession; private DAOHelper daoHelper; private final int offset = 0; @@ -105,11 +103,9 @@ public class RecordOverviewFragment extends UpNavigableFragment implements Check private String sectionToOpen = ""; private ArrayList<Integer> openSections; private ProgressBar progressBar; - private SharedPreferences pref; Thread loader; private boolean mReceiverRegistered = false; private BroadcastReceiver mReceiver; - private ExpandableListView mylist; ArrayList<RecordAll> data = new ArrayList<>(); private static final int MY_PERMISSIONS_REQUEST_WRITE_STORAGE = 3; @@ -125,9 +121,6 @@ public class RecordOverviewFragment extends UpNavigableFragment implements Check static final String TODAY = MainActivity.getInstance().getResources().getString(R.string.TODAY); static final String YESTERDAY = MainActivity.getInstance().getResources().getString(R.string.YESTERDAY); - private LayoutInflater inflater; - private ViewGroup container; - private Bundle savedInstanceState; private Menu optionsMenu; @@ -155,10 +148,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); - this.inflater = inflater; - this.container = container; - this.savedInstanceState = savedInstanceState; - setHasOptionsMenu(true); getActivity().setTitle(getResources().getString(R.string.drawer_records)); setUpDatabase(); @@ -172,9 +161,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, private void setUpDatabase() { - dbSession = HostageApplication.getInstances().getDaoSession(); + DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession, getActivity()); - pref = PreferenceManager.getDefaultSharedPreferences(getActivity()); + SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getActivity()); } @@ -235,8 +224,8 @@ private void initializeViews(LayoutInflater inflater, ViewGroup container, Bundl View rootView = inflater.inflate(this.getLayoutId(), container, false); this.rootView = rootView; - mylist = rootView.findViewById(R.id.loglistview); - this.footer = LayoutInflater.from(getApplicationContext()).inflate(R.layout.footer_listview_progressbar, null); + ExpandableListView mylist = rootView.findViewById(R.id.loglistview); + View footer = LayoutInflater.from(getApplicationContext()).inflate(R.layout.footer_listview_progressbar, null); this.progressBar = footer.findViewById(R.id.progressBar); this.spinner = rootView.findViewById(R.id.progressBar1); this.spinner.setVisibility(View.GONE); @@ -1446,8 +1435,7 @@ public boolean[] selectedGroup() { * @return ArrayList<String> protocolTitles */ public ArrayList<String> protocolTitles() { - ArrayList<String> titles = new ArrayList<>(); - titles.addAll(Arrays.asList(this.getResources().getStringArray( + ArrayList<String> titles = new ArrayList<>(Arrays.asList(this.getResources().getStringArray( R.array.protocols))); titles.add("PORTSCAN"); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java index cb52f2a3..cca2e187 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ServicesFragment.java @@ -58,11 +58,6 @@ public class ServicesFragment extends TrackerFragment { private SharedPreferences mConnectionInfo; private boolean mReceiverRegistered = false; private Profile mProfile; - private Integer[] mGhostPorts; - - private LayoutInflater inflater; - private ViewGroup container; - private Bundle savedInstanceState; public ServicesFragment() { } @@ -159,9 +154,6 @@ public void onReceive(Context context, Intent intent) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); - this.inflater = inflater; - this.container = container; - this.savedInstanceState = savedInstanceState; rootView = inflater.inflate(R.layout.fragment_services, container, false); assignViews(); @@ -240,7 +232,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa @Deprecated private void checkGhost(String protocol) { if (protocol.equals("GHOST") && mProfile.mGhostActive) { - mGhostPorts = mProfile.getGhostPorts(); + Integer[] mGhostPorts = mProfile.getGhostPorts(); if (mGhostPorts.length != 0) { for (Integer port : mGhostPorts) { if (MainActivity.getInstance().getHostageService() != null diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java index 35cddb8f..072ba7ad 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/SettingsFragment.java @@ -26,15 +26,11 @@ */ public class SettingsFragment extends UpNavigableFragment { private View v; - private Bundle savedInstanceState; private PcapLoggingManager mPcapLoggingManager; - private FragmentManager manager; - private Uri mFolderUri; private SwitchMaterial pcapSwitch; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); - this.savedInstanceState = savedInstanceState; getActivity().setTitle(getResources().getString(R.string.drawer_settings)); v = inflater.inflate(R.layout.fragment_settings, container, false); @@ -64,7 +60,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - manager = getFragmentManager(); + FragmentManager manager = getFragmentManager(); manager.beginTransaction().replace(R.id.settings_fragment_container, new PreferenceHostageFragment()).commit(); } @@ -88,6 +84,7 @@ public void onViewCreated(View view, Bundle savedInstanceState) { public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); + Uri mFolderUri; if (requestCode == PcapLoggingManager.ACTION_PICK_FOLDER_AND_ENABLE) { mFolderUri = data.getData(); mPcapLoggingManager.locationSelected(mFolderUri, true); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java index 3853cea1..9337f33e 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java @@ -39,7 +39,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -107,7 +106,6 @@ public class StatisticsFragment extends TrackerFragment implements ChecklistDial // MINIMAL 2 static final int MAX_NUMBER_OF_CHART_OBJECTS = 6; - private boolean wasBelowTimePicker; private LogFilter filter; /*Maybe used in the future if the users doesn't need a filterbutton in every situation*/ @@ -124,7 +122,6 @@ public class StatisticsFragment extends TrackerFragment implements ChecklistDial private ArrayList<PlotComparisonItem> currentData; - private DaoSession dbSession; private DAOHelper daoHelper; private ListView legendListView; @@ -132,10 +129,6 @@ public class StatisticsFragment extends TrackerFragment implements ChecklistDial private Snackbar noDataNotificationSnackbar; private String selectedCompareData = COMPARE_TITLE_AttacksPerProtocol; - private LayoutInflater inflater; - private ViewGroup container; - private Bundle savedInstanceState; - private Menu optionsMenu; /** @@ -149,10 +142,7 @@ public enum ChartType { BAR_CHART(1), LINE_CHART(2); - private final int value; - ChartType(int value) { - this.value = value; } static public ChartType create(int value) { @@ -187,12 +177,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, super.onCreateView(inflater, container, savedInstanceState); - this.inflater = inflater; - this.container = container; - this.savedInstanceState = savedInstanceState; getActivity().setTitle(getResources().getString(R.string.drawer_statistics)); - dbSession = HostageApplication.getInstances().getDaoSession(); + DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); daoHelper = new DAOHelper(dbSession, getActivity()); // Get the message from the intent @@ -754,7 +741,7 @@ private void openFilterMenuOnView(View anchor) { private void onFilterMenuItemSelected(AbstractPopupItem item) { if (item instanceof SplitPopupItem) { SplitPopupItem sItem = (SplitPopupItem) item; - wasBelowTimePicker = sItem.wasRightTouch; + boolean wasBelowTimePicker = sItem.wasRightTouch; DateTimePickerDialog.showDateTimePicker(getContext(), !wasBelowTimePicker, this); return; } @@ -1534,8 +1521,7 @@ private String getCurrentSelectedProtocol() { * @return ArrayList<String> protocolNames */ public ArrayList<String> protocolTitles() { - ArrayList<String> titles = new ArrayList<>(); - titles.addAll(Arrays.asList(getResources().getStringArray( + ArrayList<String> titles = new ArrayList<>(Arrays.asList(getResources().getStringArray( R.array.protocols))); titles.add("PORTSCAN"); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java index 090b2547..4333c665 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ThreatMapFragment.java @@ -66,7 +66,6 @@ public class ThreatMapFragment extends TrackerFragment implements GoogleMap.OnIn private GoogleMap sMap = null; private static final int LOCATION_PERMISSION_REQUEST_CODE = 100; private MapView mapView = null; - private View rootView = null; private Thread mLoader = null; private final HashMap<String, String> sMarkerIDToSSID = new HashMap<>(); private String mLocationProvider; @@ -98,7 +97,7 @@ public View onCreateView(final LayoutInflater inflater, ViewGroup container, activity.setTitle(getResources().getString(R.string.drawer_threat_map)); } - rootView = inflater.inflate(R.layout.fragment_threatmap, container, false); + View rootView = inflater.inflate(R.layout.fragment_threatmap, container, false); this.inflater = inflater; if (rootView != null) { @@ -478,7 +477,7 @@ public Point(double sx, double sy) { * contains heuristic to split SSIDs by hostage.location * see MAX_DISTANCE */ - private class SSIDArea { + private static class SSIDArea { private final Point mMinimum; private final Point mMaximum; diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java index f7aec697..a9dba187 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/opengl/AnimatedMesh.java @@ -22,11 +22,8 @@ */ public class AnimatedMesh { - private ByteBuffer data; - private int vertexOffset; private int vertexSize; - private int triangleOffset; private int triangleCount; private int vertexBuffer; // vbo @@ -132,7 +129,7 @@ private class Action { } } - private class Track { + private static class Track { @SuppressWarnings("unused") public int boneIndex; public final ArrayList<JointPose> poses; @@ -226,7 +223,7 @@ public AnimatedMesh(InputStream is) { } //data = ByteBuffer.wrap(out.toByteArray()); // doesn't work data needs to be direct - data = ByteBuffer.allocateDirect(out.size()); + ByteBuffer data = ByteBuffer.allocateDirect(out.size()); data.order(ByteOrder.nativeOrder()); data.put(out.toByteArray()); data.position(0); @@ -237,9 +234,9 @@ public AnimatedMesh(InputStream is) { //assert(magicNum == ('A' << 24 | 'M' << 16 | 'S' << 8 | 'H') && version == 1); vertexSize = 48; - vertexOffset = data.getInt(); + int vertexOffset = data.getInt(); int vertexCount = data.getInt(); - triangleOffset = data.getInt(); + int triangleOffset = data.getInt(); triangleCount = data.getInt(); int boneOffset = data.getInt(); int boneCount = data.getInt(); diff --git a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java index 9c885133..991ad0cc 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/popup/AbstractPopupItem.java @@ -59,7 +59,7 @@ public void setMultipleData(HashMap<Object, Object> map){ } public void setTitle(String title){ - title = title; + this.title = title; if (rootView != null) this.configureItemView(rootView); } public String getTitle(){ From b972a3e4c5c6822e14d3a2f7ebe4619190bbf19c Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 18 Aug 2021 15:18:36 +0200 Subject: [PATCH 06/26] delete a bunch of unused iptables code --- .../hostage/system/iptablesUtils/Api.java | 416 ------------------ 1 file changed, 416 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java index 4686f538..c5991db0 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/Api.java @@ -260,22 +260,6 @@ private static void runCommands(String command) { } } - // TODO write javadoc - @Deprecated - public static void runCommand(String command) { - Process process; - try { - process = Runtime.getRuntime().exec(command); - if (process.waitFor() == 0) { - Log.d(TAG, "Command executed successfully"); - } else { - Log.d(TAG, "Command executed unsuccessfully"); - } - } catch (IOException | InterruptedException e) { - Log.e(TAG, "Error running commands: " + e.getMessage()); - } - } - /** * TODO write javadoc * @@ -312,16 +296,6 @@ public static void addRedirectionPorts() { Listener.addRealPorts("SMTP", 28639); } - /** - * Checks if the netfilter is supported for the device. - * - * @return true if the device supports the netfilter. - */ - public static boolean isNetfilterSupported() { - return new File("/proc/net/netfilter").exists() - && new File("/proc/net/ip_tables_targets").exists(); - } - /** * Display a simple alert box * @@ -335,396 +309,6 @@ public static void toast(final Context ctx, final CharSequence msgText) { } } - public static void toast(final Context ctx, final CharSequence msgText, final int toastlen) { - if (ctx != null) { - Handler mHandler = new Handler(Looper.getMainLooper()); - mHandler.post(() -> Toast.makeText(ctx, msgText, toastlen).show()); - } - } - - /** - * Purge and re-add all rules (internal implementation). - * - * @param ctx application context (mandatory) - */ - private static boolean applyIptablesRulesImpl(final Context ctx, - List<String> out, boolean ipv6) { - if (ctx == null) { - return false; - } - List<String> cmds = new ArrayList<>(); - - // prevent data leaks due to incomplete rules - Log.i(TAG, "Setting OUTPUT to Drop"); - cmds.add("-P OUTPUT DROP"); - - for (String s : staticChains) { - cmds.add("#NOCHK# -N " + CHAIN_NAME + s); - cmds.add("-F " + CHAIN_NAME + s); - } - cmds.add("#NOCHK# -D OUTPUT -j " + CHAIN_NAME); - cmds.add("-I OUTPUT 1 -j " + CHAIN_NAME); - - for (final String itf : ITFS_WIFI) { - cmds.add("-A " + CHAIN_NAME + " -o " + itf + " -j " + CHAIN_NAME + "-wifi"); - } - - for (final String itf : ITFS_3G) { - cmds.add("-A " + CHAIN_NAME + " -o " + itf + " -j " + CHAIN_NAME + "-3g"); - } - - Log.i(TAG, "Setting OUTPUT to Accept State"); - cmds.add("-P OUTPUT ACCEPT"); - - iptablesCommands(cmds, out, ipv6); - return true; - } - - /** - * Add the repetitive parts (ipPath and such) to an iptables command list - * - * @param in Commands in the format: "-A foo ...", "#NOCHK# -A foo ...", or "#LITERAL# <UNIX command>" - * @param out A list of UNIX commands to execute - */ - private static void iptablesCommands(List<String> in, List<String> out, boolean ipv6) { - String ipPath = "/system/bin/iptables"; - - boolean firstLit = true; - for (String s : in) { - if (s.matches("#LITERAL# .*")) { - if (firstLit) { - // export vars for the benefit of custom scripts - // "true" is a dummy command which needs to return success - firstLit = false; - out.add("export IPTABLES=\"" + ipPath + "\"; " - + "export IPV6=" + (ipv6 ? "1" : "0") + "; " - + "true"); - } - out.add(s.replaceFirst("^#LITERAL# ", "")); - } else if (s.matches("#NOCHK# .*")) { - out.add(s.replaceFirst("^#NOCHK# ", "#NOCHK# " + ipPath + " ")); - } else { - out.add(ipPath + " " + s); - } - } - } - - /** - * Purge and re-add all saved rules (not in-memory ones). - * This is much faster than just calling "applyIptablesRules", since it don't need to read installed applications. - * - * @param ctx application context (mandatory) - * @param callback If non-null, use a callback instead of blocking the current thread - */ - public static boolean applySavedIp4tablesRules(Context ctx, List<String> cmds, RootCommand callback) { - if (ctx == null) { - return false; - } - try { - Log.i(TAG, "Using applySaved4IptablesRules"); - callback.setRetryExitCode(IPTABLES_TRY_AGAIN).run(ctx, cmds, false); - return true; - } catch (Exception e) { - Log.d(TAG, "Exception while applying rules: " + e.getMessage()); - applyDefaultChains(ctx, callback); - return false; - } - } - - - public static boolean applySavedIp6tablesRules(Context ctx, List<String> cmds, RootCommand callback) { - if (ctx == null) { - return false; - } - try { - Log.i(TAG, "Using applySavedIp6tablesRules"); - callback.setRetryExitCode(IPTABLES_TRY_AGAIN).run(ctx, cmds, true); - return true; - } catch (Exception e) { - Log.d(TAG, "Exception while applying rules: " + e.getMessage()); - applyDefaultChains(ctx, callback); - return false; - } - } - - /** - * Purge all iptables rules. - * - * @param ctx mandatory context - * @param callback If non-null, use a callback instead of blocking the current thread - * @return true if the rules were purged - */ - public static boolean purgeIptables(Context ctx, RootCommand callback) { - List<String> cmds = new ArrayList<>(); - List<String> cmdsv4 = new ArrayList<>(); - List<String> out = new ArrayList<>(); - - for (String s : staticChains) { - cmds.add("-F " + CHAIN_NAME + s); - } - - //make sure reset the OUTPUT chain to accept state. - cmds.add("-P OUTPUT ACCEPT"); - cmds.add("-D INPUT -j " + CHAIN_NAME + "-input"); - try { - // IPv4 - iptablesCommands(cmds, out, false); - iptablesCommands(cmdsv4, out, false); - - if (callback != null) { - callback.setRetryExitCode(IPTABLES_TRY_AGAIN).run(ctx, out); - } - - return true; - } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); - return false; - } - } - - - /** - * Retrieve the current set of IPv4 or IPv6 rules and pass it to a callback - * - * @param ctx application context - * @param callback callback to receive rule list - * @param useIPV6 true to list IPv6 rules, false to list IPv4 rules - */ - public static void fetchIptablesRules(Context ctx, boolean useIPV6, RootCommand callback) { - List<String> cmds = new ArrayList<>(); - List<String> out = new ArrayList<>(); - cmds.add("-n -v -L"); - iptablesCommands(cmds, out, false); - if (useIPV6) { - iptablesCommands(cmds, out, true); - } - callback.run(ctx, out); - } - - /** - * Run a list of commands with both iptables and ip6tables - * - * @param ctx application context - * @param cmds list of commands to run - * @param callback callback for completion - */ - public static void apply46(Context ctx, List<String> cmds, RootCommand callback) { - List<String> out = new ArrayList<>(); - iptablesCommands(cmds, out, false); - callback.setRetryExitCode(IPTABLES_TRY_AGAIN).run(ctx, out); - } - - public static void applyIPv6Quick(Context ctx, List<String> cmds, RootCommand callback) { - List<String> out = new ArrayList<>(); - iptablesCommands(cmds, out, true); - callback.setRetryExitCode(IPTABLES_TRY_AGAIN).run(ctx, out); - } - - public static void applyQuick(Context ctx, List<String> cmds, RootCommand callback) { - List<String> out = new ArrayList<>(); - - iptablesCommands(cmds, out, false); - - callback.setRetryExitCode(IPTABLES_TRY_AGAIN).run(ctx, out); - } - - /** - * Delete all kingroot firewall rules. For diagnostic purposes only. - * - * @param ctx application context - * @param callback callback for completion - */ - public static void flushAllRules(Context ctx, RootCommand callback) { - List<String> cmds = new ArrayList<>(); - cmds.add("-F"); - cmds.add("-X"); - apply46(ctx, cmds, callback); - } - - /** - * Apply single rule - * - * @param ctx context - * @param rule Rule - * @param isIpv6 Ipv6 protocol - * @param callback callback - */ - public static void applyRule(Context ctx, String rule, boolean isIpv6, RootCommand callback) { - List<String> cmds = new ArrayList<>(); - cmds.add(rule); - List<String> out = new ArrayList<>(); - iptablesCommands(cmds, out, isIpv6); - callback.run(ctx, out); - } - - private static String calculateMD5(File updateFile) { - MessageDigest digest; - try { - digest = MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException e) { - Log.e(TAG, "Exception while getting digest", e); - return null; - } - - InputStream is; - try { - is = new FileInputStream(updateFile); - } catch (FileNotFoundException e) { - Log.e(TAG, "Exception while getting FileInputStream", e); - return null; - } - - byte[] buffer = new byte[8192]; - int read; - try { - while ((read = is.read(buffer)) > 0) { - digest.update(buffer, 0, read); - } - byte[] md5sum = digest.digest(); - BigInteger bigInt = new BigInteger(1, md5sum); - String output = bigInt.toString(16); - // Fill to 32 chars - output = String.format("%32s", output).replace(' ', '0'); - return output; - } catch (IOException e) { - throw new RuntimeException("Unable to process file for MD5", e); - } finally { - try { - is.close(); - } catch (IOException e) { - Log.e(TAG, "Exception on closing MD5 input stream", e); - } - } - } - - public static String loadData(final Context context, - final String resourceName) throws IOException { - int resourceIdentifier = context - .getApplicationContext() - .getResources() - .getIdentifier(resourceName, "raw", - context.getApplicationContext().getPackageName()); - if (resourceIdentifier != 0) { - InputStream inputStream = context.getApplicationContext() - .getResources().openRawResource(resourceIdentifier); - BufferedReader reader = new BufferedReader(new InputStreamReader( - inputStream, StandardCharsets.UTF_8)); - String line; - StringBuilder data = new StringBuilder(); - while ((line = reader.readLine()) != null) { - data.append(line); - } - reader.close(); - return data.toString(); - } - return null; - } - - /* Checks if external storage is available for read and write */ - public static boolean isExternalStorageWritable() { - String state = Environment.getExternalStorageState(); - return Environment.MEDIA_MOUNTED.equals(state); - } - - /* Checks if external storage is available to at least read */ - public static boolean isExternalStorageReadable() { - String state = Environment.getExternalStorageState(); - return Environment.MEDIA_MOUNTED.equals(state) - || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state); - } - - /** - * Encrypt the password - * - * @param key the key - * @param data the data - * @return - */ - public static String hideCrypt(String key, String data) { - if (key == null || data == null) - return null; - String encodeStr = null; - try { - DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(charsetName)); - SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm); - SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); - byte[] dataBytes = data.getBytes(charsetName); - Cipher cipher = Cipher.getInstance(algorithm); - cipher.init(Cipher.ENCRYPT_MODE, secretKey); - encodeStr = Base64.encodeToString(cipher.doFinal(dataBytes), base64Mode); - - } catch (IOException | InvalidKeySpecException | InvalidKeyException | NoSuchAlgorithmException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException e) { - Log.e(TAG, e.getLocalizedMessage()); - } - return encodeStr; - } - - /** - * Decrypt the password - * - * @param key the key - * @param data the data - * @return decrypted string - */ - public static String unhideCrypt(String key, String data) { - if (key == null || data == null) - return null; - - String decryptStr = null; - try { - byte[] dataBytes = Base64.decode(data, base64Mode); - DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(charsetName)); - SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithm); - SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); - Cipher cipher = Cipher.getInstance(algorithm); - cipher.init(Cipher.DECRYPT_MODE, secretKey); - byte[] dataBytesDecrypted = (cipher.doFinal(dataBytes)); - decryptStr = new String(dataBytesDecrypted); - } catch (InvalidKeyException | UnsupportedEncodingException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException e) { - Log.e(TAG, e.getLocalizedMessage()); - } - return decryptStr; - } - - - /** - * Apply default chains based on preference - * - * @param ctx Context - */ - public static void applyDefaultChains(Context ctx, RootCommand callback) { - List<String> cmds = new ArrayList<>(); - cmds.add("-P INPUT ACCEPT"); - cmds.add("-P FORWARD ACCEPT"); - cmds.add("-P OUTPUT ACCEPT"); - - applyQuick(ctx, cmds, callback); - applyDefaultChainsv6(ctx, callback); - } - - public static void applyDefaultChainsv6(Context ctx, RootCommand callback) { - List<String> cmds = new ArrayList<>(); - cmds.add("-P INPUT ACCEPT"); - cmds.add("-P FORWARD ACCEPT"); - cmds.add("-P OUTPUT ACCEPT"); - - applyIPv6Quick(ctx, cmds, callback); - - } - - /** - * Delete all firewall rules. For diagnostic purposes only. - * - * @param ctx application context - * @param callback callback for completion - */ - public static void flushOtherRules(Context ctx, RootCommand callback) { - List<String> cmds = new ArrayList<>(); - cmds.add("-F firewall"); - cmds.add("-X firewall"); - apply46(ctx, cmds, callback); - } - public static void sendToastBroadcast(Context ctx, String message) { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("TOAST"); From e2038a72b8c18f9a961e4f020e34a615b0a109d2 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 18 Aug 2021 15:19:07 +0200 Subject: [PATCH 07/26] Android Style and correctness changes as proposed by IDE --- build.gradle | 2 +- src/main/AndroidManifest.xml | 4 +- .../java/dk/aau/netsec/hostage/Hostage.java | 1 + .../utils/smptUtils/SimpleSmtpServer.java | 1 - .../netsec/hostage/services/MultiStage.java | 3 +- .../iptablesUtils/RootShellService.java | 46 +++++++++---------- .../iptablesUtils/RootShellService2.java | 46 +++++++++---------- .../ui/fragment/ProfileEditFragment.java | 1 + .../ui/fragment/RecordDetailFragment.java | 1 + .../res/layout-land/fragment_statistics.xml | 16 +++---- src/main/res/layout/fragment_about.xml | 6 +-- src/main/res/layout/fragment_home.xml | 1 - src/main/res/layout/fragment_services.xml | 9 ++-- src/main/res/layout/fragment_statistics.xml | 10 ++-- src/main/res/layout/plot_list_item.xml | 2 +- src/main/res/layout/preference_warning.xml | 3 +- src/main/res/layout/services_list_item.xml | 2 - src/main/res/layout/simple_popup_item.xml | 4 +- src/main/res/layout/split_popup_item.xml | 14 ++---- src/main/res/menu/statistics_actions.xml | 4 +- src/main/res/values-de/strings.xml | 7 ++- src/main/res/values/strings.xml | 1 + src/main/res/xml/profile_preferences.xml | 2 +- 23 files changed, 88 insertions(+), 98 deletions(-) diff --git a/build.gradle b/build.gradle index f4f40266..6289a566 100644 --- a/build.gradle +++ b/build.gradle @@ -61,7 +61,7 @@ dependencies { //forked repo https://github.com/irinil/qpid-broker-j //implementation group: 'org.apache.qpid', name: 'qpid-broker-core', version: '8.0.0' //default package doesn't support android. // https://mvnrepository.com/artifact/javax.naming/jndi - implementation files('libs/jndi-1.2.1.jar'); + implementation files('libs/jndi-1.2.1.jar') // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-amqp-0-8-protocol implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-amqp-0-8-protocol', version: '8.0.4' // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-amqp-1-0-protocol diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 61122b9d..54b51b60 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -34,6 +34,7 @@ <application android:name="dk.aau.netsec.hostage.HostageApplication" android:allowBackup="true" + android:fullBackupContent="true" android:allowClearUserData="true" android:hardwareAccelerated="true" android:icon="@drawable/ic_launcher" @@ -53,7 +54,8 @@ android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/app_name" android:launchMode="singleInstance" - android:screenOrientation="fullSensor"> + android:screenOrientation="fullSensor" + android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> diff --git a/src/main/java/dk/aau/netsec/hostage/Hostage.java b/src/main/java/dk/aau/netsec/hostage/Hostage.java index 7f2c713b..b06fb48b 100644 --- a/src/main/java/dk/aau/netsec/hostage/Hostage.java +++ b/src/main/java/dk/aau/netsec/hostage/Hostage.java @@ -487,6 +487,7 @@ private void attackNotification() { mNotificationManager.createNotificationChannel(channel); Notification.Builder notificationBuilder = new Notification.Builder(this, "32"); notificationBuilder.setContentTitle(getString(R.string.app_name)).setTicker(getString(R.string.honeypot_live_threat)) +// TODO replace notification icons with a white variation .setContentText(getString(R.string.honeypot_live_threat)).setSmallIcon(R.drawable.ic_service_red).setAutoCancel(true).setWhen(System.currentTimeMillis()) .setSound(Uri.parse(strRingtonePreference)); diff --git a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java index a9c93922..6a0adde6 100644 --- a/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java +++ b/src/main/java/dk/aau/netsec/hostage/protocol/utils/smptUtils/SimpleSmtpServer.java @@ -163,7 +163,6 @@ private void performWork() { // Server: loop until stopped while (!stopped) { // Start server socket and listen for client connections - //noinspection resource try (Socket socket = serverSocket.accept(); Scanner input = new Scanner(new InputStreamReader(socket.getInputStream(), StandardCharsets.ISO_8859_1)).useDelimiter(CRLF); PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.ISO_8859_1));) { diff --git a/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java b/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java index 68bd266b..bbfabd6c 100644 --- a/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java +++ b/src/main/java/dk/aau/netsec/hostage/services/MultiStage.java @@ -238,7 +238,8 @@ private void startCustomForeground() { manager.createNotificationChannel(chan); Notification.Builder notificationBuilder = new Notification.Builder(this, NOTIFICATION_CHANNEL_ID); - notificationBuilder.setContentTitle("MultiStage").setContentText("MultiStage running...").setSmallIcon(R.drawable.ic_launcher); + // TODO replace notification icons with a white variation + notificationBuilder.setContentTitle("MultiStage").setContentText(getString(R.string.multistage_notification)).setSmallIcon(R.drawable.ic_launcher); notification = notificationBuilder.setOngoing(true) .setPriority(Notification.PRIORITY_LOW) diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java index f5db0165..1005e69c 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java @@ -56,11 +56,9 @@ public class RootShellService extends Service implements Cloneable { //number of retries - increase the count private final static int MAX_RETRIES = 10; private static Shell.Interactive rootSession; - private static Context mContext; private static NotificationManager notificationManager; private static ShellState rootState = ShellState.INIT; private static final LinkedList<RootCommand> waitQueue = new LinkedList<>(); - private static NotificationCompat.Builder builder; @Override public RootShellService clone() { @@ -73,7 +71,7 @@ public RootShellService clone() { return rootShellService; } - private static void complete(final RootCommand state, int exitCode) { + private static void complete(final RootCommand state, Context context, int exitCode) { if (enableProfiling) { Log.d(TAG, "RootShell: " + state.getCommands().size() + " commands completed in " + (new Date().getTime() - state.startTime.getTime()) + " ms"); @@ -85,9 +83,9 @@ private static void complete(final RootCommand state, int exitCode) { } if (exitCode == 0 && state.successToast != NO_TOAST) { - Api.sendToastBroadcast(mContext, mContext.getString(state.successToast)); + Api.sendToastBroadcast(context, context.getString(state.successToast)); } else if (exitCode != 0 && state.failureToast != NO_TOAST) { - Api.sendToastBroadcast(mContext, mContext.getString(state.failureToast)); + Api.sendToastBroadcast(context, context.getString(state.failureToast)); } if (notificationManager != null) { @@ -95,7 +93,7 @@ private static void complete(final RootCommand state, int exitCode) { } } - private static void runNextSubmission() { + private static void runNextSubmission(Context context) { RootCommand state; try { @@ -115,21 +113,21 @@ private static void runNextSubmission() { } if (rootState == ShellState.FAIL) { // if we don't have root, abort all queued commands - complete(state, EXIT_NO_ROOT_ACCESS); + complete(state, context, EXIT_NO_ROOT_ACCESS); } else if (rootState == ShellState.READY) { rootState = ShellState.BUSY; - processCommands(state); + processCommands(context, state); } } } - private static void processCommands(final RootCommand state) { + private static void processCommands(Context context, final RootCommand state) { if (state.commandIndex < state.getCommands().size() && state.getCommands().get(state.commandIndex) != null) { String command = state.getCommands().get(state.commandIndex); //not to send conflicting status if (!state.isv6) { - sendUpdate(state); + sendUpdate(context, state); } if (command != null) { state.ignoreExitCode = false; @@ -159,7 +157,7 @@ private static void processCommands(final RootCommand state) { state.retryCount++; Log.d(TAG, "command '" + state.lastCommand + "' exited with status " + exitCode + ", retrying (attempt " + state.retryCount + "/" + MAX_RETRIES + ")"); - processCommands(state); + processCommands(context, state); return; } @@ -168,7 +166,7 @@ private static void processCommands(final RootCommand state) { boolean errorExit = exitCode != 0 && !state.ignoreExitCode; if (state.commandIndex >= state.getCommands().size() || errorExit) { - complete(state, exitCode); + complete(state, context, exitCode); if (exitCode < 0) { rootState = ShellState.FAIL; Log.e(TAG, "libsuperuser error " + exitCode + " on command '" + state.lastCommand + "'"); @@ -179,9 +177,9 @@ private static void processCommands(final RootCommand state) { } rootState = ShellState.READY; } - runNextSubmission(); + runNextSubmission(context); } else { - processCommands(state); + processCommands(context, state); } }); } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { @@ -189,17 +187,17 @@ private static void processCommands(final RootCommand state) { } } } else { - complete(state, 0); + complete(state, context, 0); } } - private static void sendUpdate(final RootCommand state2) { + private static void sendUpdate(Context context, final RootCommand state2) { new Thread(() -> { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("UPDATEUI4"); broadcastIntent.putExtra("SIZE", state2.getCommands().size()); broadcastIntent.putExtra("INDEX", state2.commandIndex); - LocalBroadcastManager.getInstance(mContext).sendBroadcast(broadcastIntent); + LocalBroadcastManager.getInstance(context).sendBroadcast(broadcastIntent); }).start(); } @@ -224,7 +222,7 @@ private void setupLogging() { } - private void startShellInBackground() { + private void startShellInBackground(Context context) { Log.d(TAG, "Starting root shell..."); setupLogging(); //start only rootSession is null @@ -241,7 +239,7 @@ private void startShellInBackground() { Log.d(TAG, "Root shell is open"); rootState = ShellState.READY; } - runNextSubmission(); + runNextSubmission(context); }); } @@ -253,7 +251,7 @@ private void reOpenShell(Context context) { notificationManager.cancel(NOTIFICATION_ID); } rootState = ShellState.BUSY; - startShellInBackground(); + startShellInBackground(context); try { Intent intent = new Intent(context, RootShellService.class); context.startService(intent); @@ -269,9 +267,7 @@ public void runScriptAsRoot(Context ctx, List<String> cmds, RootCommand state) { state.setCommands(cmds); state.commandIndex = 0; state.retryCount = 0; - if (mContext == null) { - mContext = ctx.getApplicationContext(); - } + //already in memory and applied //add it to queue Log.d(TAG, "Hashing...." + state.isv6); @@ -282,7 +278,7 @@ public void runScriptAsRoot(Context ctx, List<String> cmds, RootCommand state) { if (rootState == ShellState.INIT || (rootState == ShellState.FAIL && state.reopenShell)) { reOpenShell(ctx); } else if (rootState != ShellState.BUSY) { - runNextSubmission(); + runNextSubmission(ctx); } else { new Timer().schedule(new TimerTask() { @Override @@ -293,7 +289,7 @@ public void run() { Log.i(TAG, "Forcefully changing the state " + rootState); rootState = ShellState.READY; } - runNextSubmission(); + runNextSubmission(ctx); } }, 10000); } diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java index 8339443c..38d25b9e 100644 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java +++ b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java @@ -56,11 +56,11 @@ public class RootShellService2 extends Service { //number of retries - increase the count private final static int MAX_RETRIES = 10; private static Shell.Interactive rootSession; - private static Context mContext; +// private static Context mContext; private static ShellState rootState = ShellState.INIT; private static final LinkedList<RootCommand> waitQueue = new LinkedList<>(); - private static void complete(final RootCommand state, int exitCode) { + private static void complete(final RootCommand state, Context context, int exitCode) { if (enableProfiling) { Log.d(TAG, "RootShell: " + state.getCommands().size() + " commands completed in " + (new Date().getTime() - state.startTime.getTime()) + " ms"); @@ -72,14 +72,14 @@ private static void complete(final RootCommand state, int exitCode) { } if (exitCode == 0 && state.successToast != NO_TOAST) { - Api.sendToastBroadcast(mContext, mContext.getString(state.successToast)); + Api.sendToastBroadcast(context, context.getString(state.successToast)); } else if (exitCode != 0 && state.failureToast != NO_TOAST) { - Api.sendToastBroadcast(mContext, mContext.getString(state.failureToast)); + Api.sendToastBroadcast(context, context.getString(state.failureToast)); } } - private static void runNextSubmission() { + private static void runNextSubmission(Context context) { RootCommand state; try { @@ -99,19 +99,19 @@ private static void runNextSubmission() { } if (rootState == ShellState.FAIL) { // if we don't have root, abort all queued commands - complete(state, EXIT_NO_ROOT_ACCESS); + complete(state, context, EXIT_NO_ROOT_ACCESS); } else if (rootState == ShellState.READY) { rootState = ShellState.BUSY; - processCommands(state); + processCommands(state, context); } } } - private static void processCommands(final RootCommand state) { + private static void processCommands(final RootCommand state, Context context) { if (state.commandIndex < state.getCommands().size() && state.getCommands().get(state.commandIndex) != null) { String command = state.getCommands().get(state.commandIndex); //not to send conflicting status - sendUpdate(state); + sendUpdate(state, context); if (command != null) { state.ignoreExitCode = false; @@ -141,7 +141,7 @@ private static void processCommands(final RootCommand state) { state.retryCount++; Log.d(TAG, "command '" + state.lastCommand + "' exited with status " + exitCode + ", retrying (attempt " + state.retryCount + "/" + MAX_RETRIES + ")"); - processCommands(state); + processCommands(state, context); return; } @@ -150,7 +150,7 @@ private static void processCommands(final RootCommand state) { boolean errorExit = exitCode != 0 && !state.ignoreExitCode; if (state.commandIndex >= state.getCommands().size() || errorExit) { - complete(state, exitCode); + complete(state, context, exitCode); if (exitCode < 0) { rootState = ShellState.FAIL; Log.e(TAG, "libsuperuser error " + exitCode + " on command '" + state.lastCommand + "'"); @@ -161,9 +161,9 @@ private static void processCommands(final RootCommand state) { } rootState = ShellState.READY; } - runNextSubmission(); + runNextSubmission(context); } else { - processCommands(state); + processCommands(state, context); } }); } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { @@ -171,17 +171,17 @@ private static void processCommands(final RootCommand state) { } } } else { - complete(state, 0); + complete(state, context, 0); } } - private static void sendUpdate(final RootCommand state2) { + private static void sendUpdate(final RootCommand state2, Context context) { new Thread(() -> { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("UPDATEUI6"); broadcastIntent.putExtra("SIZE", state2.getCommands().size()); broadcastIntent.putExtra("INDEX", state2.commandIndex); - LocalBroadcastManager.getInstance(mContext).sendBroadcast(broadcastIntent); + LocalBroadcastManager.getInstance(context).sendBroadcast(broadcastIntent); }).start(); } @@ -206,7 +206,7 @@ private void setupLogging() { } - private void startShellInBackground() { + private void startShellInBackground(Context context) { Log.d(TAG, "Starting root shell..."); setupLogging(); //start only rootSession is null @@ -223,7 +223,7 @@ private void startShellInBackground() { Log.d(TAG, "Root shell is open"); rootState = ShellState.READY; } - runNextSubmission(); + runNextSubmission(context); }); } @@ -232,7 +232,7 @@ private void startShellInBackground() { private void reOpenShell(Context context) { if (rootState == null || rootState != ShellState.READY || rootState == ShellState.FAIL) { rootState = ShellState.BUSY; - startShellInBackground(); + startShellInBackground(context); Intent intent = new Intent(context, RootShellService2.class); context.startService(intent); } @@ -244,9 +244,7 @@ public void runScriptAsRoot(Context ctx, List<String> cmds, RootCommand state) { state.setCommands(cmds); state.commandIndex = 0; state.retryCount = 0; - if (mContext == null) { - mContext = ctx.getApplicationContext(); - } + //already in memory and applied //add it to queue Log.d(TAG, "Hashing...." + state.isv6); @@ -257,7 +255,7 @@ public void runScriptAsRoot(Context ctx, List<String> cmds, RootCommand state) { if (rootState == ShellState.INIT || (rootState == ShellState.FAIL && state.reopenShell)) { reOpenShell(ctx); } else if (rootState != ShellState.BUSY) { - runNextSubmission(); + runNextSubmission(ctx); } else { new Timer().schedule(new TimerTask() { @Override @@ -268,7 +266,7 @@ public void run() { Log.i(TAG, "Forcefully changing the state " + rootState); rootState = ShellState.READY; } - runNextSubmission(); + runNextSubmission(ctx); } }, 10000); } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java index 6e6bba4f..73048a92 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ProfileEditFragment.java @@ -207,6 +207,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { } if (profile == null || profile.isEditable()) { +// TODO check why profile warning is not displayed getPreferenceScreen().removePreference(findPreference("pref_profile_warning")); } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java index 360b3f5d..916fb0ad 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordDetailFragment.java @@ -210,6 +210,7 @@ private void addConversationText(View row, String from, String to, RecordAll r) changeTextToHex(hexButton, r, conversationContent); Date date = new Date(r.getTimestamp()); +// TODO verify that String.format works as intended here conversationInfo.setText(String.format(getString(R.string.record_details_info), from, to, getDateAsString(date), getTimeAsString(date))); if (r.getPacket() != null) conversationContent.setText(r.getPacket()); diff --git a/src/main/res/layout-land/fragment_statistics.xml b/src/main/res/layout-land/fragment_statistics.xml index ffbf7080..4927ff83 100644 --- a/src/main/res/layout-land/fragment_statistics.xml +++ b/src/main/res/layout-land/fragment_statistics.xml @@ -6,17 +6,15 @@ android:background="@android:color/transparent" > - - - - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/toolbar_layout" android:paddingLeft="4dp" android:paddingRight="4dp" - android:weightSum="2."> + android:weightSum="2." + android:baselineAligned="false"> <RelativeLayout android:layout_width="fill_parent" @@ -34,7 +32,7 @@ android:visibility="gone"/> <!-- TITLE LAYOUT --> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="vertical" android:layout_height="40dp" android:layout_width="match_parent" @@ -52,7 +50,7 @@ android:id="@+id/title_text_view" /> </LinearLayout> <!-- PLOT LAYOUT --> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent" @@ -66,14 +64,14 @@ <!-- LIST LAYOUT --> - <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + <RelativeLayout android:layout_height="match_parent" android:layout_width="match_parent" android:paddingTop="5dp" android:layout_weight="1.1" > - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="horizontal" android:layout_height="30dp" android:layout_width="match_parent" diff --git a/src/main/res/layout/fragment_about.xml b/src/main/res/layout/fragment_about.xml index 073b79da..e2d8d2ea 100644 --- a/src/main/res/layout/fragment_about.xml +++ b/src/main/res/layout/fragment_about.xml @@ -51,14 +51,13 @@ <RelativeLayout android:orientation="horizontal" android:layout_width="fill_parent" - android:layout_height="fill_parent" android:layout_weight="0.7" + android:layout_height="fill_parent" android:paddingTop="15dp"> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_weight="0.5" android:layout_alignTop="@+id/linearLayout" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="10dp"> @@ -98,14 +97,13 @@ <RelativeLayout android:orientation="horizontal" android:layout_width="fill_parent" - android:layout_height="fill_parent" android:layout_weight="0.7" + android:layout_height="fill_parent" android:paddingTop="15dp"> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_weight="0.5" android:layout_alignTop="@+id/linearLayout" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="10dp"> diff --git a/src/main/res/layout/fragment_home.xml b/src/main/res/layout/fragment_home.xml index 51a18f05..ad7f2e25 100644 --- a/src/main/res/layout/fragment_home.xml +++ b/src/main/res/layout/fragment_home.xml @@ -40,7 +40,6 @@ android:layout_centerVertical="true" android:layout_gravity="center_horizontal" android:layout_marginLeft="15dp" - android:layout_weight="1" android:text="@string/monitor_current_connection" android:textColor="?attr/colorOnBackground" android:textStyle="bold" /> diff --git a/src/main/res/layout/fragment_services.xml b/src/main/res/layout/fragment_services.xml index 7537a337..49f5aca4 100644 --- a/src/main/res/layout/fragment_services.xml +++ b/src/main/res/layout/fragment_services.xml @@ -16,8 +16,7 @@ android:layout_alignParentRight="false" android:layout_marginLeft="15dp" android:layout_marginTop="20dp" - android:layout_weight="1" - android:text="@string/current_connection" + android:text="@string/current_connection" android:textSize="18dp" android:textStyle="bold" /> @@ -71,8 +70,7 @@ android:layout_alignParentRight="false" android:layout_marginLeft="15dp" android:layout_marginTop="35dp" - android:layout_weight="1" - android:text="@string/monitor_services" + android:text="@string/monitor_services" android:textStyle="bold" android:textSize="20dp"/> @@ -90,8 +88,7 @@ android:layout_marginRight="15dp" android:layout_marginTop="30dp" android:layout_marginBottom="0dp" - android:layout_weight="1" - android:scaleX="1.1" + android:scaleX="1.1" android:scaleY="1.1" android:checked="false" android:textSize="10dp" /> diff --git a/src/main/res/layout/fragment_statistics.xml b/src/main/res/layout/fragment_statistics.xml index a8afd52f..e7f453b3 100644 --- a/src/main/res/layout/fragment_statistics.xml +++ b/src/main/res/layout/fragment_statistics.xml @@ -6,7 +6,7 @@ android:background="@android:color/transparent" > - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" @@ -30,7 +30,7 @@ android:visibility="gone"/> <!-- TITLE LAYOUT --> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="vertical" android:layout_height="40dp" android:layout_width="match_parent" @@ -48,7 +48,7 @@ android:id="@+id/title_text_view" /> </LinearLayout> <!-- PLOT LAYOUT --> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent" @@ -62,14 +62,14 @@ <!-- LIST LAYOUT --> - <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + <RelativeLayout android:layout_height="match_parent" android:layout_width="match_parent" android:paddingTop="5dp" android:layout_weight="1.1" > - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:orientation="horizontal" android:layout_height="30dp" android:layout_width="match_parent" diff --git a/src/main/res/layout/plot_list_item.xml b/src/main/res/layout/plot_list_item.xml index ba15210d..38177e9f 100644 --- a/src/main/res/layout/plot_list_item.xml +++ b/src/main/res/layout/plot_list_item.xml @@ -6,7 +6,7 @@ android:orientation="horizontal" android:weightSum="10"> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" diff --git a/src/main/res/layout/preference_warning.xml b/src/main/res/layout/preference_warning.xml index 71cf2294..de3e78e6 100644 --- a/src/main/res/layout/preference_warning.xml +++ b/src/main/res/layout/preference_warning.xml @@ -11,7 +11,8 @@ android:layout_marginBottom="6dip" android:minHeight="?android:attr/listPreferredItemHeight" android:background="@drawable/panel_warning_bg" - android:paddingEnd="?android:attr/scrollbarSize"> + android:paddingEnd="?android:attr/scrollbarSize" + android:baselineAligned="false"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/src/main/res/layout/services_list_item.xml b/src/main/res/layout/services_list_item.xml index 974b0a1b..e8edb19c 100644 --- a/src/main/res/layout/services_list_item.xml +++ b/src/main/res/layout/services_list_item.xml @@ -30,7 +30,6 @@ android:layout_alignParentRight="false" android:layout_marginLeft="50dp" android:layout_marginTop="5dp" - android:layout_weight="1" android:textSize="16dp" android:textStyle="bold" android:textColor="?attr/colorOnBackground" @@ -43,7 +42,6 @@ android:layout_alignParentLeft="true" android:layout_marginLeft="50dp" android:layout_marginTop="25dp" - android:layout_weight="1" android:text="@string/recorded_attacks" android:textColor="?attr/colorOnBackground" android:textSize="12dp" diff --git a/src/main/res/layout/simple_popup_item.xml b/src/main/res/layout/simple_popup_item.xml index 230a69ae..6b6d4f14 100644 --- a/src/main/res/layout/simple_popup_item.xml +++ b/src/main/res/layout/simple_popup_item.xml @@ -7,8 +7,8 @@ android:gravity="top|center" android:baselineAligned="false" android:orientation="vertical"> - <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" + <RelativeLayout + android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:id="@+id/popup_item_container"> diff --git a/src/main/res/layout/split_popup_item.xml b/src/main/res/layout/split_popup_item.xml index 03d6bc98..bf840f87 100644 --- a/src/main/res/layout/split_popup_item.xml +++ b/src/main/res/layout/split_popup_item.xml @@ -5,13 +5,13 @@ android:layout_height="match_parent" android:orientation="vertical"> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="top|center" android:orientation="horizontal"> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:id="@+id/popup_left_container" android:layout_width="wrap_content" android:layout_height="85dp" @@ -20,7 +20,7 @@ android:orientation="vertical" android:padding="2dp"> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" @@ -31,7 +31,6 @@ android:id="@+id/left_title_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentStart="true" android:textAlignment="textStart" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="#ffffff" @@ -41,7 +40,6 @@ android:id="@+id/left_subtitle_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentStart="true" android:textAlignment="center" android:textAppearance="?android:attr/textAppearanceSmall" android:textIsSelectable="false" /> @@ -56,7 +54,7 @@ android:layout_weight="0" android:background="@android:color/darker_gray" /> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:id="@+id/popup_right_container" android:layout_width="wrap_content" android:layout_height="85dp" @@ -65,7 +63,7 @@ android:orientation="vertical" android:padding="2dp"> - <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" @@ -76,7 +74,6 @@ android:id="@+id/right_title_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentStart="true" android:textAlignment="textStart" android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" /> @@ -85,7 +82,6 @@ android:id="@+id/right_subtitle_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignParentStart="true" android:paddingLeft="3dp" android:paddingRight="3dp" android:textAlignment="center" diff --git a/src/main/res/menu/statistics_actions.xml b/src/main/res/menu/statistics_actions.xml index bf939c01..037e06fa 100644 --- a/src/main/res/menu/statistics_actions.xml +++ b/src/main/res/menu/statistics_actions.xml @@ -6,12 +6,12 @@ android:id="@+id/statistics_action_export" android:icon="@drawable/ic_sort_by_size" android:title="@string/stats_visualize" - app:showAsAction="always" /> + app:showAsAction="ifRoom" /> <item android:id="@+id/statistics_action_filter" android:icon="@drawable/ic_filter" android:title="@string/rec_filter_by" - app:showAsAction="always" /> + app:showAsAction="ifRoom" /> </menu> \ No newline at end of file diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 7a4392ba..a7f1772d 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -141,8 +141,8 @@ <string name="profile_activate_protocols_summary">Aktiviere die zu überwachenden Protokolle</string> <string name="profile_warning">Bitte beachte, dass dieses Profil nicht bearbeitet werden kann. Wenn du Änderungen machst und speicherst, so wird ein neues Profil mit diesen Einstellungen erstellt.</string> <string name="rec_choose_export_format">Wähle Exportformat</string> - <string name="honeypot_past_threat">Sieht nicht sicher aus...</string> - <string name="honeypot_not_monitoring">Zzz...</string> + <string name="honeypot_past_threat">Sieht nicht sicher aus…</string> + <string name="honeypot_not_monitoring">Zzz…</string> <string name="honeypot_no_threat">Sieht sicher aus!</string> <string name="honeypot_live_threat">Wir werden angegriffen!!!</string> <string name="network_not_connected_msg">Sie sind mit keinem Netzwerk verbunden. \n\nBitte verbinden sie sich zuerst mit einem Netzwerk, bevor sie HosTaGe starten.</string> @@ -177,4 +177,7 @@ <string name="pcap_log_setting_description">PCAP-Protokolle an den unten angegebenen Speicherort schrieben</string> <string name="pcap_location_setting_description">Speicherort der Protokollausgabe ändern</string> <string name="pcap_log_rotation_name">Log-Rotationsfrequenz</string> + <string name="multistage_notification">MultiStage läuft…</string> + <string name="services_unavailable">Bitte versuche es erneut</string> + <string name="close_app_warning">Drücken Sie die Zurück erneut, um HosTaGe . zu schließen</string> </resources> \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index b8b532cb..d60a7b82 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -201,4 +201,5 @@ <string name="seconds">seconds</string> <string name="pcap_log_rotation_dialog">Select log rotation period</string> <string name="pcap_not_available">PCAP logging is only available on rooted devices</string> + <string name="multistage_notification">MultiStage running…</string> </resources> diff --git a/src/main/res/xml/profile_preferences.xml b/src/main/res/xml/profile_preferences.xml index 58f06057..3b8cb36d 100644 --- a/src/main/res/xml/profile_preferences.xml +++ b/src/main/res/xml/profile_preferences.xml @@ -4,7 +4,7 @@ <Preference android:summary="@string/profile_warning" android:layout="@layout/preference_warning" android:key="pref_profile_warning" - android:enabled="false" /> + android:enabled="true" /> <PreferenceCategory android:title="@string/general" android:key="pref_profile_general_settings"> From 7418180f45e8053cc0c467c85dabbcc6e983e8c0 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 18 Aug 2021 15:38:17 +0200 Subject: [PATCH 08/26] delete unused method --- .../aau/netsec/hostage/ui/fragment/HomeFragment.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java index be910d53..2110a9f0 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java @@ -494,17 +494,6 @@ private void unbindDrawables(View view) { ((ViewGroup) view).removeAllViews(); } } - - public void AlertFile(String fname) { - AlertDialog alert = new AlertDialog.Builder(getActivity()).create(); - alert.setTitle("Delete entry"); - alert.setMessage("Are you sure you want to delete this entry?:\n" + fname); - alert.setButton(AlertDialog.BUTTON_NEUTRAL, "OK", - (dialog, which) -> dialog.dismiss()); - alert.show(); - } - - } From a72aa3f329a63cd6e5d17b9ae1a93774b66497c3 Mon Sep 17 00:00:00 2001 From: filip <filiplama@gmail.com> Date: Wed, 18 Aug 2021 22:04:21 +0200 Subject: [PATCH 09/26] delete unused file api_keys.xml --- src/main/res/values/api_keys.xml | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 src/main/res/values/api_keys.xml diff --git a/src/main/res/values/api_keys.xml b/src/main/res/values/api_keys.xml deleted file mode 100644 index a6b3daec..00000000 --- a/src/main/res/values/api_keys.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<resources></resources> \ No newline at end of file From 445fd75d947443a5db56fbe709b180af1fbfea55 Mon Sep 17 00:00:00 2001 From: filip <filiplama@gmail.com> Date: Wed, 18 Aug 2021 22:16:24 +0200 Subject: [PATCH 10/26] update gradle version to 7.1 and bump several library versions to latest available --- build.gradle | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index 6289a566..5bdd3481 100644 --- a/build.gradle +++ b/build.gradle @@ -8,11 +8,11 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.0' + classpath 'com.android.tools.build:gradle:7.0.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin - classpath 'com.google.gms:google-services:4.3.8' //added gms support - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.0' + classpath 'com.google.gms:google-services:4.3.10' //added gms support + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.7.1' } } apply plugin: 'com.android.application' @@ -31,7 +31,7 @@ allprojects { } dependencies { //firebase - implementation 'com.google.firebase:firebase-crashlytics:18.0.1' + implementation 'com.google.firebase:firebase-crashlytics:18.2.1' implementation 'com.google.firebase:firebase-analytics:19.0.0' implementation 'com.google.firebase:firebase-core:19.0.0' //google api @@ -42,7 +42,7 @@ dependencies { implementation 'com.google.android.gms:play-services-analytics:17.0.0' implementation 'com.google.android.gms:play-services-maps:17.0.1' - implementation 'com.google.android.gms:play-services-auth:19.0.0' + implementation 'com.google.android.gms:play-services-auth:19.2.0' //greenDao // implementation 'org.roboguice:roboguice:4.0.0' implementation 'org.greenrobot:greendao:3.3.0' @@ -97,9 +97,9 @@ dependencies { exclude group: 'com.github.Stericson' } - implementation "androidx.constraintlayout:constraintlayout:2.0.4" + implementation "androidx.constraintlayout:constraintlayout:2.1.0" - implementation "androidx.work:work-runtime:2.6.0-beta01" + implementation "androidx.work:work-runtime:2.6.0-rc01" //androidX legacy support implementation 'androidx.legacy:legacy-support-v4:1.0.0' @@ -126,7 +126,7 @@ dependencies { implementation 'com.jaredrummler:android-device-names:2.0.0' //materialDesign - implementation 'com.google.android.material:material:1.4.0-rc01' + implementation 'com.google.android.material:material:1.5.0-alpha02' //leakcanary //debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4' @@ -137,19 +137,19 @@ dependencies { // Optional -- Mockito framework testImplementation "org.mockito:mockito-core:3.10.0" - implementation 'androidx.annotation:annotation:1.0.0' + implementation 'androidx.annotation:annotation:1.2.0' - androidTestImplementation 'androidx.test:rules:1.4.0-beta02' - androidTestImplementation 'androidx.test:runner:1.4.0-beta02' + androidTestImplementation 'androidx.test:rules:1.4.0' + androidTestImplementation 'androidx.test:runner:1.4.0' // Optional -- UI testing with Espresso - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' //PowerMock testImplementation 'org.powermock:powermock-api-mockito2:2.0.9' testImplementation 'org.powermock:powermock-module-junit4:2.0.9' testImplementation 'org.powermock:powermock-core:2.0.9' testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.9' - implementation 'androidx.multidex:multidex:2.0.0' + implementation 'androidx.multidex:multidex:2.0.1' // Optional -- Robolectric environment testImplementation 'org.robolectric:robolectric:4.4.1' } From e223f3ffc6fe3ed6f0ea521b47f34e5717e10e67 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Tue, 24 Aug 2021 15:49:14 +0200 Subject: [PATCH 11/26] remove unneeded files in root directory --- NOTES.md | 19 --- lint.xml | 4 - pom.xml~ | 82 ----------- robo_test_pr-35_30062020.json | 261 ---------------------------------- robo_test_pr-37-30062020.json | 224 ----------------------------- 5 files changed, 590 deletions(-) delete mode 100644 NOTES.md delete mode 100644 lint.xml delete mode 100644 pom.xml~ delete mode 100644 robo_test_pr-35_30062020.json delete mode 100644 robo_test_pr-37-30062020.json diff --git a/NOTES.md b/NOTES.md deleted file mode 100644 index 77feffb8..00000000 --- a/NOTES.md +++ /dev/null @@ -1,19 +0,0 @@ -# Notes -The app name of HosTaGe ICS was changed to HosTaGe. -The threatmap service was fixed. -Server Address has been change. -Random App crash fixed. - -# Issues - -## Dependency Problems -Description: Android Studio version should not be upgraded to avoid error in dependency. -Solution: Use Android Studio Version 1.0 - -## SDK versioning issues -Description: Unable to support higher version of SDK -Solution: Use SDK 19.1.0 - -## API key -Description: Ensure the correct API key and save both debug and release SHA- fingeprint - diff --git a/lint.xml b/lint.xml deleted file mode 100644 index 8292216d..00000000 --- a/lint.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<lint> - <issue id="DefaultLocale" severity="ignore" /> -</lint> \ No newline at end of file diff --git a/pom.xml~ b/pom.xml~ deleted file mode 100644 index 136e1fb7..00000000 --- a/pom.xml~ +++ /dev/null @@ -1,82 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <groupId>de.tudarmstadt.informatik</groupId> - <artifactId>hostage</artifactId> - <version>2.0.0-SNAPSHOT</version> - <packaging>apk</packaging> - <name>HosTaGe</name> - <dependencies> - <dependency> - <groupId>android</groupId> - <artifactId>android</artifactId> - <version>4.4.2_r2</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>android.support</groupId> - <artifactId>compatibility-v4</artifactId> - <version>19.0.1</version> - </dependency> - <dependency> - <groupId>org.roboguice</groupId> - <artifactId>roboguice</artifactId> - <version>2.0</version> - </dependency> - </dependencies> - <build> - <finalName>${project.artifactId}</finalName> - <sourceDirectory>src</sourceDirectory> - <pluginManagement> - <plugins> - <plugin> - <groupId>com.jayway.maven.plugins.android.generation2</groupId> - <artifactId>android-maven-plugin</artifactId> - <version>3.8.0</version> - <extensions>true</extensions> - </plugin> - <plugin> - <groupId>org.eclipse.m2e</groupId> - <artifactId>lifecycle-mapping</artifactId> - <version>1.0.0</version> - <configuration> - <lifecycleMappingMetadata> - <pluginExecutions> - <pluginExecution> - <pluginExecutionFilter> - <groupId> - com.jayway.maven.plugins.android.generation2 - </groupId> - <artifactId> - android-maven-plugin - </artifactId> - <versionRange> - [3.8.0,) - </versionRange> - <goals> - <goal>consume-aar</goal> - </goals> - </pluginExecutionFilter> - <action> - <ignore></ignore> - </action> - </pluginExecution> - </pluginExecutions> - </lifecycleMappingMetadata> - </configuration> - </plugin> - </plugins> - </pluginManagement> - <plugins> - <plugin> - <groupId>com.jayway.maven.plugins.android.generation2</groupId> - <artifactId>android-maven-plugin</artifactId> - <configuration> - <sdk> - <platform>19.0.1</platform> - </sdk> - </configuration> - </plugin> - </plugins> - </build> -</project> diff --git a/robo_test_pr-35_30062020.json b/robo_test_pr-35_30062020.json deleted file mode 100644 index 90c3bbdd..00000000 --- a/robo_test_pr-35_30062020.json +++ /dev/null @@ -1,261 +0,0 @@ -[ - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593624874726, - "replacementText": "Agree", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": true, - "elementDescriptors": [ - { - "className": "androidx.appcompat.widget.AppCompatButton", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "android:id/button1", - "contentDescription": "", - "text": "Agree" - }, - { - "className": "com.android.internal.widget.ButtonBarLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.ScrollView", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "android:id/buttonPanel", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593624902694, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "android.widget.Switch", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/home_switch_connection", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.RelativeLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593624923165, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "androidx.appcompat.widget.AppCompatImageButton", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "", - "contentDescription": "Navigate up", - "text": "" - }, - { - "className": "androidx.appcompat.widget.Toolbar", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "dk.aau.netsec.hostage:id/action_bar", - "contentDescription": "", - "text": "" - }, - { - "className": "androidx.appcompat.widget.ActionBarContainer", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/action_bar_container", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593624932702, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "androidx.appcompat.widget.AppCompatImageView", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/home_button_connection_info", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.RelativeLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593624945126, - "replacementText": "Close", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "androidx.appcompat.widget.AppCompatButton", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "android:id/button2", - "contentDescription": "", - "text": "Close" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "android:id/buttonPanel", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593624951499, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "androidx.appcompat.widget.AppCompatImageButton", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "", - "contentDescription": "Navigate up", - "text": "" - }, - { - "className": "androidx.appcompat.widget.Toolbar", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "dk.aau.netsec.hostage:id/action_bar", - "contentDescription": "", - "text": "" - }, - { - "className": "androidx.appcompat.widget.ActionBarContainer", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/action_bar_container", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "LIST_ITEM_CLICKED", - "timestamp": 1593624958708, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": 4, - "groupViewChildPosition": -1, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.ListView", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/left_drawer", - "contentDescription": "", - "text": "" - }, - { - "className": "androidx.drawerlayout.widget.DrawerLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "dk.aau.netsec.hostage:id/drawer_layout", - "contentDescription": "", - "text": "" - } - ] - } -] \ No newline at end of file diff --git a/robo_test_pr-37-30062020.json b/robo_test_pr-37-30062020.json deleted file mode 100644 index 1ff0136d..00000000 --- a/robo_test_pr-37-30062020.json +++ /dev/null @@ -1,224 +0,0 @@ -[ - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593625870647, - "replacementText": "Agree", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": true, - "elementDescriptors": [ - { - "className": "com.google.android.material.button.MaterialButton", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "android:id/button1", - "contentDescription": "", - "text": "Agree" - }, - { - "className": "com.android.internal.widget.ButtonBarLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.ScrollView", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "android:id/buttonPanel", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593625879291, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "android.widget.Switch", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/home_switch_connection", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.RelativeLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593625893320, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "androidx.appcompat.widget.AppCompatImageView", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/home_button_connection_info", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.RelativeLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593625900630, - "replacementText": "Close", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "com.google.android.material.button.MaterialButton", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "android:id/button2", - "contentDescription": "", - "text": "Close" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 3, - "resourceId": "android:id/buttonPanel", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "VIEW_CLICKED", - "timestamp": 1593625907940, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "androidx.appcompat.widget.AppCompatImageButton", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "", - "contentDescription": "Navigate up", - "text": "" - }, - { - "className": "androidx.appcompat.widget.Toolbar", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "dk.aau.netsec.hostage:id/action_bar", - "contentDescription": "", - "text": "" - }, - { - "className": "androidx.appcompat.widget.ActionBarContainer", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/action_bar_container", - "contentDescription": "", - "text": "" - } - ] - }, - { - "eventType": "LIST_ITEM_CLICKED", - "timestamp": 1593625913167, - "replacementText": "", - "actionCode": -1, - "delayTime": 0, - "canScrollTo": false, - "elementDescriptors": [ - { - "className": "android.widget.LinearLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": 4, - "groupViewChildPosition": -1, - "resourceId": "", - "contentDescription": "", - "text": "" - }, - { - "className": "android.widget.ListView", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 1, - "resourceId": "dk.aau.netsec.hostage:id/left_drawer", - "contentDescription": "", - "text": "" - }, - { - "className": "androidx.drawerlayout.widget.DrawerLayout", - "recyclerViewChildPosition": -1, - "adapterViewChildPosition": -1, - "groupViewChildPosition": 0, - "resourceId": "dk.aau.netsec.hostage:id/drawer_layout", - "contentDescription": "", - "text": "" - } - ] - } -] \ No newline at end of file From 1e3b21eefcccb7baf7b9ce0090d18c49f0d57b30 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 25 Aug 2021 10:02:14 +0200 Subject: [PATCH 12/26] code formatting --- .../ConnectionInfoDialogFragment.java | 169 +++++++-------- .../layout/fragment_connectioninfo_dialog.xml | 198 ++++++++++-------- 2 files changed, 198 insertions(+), 169 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java index 33db5e06..d7ea1c58 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java @@ -14,6 +14,7 @@ import androidx.fragment.app.DialogFragment; import com.google.android.material.dialog.MaterialAlertDialogBuilder; + import java.util.ArrayList; import dk.aau.netsec.hostage.R; @@ -26,87 +27,89 @@ * displays details about the current connection */ public class ConnectionInfoDialogFragment extends DialogFragment { - private View view; - - public Dialog onCreateDialog(Bundle savedInstance) { - // the data we want to display - String ssid = "undefined"; - String bssid = "undefined"; - String internalIP = "undefined"; - String externalIP = "undefined"; - - // get infos about the current connection using SharedPreferences - final Activity activity = getActivity(); - if (activity != null) { - SharedPreferences sharedPreferences = activity.getSharedPreferences(getString(R.string.connection_info), Context.MODE_PRIVATE); - ssid = sharedPreferences.getString(getString(R.string.connection_info_ssid), ""); - bssid = sharedPreferences.getString(getString(R.string.connection_info_bssid), ""); - internalIP = HelperUtils.inetAddressToString( - sharedPreferences.getInt(getString(R.string.connection_info_internal_ip), 0)); - externalIP = sharedPreferences.getString( - getString(R.string.connection_info_external_ip), ""); - } - - LayoutInflater localInflater = getActivity().getLayoutInflater(); - view = localInflater.inflate(R.layout.fragment_connectioninfo_dialog, null); - - // assign values in layout - if (view != null) { - ((TextView)view.findViewById(R.id.connectioninfo_ssid_value)).setText(ssid); - ((TextView)view.findViewById(R.id.connectioninfo_bssid_value)).setText(bssid); - ((TextView)view.findViewById(R.id.connectioninfo_internalip_value)).setText(internalIP); - ((TextView)view.findViewById(R.id.connectioninfo_externalip_value)).setText(externalIP); - } - - return getConnectionInfoDialog(ssid).create(); - } - - private MaterialAlertDialogBuilder getConnectionInfoDialog(String ssid){ - // capture the SSID for the button action - final String filterSSID = ssid; - // build the actual dialog - MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity(), R.style.CustomAlertDialog); - - builder.setView(view); - builder.setTitle(R.string.title_connection_info); - builder.setIcon(getResources().getDrawable(R.drawable.ic_info_dark_grey_icon)); - builder.setPositiveButton(R.string.show_records, (dialog, which) -> showRecords(filterSSID)); - builder.setNegativeButton(R.string.close, null); - - return builder; - } - - private void showRecords(String filterSSID){ - ArrayList<String> ssids = new ArrayList<>(); - ssids.add(filterSSID); - - LogFilter filter = new LogFilter(); - filter.setESSIDs(ssids); - - RecordOverviewFragment recordOverviewFragment = new RecordOverviewFragment(); - recordOverviewFragment.setFilter(filter); - recordOverviewFragment.setGroupKey("ESSID"); - MainActivity.getInstance().injectFragment(recordOverviewFragment); - } - - @Override - public void onDestroy() { - super.onDestroy(); - if(view!=null) { - unbindDrawables(view); - view=null; - } - } - - private void unbindDrawables(View view) { - if (view.getBackground() != null) { - view.getBackground().setCallback(null); - } - if (view instanceof ViewGroup && !(view instanceof AdapterView)) { - for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { - unbindDrawables(((ViewGroup) view).getChildAt(i)); - } - ((ViewGroup) view).removeAllViews(); - } - } + private View view; + + public Dialog onCreateDialog(Bundle savedInstance) { + // the data we want to display + String ssid = "undefined"; + String bssid = "undefined"; + String internalIP = "undefined"; + String externalIP = "undefined"; + + // get infos about the current connection using SharedPreferences + final Activity activity = getActivity(); + if (activity != null) { + SharedPreferences sharedPreferences = activity.getSharedPreferences(getString(R.string.connection_info), Context.MODE_PRIVATE); + ssid = sharedPreferences.getString(getString(R.string.connection_info_ssid), ""); + bssid = sharedPreferences.getString(getString(R.string.connection_info_bssid), ""); + internalIP = HelperUtils.inetAddressToString( + sharedPreferences.getInt(getString(R.string.connection_info_internal_ip), 0)); + externalIP = sharedPreferences.getString( + getString(R.string.connection_info_external_ip), ""); + } + + LayoutInflater localInflater = getActivity().getLayoutInflater(); + view = localInflater.inflate(R.layout.fragment_connectioninfo_dialog, null); + + // assign values in layout + if (view != null) { + ((TextView) view.findViewById(R.id.connectioninfo_ssid_value)).setText(ssid); + ((TextView) view.findViewById(R.id.connectioninfo_bssid_value)).setText(bssid); + ((TextView) view.findViewById(R.id.connectioninfo_internalip_value)).setText(internalIP); + ((TextView) view.findViewById(R.id.connectioninfo_externalip_value)).setText(externalIP); + } + + return getConnectionInfoDialog(ssid).create(); + } + + private MaterialAlertDialogBuilder getConnectionInfoDialog(String ssid) { + // capture the SSID for the button action + final String filterSSID = ssid; + // build the actual dialog + MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getActivity(), R.style.CustomAlertDialog); + + builder.setView(view); + builder.setTitle(R.string.title_connection_info); + builder.setIcon(getResources().getDrawable(R.drawable.ic_info_dark_grey_icon)); + builder.setPositiveButton(R.string.show_records, (dialog, which) -> { + showRecords(filterSSID); + }); + builder.setNegativeButton(R.string.close, null); + + return builder; + } + + private void showRecords(String filterSSID) { + ArrayList<String> ssids = new ArrayList<>(); + ssids.add(filterSSID); + + LogFilter filter = new LogFilter(); + filter.setESSIDs(ssids); + + RecordOverviewFragment recordOverviewFragment = new RecordOverviewFragment(); + recordOverviewFragment.setFilter(filter); + recordOverviewFragment.setGroupKey("ESSID"); + MainActivity.getInstance().injectFragment(recordOverviewFragment); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (view != null) { + unbindDrawables(view); + view = null; + } + } + + private void unbindDrawables(View view) { + if (view.getBackground() != null) { + view.getBackground().setCallback(null); + } + if (view instanceof ViewGroup && !(view instanceof AdapterView)) { + for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { + unbindDrawables(((ViewGroup) view).getChildAt(i)); + } + ((ViewGroup) view).removeAllViews(); + } + } } diff --git a/src/main/res/layout/fragment_connectioninfo_dialog.xml b/src/main/res/layout/fragment_connectioninfo_dialog.xml index 210ad1c8..4e20cd63 100644 --- a/src/main/res/layout/fragment_connectioninfo_dialog.xml +++ b/src/main/res/layout/fragment_connectioninfo_dialog.xml @@ -1,93 +1,119 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="vertical" - android:layout_width="fill_parent" - android:layout_height="fill_parent" - android:gravity="center_horizontal"> - <TableLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="16dp" android:layout_marginBottom="16dp"> - <TableRow - android:layout_width="fill_parent" - android:layout_height="fill_parent"> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="@string/ssid" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:gravity="center_horizontal" + android:orientation="vertical"> + + <TableLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="16dp" + android:layout_marginBottom="16dp"> + + <TableRow + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + <TextView + android:id="@+id/textView1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="0" + android:layout_margin="4dp" + android:text="@string/ssid" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" + android:textStyle="bold" /> + + <TextView + android:id="@+id/connectioninfo_ssid_value" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_margin="4dp" + android:gravity="right" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" /> + </TableRow> + + <TableRow + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + <TextView + android:id="@+id/txtP2PSubheader" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_column="0" - android:layout_margin="4dp" - android:textColor="?attr/colorOnBackground" - android:textStyle="bold"/> - <TextView - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:id="@+id/connectioninfo_ssid_value" android:layout_column="1" - android:textColor="?attr/colorOnBackground" - android:layout_margin="4dp" android:gravity="right"/> - </TableRow> - <TableRow - android:layout_width="fill_parent" - android:layout_height="fill_parent"> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="@string/bssid" + android:layout_margin="4dp" + android:text="@string/bssid" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" + android:textStyle="bold" /> + + <TextView + android:id="@+id/connectioninfo_bssid_value" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_margin="4dp" + android:gravity="right" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" /> + </TableRow> + + <TableRow + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + <TextView + android:id="@+id/textView3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_column="0" - android:layout_margin="4dp" - android:textColor="?attr/colorOnBackground" - android:textStyle="bold"/> - <TextView - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:id="@+id/connectioninfo_bssid_value" android:layout_column="1" - android:textColor="?attr/colorOnBackground" - android:layout_margin="4dp" android:gravity="right"/> - </TableRow> - <TableRow - android:layout_width="fill_parent" - android:layout_height="fill_parent"> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="@string/internal_ip" + android:layout_margin="4dp" + android:text="@string/internal_ip" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" + android:textStyle="bold" /> + + <TextView + android:id="@+id/connectioninfo_internalip_value" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_margin="4dp" + android:gravity="right" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" /> + </TableRow> + + <TableRow + android:layout_width="fill_parent" + android:layout_height="fill_parent"> + + <TextView + android:id="@+id/record_details_text_bssid" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:layout_column="0" - android:layout_margin="4dp" - android:textColor="?attr/colorOnBackground" - android:textStyle="bold"/> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:id="@+id/connectioninfo_internalip_value" android:layout_column="1" - android:textColor="?attr/colorOnBackground" - android:layout_margin="4dp" android:gravity="right"/> - </TableRow> - <TableRow - android:layout_width="fill_parent" - android:layout_height="fill_parent"> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="@string/external_ip" - android:id="@+id/record_details_text_bssid" android:layout_column="0" - android:layout_margin="4dp" - android:textColor="?attr/colorOnBackground" - android:textStyle="bold"/> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textAppearance="?android:attr/textAppearanceMedium" - android:id="@+id/connectioninfo_externalip_value" android:layout_column="1" - android:textColor="?attr/colorOnBackground" - android:layout_margin="4dp" android:gravity="right"/> - </TableRow> - </TableLayout> + android:layout_margin="4dp" + android:text="@string/external_ip" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" + android:textStyle="bold" /> + + <TextView + android:id="@+id/connectioninfo_externalip_value" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_margin="4dp" + android:gravity="right" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textColor="?attr/colorOnBackground" /> + </TableRow> + </TableLayout> </LinearLayout> \ No newline at end of file From 7c214c3b59047e933d64ec32ef4bb28c48a12a09 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 25 Aug 2021 10:14:50 +0200 Subject: [PATCH 13/26] remove colon from string resource --- .../ConnectionInfoDialogFragment.java | 5 ++++ .../layout/fragment_connectioninfo_dialog.xml | 25 ++++++++++--------- src/main/res/values-de/strings.xml | 12 ++++++--- src/main/res/values/strings.xml | 15 ++++++++--- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java index d7ea1c58..bdb4d960 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/ConnectionInfoDialogFragment.java @@ -51,6 +51,11 @@ public Dialog onCreateDialog(Bundle savedInstance) { LayoutInflater localInflater = getActivity().getLayoutInflater(); view = localInflater.inflate(R.layout.fragment_connectioninfo_dialog, null); + ((TextView) view.findViewById(R.id.ssid_label)).setText(getString(R.string.ssid) + ":"); + ((TextView) view.findViewById(R.id.bssid_label)).setText(getString(R.string.ssid) + ":"); + ((TextView) view.findViewById(R.id.internal_ip_label)).setText(getString(R.string.internal_ip) + ":"); + ((TextView) view.findViewById(R.id.external_ip_label)).setText(getString(R.string.external_ip) + ":"); + // assign values in layout if (view != null) { ((TextView) view.findViewById(R.id.connectioninfo_ssid_value)).setText(ssid); diff --git a/src/main/res/layout/fragment_connectioninfo_dialog.xml b/src/main/res/layout/fragment_connectioninfo_dialog.xml index 4e20cd63..a1e84028 100644 --- a/src/main/res/layout/fragment_connectioninfo_dialog.xml +++ b/src/main/res/layout/fragment_connectioninfo_dialog.xml @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" @@ -17,15 +18,15 @@ android:layout_height="fill_parent"> <TextView - android:id="@+id/textView1" + android:id="@+id/ssid_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="0" android:layout_margin="4dp" - android:text="@string/ssid" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?attr/colorOnBackground" - android:textStyle="bold" /> + android:textStyle="bold" + tools:text="SSID:" /> <TextView android:id="@+id/connectioninfo_ssid_value" @@ -43,15 +44,15 @@ android:layout_height="fill_parent"> <TextView - android:id="@+id/txtP2PSubheader" + android:id="@+id/bssid_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="0" android:layout_margin="4dp" - android:text="@string/bssid" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?attr/colorOnBackground" - android:textStyle="bold" /> + android:textStyle="bold" + tools:text="BSSID: " /> <TextView android:id="@+id/connectioninfo_bssid_value" @@ -69,15 +70,15 @@ android:layout_height="fill_parent"> <TextView - android:id="@+id/textView3" + android:id="@+id/internal_ip_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="0" android:layout_margin="4dp" - android:text="@string/internal_ip" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?attr/colorOnBackground" - android:textStyle="bold" /> + android:textStyle="bold" + tools:text="Internal IP:" /> <TextView android:id="@+id/connectioninfo_internalip_value" @@ -95,15 +96,15 @@ android:layout_height="fill_parent"> <TextView - android:id="@+id/record_details_text_bssid" + android:id="@+id/external_ip_label" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_column="0" android:layout_margin="4dp" - android:text="@string/external_ip" android:textAppearance="?android:attr/textAppearanceMedium" android:textColor="?attr/colorOnBackground" - android:textStyle="bold" /> + android:textStyle="bold" + tools:text="External IP:" /> <TextView android:id="@+id/connectioninfo_externalip_value" diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index a7f1772d..bd3e9712 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -20,10 +20,14 @@ <string name="monitor_current_connection">Überwache Verbindung</string> <string name="active_profile">Aktives Profil: </string> - <string name="ssid">SSID:</string> - <string name="bssid">BSSID:</string> - <string name="internal_ip">Interne IP:</string> - <string name="external_ip">Externe IP:</string> + <string name="protocol">Protokoll:</string> + <string name="timestamp">Zeitstempel:</string> + <string name="hostage.location" tools:ignore="ExtraTranslation">Ort:</string> + <string name="internal_ip">Interne IP</string> + <string name="external_ip">Externe IP</string> + <string name="remote_ip">Remote IP:</string> + <string name="packet_type">Packet Typ:</string> + <string name="packet_content">Packet Inhalt:</string> <string name="delete">Löschen</string> <string name="cancel">Abbrechen</string> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index d60a7b82..e1144bc1 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -34,10 +34,17 @@ <string name="monitor_current_connection">Monitor current connection</string> <string name="active_profile">Active profile: </string> - <string name="ssid">SSID:</string> - <string name="bssid">BSSID:</string> - <string name="internal_ip">Internal IP:</string> - <string name="external_ip">External IP:</string> + <string name="ssid" translatable="false">SSID</string> + <string name="bssid" translatable="false">BSSID</string> + <string name="protocol">Protocol:</string> + <string name="timestamp">Timestamp:</string> + <string name="hostage.location" tools:ignore="ExtraTranslation">Location:</string> + <string name="internal_ip">Internal IP</string> + <string name="subnet_mask">Subnet Mask:</string> + <string name="external_ip">External IP</string> + <string name="remote_ip">Remote IP:</string> + <string name="packet_type">Packet type:</string> + <string name="packet_content">Packet content:</string> <string name="delete">Delete</string> <string name="cancel">Cancel</string> From b9632304f4ab69f6902721adbaf43269d13476c8 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 25 Aug 2021 10:33:55 +0200 Subject: [PATCH 14/26] remove redundant "this" keyword --- .../ui/fragment/RecordOverviewFragment.java | 346 +++++++++--------- .../ui/fragment/StatisticsFragment.java | 119 +++--- 2 files changed, 231 insertions(+), 234 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java index 08e9bd2f..9e915b19 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java @@ -154,7 +154,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, getFilter(); initializeViews(inflater, container, savedInstanceState); // addButtons(); - this.registerBroadcastReceiver(); + registerBroadcastReceiver(); return rootView; } @@ -168,14 +168,14 @@ private void setUpDatabase() { } private void getFilter() { - if (this.filter == null) { - Intent intent = this.getActivity().getIntent(); + if (filter == null) { + Intent intent = getActivity().getIntent(); LogFilter filter = intent.getParcelableExtra(LogFilter.LOG_FILTER_INTENT_KEY); if (filter == null) { - this.clearFilter(); + clearFilter(); } else { - this.filter = filter; + filter = filter; } } @@ -217,21 +217,21 @@ private void getFilter() { // } private void initializeViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - if (this.groupingKey == null) - this.groupingKey = this.groupingTitles().get(DEFAULT_GROUPING_KEY_INDEX); + if (groupingKey == null) + groupingKey = groupingTitles().get(DEFAULT_GROUPING_KEY_INDEX); - this.setShowFilterButton(!this.filter.isNotEditable()); - View rootView = inflater.inflate(this.getLayoutId(), container, false); + setShowFilterButton(!filter.isNotEditable()); + View rootView = inflater.inflate(getLayoutId(), container, false); this.rootView = rootView; ExpandableListView mylist = rootView.findViewById(R.id.loglistview); View footer = LayoutInflater.from(getApplicationContext()).inflate(R.layout.footer_listview_progressbar, null); - this.progressBar = footer.findViewById(R.id.progressBar); - this.spinner = rootView.findViewById(R.id.progressBar1); - this.spinner.setVisibility(View.GONE); + progressBar = footer.findViewById(R.id.progressBar); + spinner = rootView.findViewById(R.id.progressBar1); + spinner.setVisibility(View.GONE); - this.expListView = mylist; - this.initialiseListView(); + expListView = mylist; + initialiseListView(); setListOnScrollListener(); } @@ -287,9 +287,9 @@ private void removeListViewFooter() { */ private void initialiseListView() { if (loader != null) loader.interrupt(); - if (this.openSections == null) this.openSections = new ArrayList<>(); + if (openSections == null) openSections = new ArrayList<>(); - this.spinner.setVisibility(View.VISIBLE); + spinner.setVisibility(View.VISIBLE); loader = new Thread(new Runnable() { private void updateUI(final RecordListAdapter currentAdapter) { @@ -298,30 +298,30 @@ private void updateUI(final RecordListAdapter currentAdapter) { } //checks null before the initialization of the Activity. if (getActivity() != null) { - Activity activity = RecordOverviewFragment.this.getActivity(); + Activity activity = getActivity(); activity.runOnUiThread(() -> { - RecordOverviewFragment.this.expListView.setAdapter(currentAdapter); + expListView.setAdapter(currentAdapter); // Update view and remove loading spinner etc... getExpandableListGroups(); expandGroupSection(); if (mListPosition != -1 && mItemPosition != -1) - RecordOverviewFragment.this.expListView.setSelectedChild(mListPosition, mItemPosition, true); + expListView.setSelectedChild(mListPosition, mItemPosition, true); mListPosition = -1; mItemPosition = -1; - registerListClickCallback(RecordOverviewFragment.this.expListView); - RecordOverviewFragment.this.spinner.setVisibility(View.GONE); - RecordOverviewFragment.this.actualiseFilterButton(); - RecordOverviewFragment.this.showEmptyDataNotification(); + registerListClickCallback(expListView); + spinner.setVisibility(View.GONE); + actualiseFilterButton(); + showEmptyDataNotification(); }); } } private RecordListAdapter doInBackground() { - return populateListViewFromDB(RecordOverviewFragment.this.expListView); + return populateListViewFromDB(expListView); } @Override @@ -333,35 +333,35 @@ public void run() { loader.start(); - this.actualiseFilterButton(); + actualiseFilterButton(); } private void getExpandableListGroups() { - RecordListAdapter adapter = (RecordListAdapter) RecordOverviewFragment.this.expListView.getExpandableListAdapter(); + RecordListAdapter adapter = (RecordListAdapter) expListView.getExpandableListAdapter(); if (adapter != null) { adapter.notifyDataSetChanged(); if (adapter.getGroupCount() >= 1) { - RecordOverviewFragment.this.expListView.expandGroup(DEFAULT_GROUPING_KEY_INDEX); - if (!RecordOverviewFragment.this.openSections.contains(DEFAULT_GROUPING_KEY_INDEX)) { - RecordOverviewFragment.this.openSections.add(DEFAULT_GROUPING_KEY_INDEX); + expListView.expandGroup(DEFAULT_GROUPING_KEY_INDEX); + if (!openSections.contains(DEFAULT_GROUPING_KEY_INDEX)) { + openSections.add(DEFAULT_GROUPING_KEY_INDEX); } } else { - RecordOverviewFragment.this.setSectionToOpen(RecordOverviewFragment.this.sectionToOpen); + setSectionToOpen(sectionToOpen); } } } private void expandGroupSection() { - if (RecordOverviewFragment.this.openSections != null && RecordOverviewFragment.this.openSections.size() != 0) { - for (int i = 0; i < RecordOverviewFragment.this.openSections.size(); i++) { - int index = RecordOverviewFragment.this.openSections.get(i); - RecordOverviewFragment.this.expListView.expandGroup(index); + if (openSections != null && openSections.size() != 0) { + for (int i = 0; i < openSections.size(); i++) { + int index = openSections.get(i); + expListView.expandGroup(index); } } else { - RecordOverviewFragment.this.openSections = new ArrayList<>(); + openSections = new ArrayList<>(); } } @@ -391,23 +391,23 @@ public void onFilterMenuItemSelected(AbstractPopupItem item) { if (title != null) { if (title.equals(FILTER_MENU_TITLE_BSSID)) { - this.openBSSIDFilterDialog(); + openBSSIDFilterDialog(); } if (title.equals(FILTER_MENU_TITLE_ESSID)) { - this.openESSIDFilterDialog(); + openESSIDFilterDialog(); } if (title.equals(FILTER_MENU_TITLE_IPS)) { - this.openIpsFilterDialog(); + openIpsFilterDialog(); } if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { - this.openProtocolsFilterDialog(); + openProtocolsFilterDialog(); } if (title.equals(FILTER_MENU_TITLE_SORTING)) { - this.openSortingDialog(); + openSortingDialog(); } if (title.equals(FILTER_MENU_TITLE_REMOVE)) { - this.clearFilter(); - this.actualiseListViewInBackground(); + clearFilter(); + actualiseListViewInBackground(); } if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) { DateTimePickerDialog.showDateTimePicker(getContext(), false, this); @@ -422,11 +422,11 @@ public void onFilterMenuItemSelected(AbstractPopupItem item) { @Override public void onStart() { super.onStart(); - if (this.expListView.getExpandableListAdapter() != null) { - if (this.expListView.getExpandableListAdapter().getGroupCount() == 1) { - this.expListView.expandGroup(0); + if (expListView.getExpandableListAdapter() != null) { + if (expListView.getExpandableListAdapter().getGroupCount() == 1) { + expListView.expandGroup(0); } else { - this.setSectionToOpen(this.sectionToOpen); + setSectionToOpen(sectionToOpen); } } } @@ -581,7 +581,7 @@ public void openDeleteFilteredAttacksDialog() { String cancelTitle = MainActivity.getInstance().getString(R.string.cancel); String deleteTitle = MainActivity.getInstance().getString(R.string.delete); - String text = this.filter.isSet() ? deleteFILTEREDAttacksTitle : deleteALLAttacksTitle; + String text = filter.isSet() ? deleteFILTEREDAttacksTitle : deleteALLAttacksTitle; builder.setMessage(text) .setPositiveButton(deleteTitle, new DialogInterface.OnClickListener() { @@ -593,7 +593,7 @@ public void onClick(DialogInterface dialog, int id) { } public DialogInterface.OnClickListener init(RecordOverviewFragment rf) { - this.recordOverviewFragment = rf; + recordOverviewFragment = rf; return this; } }.init(this)) @@ -662,10 +662,10 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { */ public void showDetailsForSSID(String SSID) { Log.e("RecordOverviewFragment", "Implement showDetailsForSSID!!"); - this.clearFilter(); + clearFilter(); int ESSID_INDEX = 2; - this.sectionToOpen = SSID; - this.groupingKey = this.groupingTitles().get(ESSID_INDEX); + sectionToOpen = SSID; + groupingKey = groupingTitles().get(ESSID_INDEX); } @@ -683,8 +683,9 @@ public void showDetailsForSSID(String SSID) { private RecordListAdapter populateListViewFromDB(ExpandableListView mylist) { ArrayList<String> groupTitle = new ArrayList<>(); - HashMap<String, ArrayList<ExpandableListItem>> sectionData = this.fetchDataForFilter(this.filter, groupTitle); + HashMap<String, ArrayList<ExpandableListItem>> sectionData = fetchDataForFilter(filter, groupTitle); RecordListAdapter adapter; + if (mylist.getAdapter() != null && mylist.getAdapter() instanceof RecordListAdapter) { adapter = (RecordListAdapter) mylist.getAdapter(); adapter.setData(sectionData); @@ -735,7 +736,7 @@ private void changeAttackLimitOffset(long recordsSize) { private HashMap<String, ArrayList<ExpandableListItem>> fetchDataForFilter(LogFilter filter, ArrayList<String> groupTitle) { HashMap<String, ArrayList<ExpandableListItem>> sectionData = new HashMap<>(); // Adding Items to ListView - String[] keys = new String[]{RecordOverviewFragment.this.getString(R.string.RecordIP), RecordOverviewFragment.this.getString(R.string.RecordSSID), RecordOverviewFragment.this.getString(R.string.RecordProtocol), RecordOverviewFragment.this.getString(R.string.RecordTimestamp)}; + String[] keys = new String[]{getString(R.string.RecordIP), getString(R.string.RecordSSID), getString(R.string.RecordProtocol), getString(R.string.RecordTimestamp)}; int[] ids = new int[]{R.id.RecordTextFieldBSSID, R.id.RecordTextFieldIP, R.id.RecordTextFieldProtocol, R.id.RecordTextFieldTimestamp}; if (filter != null && !filter.protocols.isEmpty()) { @@ -763,11 +764,10 @@ private HashMap<String, ArrayList<ExpandableListItem>> fetchDataForFilter(LogFil for (RecordAll val : data) { // DO GROUPING IN HERE HashMap<String, String> map = new HashMap<>(); - map.put(RecordOverviewFragment.this.getString(R.string.RecordBSSID), val.getBssid()); - map.put(RecordOverviewFragment.this.getString(R.string.RecordIP), val.getRemoteIP()); - map.put(RecordOverviewFragment.this.getString(R.string.RecordProtocol), val.getProtocol()); - map.put(RecordOverviewFragment.this.getString(R.string.RecordTimestamp), - RecordOverviewFragment.this.getDateAsString(val.getTimestamp())); + map.put(getString(R.string.bssid), val.getBssid()); + map.put(getString(R.string.RecordIP), val.getRemoteIP()); + map.put(getString(R.string.RecordProtocol), val.getProtocol()); + map.put(getString(R.string.RecordTimestamp), getDateAsString(val.getTimestamp())); ExpandableListItem item = new ExpandableListItem(); item.setData(map); @@ -776,7 +776,7 @@ private HashMap<String, ArrayList<ExpandableListItem>> fetchDataForFilter(LogFil item.setTag(val.getAttack_id()); - String groupID = RecordOverviewFragment.this.getGroupValue(val); + String groupID = getGroupValue(val); ArrayList<ExpandableListItem> items = sectionData.get(groupID); if (items == null) { @@ -789,7 +789,7 @@ private HashMap<String, ArrayList<ExpandableListItem>> fetchDataForFilter(LogFil } - if (this.groupingKey.equals(this.groupingTitles().get(DEFAULT_GROUPING_KEY_INDEX))) { + if (groupingKey.equals(groupingTitles().get(DEFAULT_GROUPING_KEY_INDEX))) { groupTitle.sort(new DateStringComparator()); } else { groupTitle.sort(String::compareToIgnoreCase); @@ -805,8 +805,8 @@ private HashMap<String, ArrayList<ExpandableListItem>> fetchDataForFilter(LogFil */ class DateStringComparator implements Comparator<String> { public int compare(String lhs, String rhs) { - Date date1 = RecordOverviewFragment.this.convertStringToDate(lhs); - Date date2 = RecordOverviewFragment.this.convertStringToDate(rhs); + Date date1 = convertStringToDate(lhs); + Date date2 = convertStringToDate(rhs); return date2.compareTo(date1); } @@ -821,19 +821,19 @@ private void registerBroadcastReceiver() { mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - RecordOverviewFragment.this.actualiseListViewInBackground(); + actualiseListViewInBackground(); } }; LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, new IntentFilter(getString(R.string.broadcast))); - this.mReceiverRegistered = true; + mReceiverRegistered = true; } } private void unregisterBroadcastReceiver() { if (mReceiverRegistered) { LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mReceiver); - this.mReceiverRegistered = false; + mReceiverRegistered = false; } } @@ -849,20 +849,20 @@ private void actualiseListViewInBackground() { loader = new Thread(new Runnable() { @Override public void run() { - this.runOnUiThread(this.doInBackground()); + runOnUiThread(doInBackground()); } private RecordListAdapter doInBackground() { - return RecordOverviewFragment.this.populateListViewFromDB(RecordOverviewFragment.this.expListView); + return populateListViewFromDB(expListView); } private void runOnUiThread(final RecordListAdapter adapter) { - Activity actv = RecordOverviewFragment.this.getActivity(); + Activity actv = getActivity(); if (actv != null) { actv.runOnUiThread(new Runnable() { @Override public void run() { - this.actualiseUI(); + actualiseUI(); } private void actualiseUI() { @@ -895,18 +895,18 @@ private void actualiseUI() { * Shows a small toast if the data to show is empty (no records). */ private void showEmptyDataNotification() { - if (RecordOverviewFragment.this.noDataNotificationSnackbar == null) { - RecordOverviewFragment.this.noDataNotificationSnackbar = Snackbar.make(rootView, R.string.no_data_notification, Snackbar.LENGTH_LONG); + if (noDataNotificationSnackbar == null) { + noDataNotificationSnackbar = Snackbar.make(rootView, R.string.no_data_notification, Snackbar.LENGTH_LONG); } - RecordListAdapter adapter = (RecordListAdapter) RecordOverviewFragment.this.expListView.getExpandableListAdapter(); + RecordListAdapter adapter = (RecordListAdapter) expListView.getExpandableListAdapter(); - if (this.filter.isSet()) { - this.noDataNotificationSnackbar.setText(R.string.no_data_notification); + if (filter.isSet()) { + noDataNotificationSnackbar.setText(R.string.no_data_notification); } else { - this.noDataNotificationSnackbar.setText(R.string.no_data_notification_no_filter); + noDataNotificationSnackbar.setText(R.string.no_data_notification_no_filter); } if (adapter == null || adapter.getData().isEmpty()) - RecordOverviewFragment.this.noDataNotificationSnackbar.show(); + noDataNotificationSnackbar.show(); } @@ -916,14 +916,14 @@ private void showEmptyDataNotification() { * @param s String (the section title to open) */ private void setSectionToOpen(String s) { - this.sectionToOpen = s; - if (this.sectionToOpen != null && this.sectionToOpen.length() != 0) { - if (this.getGroupTitles().contains(this.sectionToOpen)) { - int section = this.getGroupTitles().indexOf(this.sectionToOpen); - this.expListView.expandGroup(section); - this.sectionToOpen = ""; - if (!this.openSections.contains(section)) { - RecordOverviewFragment.this.openSections.add(section); + sectionToOpen = s; + if (sectionToOpen != null && sectionToOpen.length() != 0) { + if (getGroupTitles().contains(sectionToOpen)) { + int section = getGroupTitles().indexOf(sectionToOpen); + expListView.expandGroup(section); + sectionToOpen = ""; + if (!openSections.contains(section)) { + openSections.add(section); } } } @@ -935,7 +935,7 @@ private void setSectionToOpen(String s) { * @return Context baseContext */ private Context getBaseContext() { - return this.getActivity().getBaseContext(); + return getActivity().getBaseContext(); } /** @@ -944,7 +944,7 @@ private Context getBaseContext() { * @return Context application context */ private Context getApplicationContext() { - return this.getActivity().getApplicationContext(); + return getActivity().getApplicationContext(); } /** @@ -963,17 +963,17 @@ private void registerListClickCallback(ExpandableListView mylist) { DaoSession dbSession = HostageApplication.getInstances().getDaoSession(); DAOHelper daoHelper = new DAOHelper(dbSession, getActivity()); RecordAll rec = daoHelper.getAttackRecordDAO().getRecordOfAttackId((int) item.getTag()); - RecordOverviewFragment.this.pushRecordDetailViewForRecord(rec); + pushRecordDetailViewForRecord(rec); return true; }); mylist.setOnGroupExpandListener(i -> { - if (!RecordOverviewFragment.this.openSections.contains(i)) { - RecordOverviewFragment.this.openSections.add(i); + if (!openSections.contains(i)) { + openSections.add(i); } }); mylist.setOnGroupCollapseListener(i -> { try { - RecordOverviewFragment.this.openSections.remove(i); + openSections.remove(i); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } @@ -1018,7 +1018,7 @@ public String getFormattedDateForGrouping(long timestamp) { // DAY FORMAT //String date = this.getDateAsDayString(timestamp); - return this.getDateAsMonthString(timestamp); + return getDateAsMonthString(timestamp); } /** @@ -1031,11 +1031,11 @@ private String getDateAsDayString(long timestamp) { Date netDate = (new Date(timestamp)); String dateString; - long date = this.dayMilliseconds(timestamp); + long date = dayMilliseconds(timestamp); - if (this.todayMilliseconds() == date) { + if (todayMilliseconds() == date) { dateString = TODAY; - } else if (this.yesterdayMilliseconds() == date) { + } else if (yesterdayMilliseconds() == date) { dateString = YESTERDAY; } else { dateString = localisedDateFormatter.format(netDate); @@ -1054,10 +1054,10 @@ private Date convertStringToDate(String dateString) { Date date; try { if (dateString.equals(TODAY)) { - long millisec = RecordOverviewFragment.this.todayMilliseconds(); + long millisec = todayMilliseconds(); date = new Date(millisec); } else if (dateString.equals(YESTERDAY)) { - long millisec = RecordOverviewFragment.this.yesterdayMilliseconds(); + long millisec = yesterdayMilliseconds(); date = new Date(millisec); } else { date = groupingDateFormatter.parse(dateString); @@ -1159,7 +1159,7 @@ public boolean isShowFilterButton() { } public void setShowFilterButton(boolean showFilterButton) { - this.showFilterButton = showFilterButton; + showFilterButton = showFilterButton; } /** @@ -1173,11 +1173,11 @@ public void setShowFilterButton(boolean showFilterButton) { * @param key String */ public void setGroupKey(String key) { - this.groupingKey = key; + groupingKey = key; } public void setFilter(LogFilter filter) { - this.filter = filter; + filter = filter; } @@ -1190,41 +1190,41 @@ public void setFilter(LogFilter filter) { * Opens the grouping dialog */ private void openGroupingDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_GROUP, this.groupingTitles(), this.selectedGroup(), false, this); + ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_GROUP, groupingTitles(), selectedGroup(), false, this); expListView.setStackFromBottom(false); - newFragment.show(this.getActivity().getFragmentManager(), FILTER_MENU_TITLE_GROUP); + newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_GROUP); } /** * opens the bssid filter dialog */ private void openBSSIDFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_BSSID, this.bssids(), this.selectedBSSIDs(), true, this); - newFragment.show(this.getActivity().getFragmentManager(), FILTER_MENU_TITLE_BSSID); + ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_BSSID, bssids(), selectedBSSIDs(), true, this); + newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_BSSID); } /** * opens the essid filter dialog */ private void openESSIDFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_ESSID, this.essids(), this.selectedESSIDs(), true, this); - newFragment.show(this.getActivity().getFragmentManager(), FILTER_MENU_TITLE_ESSID); + ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_ESSID, essids(), selectedESSIDs(), true, this); + newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_ESSID); } /** * opens the ips filter dialog */ private void openIpsFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_IPS, this.ips(), this.selectedIps(), true, this); - newFragment.show(this.getActivity().getFragmentManager(), FILTER_MENU_TITLE_IPS); + ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_IPS, ips(), selectedIps(), true, this); + newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_IPS); } /** * opens the protocol filter dialog */ private void openProtocolsFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_PROTOCOLS, this.protocolTitles(), this.selectedProtocols(), true, this); - newFragment.show(this.getActivity().getFragmentManager(), FILTER_MENU_TITLE_PROTOCOLS); + ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_PROTOCOLS, protocolTitles(), selectedProtocols(), true, this); + newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_PROTOCOLS); } @@ -1250,8 +1250,8 @@ public void dateTimeSelected(Calendar date, boolean filterFrom) { * opens the sorting dialog */ private void openSortingDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_SORTING, this.sortTypeTiles(), this.selectedSorttype(), false, this); - newFragment.show(this.getActivity().getFragmentManager(), FILTER_MENU_TITLE_SORTING); + ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_SORTING, sortTypeTiles(), selectedSorttype(), false, this); + newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_SORTING); } /***************************** @@ -1267,7 +1267,7 @@ private void openSortingDialog() { * @return String grouptitle */ public String getGroupValue(RecordAll rec) { - int index = this.groupingTitles().indexOf(this.groupingKey); + int index = groupingTitles().indexOf(groupingKey); switch (index) { case 1: return rec.getProtocol(); @@ -1278,7 +1278,7 @@ public String getGroupValue(RecordAll rec) { case 4: return rec.getBssid(); default: - return this.getFormattedDateForGrouping(rec.getTimestamp()); + return getFormattedDateForGrouping(rec.getTimestamp()); } } @@ -1288,19 +1288,19 @@ public String getGroupValue(RecordAll rec) { * @return ArrayList<String> grouptitles */ public List<String> getGroupTitles() { - int index = this.groupingTitles().indexOf(this.groupingKey); + int index = groupingTitles().indexOf(groupingKey); switch (index) { case 1: - return this.protocolTitles(); + return protocolTitles(); case 2: - return this.ips(); + return ips(); case 3: - return this.essids(); + return essids(); case 4: - return this.bssids(); + return bssids(); case 0: default: - RecordListAdapter adapter = (RecordListAdapter) this.expListView.getExpandableListAdapter(); + RecordListAdapter adapter = (RecordListAdapter) expListView.getExpandableListAdapter(); if (adapter != null) { return adapter.getSectionHeaders(); } @@ -1321,7 +1321,7 @@ public List<String> getGroupTitles() { * @return ImageButton filterButton */ private ImageButton getFilterButton() { - return (ImageButton) this.rootView.findViewById(R.id.FilterButton); + return (ImageButton) rootView.findViewById(R.id.FilterButton); } /** @@ -1330,30 +1330,31 @@ private ImageButton getFilterButton() { * @param v View the anchorView */ private void openFilterPopupMenuOnView(View v) { - SimplePopupTable filterMenu = new SimplePopupTable(this.getActivity(), ob -> { + SimplePopupTable filterMenu = new SimplePopupTable(getActivity(), ob -> { if (ob instanceof AbstractPopupItem) { AbstractPopupItem item = (AbstractPopupItem) ob; - RecordOverviewFragment.this.onFilterMenuItemSelected(item); + onFilterMenuItemSelected(item); } }); filterMenu.setTitle(FILTER_MENU_POPUP_TITLE); - for (String title : RecordOverviewFragment.this.filterMenuTitles()) { + + for (String title : filterMenuTitles()) { AbstractPopupItem item; if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) continue; if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { - item = new SplitPopupItem(this.getActivity()); + item = new SplitPopupItem(getActivity()); item.setValue(SplitPopupItem.RIGHT_TITLE, FILTER_MENU_TITLE_TIMESTAMP_BELOW); item.setValue(SplitPopupItem.LEFT_TITLE, FILTER_MENU_TITLE_TIMESTAMP_ABOVE); - if (this.filter.hasBelowTimestamp()) { - item.setValue(SplitPopupItem.RIGHT_SUBTITLE, this.getDateAsString(this.filter.belowTimestamp)); + if (filter.hasBelowTimestamp()) { + item.setValue(SplitPopupItem.RIGHT_SUBTITLE, getDateAsString(filter.belowTimestamp)); } - if (this.filter.hasAboveTimestamp()) { - item.setValue(SplitPopupItem.LEFT_SUBTITLE, this.getDateAsString(this.filter.aboveTimestamp)); + if (filter.hasAboveTimestamp()) { + item.setValue(SplitPopupItem.LEFT_SUBTITLE, getDateAsString(filter.aboveTimestamp)); } } else { - item = new SimplePopupItem(this.getActivity()); + item = new SimplePopupItem(getActivity()); item.setTitle(title); - ((SimplePopupItem) item).setSelected(this.isFilterSetForTitle(title)); + ((SimplePopupItem) item).setSelected(isFilterSetForTitle(title)); } filterMenu.addItem(item); @@ -1370,22 +1371,22 @@ private void openFilterPopupMenuOnView(View v) { */ private boolean isFilterSetForTitle(String title) { if (title.equals(FILTER_MENU_TITLE_BSSID)) { - return this.filter.hasBSSIDs(); + return filter.hasBSSIDs(); } if (title.equals(FILTER_MENU_TITLE_ESSID)) { - return this.filter.hasESSIDs(); + return filter.hasESSIDs(); } if (title.equals(FILTER_MENU_TITLE_IPS)) { - return this.filter.hasIps(); + return filter.hasIps(); } if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { - return this.filter.hasProtocols(); + return filter.hasProtocols(); } if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) { - return this.filter.hasBelowTimestamp(); + return filter.hasBelowTimestamp(); } if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { - return this.filter.hasAboveTimestamp(); + return filter.hasAboveTimestamp(); } return false; } @@ -1394,8 +1395,8 @@ private boolean isFilterSetForTitle(String title) { * clears the filter. Does not invoke populatelistview! */ private void clearFilter() { - if (filter == null) this.filter = new LogFilter(); - this.filter.clear(); + if (filter == null) filter = new LogFilter(); + filter.clear(); } /** @@ -1419,11 +1420,11 @@ public ArrayList<String> groupingTitles() { * @return boolean[] selection */ public boolean[] selectedGroup() { - ArrayList<String> groups = this.groupingTitles(); + ArrayList<String> groups = groupingTitles(); boolean[] selected = new boolean[groups.size()]; int i = 0; for (String group : groups) { - selected[i] = (group.equals(this.groupingKey)); + selected[i] = (group.equals(groupingKey)); i++; } return selected; @@ -1435,7 +1436,7 @@ public boolean[] selectedGroup() { * @return ArrayList<String> protocolTitles */ public ArrayList<String> protocolTitles() { - ArrayList<String> titles = new ArrayList<>(Arrays.asList(this.getResources().getStringArray( + ArrayList<String> titles = new ArrayList<>(Arrays.asList(getResources().getStringArray( R.array.protocols))); titles.add("PORTSCAN"); @@ -1451,12 +1452,12 @@ public ArrayList<String> protocolTitles() { * @return boolean[] protocol selection */ public boolean[] selectedProtocols() { - ArrayList<String> protocols = this.protocolTitles(); + ArrayList<String> protocols = protocolTitles(); boolean[] selected = new boolean[protocols.size()]; int i = 0; for (String protocol : protocols) { - selected[i] = (this.filter.protocols.contains(protocol)); + selected[i] = (filter.protocols.contains(protocol)); i++; } return selected; @@ -1484,11 +1485,11 @@ public ArrayList<String> sortTypeTiles() { * @return boolean array, length == sortTypeTiles().length */ public boolean[] selectedSorttype() { - ArrayList<String> types = this.sortTypeTiles(); + ArrayList<String> types = sortTypeTiles(); boolean[] selected = new boolean[types.size()]; int i = 0; for (String sorttype : types) { - selected[i] = (this.filter.sorttype.toString().equals(sorttype)); + selected[i] = (filter.sorttype.toString().equals(sorttype)); i++; } return selected; @@ -1510,12 +1511,12 @@ public ArrayList<String> bssids() { * @return boolean array, length == bssids().length */ public boolean[] selectedBSSIDs() { - ArrayList<String> bssids = this.bssids(); + ArrayList<String> bssids = bssids(); boolean[] selected = new boolean[bssids.size()]; int i = 0; for (String bssid : bssids) { - selected[i] = (this.filter.BSSIDs.contains(bssid)); + selected[i] = (filter.BSSIDs.contains(bssid)); i++; } return selected; @@ -1546,12 +1547,12 @@ public ArrayList<String> ips() { * @return boolean array, length == essids().length */ public boolean[] selectedESSIDs() { - ArrayList<String> essids = this.essids(); + ArrayList<String> essids = essids(); boolean[] selected = new boolean[essids.size()]; int i = 0; for (String essid : essids) { - selected[i] = (this.filter.ESSIDs.contains(essid)); + selected[i] = (filter.ESSIDs.contains(essid)); i++; } return selected; @@ -1564,12 +1565,12 @@ public boolean[] selectedESSIDs() { * @return boolean array, length == ips().length */ public boolean[] selectedIps() { - ArrayList<String> ips = this.ips(); + ArrayList<String> ips = ips(); boolean[] selected = new boolean[ips.size()]; int i = 0; for (String ip : ips) { - selected[i] = (this.filter.IPs.contains(ip)); + selected[i] = (filter.IPs.contains(ip)); i++; } return selected; @@ -1588,7 +1589,7 @@ private ArrayList<String> filterMenuTitles() { titles.add(FILTER_MENU_TITLE_PROTOCOLS); titles.add(FILTER_MENU_TITLE_TIMESTAMP_ABOVE); titles.add(FILTER_MENU_TITLE_TIMESTAMP_BELOW); - if (this.filter.isSet()) titles.add(FILTER_MENU_TITLE_REMOVE); + if (filter.isSet()) titles.add(FILTER_MENU_TITLE_REMOVE); return titles; } @@ -1601,35 +1602,35 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { String title = dialog.getTitle(); if (title.equals(FILTER_MENU_TITLE_BSSID)) { ArrayList<String> titles = dialog.getSelectedItemTitles(); - if (titles.size() == this.bssids().size()) { - this.filter.setBSSIDs(new ArrayList<>()); + if (titles.size() == bssids().size()) { + filter.setBSSIDs(new ArrayList<>()); } else { - this.filter.setBSSIDs(titles); + filter.setBSSIDs(titles); } } if (title.equals(FILTER_MENU_TITLE_ESSID)) { ArrayList<String> titles = dialog.getSelectedItemTitles(); - if (titles.size() == this.essids().size()) { - this.filter.setESSIDs(new ArrayList<>()); + if (titles.size() == essids().size()) { + filter.setESSIDs(new ArrayList<>()); } else { - this.filter.setESSIDs(titles); + filter.setESSIDs(titles); } } if (title.equals(FILTER_MENU_TITLE_IPS)) { ArrayList<String> titles = dialog.getSelectedItemTitles(); - if (titles.size() == this.ips().size()) { - this.filter.setIps(new ArrayList<>()); + if (titles.size() == ips().size()) { + filter.setIps(new ArrayList<>()); } else { - this.filter.setIps(titles); + filter.setIps(titles); } } if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { ArrayList<String> protocols = dialog.getSelectedItemTitles(); - if (protocols.size() == this.protocolTitles().size()) { - this.filter.setProtocols(new ArrayList<>()); + if (protocols.size() == protocolTitles().size()) { + filter.setProtocols(new ArrayList<>()); } else { - this.filter.setProtocols(dialog.getSelectedItemTitles()); + filter.setProtocols(dialog.getSelectedItemTitles()); } } if (title.equals(FILTER_MENU_TITLE_SORTING)) { @@ -1637,18 +1638,18 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { if (titles.size() == 0) return; // ALWAYS GET THE FIRST ELEMENT (SHOULD BE ALWAYS ONE) String t = titles.get(0); - int sortType = this.sortTypeTiles().indexOf(t); - this.filter.setSorttype(LogFilter.SortType.values()[sortType]); + int sortType = sortTypeTiles().indexOf(t); + filter.setSorttype(LogFilter.SortType.values()[sortType]); } if (title.equals(FILTER_MENU_TITLE_GROUP)) { ArrayList<String> titles = dialog.getSelectedItemTitles(); if (titles.size() == 0) return; // ALWAYS GET THE FIRST ELEMENT (SHOULD BE ALWAYS ONE) - this.groupingKey = titles.get(0); + groupingKey = titles.get(0); } - this.actualiseListViewInBackground(); + actualiseListViewInBackground(); - this.actualiseFilterButton(); + actualiseFilterButton(); } /** @@ -1685,9 +1686,8 @@ private void actualiseFilterButton() { * Deletes the current displayed attacks. */ public void deleteFilteredAttacks() { - LogFilter filter = this.filter; daoHelper.getAttackRecordDAO().deleteAttacksByFilter(filter); - this.actualiseListViewInBackground(); + actualiseListViewInBackground(); } /** @@ -1705,7 +1705,7 @@ public void onDialogNegativeClick(ChecklistDialog dialog) { * @param record {@link RecordAll Record } to show */ private void pushRecordDetailViewForRecord(RecordAll record) { - FragmentManager fm = this.getActivity().getFragmentManager(); + FragmentManager fm = getActivity().getFragmentManager(); if (fm != null) { RecordDetailFragment newFragment = new RecordDetailFragment(); @@ -1726,6 +1726,4 @@ private void unbindDrawables(View view) { ((ViewGroup) view).removeAllViews(); } } - - } \ No newline at end of file diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java index 9337f33e..881b3614 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java @@ -183,8 +183,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, daoHelper = new DAOHelper(dbSession, getActivity()); // Get the message from the intent - if (this.filter == null) { - Intent intent = this.getActivity().getIntent(); + if (filter == null) { + Intent intent = getActivity().getIntent(); LogFilter filter = intent.getParcelableExtra(LogFilter.LOG_FILTER_INTENT_KEY); if (filter == null) { clearFilter(); @@ -193,10 +193,10 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, } } - this.rootView = inflater.inflate(getLayoutID(), container, false); - configureRootView(this.rootView); + rootView = inflater.inflate(getLayoutID(), container, false); + configureRootView(rootView); - return this.rootView; + return rootView; } @Override @@ -237,11 +237,10 @@ public void onConfigurationChanged(Configuration newConfig) { ViewGroup container = (ViewGroup) getView(); assert container != null; container.removeAllViewsInLayout(); - this.rootView = inflater.inflate(getLayoutID(), container, false); - container.addView(this.rootView); - - configureRootView(this.rootView); + rootView = inflater.inflate(getLayoutID(), container, false); + container.addView(rootView); + configureRootView(rootView); } /** @@ -288,7 +287,7 @@ public void configureRootView(View rootView) { } legendListView = rootView.findViewById(R.id.legend_list_view); - legendListView.setOnItemClickListener((adapterView, view, i, l) -> StatisticsFragment.this.userTappedOnLegendItem(i)); + legendListView.setOnItemClickListener((adapterView, view, i, l) -> userTappedOnLegendItem(i)); rootView.setWillNotDraw(false); // ImageButton visualButton = rootView.findViewById(R.id.plot_data_button); @@ -312,7 +311,7 @@ public void configureRootView(View rootView) { * @param title String */ public void setTitle(String title) { - TextView titleView = this.rootView.findViewById(R.id.title_text_view); + TextView titleView = rootView.findViewById(R.id.title_text_view); if (title != null && titleView != null) { titleView.setText(title); titleView.invalidate(); @@ -325,7 +324,7 @@ public void setTitle(String title) { * @return String title */ public String getTitle() { - TextView titleView = this.rootView.findViewById(R.id.title_text_view); + TextView titleView = rootView.findViewById(R.id.title_text_view); if (titleView != null) { return "" + titleView.getText(); } @@ -335,13 +334,13 @@ public String getTitle() { @Override public void onStart() { super.onStart(); - this.actualiseCurrentPlot(); - this.currentPlotView.invalidate(); + actualiseCurrentPlot(); + currentPlotView.invalidate(); - if (this.currentPlotView instanceof BarGraph) { - this.setTitle("" + this.getCurrentSelectedProtocol() + ": " + this.selectedCompareData); + if (currentPlotView instanceof BarGraph) { + setTitle("" + getCurrentSelectedProtocol() + ": " + selectedCompareData); } else { - this.setTitle(this.selectedCompareData); + setTitle(selectedCompareData); } } @@ -455,12 +454,12 @@ private void openBarSelectionMenuOnView(View anchorView) { SimplePopupTable visualiseMenu = new SimplePopupTable(getActivity(), ob -> { if (ob instanceof AbstractPopupItem) { AbstractPopupItem item = (AbstractPopupItem) ob; - StatisticsFragment.this.userSelectMenuItem(item); + userSelectMenuItem(item); } }); visualiseMenu.setTitle(MENU_POPUP_TITLE); int id = 0; - for (String title : StatisticsFragment.this.getMenuTitles()) { + for (String title : getMenuTitles()) { SimplePopupItem item = new SimplePopupItem(getActivity()); item.setTitle(title); item.setItemId(id); @@ -547,7 +546,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { //titles = titles.size() == 0 ? protocolTitles() : titles; - this.filter.setProtocols(titles); + filter.setProtocols(titles); actualiseCurrentPlot(); return; } @@ -556,7 +555,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { titles = new ArrayList<>(); titles.add(protocolTitles().get(0)); } - this.filter.setProtocols(titles); + filter.setProtocols(titles); actualiseCurrentPlot(); String fragTitle = "" + getCurrentSelectedProtocol() + ": " + selectedCompareData; @@ -704,7 +703,7 @@ private void openFilterMenuOnView(View anchor) { SimplePopupTable filterMenu = new SimplePopupTable(getActivity(), ob -> { if (ob instanceof AbstractPopupItem) { AbstractPopupItem item = (AbstractPopupItem) ob; - StatisticsFragment.this.onFilterMenuItemSelected(item); + onFilterMenuItemSelected(item); } }); @@ -868,7 +867,7 @@ public boolean[] selectedESSIDs() { int i = 0; for (String essid : essids) { - selected[i] = (this.filter.getESSIDs().contains(essid)); + selected[i] = (filter.getESSIDs().contains(essid)); i++; } return selected; @@ -902,7 +901,7 @@ public boolean[] selectedBSSIDs() { int i = 0; for (String bssid : bssids) { - selected[i] = (this.filter.getBSSIDs().contains(bssid)); + selected[i] = (filter.getBSSIDs().contains(bssid)); i++; } return selected; @@ -1048,11 +1047,11 @@ public void setLineGraphData(LineGraph linegraph) { if (shouldUseDate) { linegraph.resetXLimits(); - if (this.filter.hasBelowTimestamp()) { - rangeMax_X = Math.max(this.filter.belowTimestamp, rangeMax_X); + if (filter.hasBelowTimestamp()) { + rangeMax_X = Math.max(filter.belowTimestamp, rangeMax_X); } - if (this.filter.hasAboveTimestamp()) { - rangeMin_X = Math.min(this.filter.aboveTimestamp, rangeMin_X); + if (filter.hasAboveTimestamp()) { + rangeMin_X = Math.min(filter.aboveTimestamp, rangeMin_X); } if (rangeMax_X == rangeMin_X) { @@ -1069,7 +1068,7 @@ public void setLineGraphData(LineGraph linegraph) { linegraph.setConverter(new LineGraph.AxisDataConverter() { @Override public String convertDataForX_Position(double x) { - return StatisticsFragment.this.getDateAsDayString((long) x); + return getDateAsDayString((long) x); } @Override @@ -1131,8 +1130,8 @@ public void setBarGraphData(BarGraph bargraph) { * @return records {@link java.util.ArrayList}, {@link RecordAll Record} */ public ArrayList<RecordAll> getFetchedRecords() { - if (this.filter == null) clearFilter(); - return daoHelper.getAttackRecordDAO().getRecordsForFilter(this.filter); + if (filter == null) clearFilter(); + return daoHelper.getAttackRecordDAO().getRecordsForFilter(filter); } /** @@ -1180,39 +1179,39 @@ public void run() { } private void loadDataInBackground() { - View plot = StatisticsFragment.this.currentPlotView; + View plot = currentPlotView; if (plot instanceof PieGraph) { PieGraph pie = (PieGraph) plot; - StatisticsFragment.this.setPieGraphData(pie); + setPieGraphData(pie); } if (plot instanceof BarGraph) { BarGraph bar = (BarGraph) plot; - StatisticsFragment.this.setBarGraphData(bar); + setBarGraphData(bar); } if (plot instanceof LineGraph) { LineGraph line = (LineGraph) plot; - StatisticsFragment.this.setLineGraphData(line); + setLineGraphData(line); } } private void actualiseUI() { - Activity actv = StatisticsFragment.this.getActivity(); + Activity actv = getActivity(); if (actv != null) { actv.runOnUiThread(() -> { // SET VISIBILITY - View plot1 = StatisticsFragment.this.currentPlotView; + View plot1 = currentPlotView; if (plot1 instanceof PieGraph) { // HIDE FILTER BUTTON // ImageButton filterButton = StatisticsFragment.this.getFilterButton(); // if (filterButton != null) filterButton.setVisibility(View.GONE); } else { - if (StatisticsFragment.this.pieGraph != null) { - StatisticsFragment.this.pieGraph.setVisibility(View.GONE); - if (StatisticsFragment.this.pieGraph.getParent() != null) { - thePlotlayout.removeView(StatisticsFragment.this.pieGraph); + if (pieGraph != null) { + pieGraph.setVisibility(View.GONE); + if (pieGraph.getParent() != null) { + thePlotlayout.removeView(pieGraph); } } // SHOW FILTER BUTTON @@ -1220,18 +1219,18 @@ private void actualiseUI() { // if (filterButton != null) filterButton.setVisibility(View.VISIBLE); } if (!(plot1 instanceof BarGraph)) { - if (StatisticsFragment.this.barGraph != null) { - StatisticsFragment.this.barGraph.setVisibility(View.GONE); - if (StatisticsFragment.this.barGraph.getParent() != null) { - thePlotlayout.removeView(StatisticsFragment.this.barGraph); + if (barGraph != null) { + barGraph.setVisibility(View.GONE); + if (barGraph.getParent() != null) { + thePlotlayout.removeView(barGraph); } } } if (!(plot1 instanceof LineGraph)) { - if (StatisticsFragment.this.lineGraph != null) { - StatisticsFragment.this.lineGraph.setVisibility(View.GONE); - if (StatisticsFragment.this.lineGraph.getParent() != null) { - thePlotlayout.removeView(StatisticsFragment.this.lineGraph); + if (lineGraph != null) { + lineGraph.setVisibility(View.GONE); + if (lineGraph.getParent() != null) { + thePlotlayout.removeView(lineGraph); } } } @@ -1241,19 +1240,19 @@ private void actualiseUI() { if (plot1.getParent() == null) { thePlotlayout.addView(plot1); } - StatisticsFragment.this.actualiseLegendList(); - StatisticsFragment.this.currentPlotView.bringToFront(); - StatisticsFragment.this.currentPlotView.invalidate(); + actualiseLegendList(); + currentPlotView.bringToFront(); + currentPlotView.invalidate(); - StatisticsFragment.this.spinner.setVisibility(View.GONE); + spinner.setVisibility(View.GONE); - StatisticsFragment.this.showEmptyDataNotification(); + showEmptyDataNotification(); }); } } }); - this.loader.start(); + loader.start(); } /** @@ -1452,7 +1451,7 @@ public ArrayList<PlotComparisonItem> attacksPerESSID(String protocol) { protocollist.add(protocol); filter.setProtocols(protocollist); - ArrayList<PlotComparisonItem> plotItems = this.daoHelper.getNetworkRecordDAO().attacksPerESSID(filter); //new ArrayList<PlotComparisonItem>(); + ArrayList<PlotComparisonItem> plotItems = daoHelper.getNetworkRecordDAO().attacksPerESSID(filter); //new ArrayList<PlotComparisonItem>(); plotItems.sort((s1, s2) -> s2.getValue2().compareTo(s1.getValue2())); @@ -1541,7 +1540,7 @@ public boolean[] selectedProtocols() { int i = 0; for (String protocol : protocols) { - selected[i] = (this.filter.protocols.contains(protocol)); + selected[i] = (filter.protocols.contains(protocol)); i++; } return selected; @@ -1549,7 +1548,7 @@ public boolean[] selectedProtocols() { public ArrayList<String> getSelectedProtocolTitles() { ArrayList<String> knownProtocols = protocolTitles(); - if (this.filter.hasProtocols()) { + if (filter.hasProtocols()) { ArrayList<String> titles = new ArrayList<>(); int i = 0; for (boolean b : selectedProtocols()) { @@ -1635,8 +1634,8 @@ private boolean isFilterSetForTitle(String title) { * Clears the current filter. */ private void clearFilter() { - if (filter == null) this.filter = new LogFilter(); - this.filter.clear(); + if (filter == null) filter = new LogFilter(); + filter.clear(); } /* From d6a2f112b6fdec33d03520e87334f9bac033f9a8 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 25 Aug 2021 11:27:47 +0200 Subject: [PATCH 15/26] adjust strings in RecordOverviewFragment and StatisticsFragment --- .../ui/fragment/RecordOverviewFragment.java | 120 ++++----- .../ui/fragment/StatisticsFragment.java | 228 +++++++----------- .../res/layout/fragment_record_detail.xml | 4 +- src/main/res/values-de/strings.xml | 4 - src/main/res/values/strings.xml | 10 +- 5 files changed, 149 insertions(+), 217 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java index 9e915b19..fc05cc2f 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/RecordOverviewFragment.java @@ -66,20 +66,6 @@ public class RecordOverviewFragment extends UpNavigableFragment implements ChecklistDialog.ChecklistDialogListener, DateTimePickerDialog.DateTimeSelected { - static final String FILTER_MENU_TITLE_BSSID = MainActivity.getContext().getString(R.string.BSSID); - static final String FILTER_MENU_TITLE_ESSID = MainActivity.getContext().getString(R.string.ESSID); - static final String FILTER_MENU_TITLE_IPS = MainActivity.getContext().getString(R.string.RecordIP); - static final String FILTER_MENU_TITLE_PROTOCOLS = MainActivity.getContext().getString(R.string.rec_protocol); - static final String FILTER_MENU_TITLE_TIMESTAMP_BELOW = MainActivity.getContext().getString( - R.string.rec_latest); - static final String FILTER_MENU_TITLE_TIMESTAMP_ABOVE = MainActivity.getContext().getString( - R.string.rec_earliest); - static final String FILTER_MENU_TITLE_SORTING = MainActivity.getContext().getString(R.string.rec_sortby); - static final String FILTER_MENU_TITLE_REMOVE = MainActivity.getContext().getString(R.string.rec_reset_filter); - static final String FILTER_MENU_TITLE_GROUP = MainActivity.getContext().getString( - R.string.rec_group_by); - static final String FILTER_MENU_POPUP_TITLE = MainActivity.getContext().getString( - R.string.rec_filter_by); static final int DEFAULT_GROUPING_KEY_INDEX = 0; private boolean wasBelowTimePicker; @@ -390,29 +376,29 @@ public void onFilterMenuItemSelected(AbstractPopupItem item) { } if (title != null) { - if (title.equals(FILTER_MENU_TITLE_BSSID)) { + if (title.equals(getString(R.string.bssid))) { openBSSIDFilterDialog(); } - if (title.equals(FILTER_MENU_TITLE_ESSID)) { + if (title.equals(getString(R.string.essid))) { openESSIDFilterDialog(); } - if (title.equals(FILTER_MENU_TITLE_IPS)) { + if (title.equals(getString(R.string.ip))) { openIpsFilterDialog(); } - if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { + if (title.equals(getString(R.string.rec_protocol))) { openProtocolsFilterDialog(); } - if (title.equals(FILTER_MENU_TITLE_SORTING)) { + if (title.equals(getString(R.string.rec_sortby))) { openSortingDialog(); } - if (title.equals(FILTER_MENU_TITLE_REMOVE)) { + if (title.equals(getString(R.string.rec_reset_filter))) { clearFilter(); actualiseListViewInBackground(); } - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) { + if (title.equals(getString(R.string.rec_latest))) { DateTimePickerDialog.showDateTimePicker(getContext(), false, this); } - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { + if (title.equals(getString(R.string.rec_earliest))) { DateTimePickerDialog.showDateTimePicker(getContext(), true, this); } } @@ -736,7 +722,7 @@ private void changeAttackLimitOffset(long recordsSize) { private HashMap<String, ArrayList<ExpandableListItem>> fetchDataForFilter(LogFilter filter, ArrayList<String> groupTitle) { HashMap<String, ArrayList<ExpandableListItem>> sectionData = new HashMap<>(); // Adding Items to ListView - String[] keys = new String[]{getString(R.string.RecordIP), getString(R.string.RecordSSID), getString(R.string.RecordProtocol), getString(R.string.RecordTimestamp)}; + String[] keys = new String[]{getString(R.string.ip), getString(R.string.ssid), getString(R.string.RecordProtocol), getString(R.string.RecordTimestamp)}; int[] ids = new int[]{R.id.RecordTextFieldBSSID, R.id.RecordTextFieldIP, R.id.RecordTextFieldProtocol, R.id.RecordTextFieldTimestamp}; if (filter != null && !filter.protocols.isEmpty()) { @@ -765,7 +751,7 @@ private HashMap<String, ArrayList<ExpandableListItem>> fetchDataForFilter(LogFil // DO GROUPING IN HERE HashMap<String, String> map = new HashMap<>(); map.put(getString(R.string.bssid), val.getBssid()); - map.put(getString(R.string.RecordIP), val.getRemoteIP()); + map.put(getString(R.string.ip), val.getRemoteIP()); map.put(getString(R.string.RecordProtocol), val.getProtocol()); map.put(getString(R.string.RecordTimestamp), getDateAsString(val.getTimestamp())); @@ -1190,41 +1176,41 @@ public void setFilter(LogFilter filter) { * Opens the grouping dialog */ private void openGroupingDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_GROUP, groupingTitles(), selectedGroup(), false, this); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.rec_group_by), groupingTitles(), selectedGroup(), false, this); expListView.setStackFromBottom(false); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_GROUP); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.rec_group_by)); } /** * opens the bssid filter dialog */ private void openBSSIDFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_BSSID, bssids(), selectedBSSIDs(), true, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_BSSID); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.bssid), bssids(), selectedBSSIDs(), true, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.bssid)); } /** * opens the essid filter dialog */ private void openESSIDFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_ESSID, essids(), selectedESSIDs(), true, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_ESSID); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.essid), essids(), selectedESSIDs(), true, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.essid)); } /** * opens the ips filter dialog */ private void openIpsFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_IPS, ips(), selectedIps(), true, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_IPS); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.ip), ips(), selectedIps(), true, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.ip)); } /** * opens the protocol filter dialog */ private void openProtocolsFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_PROTOCOLS, protocolTitles(), selectedProtocols(), true, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_PROTOCOLS); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.rec_protocol), protocolTitles(), selectedProtocols(), true, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.rec_protocol)); } @@ -1250,8 +1236,8 @@ public void dateTimeSelected(Calendar date, boolean filterFrom) { * opens the sorting dialog */ private void openSortingDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_SORTING, sortTypeTiles(), selectedSorttype(), false, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_SORTING); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.rec_sortby), sortTypeTiles(), selectedSorttype(), false, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.rec_sortby)); } /***************************** @@ -1336,15 +1322,15 @@ private void openFilterPopupMenuOnView(View v) { onFilterMenuItemSelected(item); } }); - filterMenu.setTitle(FILTER_MENU_POPUP_TITLE); + filterMenu.setTitle(getString(R.string.rec_filter_by)); for (String title : filterMenuTitles()) { AbstractPopupItem item; - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) continue; - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { + if (title.equals(getString(R.string.rec_latest))) continue; + if (title.equals(getString(R.string.rec_earliest))) { item = new SplitPopupItem(getActivity()); - item.setValue(SplitPopupItem.RIGHT_TITLE, FILTER_MENU_TITLE_TIMESTAMP_BELOW); - item.setValue(SplitPopupItem.LEFT_TITLE, FILTER_MENU_TITLE_TIMESTAMP_ABOVE); + item.setValue(SplitPopupItem.RIGHT_TITLE, getString(R.string.rec_latest)); + item.setValue(SplitPopupItem.LEFT_TITLE, getString(R.string.rec_earliest)); if (filter.hasBelowTimestamp()) { item.setValue(SplitPopupItem.RIGHT_SUBTITLE, getDateAsString(filter.belowTimestamp)); } @@ -1364,28 +1350,28 @@ private void openFilterPopupMenuOnView(View v) { /** * Returns true if the filter object is set for the given title otherwise false. e.g. the filter object has protocols, - * so the method will return for the title FILTER_MENU_TITLE_PROTOCOLS TRUE. + * so the method will return for the title getString(R.string.rec_protocol) TRUE. * * @param title String * @return boolean value */ private boolean isFilterSetForTitle(String title) { - if (title.equals(FILTER_MENU_TITLE_BSSID)) { + if (title.equals(getString(R.string.bssid))) { return filter.hasBSSIDs(); } - if (title.equals(FILTER_MENU_TITLE_ESSID)) { + if (title.equals(getString(R.string.essid))) { return filter.hasESSIDs(); } - if (title.equals(FILTER_MENU_TITLE_IPS)) { + if (title.equals(getString(R.string.ip))) { return filter.hasIps(); } - if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { + if (title.equals(getString(R.string.rec_protocol))) { return filter.hasProtocols(); } - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) { + if (title.equals(getString(R.string.rec_latest))) { return filter.hasBelowTimestamp(); } - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { + if (title.equals(getString(R.string.rec_earliest))) { return filter.hasAboveTimestamp(); } return false; @@ -1408,9 +1394,9 @@ public ArrayList<String> groupingTitles() { ArrayList<String> titles = new ArrayList<>(); titles.add(MainActivity.getContext().getString(R.string.date)); titles.add(MainActivity.getContext().getString(R.string.rec_protocol)); - titles.add(MainActivity.getContext().getString(R.string.IP)); - titles.add(MainActivity.getContext().getString(R.string.ESSID)); - titles.add(MainActivity.getContext().getString(R.string.BSSID)); + titles.add(MainActivity.getContext().getString(R.string.ip)); + titles.add(MainActivity.getContext().getString(R.string.essid)); + titles.add(MainActivity.getContext().getString(R.string.bssid)); return titles; } @@ -1472,9 +1458,9 @@ public ArrayList<String> sortTypeTiles() { ArrayList<String> titles = new ArrayList<>(); titles.add(MainActivity.getContext().getString(R.string.rec_time)); titles.add(MainActivity.getContext().getString(R.string.rec_protocol)); - titles.add(MainActivity.getContext().getString(R.string.IP)); - titles.add(MainActivity.getContext().getString(R.string.ESSID)); - titles.add(MainActivity.getContext().getString(R.string.BSSID)); + titles.add(MainActivity.getContext().getString(R.string.ip)); + titles.add(MainActivity.getContext().getString(R.string.essid)); + titles.add(MainActivity.getContext().getString(R.string.bssid)); return titles; } @@ -1583,13 +1569,13 @@ public boolean[] selectedIps() { */ private ArrayList<String> filterMenuTitles() { ArrayList<String> titles = new ArrayList<>(); - titles.add(FILTER_MENU_TITLE_BSSID); - titles.add(FILTER_MENU_TITLE_ESSID); - titles.add(FILTER_MENU_TITLE_IPS); - titles.add(FILTER_MENU_TITLE_PROTOCOLS); - titles.add(FILTER_MENU_TITLE_TIMESTAMP_ABOVE); - titles.add(FILTER_MENU_TITLE_TIMESTAMP_BELOW); - if (filter.isSet()) titles.add(FILTER_MENU_TITLE_REMOVE); + titles.add(getString(R.string.bssid)); + titles.add(getString(R.string.essid)); + titles.add(getString(R.string.ip)); + titles.add(getString(R.string.rec_protocol)); + titles.add(getString(R.string.rec_earliest)); + titles.add(getString(R.string.rec_latest)); + if (filter.isSet()) titles.add(getString(R.string.rec_reset_filter)); return titles; } @@ -1600,7 +1586,7 @@ private ArrayList<String> filterMenuTitles() { */ public void onDialogPositiveClick(ChecklistDialog dialog) { String title = dialog.getTitle(); - if (title.equals(FILTER_MENU_TITLE_BSSID)) { + if (title.equals(getString(R.string.bssid))) { ArrayList<String> titles = dialog.getSelectedItemTitles(); if (titles.size() == bssids().size()) { filter.setBSSIDs(new ArrayList<>()); @@ -1608,7 +1594,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { filter.setBSSIDs(titles); } } - if (title.equals(FILTER_MENU_TITLE_ESSID)) { + if (title.equals(getString(R.string.essid))) { ArrayList<String> titles = dialog.getSelectedItemTitles(); if (titles.size() == essids().size()) { filter.setESSIDs(new ArrayList<>()); @@ -1617,7 +1603,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { } } - if (title.equals(FILTER_MENU_TITLE_IPS)) { + if (title.equals(getString(R.string.ip))) { ArrayList<String> titles = dialog.getSelectedItemTitles(); if (titles.size() == ips().size()) { filter.setIps(new ArrayList<>()); @@ -1625,7 +1611,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { filter.setIps(titles); } } - if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { + if (title.equals(getString(R.string.rec_protocol))) { ArrayList<String> protocols = dialog.getSelectedItemTitles(); if (protocols.size() == protocolTitles().size()) { filter.setProtocols(new ArrayList<>()); @@ -1633,7 +1619,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { filter.setProtocols(dialog.getSelectedItemTitles()); } } - if (title.equals(FILTER_MENU_TITLE_SORTING)) { + if (title.equals(getString(R.string.rec_sortby))) { ArrayList<String> titles = dialog.getSelectedItemTitles(); if (titles.size() == 0) return; // ALWAYS GET THE FIRST ELEMENT (SHOULD BE ALWAYS ONE) @@ -1641,7 +1627,7 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { int sortType = sortTypeTiles().indexOf(t); filter.setSorttype(LogFilter.SortType.values()[sortType]); } - if (title.equals(FILTER_MENU_TITLE_GROUP)) { + if (title.equals(getString(R.string.rec_group_by))) { ArrayList<String> titles = dialog.getSelectedItemTitles(); if (titles.size() == 0) return; // ALWAYS GET THE FIRST ELEMENT (SHOULD BE ALWAYS ONE) diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java index 881b3614..bba0539c 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/StatisticsFragment.java @@ -64,45 +64,6 @@ * Created by Julien on 16.02.14. */ public class StatisticsFragment extends TrackerFragment implements ChecklistDialog.ChecklistDialogListener, DateTimePickerDialog.DateTimeSelected { - static final String FILTER_MENU_TITLE_BSSID = "BSSID"; - static final String FILTER_MENU_TITLE_ESSID = "ESSID"; - static final String FILTER_MENU_TITLE_PROTOCOLS = MainActivity.getContext().getString(R.string.stats_protocols); - static final String FILTER_MENU_TITLE_PROTOCOL = MainActivity.getContext().getString(R.string.rec_protocol); - static final String FILTER_MENU_TITLE_TIMESTAMP_BELOW = MainActivity.getContext().getString(R.string.rec_latest); - static final String FILTER_MENU_TITLE_TIMESTAMP_ABOVE = MainActivity.getContext().getString(R.string.rec_earliest); - static final String FILTER_MENU_TITLE_REMOVE = MainActivity.getContext().getString(R.string.rec_reset_filter); - static final String FILTER_MENU_POPUP_TITLE = MainActivity.getContext().getString(R.string.rec_filter_by); - - static final String MENU_TITLE_PROTOCOLS = MainActivity.getContext().getString( - R.string.stats_protocols); - static final String MENU_TITLE_NETWORK = MainActivity.getContext().getString( - R.string.stats_networks); - static final String MENU_TITLE_ATTACKS = MainActivity.getContext().getString( - R.string.stats_attacks); - static final String MENU_POPUP_TITLE = MainActivity.getContext().getString( - R.string.stats_visualize); - - static final String CHART_TYPE_TITLE_BAR = MainActivity.getContext().getString( - R.string.stats_bar_plot); - static final String CHART_TYPE_TITLE_PIE = MainActivity.getContext().getString(R.string.stats_pie_plot); - static final String CHART_TYPE_TITLE_LINE = MainActivity.getContext().getString(R.string.stats_line_plot); - - //static final String DIALOG_PROTOCOLS_TITLE = MainActivity.getContext().getString(R.string.stats_select_protocol_data); - static final String DIALOG_NETWORK_TITLE = MainActivity.getContext().getString(R.string.stats_select_network_data); - static final String DIALOG_ATTACK_TITLE = MainActivity.getContext().getString(R.string.stats_select_attack_data); - - static final String COMPARE_TITLE_AttacksPerProtocol = MainActivity.getContext().getString(R.string.stats_attacks_protocol); - //static final String COMPARE_TITLE_UsesPerProtocol = MainActivity.getContext().getString(R.string.stats_uses_protocol); - static final String COMPARE_TITLE_AttacksPerDate = MainActivity.getContext().getString(R.string.stats_attacks_date); - static final String COMPARE_TITLE_AttacksPerTime = MainActivity.getContext().getString(R.string.stats_attacks_time); - static final String COMPARE_TITLE_AttacksPerBSSID = MainActivity.getContext().getString(R.string.stats_attacks_bssid); - static final String COMPARE_TITLE_AttacksPerESSID = MainActivity.getContext().getString(R.string.stats_attacks_essid); - static final String FILTER_MENU_PROTOCOL_SINGLE_CHOICE_TITLE = MainActivity.getContext().getString(R.string.stats_select_protocol); - - static final String TABLE_HEADER_VALUE_TITLE_ATTACKS_COUNT = MainActivity.getContext().getString(R.string.stats_attacks_count); - static final String TABLE_HEADER_VALUE_TITLE_ATTACKS_PERCENTAGE = MainActivity.getContext().getString(R.string.stats_per_cent_all); - - static final String OTHER_CHART_TITLE = MainActivity.getContext().getString(R.string.stats_other); // MINIMAL 2 static final int MAX_NUMBER_OF_CHART_OBJECTS = 6; @@ -127,7 +88,7 @@ public class StatisticsFragment extends TrackerFragment implements ChecklistDial private ListView legendListView; private Snackbar noDataNotificationSnackbar; - private String selectedCompareData = COMPARE_TITLE_AttacksPerProtocol; + private String selectedCompareData; private Menu optionsMenu; @@ -149,17 +110,6 @@ static public ChartType create(int value) { if (value < 0 || value >= ChartType.values().length) return ChartType.PIE_CHART; return ChartType.values()[value]; } - - public String toString() { - if (this.equals(ChartType.create(0))) { - return CHART_TYPE_TITLE_PIE; - } - if (this.equals(ChartType.create(1))) { - return CHART_TYPE_TITLE_BAR; - } - return CHART_TYPE_TITLE_LINE; - } - } /** @@ -193,6 +143,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, } } + selectedCompareData = getString(R.string.stats_attacks_protocol); + rootView = inflater.inflate(getLayoutID(), container, false); configureRootView(rootView); @@ -420,19 +372,19 @@ public void actualiseLegendList() { TextView tableHeaderTitleView = rootView.findViewById(R.id.table_header_title_textview); TextView tableHeaderValueView = rootView.findViewById(R.id.table_header_value_textview); if (currentPlotView instanceof LineGraph) { - tableHeaderTitleView.setText(FILTER_MENU_TITLE_ESSID); - tableHeaderValueView.setText(TABLE_HEADER_VALUE_TITLE_ATTACKS_PERCENTAGE); + tableHeaderTitleView.setText(R.string.essid); + tableHeaderValueView.setText(R.string.stats_per_cent_all); } if (currentPlotView instanceof PieGraph) { - tableHeaderTitleView.setText(FILTER_MENU_TITLE_PROTOCOL); - tableHeaderValueView.setText(TABLE_HEADER_VALUE_TITLE_ATTACKS_COUNT); + tableHeaderTitleView.setText(R.string.rec_protocol); + tableHeaderValueView.setText(R.string.stats_attacks_count); } if (currentPlotView instanceof BarGraph) { - tableHeaderValueView.setText(TABLE_HEADER_VALUE_TITLE_ATTACKS_COUNT); - if (selectedCompareData.equals(COMPARE_TITLE_AttacksPerBSSID)) { - tableHeaderTitleView.setText(FILTER_MENU_TITLE_BSSID); + tableHeaderValueView.setText(R.string.stats_attacks_count); + if (selectedCompareData.equals(getString(R.string.stats_attacks_bssid))) { + tableHeaderTitleView.setText(R.string.bssid); } else { - tableHeaderTitleView.setText(FILTER_MENU_TITLE_ESSID); + tableHeaderTitleView.setText(R.string.essid); } } if (currentData == null || currentData.isEmpty()) { @@ -457,7 +409,7 @@ private void openBarSelectionMenuOnView(View anchorView) { userSelectMenuItem(item); } }); - visualiseMenu.setTitle(MENU_POPUP_TITLE); + visualiseMenu.setTitle(getString(R.string.stats_visualize)); int id = 0; for (String title : getMenuTitles()) { SimplePopupItem item = new SimplePopupItem(getActivity()); @@ -477,16 +429,15 @@ private void openBarSelectionMenuOnView(View anchorView) { */ private void userSelectMenuItem(AbstractPopupItem item) { // OPEN A DIALOG TO SPECIFY THE VISUALISE DATA - if (item.getTitle().equals(MENU_TITLE_PROTOCOLS)) { + if (item.getTitle().equals(getString(R.string.stats_protocols))) { ChartType chartType = ChartType.PIE_CHART; - selectedCompareData = COMPARE_TITLE_AttacksPerProtocol; setChartType(chartType); - setTitle(COMPARE_TITLE_AttacksPerProtocol); + setTitle(getString(R.string.stats_attacks_protocol)); } - if (item.getTitle().equals(MENU_TITLE_NETWORK)) { + if (item.getTitle().equals(getString(R.string.stats_networks))) { openNetworkDataDialog(); } - if (item.getTitle().equals(MENU_TITLE_ATTACKS)) { + if (item.getTitle().equals(getString(R.string.stats_attacks))) { openAttackDataDialog(); } } @@ -496,9 +447,9 @@ private void userSelectMenuItem(AbstractPopupItem item) { */ private ArrayList<String> getMenuTitles() { ArrayList<String> titles = new ArrayList<>(); - titles.add(MENU_TITLE_PROTOCOLS); - titles.add(MENU_TITLE_NETWORK); - titles.add(MENU_TITLE_ATTACKS); + titles.add(getString(R.string.stats_protocols)); + titles.add(getString(R.string.stats_networks)); + titles.add(getString(R.string.stats_attacks)); return titles; } @@ -516,8 +467,8 @@ private ArrayList<String> getMenuTitles() { */ private void openNetworkDataDialog() { ArrayList<String> titles = getDialogNetworkDataTitle(); - ChecklistDialog newFragment = new ChecklistDialog(DIALOG_NETWORK_TITLE, titles, selectedData(titles), false, this); - newFragment.show(getActivity().getFragmentManager(), DIALOG_NETWORK_TITLE); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.stats_select_network_data), titles, selectedData(titles), false, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.stats_select_network_data)); } /** @@ -525,8 +476,8 @@ private void openNetworkDataDialog() { */ private void openAttackDataDialog() { ArrayList<String> titles = getDialogAttackDataTitle(); - ChecklistDialog newFragment = new ChecklistDialog(DIALOG_ATTACK_TITLE, titles, selectedData(titles), false, this); - newFragment.show(getActivity().getFragmentManager(), DIALOG_ATTACK_TITLE); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.stats_select_attack_data), titles, selectedData(titles), false, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.stats_select_attack_data)); } /* @@ -544,13 +495,13 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { String title = dialog.getTitle(); ArrayList<String> titles = dialog.getSelectedItemTitles(); - if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { + if (title.equals(getString(R.string.stats_protocols))) { //titles = titles.size() == 0 ? protocolTitles() : titles; filter.setProtocols(titles); actualiseCurrentPlot(); return; } - if (title.equals(FILTER_MENU_PROTOCOL_SINGLE_CHOICE_TITLE)) { + if (title.equals(getString(R.string.stats_select_protocol))) { if (titles.size() == 0) { titles = new ArrayList<>(); titles.add(protocolTitles().get(0)); @@ -563,14 +514,14 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { return; } - if (title.equals(FILTER_MENU_TITLE_ESSID)) { - this.filter.setESSIDs(titles); + if (title.equals(getString(R.string.essid))) { + filter.setESSIDs(titles); actualiseCurrentPlot(); return; } - if (title.equals(FILTER_MENU_TITLE_BSSID)) { - this.filter.setBSSIDs(titles); + if (title.equals(getString(R.string.bssid))) { + filter.setBSSIDs(titles); actualiseCurrentPlot(); return; @@ -582,13 +533,13 @@ public void onDialogPositiveClick(ChecklistDialog dialog) { actualiseFilterButton(); - if (data.equals(COMPARE_TITLE_AttacksPerTime) || data.equals(COMPARE_TITLE_AttacksPerDate)) { + if (data.equals(getString(R.string.stats_attacks_time)) || data.equals(getString(R.string.stats_attacks_date))) { ChartType chartType = ChartType.LINE_CHART; selectedCompareData = data; setChartType(chartType); return; } - if (data.equals(COMPARE_TITLE_AttacksPerBSSID) || data.equals(COMPARE_TITLE_AttacksPerESSID)) { + if (data.equals(getString(R.string.stats_attacks_bssid)) || data.equals(getString(R.string.stats_attacks_essid))) { ChartType chartType = ChartType.BAR_CHART; selectedCompareData = data; setChartType(chartType); @@ -617,7 +568,7 @@ public void onDialogNegativeClick(ChecklistDialog dialog) { // private ArrayList<String> getDialogProtocolDataTitle(){ // ArrayList<String> data = new ArrayList<String>(); -// data.add(COMPARE_TITLE_AttacksPerProtocol); +// data.add(getString(R.string.stats_attacks_protocol)); // data.add(COMPARE_TITLE_UsesPerProtocol); // return data; // } @@ -629,8 +580,8 @@ public void onDialogNegativeClick(ChecklistDialog dialog) { */ private ArrayList<String> getDialogAttackDataTitle() { ArrayList<String> data = new ArrayList<>(); - data.add(COMPARE_TITLE_AttacksPerDate); - data.add(COMPARE_TITLE_AttacksPerTime); + data.add(getString(R.string.stats_attacks_date)); + data.add(getString(R.string.stats_attacks_time)); return data; } @@ -641,8 +592,8 @@ private ArrayList<String> getDialogAttackDataTitle() { */ private ArrayList<String> getDialogNetworkDataTitle() { ArrayList<String> data = new ArrayList<>(); - data.add(COMPARE_TITLE_AttacksPerESSID); - data.add(COMPARE_TITLE_AttacksPerBSSID); + data.add(getString(R.string.stats_attacks_essid)); + data.add(getString(R.string.stats_attacks_bssid)); return data; } @@ -707,19 +658,20 @@ private void openFilterMenuOnView(View anchor) { } }); - filterMenu.setTitle(FILTER_MENU_POPUP_TITLE); - for (String title : StatisticsFragment.this.filterMenuTitles()) { + filterMenu.setTitle(getString(R.string.rec_filter_by)); + for (String title : filterMenuTitles()) { AbstractPopupItem item; - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) continue; - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { + if (title.equals(getString(R.string.rec_latest))) continue; + if (title.equals(getString(R.string.rec_earliest))) { + item = new SplitPopupItem(getActivity()); - item.setValue(SplitPopupItem.RIGHT_TITLE, FILTER_MENU_TITLE_TIMESTAMP_BELOW); - item.setValue(SplitPopupItem.LEFT_TITLE, FILTER_MENU_TITLE_TIMESTAMP_ABOVE); - if (this.filter.hasBelowTimestamp()) { - item.setValue(SplitPopupItem.RIGHT_SUBTITLE, getDateAsString(this.filter.belowTimestamp)); + item.setValue(SplitPopupItem.RIGHT_TITLE, getString(R.string.rec_latest)); + item.setValue(SplitPopupItem.LEFT_TITLE, getString(R.string.rec_earliest)); + if (filter.hasBelowTimestamp()) { + item.setValue(SplitPopupItem.RIGHT_SUBTITLE, getDateAsString(filter.belowTimestamp)); } - if (this.filter.hasAboveTimestamp()) { - item.setValue(SplitPopupItem.LEFT_SUBTITLE, getDateAsString(this.filter.aboveTimestamp)); + if (filter.hasAboveTimestamp()) { + item.setValue(SplitPopupItem.LEFT_SUBTITLE, getDateAsString(filter.aboveTimestamp)); } } else { item = new SimplePopupItem(getActivity()); @@ -745,19 +697,19 @@ private void onFilterMenuItemSelected(AbstractPopupItem item) { return; } String title = item.getTitle(); - if (title.equals(FILTER_MENU_TITLE_ESSID)) { + if (title.equals(getString(R.string.essid))) { openESSIDFilterDialog(); } - if (title.equals(FILTER_MENU_TITLE_BSSID)) { + if (title.equals(getString(R.string.bssid))) { openBSSIDFilterDialog(); } - if (title.equals(FILTER_MENU_TITLE_PROTOCOL)) { + if (title.equals(getString(R.string.rec_protocol))) { openFilterDialogSelectProtocol(); } - if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { + if (title.equals(getString(R.string.stats_protocols))) { openProtocolsFilterDialog(); } - if (title.equals(FILTER_MENU_TITLE_REMOVE)) { + if (title.equals(getString(R.string.rec_reset_filter))) { clearFilter(); actualiseCurrentPlot(); } @@ -771,27 +723,27 @@ private void onFilterMenuItemSelected(AbstractPopupItem item) { private ArrayList<String> filterMenuTitles() { ArrayList<String> titles = new ArrayList<>(); if (currentPlotView instanceof LineGraph) { - titles.add(FILTER_MENU_TITLE_ESSID); - titles.add(FILTER_MENU_TITLE_PROTOCOLS); - titles.add(FILTER_MENU_TITLE_TIMESTAMP_ABOVE); - if (this.filter.hasESSIDs() || this.filter.hasATimestamp() || (this.filter.getProtocols() != null && this.filter.hasProtocols() && this.filter.getProtocols().size() != this.protocolTitles().size())) { - titles.add(FILTER_MENU_TITLE_REMOVE); + titles.add(getString(R.string.essid)); + titles.add(getString(R.string.stats_protocols)); + titles.add(getString(R.string.rec_earliest)); + if (filter.hasESSIDs() || filter.hasATimestamp() || (filter.getProtocols() != null && filter.hasProtocols() && filter.getProtocols().size() != protocolTitles().size())) { + titles.add(getString(R.string.rec_reset_filter)); } } else { - titles.add(FILTER_MENU_TITLE_PROTOCOL); + titles.add(getString(R.string.rec_protocol)); String protocol = getCurrentSelectedProtocol(); if (protocol.length() > 0) { - if (selectedCompareData.equals(COMPARE_TITLE_AttacksPerBSSID)) { - titles.add(FILTER_MENU_TITLE_BSSID); + if (selectedCompareData.equals(getString(R.string.stats_attacks_bssid))) { + titles.add(getString(R.string.bssid)); } else { // DEFAULT - titles.add(FILTER_MENU_TITLE_ESSID); + titles.add(getString(R.string.essid)); } } - titles.add(FILTER_MENU_TITLE_TIMESTAMP_ABOVE); - if (this.filter.hasATimestamp() || this.filter.hasESSIDs() || this.filter.hasBSSIDs() + titles.add(getString(R.string.rec_earliest)); + if (filter.hasATimestamp() || filter.hasESSIDs() || filter.hasBSSIDs() || (currentPlotView instanceof LineGraph && filter.hasProtocols())) { - titles.add(FILTER_MENU_TITLE_REMOVE); + titles.add(getString(R.string.rec_reset_filter)); } } return titles; @@ -801,12 +753,12 @@ private ArrayList<String> filterMenuTitles() { * Opens a multiple protocol checklist dialog */ private void openProtocolsFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_PROTOCOLS, + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.stats_protocols), protocolTitles(), selectedProtocols(), true, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_PROTOCOLS); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.stats_protocols)); } /** @@ -820,24 +772,24 @@ private void openFilterDialogSelectProtocol() { selected[i] = title.equals(getCurrentSelectedProtocol()); i++; } - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_PROTOCOL_SINGLE_CHOICE_TITLE, titles, selected, false, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_PROTOCOL_SINGLE_CHOICE_TITLE); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.stats_select_protocol), titles, selected, false, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.stats_select_protocol)); } /** * Opens a multiple essid checklist dialog */ private void openESSIDFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_ESSID, essids(), selectedESSIDs(), true, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_ESSID); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.essid), essids(), selectedESSIDs(), true, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.essid)); } /** * Opens a multiple bssid checlist dialog. */ private void openBSSIDFilterDialog() { - ChecklistDialog newFragment = new ChecklistDialog(FILTER_MENU_TITLE_BSSID, bssids(), selectedBSSIDs(), true, this); - newFragment.show(getActivity().getFragmentManager(), FILTER_MENU_TITLE_BSSID); + ChecklistDialog newFragment = new ChecklistDialog(getString(R.string.bssid), bssids(), selectedBSSIDs(), true, this); + newFragment.show(getActivity().getFragmentManager(), getString(R.string.bssid)); } /** @@ -1043,7 +995,7 @@ public void setLineGraphData(LineGraph linegraph) { rangeMax_Y++; rangeMin_Y--; - boolean shouldUseDate = selectedCompareData.equals(COMPARE_TITLE_AttacksPerDate); + boolean shouldUseDate = selectedCompareData.equals(getString(R.string.stats_attacks_date)); if (shouldUseDate) { linegraph.resetXLimits(); @@ -1292,7 +1244,7 @@ public ArrayList<PlotComparisonItem> getBarData() { String protocol = getCurrentSelectedProtocol(); if (protocol.length() > 0) { - if (selectedCompareData.equals(COMPARE_TITLE_AttacksPerESSID)) { + if (selectedCompareData.equals(getString(R.string.stats_attacks_essid))) { return attacksPerESSID(protocol); } // DEFAULT @@ -1351,7 +1303,7 @@ public synchronized ArrayList<PlotComparisonItem> attacksPerProtocols() { public ArrayList<PlotComparisonItem> attacksPerTime() { HashMap<String, HashMap<Long, ArrayList<RecordAll>>> lineMap = new HashMap<>(); - boolean shouldUseDate = selectedCompareData.equals(COMPARE_TITLE_AttacksPerDate); + boolean shouldUseDate = selectedCompareData.equals(getString(R.string.stats_attacks_date)); ArrayList<RecordAll> records = getFetchedRecords(); for (RecordAll record : records) { @@ -1484,7 +1436,7 @@ private ArrayList<PlotComparisonItem> resizeData(ArrayList<PlotComparisonItem> p valueOfOthers += item.getValue2(); } } - PlotComparisonItem otherItem = new PlotComparisonItem(OTHER_CHART_TITLE, getOtherColor(), 0., valueOfOthers); + PlotComparisonItem otherItem = new PlotComparisonItem(getString(R.string.stats_other), getOtherColor(), 0., valueOfOthers); otherItem.setChildItems(others); copy.add(otherItem); @@ -1612,20 +1564,20 @@ public LinearLayout getPlotLayout() { * @return boolean b */ private boolean isFilterSetForTitle(String title) { - if (title.equals(FILTER_MENU_TITLE_BSSID)) { - return this.filter.hasBSSIDs(); + if (title.equals(getString(R.string.bssid))) { + return filter.hasBSSIDs(); } - if (title.equals(FILTER_MENU_TITLE_ESSID)) { - return this.filter.hasESSIDs(); + if (title.equals(getString(R.string.essid))) { + return filter.hasESSIDs(); } - if (title.equals(FILTER_MENU_TITLE_PROTOCOLS)) { - return (this.filter.getProtocols() != null && this.filter.hasProtocols() && this.filter.getProtocols().size() != this.protocolTitles().size()); + if (title.equals(getString(R.string.stats_protocols))) { + return (filter.getProtocols() != null && filter.hasProtocols() && filter.getProtocols().size() != protocolTitles().size()); } - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_BELOW)) { - return this.filter.hasBelowTimestamp(); + if (title.equals(getString(R.string.rec_latest))) { + return filter.hasBelowTimestamp(); } - if (title.equals(FILTER_MENU_TITLE_TIMESTAMP_ABOVE)) { - return this.filter.hasAboveTimestamp(); + if (title.equals(getString(R.string.rec_earliest))) { + return filter.hasAboveTimestamp(); } return false; } @@ -1736,12 +1688,12 @@ private void userTappedOnLegendItem(int index) { } if (currentPlotView instanceof BarGraph) { - if (selectedCompareData.equals(COMPARE_TITLE_AttacksPerESSID)) { + if (selectedCompareData.equals(getString(R.string.stats_attacks_essid))) { filter.setESSIDs(selectedData); - groupingKey = MainActivity.getInstance().getResources().getString(R.string.ESSID); + groupingKey = getString(R.string.essid); } else { filter.setBSSIDs(selectedData); - groupingKey = MainActivity.getInstance().getResources().getString(R.string.BSSID); + groupingKey = getString(R.string.bssid); } ArrayList<String> currentSelectedProtocol = new ArrayList<>(); @@ -1753,7 +1705,7 @@ private void userTappedOnLegendItem(int index) { selectedData.add(item.getTitle()); filter.setESSIDs(selectedData); filter.setProtocols(this.filter.getProtocols()); - groupingKey = MainActivity.getInstance().getResources().getString(R.string.ESSID); + groupingKey = getString(R.string.essid); } if (this.filter.hasATimestamp()) { diff --git a/src/main/res/layout/fragment_record_detail.xml b/src/main/res/layout/fragment_record_detail.xml index 64a88c80..19140f03 100644 --- a/src/main/res/layout/fragment_record_detail.xml +++ b/src/main/res/layout/fragment_record_detail.xml @@ -62,7 +62,7 @@ android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:gravity="center" - android:text="@string/RecordSSID" + android:text="@string/ssid" android:textAllCaps="true" android:textAppearance="?android:attr/textAppearanceSmall" /> @@ -83,7 +83,7 @@ android:layout_alignParentStart="true" android:layout_alignParentLeft="true" android:gravity="center" - android:text="@string/RecordBSSID" + android:text="@string/bssid" android:textAllCaps="true" android:textAppearance="?android:attr/textAppearanceSmall" /> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index bd3e9712..44901d7b 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -42,8 +42,6 @@ <string name="RecordAttackType">Typ</string> <string name="RecordInternalAttack">Interner Angriff</string> <string name="RecordExternalAttack">Externer Angriff</string> - <string name="RecordBSSID">BSSID</string> - <string name="RecordSSID">SSID</string> <string name="RecordTimestamp">Zeitstempel</string> <string name="RecordProtocol">Protokoll</string> @@ -91,8 +89,6 @@ <string name="save">Speichern</string> <string name="rec_protocol">Protokoll</string> <string name="date">Datum</string> - <string name="ESSID">ESSID</string> - <string name="BSSID">BSSID</string> <string name="rec_sortby">Sortieren</string> <string name="rec_latest">Bis</string> <string name="rec_earliest">Von</string> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index e1144bc1..a99edca0 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -36,6 +36,9 @@ <string name="ssid" translatable="false">SSID</string> <string name="bssid" translatable="false">BSSID</string> + <string name="essid" translatable="false">ESSID</string> + <string name="ip" translatable="false">IP</string> + <string name="protocol">Protocol:</string> <string name="timestamp">Timestamp:</string> <string name="hostage.location" tools:ignore="ExtraTranslation">Location:</string> @@ -61,9 +64,6 @@ <string name="RecordAttackType">Type</string> <string name="RecordInternalAttack">Internal attack</string> <string name="RecordExternalAttack">External attack</string> - <string name="RecordBSSID">BSSID</string> - <string name="RecordSSID">SSID</string> - <string name="RecordIP" translatable="false">IP</string> <string name="RecordTimestamp">Timestamp</string> <string name="RecordProtocol">Protocol</string> @@ -113,9 +113,7 @@ <string name="save">Save</string> <string name="rec_protocol">Protocol</string> <string name="date">Date</string> - <string name="ESSID">ESSID</string> - <string name="BSSID">BSSID</string> - <string name="IP" translatable="false">IP</string> + <string name="rec_sortby">Sort by</string> <string name="rec_latest">Latest</string> <string name="rec_earliest">Earliest</string> From 7843435c4c58099d304866ad3ff1e70fccb8c45a Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 25 Aug 2021 13:02:39 +0200 Subject: [PATCH 16/26] remove unused string resources --- src/main/res/values-de/strings.xml | 6 ------ src/main/res/values/strings.xml | 7 ------- 2 files changed, 13 deletions(-) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 44901d7b..98d9ea4a 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -20,14 +20,8 @@ <string name="monitor_current_connection">Überwache Verbindung</string> <string name="active_profile">Aktives Profil: </string> - <string name="protocol">Protokoll:</string> - <string name="timestamp">Zeitstempel:</string> - <string name="hostage.location" tools:ignore="ExtraTranslation">Ort:</string> <string name="internal_ip">Interne IP</string> <string name="external_ip">Externe IP</string> - <string name="remote_ip">Remote IP:</string> - <string name="packet_type">Packet Typ:</string> - <string name="packet_content">Packet Inhalt:</string> <string name="delete">Löschen</string> <string name="cancel">Abbrechen</string> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a99edca0..457797c7 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -39,15 +39,8 @@ <string name="essid" translatable="false">ESSID</string> <string name="ip" translatable="false">IP</string> - <string name="protocol">Protocol:</string> - <string name="timestamp">Timestamp:</string> - <string name="hostage.location" tools:ignore="ExtraTranslation">Location:</string> <string name="internal_ip">Internal IP</string> - <string name="subnet_mask">Subnet Mask:</string> <string name="external_ip">External IP</string> - <string name="remote_ip">Remote IP:</string> - <string name="packet_type">Packet type:</string> - <string name="packet_content">Packet content:</string> <string name="delete">Delete</string> <string name="cancel">Cancel</string> From c939f8dda1aeb081e8a3aa7b3da1f70e27919c63 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 25 Aug 2021 16:05:43 +0200 Subject: [PATCH 17/26] remove overlooked merge conflict artefacts --- .../hostage/ui/fragment/PrivacyFragment.java | 178 +----------------- 1 file changed, 4 insertions(+), 174 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java index d04f74f6..60f60427 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/PrivacyFragment.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.os.Bundle; +import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -24,7 +25,7 @@ public class PrivacyFragment extends Fragment { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); - + final Activity activity = getActivity(); if (activity != null) { activity.setTitle(getResources().getString(R.string.privacy_policy)); @@ -41,125 +42,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, " </head>\n" + " <body>\n" + " <strong>Privacy Policy</strong> <p>\n" + - <<<<<<<HEAD - " Aalborg University, Denmark built the HosTaGe app as\n" + - " an Open Source app. This SERVICE is provided by\n" + - " Aalborg University, Denmark at no cost and is intended for use as\n" + - " is.\n" + - " </p> <p>\n" + - " This page is used to inform visitors regarding our\n" + - " policies with the collection, use, and disclosure of Personal\n" + - " Information if anyone decided to use our Service.\n" + - " </p> <p>\n" + - " If you choose to use our Service, then you agree to\n" + - " the collection and use of information in relation to this\n" + - " policy. The Personal Information that we collect is\n" + - " used for providing and improving the Service. We will not use or share your information with\n" + - " anyone except as described in this Privacy Policy.\n" + - " </p> <p>\n" + - " The users can consent for the following:\n" + - " <ul> \n " + - " <li> The right to be forgotten – to get your data deleted. The right to have incorrect data corrected. </li> \n " + - " <li> The right to know what data a controller have on you. </li> \n " + - " <li> The right to have your data shared with another organization, if requested be the subject. </li> \n " + - " <li> The right to not be profiled, the right to object.</li> \n " + - " </ul> \n " + - " </p> <p>\n" + - " The terms used in this Privacy Policy have the same meanings\n" + - " as in our Terms and Conditions, which is accessible at\n" + - " HosTaGe unless otherwise defined in this Privacy Policy.\n" + - " The Privacy Policy of Aalborg University can be accessed at https://www.en.aau.dk/privacy-policy-cookies#370625\n" + - " </p> <p><strong>Information Collection and Use</strong></p> <p>\n" + - " For a better experience, while using our Service, we\n" + - " may require you to provide us with certain personally\n" + - " identifiable information. The information that\n" + - " we request will be retained by us and used as described in this privacy policy.\n" + - " </p> <div><p>\n" + - " On app startup, we ask for user consent for accessing the location permission. \n" + - " This information is required to access the network related information, necessary for the app main functionality.\n" + - " </p> <p>\n" + - " </p> <div><p>\n" + - " The app does use third party services that may collect\n" + - " information used to identify you.\n" + - " </p> <p>\n" + - " Link to privacy policy of third party service providers used\n" + - " by the app\n" + - " </p> <ul><li><a href=\"https://www.google.com/policies/privacy/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Play Services</a></li><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----><!----></ul></div> <p><strong>Log Data</strong></p> <p>\n" + - " We want to inform you that whenever you\n" + - " use our Service, in a case of an error in the app\n" + - " we collect data and information (through third party\n" + - " products) on your phone called Log Data. This Log Data may\n" + - " include information such as your device Internet Protocol\n" + - " (“IP”) address, device name, operating system version, the\n" + - " configuration of the app when utilizing our Service,\n" + - " the time and date of your use of the Service, and other\n" + - " statistics. The logs will be purged periodically every 3 months.\n" + - " </p> <p><strong>Cookies</strong></p> <p>\n" + - " Cookies are files with a small amount of data that are\n" + - " commonly used as anonymous unique identifiers. These are sent\n" + - " to your browser from the websites that you visit and are\n" + - " stored on your device's internal memory.\n" + - " </p> <p>\n" + - " This Service does not use these “cookies” explicitly. However,\n" + - " the app may use third party code and libraries that use\n" + - " “cookies” to collect information and improve their services.\n" + - " You have the option to either accept or refuse these cookies\n" + - " and know when a cookie is being sent to your device. If you\n" + - " choose to refuse our cookies, you may not be able to use some\n" + - " portions of this Service.\n" + - " </p> <p><strong>Service Providers</strong></p> <p>\n" + - " We may employ third-party companies and\n" + - " individuals due to the following reasons:\n" + - " </p> <ul><li>To facilitate our Service;(Google Services for hosting the app information)</li> <li>To provide the Service on our behalf;</li> <li>To perform Service-related services; or</li> <li>To assist us in analyzing how our Service is used.</li></ul> <p>\n" + - " We want to inform users of this Service\n" + - " that these third parties have access to your Personal\n" + - " Information. The reason is to perform the tasks assigned to\n" + - " them on our behalf. However, they are obligated not to\n" + - " disclose or use the information for any other purpose.\n" + - " </p> <p><strong>Security</strong></p> <p>\n" + - " We value your trust in providing us your\n" + - " Personal Information, thus we are striving to use commercially\n" + - " acceptable means of protecting it. But remember that no method\n" + - " of transmission over the internet, or method of electronic\n" + - " storage is 100% secure and reliable, and we cannot\n" + - " guarantee its absolute security.\n" + - " </p> <p><strong>Links to Other Sites</strong></p> <p>\n" + - " This Service may contain links to other sites. If you click on\n" + - " a third-party link, you will be directed to that site. Note\n" + - " that these external sites are not operated by us.\n" + - " Therefore, we strongly advise you to review the\n" + - " Privacy Policy of these websites. We have\n" + - " no control over and assume no responsibility for the content,\n" + - " privacy policies, or practices of any third-party sites or\n" + - " services.\n" + - " </p> <p><strong>Children’s Privacy</strong></p> <p>\n" + - " These Services do not address anyone under the age of 13.\n" + - " We do not knowingly collect personally\n" + - " identifiable information from children under 13 years of age. In the case\n" + - " we discover that a child under 13 has provided\n" + - " us with personal information, we immediately\n" + - " delete this from our servers. If you are a parent or guardian\n" + - " and you are aware that your child has provided us with\n" + - " personal information, please contact us so that\n" + - " we will be able to do necessary actions.\n" + - " </p> <p><strong>Changes to This Privacy Policy</strong></p> <p>\n" + - " We may update our Privacy Policy from\n" + - " time to time. Thus, you are advised to review this page\n" + - " periodically for any changes. We will\n" + - " notify you of any changes by posting the new Privacy Policy on\n" + - " this page.\n" + - " </p> <p>This policy is effective as of 2021-03-08</p> <p><strong>Contact Us</strong></p> <p>\n" + - " If you have any questions or suggestions about our\n" + - " Privacy Policy, do not hesitate to contact us at hostage@es.aau.dk.\n" + - "Data subjects have the right to submit a complaint about how their personal data is processed\n" + - "to the Danish Data Protection Agency at dt@datatilsynet.dk or by post to Datatilsynet/the \n" + - "Danish Data Protection Agency, Borgergade 28, 5., 1300 Copenhagen K.\n" + - "Please contact our Data Protection Officer if you have any question about the processing of \n" + - "your personal data at dpo@aau.dk\n" + - "However, before contacting the Danish Data Protection Agency, we recommend that you \n" + - "contact Aalborg University’s data protection officer who may be able to solve the matter.\n" + - ======= - " Aalborg University, Denmark built the HosTaGe app as" + + " Aalborg University, Denmark built the HosTaGe app as" + " an Open Source app. This SERVICE is provided by" + " Aalborg University, Denmark at no cost and is intended for use as" + " is." + @@ -276,69 +159,16 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, "your personal data at dpo@aau.dk" + "However, before contacting the Danish Data Protection Agency, we recommend that you " + "contact Aalborg University’s data protection officer who may be able to solve the matter." + - >>>>>>>ver - 2.4 (major) "\n" + " </body>\n" + " </html>\n"; TextView policy = rootView.findViewById(R.id.policyText); policy.setText(HtmlCompat.fromHtml(policyText, 0)); -<<<<<<<HEAD + policy.setMovementMethod(LinkMovementMethod.getInstance()); return rootView; } - - @Override - public void onDestroy() { - super.onDestroy(); - if (rootView != null) { - unbindDrawables(rootView); - rootView = null; - - } - } - - @Override - public void onResume() { - super.onResume(); - onCreateView(inflater, container, savedInstanceState); - } - - @Override - public void onPause() { - super.onPause(); - if (rootView != null) { - unbindDrawables(rootView); - rootView = null; - } - } - - @Override - public void onStop() { - super.onStop(); - if (rootView != null) { - unbindDrawables(rootView); - rootView = null; - } - } - - private void unbindDrawables(View view) { - if (view.getBackground() != null) { - view.getBackground().setCallback(null); - } - if (view instanceof ViewGroup && !(view instanceof AdapterView)) { - for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { - unbindDrawables(((ViewGroup) view).getChildAt(i)); - } - ((ViewGroup) view).removeAllViews(); - } - } -======= - policy.setMovementMethod(LinkMovementMethod.getInstance()); - - return rootView; } ->>>>>>>ver-2.4(major) - } From ea6ba2d81a79f62c0c980c9b04317a9acd400f87 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Mon, 30 Aug 2021 14:39:08 +0200 Subject: [PATCH 18/26] fix background location being requested twice --- .../netsec/hostage/location/CustomLocationManager.java | 1 - .../dk/aau/netsec/hostage/ui/activity/MainActivity.java | 1 - .../dk/aau/netsec/hostage/ui/fragment/HomeFragment.java | 9 +++++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java index 65034361..4587c537 100644 --- a/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java +++ b/src/main/java/dk/aau/netsec/hostage/location/CustomLocationManager.java @@ -339,7 +339,6 @@ private void requestBackgroundLocationPermission(Fragment fragment) { dialog.setPositiveButton(R.string.ok, ((dialog1, which) -> showLocationRequestDialog(fragment, Manifest.permission.ACCESS_BACKGROUND_LOCATION))); - AlertDialog alertDialog = dialog.create(); alertDialog.show(); } diff --git a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java index 820acf58..aec42386 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java @@ -316,7 +316,6 @@ protected void onSaveInstanceState(Bundle outState) { */ private void onFirstRun() { AlertDialog.Builder builder = new AlertDialog.Builder(this); -// TODO adjust disclaimer to mention T&C location as well builder.setMessage(Html.fromHtml(getString(R.string.hostage_disclaimer))) .setCancelable(false) .setPositiveButton(getString(R.string.agree), (dialog, id) -> { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java index e6d50304..a9daab37 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/fragment/HomeFragment.java @@ -223,12 +223,17 @@ public void initAsNotActive() { setStateNotActive(false); } + public void initStateActive(){ + setStateActive(); + + mHomeSwitchConnection.setChecked(true); + } + public void setStateActive() { mHomeTextName.setTextColor(mDefaultTextColor); mHomeTextProfile.setTextColor(mDefaultTextColor); mHomeTextProfileHeader.setTextColor(mDefaultTextColor); - mHomeSwitchConnection.setChecked(true); isActive = true; } @@ -269,7 +274,7 @@ public void updateUI() { } updateTextConnection(totalAttacks); if (hasActiveListeners) { - setStateActive(); + initStateActive(); // color text according to threat level changeTextColorThreat(totalAttacks); //updateAndroidIcon(); From 6b2f73ee18cab5db36ed9b25d5e9660d6623dfb5 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Mon, 30 Aug 2021 14:40:10 +0200 Subject: [PATCH 19/26] temporarily disable backups --- src/main/AndroidManifest.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 94b2dbaf..b1255d7b 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -30,11 +30,11 @@ <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> - +<!--TODO investigate about backup--> <application android:name="dk.aau.netsec.hostage.HostageApplication" - android:allowBackup="true" - android:fullBackupContent="true" + android:allowBackup="false" + android:fullBackupOnly="false" android:allowClearUserData="true" android:hardwareAccelerated="true" android:icon="@drawable/ic_launcher" From 7e3bd931d9a0bafcd8d62703fb7e16aac5dae71b Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 1 Sep 2021 10:40:36 +0200 Subject: [PATCH 20/26] bump dependency versions to latest available --- build.gradle | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/build.gradle b/build.gradle index f15a4745..72599ea2 100644 --- a/build.gradle +++ b/build.gradle @@ -32,15 +32,15 @@ allprojects { dependencies { //firebase implementation 'com.google.firebase:firebase-crashlytics:18.2.1' - implementation 'com.google.firebase:firebase-analytics:19.0.0' - implementation 'com.google.firebase:firebase-core:19.0.0' + implementation 'com.google.firebase:firebase-analytics:19.0.1' + implementation 'com.google.firebase:firebase-core:19.0.1' //google api implementation 'com.google.android.gms:play-services-base:17.6.0' implementation 'com.google.android.gms:play-services-basement:17.6.0' implementation 'com.google.android.gms:play-services-tasks:17.2.1' implementation 'com.google.android.gms:play-services-location:18.0.0' - implementation 'com.google.android.gms:play-services-analytics:17.0.0' + implementation 'com.google.android.gms:play-services-analytics:17.0.1' implementation 'com.google.android.gms:play-services-maps:17.0.1' implementation 'com.google.android.gms:play-services-auth:19.2.0' //greenDao @@ -55,7 +55,7 @@ dependencies { //AMQP // https://mvnrepository.com/artifact/com.rabbitmq/amqp-client - implementation group: 'com.rabbitmq', name: 'amqp-client', version: '5.12.0' + implementation group: 'com.rabbitmq', name: 'amqp-client', version: '5.13.1' implementation files('libs/qpid-broker-core-9.0.0-SNAPSHOT.jar') //forked repo https://github.com/irinil/qpid-broker-j @@ -63,11 +63,11 @@ dependencies { // https://mvnrepository.com/artifact/javax.naming/jndi implementation files('libs/jndi-1.2.1.jar') // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-amqp-0-8-protocol - implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-amqp-0-8-protocol', version: '8.0.4' + implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-amqp-0-8-protocol', version: '8.0.6' // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-amqp-1-0-protocol implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-amqp-1-0-protocol', version: '8.0.4' // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-memory-store - implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-memory-store', version: '8.0.4' + implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-memory-store', version: '8.0.6' //dependencies of AMQP broker // https://mvnrepository.com/artifact/com.google.guava/guava @@ -82,7 +82,7 @@ dependencies { //MQTT //moquette - implementation 'io.moquette:moquette-broker:0.12.1' + implementation 'io.moquette:moquette-broker:0.15' //hive-Mq implementation group: 'com.hivemq', name: 'hivemq-mqtt-client', version: '1.2.2' @@ -99,7 +99,7 @@ dependencies { implementation "androidx.constraintlayout:constraintlayout:2.1.0" - implementation "androidx.work:work-runtime:2.6.0-rc01" + implementation 'androidx.work:work-runtime:2.7.0-alpha05' //androidX legacy support implementation 'androidx.legacy:legacy-support-v4:1.0.0' @@ -110,14 +110,14 @@ dependencies { implementation files('libs/alfresco-jlan.jar') implementation files('libs/nineoldandroids-2.4.0.jar') implementation files('libs/cryptix-jce-provider.jar') - implementation group: 'org.snmp4j', name: 'snmp4j', version: '3.4.5' + implementation group: 'org.snmp4j', name: 'snmp4j', version: '3.5.1' // https://mvnrepository.com/artifact/org.snmp4j/snmp4j-agent - implementation group: 'org.snmp4j', name: 'snmp4j-agent', version: '3.3.6' + implementation group: 'org.snmp4j', name: 'snmp4j-agent', version: '3.5.0' implementation files('libs/VirusTotalAPI.jar') - implementation 'com.google.firebase:firebase-analytics:19.0.0' + implementation 'com.google.firebase:firebase-analytics:19.0.1' // https://mvnrepository.com/artifact/com.hierynomus/smbj - testImplementation group: 'com.hierynomus', name: 'smbj', version: '0.11.1' + testImplementation group: 'com.hierynomus', name: 'smbj', version: '0.11.3' // https://mvnrepository.com/artifact/commons-io/commons-io implementation group: 'commons-io', name: 'commons-io', version: '2.9.0' @@ -136,7 +136,7 @@ dependencies { //testImplementation 'androidx.test:core:1.2.0' // Optional -- Mockito framework - testImplementation "org.mockito:mockito-core:3.10.0" + testImplementation 'org.mockito:mockito-core:3.12.4' implementation 'androidx.annotation:annotation:1.2.0' androidTestImplementation 'androidx.test:rules:1.4.0' @@ -151,7 +151,7 @@ dependencies { testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.9' implementation 'androidx.multidex:multidex:2.0.1' // Optional -- Robolectric environment - testImplementation 'org.robolectric:robolectric:4.4.1' + testImplementation 'org.robolectric:robolectric:4.6.1' } greendao { From 9eb3c5e89844bc278f488487fa20c7b30b1d9da6 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 1 Sep 2021 10:41:40 +0200 Subject: [PATCH 21/26] delete unused code --- .../aau/netsec/hostage/system/Decompress.java | 61 ---- .../system/iptablesUtils/RootCommand.java | 194 ----------- .../iptablesUtils/RootShellService.java | 310 ------------------ .../iptablesUtils/RootShellService2.java | 287 ---------------- 4 files changed, 852 deletions(-) delete mode 100644 src/main/java/dk/aau/netsec/hostage/system/Decompress.java delete mode 100644 src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java delete mode 100644 src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java delete mode 100644 src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java diff --git a/src/main/java/dk/aau/netsec/hostage/system/Decompress.java b/src/main/java/dk/aau/netsec/hostage/system/Decompress.java deleted file mode 100644 index cc4dfe86..00000000 --- a/src/main/java/dk/aau/netsec/hostage/system/Decompress.java +++ /dev/null @@ -1,61 +0,0 @@ -package dk.aau.netsec.hostage.system; - -import android.util.Log; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -/** - * Created by shankar on 16.05.14. - */ -public class Decompress { - private final String _zipFile; - private final String _location; - - public Decompress(String zipFile, String location) { - _zipFile = zipFile; - _location = location; - - _dirChecker(""); - } - - public void unzip() { - try { - FileInputStream fin = new FileInputStream(_zipFile); - ZipInputStream zin = new ZipInputStream(fin); - ZipEntry ze; - while ((ze = zin.getNextEntry()) != null) { - Log.v("Decompress", "Unzipping " + ze.getName()); - - if (ze.isDirectory()) { - _dirChecker(ze.getName()); - } else { - FileOutputStream fout = new FileOutputStream(_location + ze.getName()); - for (int c = zin.read(); c != -1; c = zin.read()) { - fout.write(c); - } - - zin.closeEntry(); - fout.close(); - } - - } - zin.close(); - } catch (IOException e) { - Log.e("Decompress", "unzip", e); - } - - } - - private void _dirChecker(String dir) { - File f = new File(_location + dir); - - if (!f.isDirectory()) { - f.mkdirs(); - } - } -} diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java deleted file mode 100644 index f331fbb5..00000000 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootCommand.java +++ /dev/null @@ -1,194 +0,0 @@ -package dk.aau.netsec.hostage.system.iptablesUtils; - -import android.content.Context; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import static dk.aau.netsec.hostage.system.iptablesUtils.RootShellService2.NO_TOAST; -/** - * Created by ukanth on 21/10/17. - */ -public class RootCommand implements Cloneable, Serializable { - public Callback cb = null; - public int successToast = NO_TOAST; - public int failureToast = NO_TOAST; - public boolean reopenShell = false; - public int retryExitCode = -1; - public int commandIndex; - public boolean ignoreExitCode; - public Date startTime; - public int retryCount; - public StringBuilder res; - public String lastCommand; - public StringBuilder lastCommandResult; - public int exitCode; - public boolean done = false; - public int hash = -1; - public boolean isv6 = false; - - private List<String> commands; - - public RootCommand setHash(int hash) { - this.hash = hash; - return this; - } - - private RootShellService rootShellService; - private RootShellService2 rootShellService2; - - public RootCommand() { - rootShellService = new RootShellService(); - rootShellService2 = new RootShellService2(); - } - - - @Override - public RootCommand clone() { - RootCommand rootCommand = null; - try { - rootCommand = (RootCommand) super.clone(); - rootCommand.isv6 = true; - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - return rootCommand; - } - - public List<String> getCommands() { - return commands; - } - - public void setCommands(List<String> commands) { - this.commands = commands; - } - - /** - * Set callback to run after command completion - * - * @param cb Callback object, with cbFunc() populated - * @return RootCommand builder object - */ - public RootCommand setCallback(Callback cb) { - this.cb = cb; - return this; - } - - /** - * Tell RootShell to display a toast message on success - * - * @param resId Resource ID of the toast string - * @return RootCommand builder object - */ - public RootCommand setSuccessToast(int resId) { - this.successToast = resId; - return this; - } - - /** - * Tell RootShell to display a toast message on failure - * - * @param resId Resource ID of the toast string - * @return RootCommand builder object - */ - public RootCommand setFailureToast(int resId) { - this.failureToast = resId; - return this; - } - - /** - * Tell RootShell whether or not it should try to open a new root shell if the last attempt - * died. To avoid "thrashing" it might be best to only try this in response to a user - * request - * - * @param reopenShell true to attempt reopening a failed shell - * @return RootCommand builder object - */ - public RootCommand setReopenShell(boolean reopenShell) { - this.reopenShell = reopenShell; - return this; - } - - /** - * Capture the command output in this.res - * - * @param enableLog true to enable logging - * @return RootCommand builder object - */ - public RootCommand setLogging(boolean enableLog) { - if (enableLog) { - this.res = new StringBuilder(); - } else { - this.res = null; - } - return this; - } - - /** - * Retry a failed command on a specific exit code - * - * @param retryExitCode code that indicates a transient failure - * @return RootCommand builder object - */ - public RootCommand setRetryExitCode(int retryExitCode) { - this.retryExitCode = retryExitCode; - return this; - } - - /** - * Run a series of commands as root; call cb.cbFunc() when complete - * - * @param ctx Context object used to create toasts - * @param script List of commands to run as root - */ - public final void run(Context ctx, List<String> script) { - if (rootShellService == null) { - rootShellService = new RootShellService(); - } - rootShellService.runScriptAsRoot(ctx, script, this); - } - - /** - * Run a series of commands as root; call cb.cbFunc() when complete - * - * @param ctx Context object used to create toasts - * @param script List of commands to run as root - */ - public final void run(Context ctx, List<String> script, boolean isv6) { - if (rootShellService == null) { - rootShellService = new RootShellService(); - } - if (rootShellService2 == null) { - rootShellService2 = new RootShellService2(); - } - if (isv6) { - rootShellService2.runScriptAsRoot(ctx, script, this); - } else { - rootShellService.runScriptAsRoot(ctx, script, this); - } - } - - /** - * Run a single command as root; call cb.cbFunc() when complete - * - * @param ctx Context object used to create toasts - * @param cmd Command to run as root - */ - public final void run(Context ctx, String cmd) { - if (rootShellService == null) { - rootShellService = new RootShellService(); - } - List<String> script = new ArrayList<>(); - script.add(cmd); - rootShellService.runScriptAsRoot(ctx, script, this); - } - - public static abstract class Callback { - /** - * Optional user-specified callback - */ - public abstract void cbFunc(RootCommand state); - } -} \ No newline at end of file diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java deleted file mode 100644 index 1005e69c..00000000 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService.java +++ /dev/null @@ -1,310 +0,0 @@ -/** - * Keep a persistent root shell running in the background - * <p> - * Copyright (C) 2013 Kevin Cernekee - * <p> - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * <p> - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * <p> - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * @author Kevin Cernekee - * @version 1.0 - */ - -package dk.aau.netsec.hostage.system.iptablesUtils; - -import android.app.NotificationManager; -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.util.Log; - -import androidx.annotation.Nullable; -import androidx.core.app.NotificationCompat; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; - -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; -import java.util.Timer; -import java.util.TimerTask; - -import dk.aau.netsec.hostage.R; -import eu.chainfire.libsuperuser.Debug; -import eu.chainfire.libsuperuser.Shell; - -public class RootShellService extends Service implements Cloneable { - public static final String TAG = "Iptables"; - public static final int NOTIFICATION_ID = 33347; - public static final int EXIT_NO_ROOT_ACCESS = -1; - public static final int NO_TOAST = -1; - /* write command completion times to logcat */ - private static final boolean enableProfiling = false; - //number of retries - increase the count - private final static int MAX_RETRIES = 10; - private static Shell.Interactive rootSession; - private static NotificationManager notificationManager; - private static ShellState rootState = ShellState.INIT; - private static final LinkedList<RootCommand> waitQueue = new LinkedList<>(); - - @Override - public RootShellService clone() { - RootShellService rootShellService = null; - try { - rootShellService = (RootShellService) super.clone(); - } catch (CloneNotSupportedException e) { - e.printStackTrace(); - } - return rootShellService; - } - - private static void complete(final RootCommand state, Context context, int exitCode) { - if (enableProfiling) { - Log.d(TAG, "RootShell: " + state.getCommands().size() + " commands completed in " + - (new Date().getTime() - state.startTime.getTime()) + " ms"); - } - state.exitCode = exitCode; - state.done = true; - if (state.cb != null) { - state.cb.cbFunc(state); - } - - if (exitCode == 0 && state.successToast != NO_TOAST) { - Api.sendToastBroadcast(context, context.getString(state.successToast)); - } else if (exitCode != 0 && state.failureToast != NO_TOAST) { - Api.sendToastBroadcast(context, context.getString(state.failureToast)); - } - - if (notificationManager != null) { - notificationManager.cancel(NOTIFICATION_ID); - } - } - - private static void runNextSubmission(Context context) { - - RootCommand state; - try { - state = waitQueue.remove(); - } catch (NoSuchElementException e) { - // nothing left to do - if (rootState == ShellState.BUSY) { - rootState = ShellState.READY; - } - return; - } - if (state != null) { - //same as last one. ignore it - Log.i(TAG, "Start processing next state"); - if (enableProfiling) { - state.startTime = new Date(); - } - if (rootState == ShellState.FAIL) { - // if we don't have root, abort all queued commands - complete(state, context, EXIT_NO_ROOT_ACCESS); - } else if (rootState == ShellState.READY) { - rootState = ShellState.BUSY; - processCommands(context, state); - } - } - - } - - private static void processCommands(Context context, final RootCommand state) { - if (state.commandIndex < state.getCommands().size() && state.getCommands().get(state.commandIndex) != null) { - String command = state.getCommands().get(state.commandIndex); - //not to send conflicting status - if (!state.isv6) { - sendUpdate(context, state); - } - if (command != null) { - state.ignoreExitCode = false; - - if (command.startsWith("#NOCHK# ")) { - command = command.replaceFirst("#NOCHK# ", ""); - state.ignoreExitCode = true; - } - state.lastCommand = command; - state.lastCommandResult = new StringBuilder(); - try { - rootSession.addCommand(command, 0, (commandCode, exitCode, output) -> { - if (output != null) { - ListIterator<String> iter = output.listIterator(); - while (iter.hasNext()) { - String line = iter.next(); - if (line != null && !line.equals("")) { - if (state.res != null) { - state.res.append(line).append("\n"); - } - state.lastCommandResult.append(line).append("\n"); - } - } - } - if (exitCode >= 0 && exitCode == state.retryExitCode && state.retryCount < MAX_RETRIES) { - //lets wait for few ms before trying ? - state.retryCount++; - Log.d(TAG, "command '" + state.lastCommand + "' exited with status " + exitCode + - ", retrying (attempt " + state.retryCount + "/" + MAX_RETRIES + ")"); - processCommands(context, state); - return; - } - - state.commandIndex++; - state.retryCount = 0; - - boolean errorExit = exitCode != 0 && !state.ignoreExitCode; - if (state.commandIndex >= state.getCommands().size() || errorExit) { - complete(state, context, exitCode); - if (exitCode < 0) { - rootState = ShellState.FAIL; - Log.e(TAG, "libsuperuser error " + exitCode + " on command '" + state.lastCommand + "'"); - } else { - if (errorExit) { - Log.i(TAG, "command '" + state.lastCommand + "' exited with status " + exitCode + - "\nOutput:\n" + state.lastCommandResult); - } - rootState = ShellState.READY; - } - runNextSubmission(context); - } else { - processCommands(context, state); - } - }); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { - Log.e(TAG, e.getMessage(), e); - } - } - } else { - complete(state, context, 0); - } - } - - private static void sendUpdate(Context context, final RootCommand state2) { - new Thread(() -> { - Intent broadcastIntent = new Intent(); - broadcastIntent.setAction("UPDATEUI4"); - broadcastIntent.putExtra("SIZE", state2.getCommands().size()); - broadcastIntent.putExtra("INDEX", state2.commandIndex); - LocalBroadcastManager.getInstance(context).sendBroadcast(broadcastIntent); - }).start(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if (intent == null) { // if crash restart... - Log.i(TAG, "Restarting RootShell..."); - List<String> cmds = new ArrayList<>(); - cmds.add("true"); - new RootCommand().setFailureToast(R.string.error_su) - .setReopenShell(true).run(getApplicationContext(), cmds); - } - return Service.START_STICKY; - } - - private void setupLogging() { - Debug.setDebug(false); - Debug.setLogTypeEnabled(Debug.LOG_ALL, false); - Debug.setLogTypeEnabled(Debug.LOG_GENERAL, false); - Debug.setSanityChecksEnabled(false); - Debug.setOnLogListener((type, typeIndicator, message) -> Log.i(TAG, "[libsuperuser] " + message)); - } - - - private void startShellInBackground(Context context) { - Log.d(TAG, "Starting root shell..."); - setupLogging(); - //start only rootSession is null - if (rootSession == null) { - rootSession = new Shell.Builder(). - useSU(). - setWantSTDERR(true). - setWatchdogTimeout(5). - open((commandCode, exitCode, output) -> { - if (exitCode < 0) { - Log.e(TAG, "Can't open root shell: exitCode " + exitCode); - rootState = ShellState.FAIL; - } else { - Log.d(TAG, "Root shell is open"); - rootState = ShellState.READY; - } - runNextSubmission(context); - }); - } - - } - - private void reOpenShell(Context context) { - if (rootState == null || rootState != ShellState.READY || rootState == ShellState.FAIL) { - if (notificationManager != null) { - notificationManager.cancel(NOTIFICATION_ID); - } - rootState = ShellState.BUSY; - startShellInBackground(context); - try { - Intent intent = new Intent(context, RootShellService.class); - context.startService(intent); - } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); - } - } - } - - - public void runScriptAsRoot(Context ctx, List<String> cmds, RootCommand state) { - Log.i(TAG, "Received cmds: #" + cmds.size()); - state.setCommands(cmds); - state.commandIndex = 0; - state.retryCount = 0; - - //already in memory and applied - //add it to queue - Log.d(TAG, "Hashing...." + state.isv6); - Log.d(TAG, state.hash + ""); - - waitQueue.add(state); - - if (rootState == ShellState.INIT || (rootState == ShellState.FAIL && state.reopenShell)) { - reOpenShell(ctx); - } else if (rootState != ShellState.BUSY) { - runNextSubmission(ctx); - } else { - new Timer().schedule(new TimerTask() { - @Override - public void run() { - Log.i(TAG, "State of rootShell: " + rootState); - if (rootState == ShellState.BUSY) { - //try resetting state to READY forcefully - Log.i(TAG, "Forcefully changing the state " + rootState); - rootState = ShellState.READY; - } - runNextSubmission(ctx); - } - }, 10000); - } - } - - @Nullable - @Override - public IBinder onBind(Intent intent) { - return null; - } - - public enum ShellState { - INIT, - READY, - BUSY, - FAIL - } -} \ No newline at end of file diff --git a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java b/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java deleted file mode 100644 index 38d25b9e..00000000 --- a/src/main/java/dk/aau/netsec/hostage/system/iptablesUtils/RootShellService2.java +++ /dev/null @@ -1,287 +0,0 @@ -/** - * Keep a persistent root shell running in the background - * <p> - * Copyright (C) 2013 Kevin Cernekee - * <p> - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * <p> - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * <p> - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * @author Kevin Cernekee - * @version 1.0 - */ - -package dk.aau.netsec.hostage.system.iptablesUtils; - - -import android.app.Service; -import android.content.Context; -import android.content.Intent; -import android.os.IBinder; -import android.util.Log; - -import androidx.annotation.Nullable; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; - -import java.util.ArrayList; -import java.util.Date; -import java.util.LinkedList; -import java.util.List; -import java.util.ListIterator; -import java.util.NoSuchElementException; -import java.util.Timer; -import java.util.TimerTask; - -import dk.aau.netsec.hostage.R; -import eu.chainfire.libsuperuser.Debug; -import eu.chainfire.libsuperuser.Shell; - - -public class RootShellService2 extends Service { - public static final String TAG = "Iptables"; - public static final int NOTIFICATION_ID = 33347; - public static final int EXIT_NO_ROOT_ACCESS = -1; - public static final int NO_TOAST = -1; - /* write command completion times to logcat */ - private static final boolean enableProfiling = false; - //number of retries - increase the count - private final static int MAX_RETRIES = 10; - private static Shell.Interactive rootSession; -// private static Context mContext; - private static ShellState rootState = ShellState.INIT; - private static final LinkedList<RootCommand> waitQueue = new LinkedList<>(); - - private static void complete(final RootCommand state, Context context, int exitCode) { - if (enableProfiling) { - Log.d(TAG, "RootShell: " + state.getCommands().size() + " commands completed in " + - (new Date().getTime() - state.startTime.getTime()) + " ms"); - } - state.exitCode = exitCode; - state.done = true; - if (state.cb != null) { - state.cb.cbFunc(state); - } - - if (exitCode == 0 && state.successToast != NO_TOAST) { - Api.sendToastBroadcast(context, context.getString(state.successToast)); - } else if (exitCode != 0 && state.failureToast != NO_TOAST) { - Api.sendToastBroadcast(context, context.getString(state.failureToast)); - } - - } - - private static void runNextSubmission(Context context) { - - RootCommand state; - try { - state = waitQueue.remove(); - } catch (NoSuchElementException e) { - // nothing left to do - if (rootState == ShellState.BUSY) { - rootState = ShellState.READY; - } - return; - } - if (state != null) { - //same as last one. ignore it - Log.i(TAG, "Start processing next state"); - if (enableProfiling) { - state.startTime = new Date(); - } - if (rootState == ShellState.FAIL) { - // if we don't have root, abort all queued commands - complete(state, context, EXIT_NO_ROOT_ACCESS); - } else if (rootState == ShellState.READY) { - rootState = ShellState.BUSY; - processCommands(state, context); - } - } - } - - private static void processCommands(final RootCommand state, Context context) { - if (state.commandIndex < state.getCommands().size() && state.getCommands().get(state.commandIndex) != null) { - String command = state.getCommands().get(state.commandIndex); - //not to send conflicting status - sendUpdate(state, context); - - if (command != null) { - state.ignoreExitCode = false; - - if (command.startsWith("#NOCHK# ")) { - command = command.replaceFirst("#NOCHK# ", ""); - state.ignoreExitCode = true; - } - state.lastCommand = command; - state.lastCommandResult = new StringBuilder(); - try { - rootSession.addCommand(command, 0, (commandCode, exitCode, output) -> { - if (output != null) { - ListIterator<String> iter = output.listIterator(); - while (iter.hasNext()) { - String line = iter.next(); - if (line != null && !line.equals("")) { - if (state.res != null) { - state.res.append(line).append("\n"); - } - state.lastCommandResult.append(line).append("\n"); - } - } - } - if (exitCode >= 0 && exitCode == state.retryExitCode && state.retryCount < MAX_RETRIES) { - //lets wait for few ms before trying ? - state.retryCount++; - Log.d(TAG, "command '" + state.lastCommand + "' exited with status " + exitCode + - ", retrying (attempt " + state.retryCount + "/" + MAX_RETRIES + ")"); - processCommands(state, context); - return; - } - - state.commandIndex++; - state.retryCount = 0; - - boolean errorExit = exitCode != 0 && !state.ignoreExitCode; - if (state.commandIndex >= state.getCommands().size() || errorExit) { - complete(state, context, exitCode); - if (exitCode < 0) { - rootState = ShellState.FAIL; - Log.e(TAG, "libsuperuser error " + exitCode + " on command '" + state.lastCommand + "'"); - } else { - if (errorExit) { - Log.i(TAG, "command '" + state.lastCommand + "' exited with status " + exitCode + - "\nOutput:\n" + state.lastCommandResult); - } - rootState = ShellState.READY; - } - runNextSubmission(context); - } else { - processCommands(state, context); - } - }); - } catch (NullPointerException | ArrayIndexOutOfBoundsException e) { - Log.e(TAG, e.getMessage(), e); - } - } - } else { - complete(state, context, 0); - } - } - - private static void sendUpdate(final RootCommand state2, Context context) { - new Thread(() -> { - Intent broadcastIntent = new Intent(); - broadcastIntent.setAction("UPDATEUI6"); - broadcastIntent.putExtra("SIZE", state2.getCommands().size()); - broadcastIntent.putExtra("INDEX", state2.commandIndex); - LocalBroadcastManager.getInstance(context).sendBroadcast(broadcastIntent); - }).start(); - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - if (intent == null) { // if crash restart... - Log.i(TAG, "Restarting RootShell..."); - List<String> cmds = new ArrayList<>(); - cmds.add("true"); - new RootCommand().setFailureToast(R.string.error_su) - .setReopenShell(true).run(getApplicationContext(), cmds); - } - return Service.START_STICKY; - } - - private void setupLogging() { - Debug.setDebug(false); - Debug.setLogTypeEnabled(Debug.LOG_ALL, false); - Debug.setLogTypeEnabled(Debug.LOG_GENERAL, false); - Debug.setSanityChecksEnabled(false); - Debug.setOnLogListener((type, typeIndicator, message) -> Log.i(TAG, "[libsuperuser] " + message)); - } - - - private void startShellInBackground(Context context) { - Log.d(TAG, "Starting root shell..."); - setupLogging(); - //start only rootSession is null - if (rootSession == null) { - rootSession = new Shell.Builder(). - useSU(). - setWantSTDERR(true). - setWatchdogTimeout(5). - open((commandCode, exitCode, output) -> { - if (exitCode < 0) { - Log.e(TAG, "Can't open root shell: exitCode " + exitCode); - rootState = ShellState.FAIL; - } else { - Log.d(TAG, "Root shell is open"); - rootState = ShellState.READY; - } - runNextSubmission(context); - }); - } - - } - - private void reOpenShell(Context context) { - if (rootState == null || rootState != ShellState.READY || rootState == ShellState.FAIL) { - rootState = ShellState.BUSY; - startShellInBackground(context); - Intent intent = new Intent(context, RootShellService2.class); - context.startService(intent); - } - } - - - public void runScriptAsRoot(Context ctx, List<String> cmds, RootCommand state) { - Log.i(TAG, "Received cmds: #" + cmds.size()); - state.setCommands(cmds); - state.commandIndex = 0; - state.retryCount = 0; - - //already in memory and applied - //add it to queue - Log.d(TAG, "Hashing...." + state.isv6); - Log.d(TAG, state.hash + ""); - - waitQueue.add(state); - - if (rootState == ShellState.INIT || (rootState == ShellState.FAIL && state.reopenShell)) { - reOpenShell(ctx); - } else if (rootState != ShellState.BUSY) { - runNextSubmission(ctx); - } else { - new Timer().schedule(new TimerTask() { - @Override - public void run() { - Log.i(TAG, "State of rootShell: " + rootState); - if (rootState == ShellState.BUSY) { - //try resetting state to READY forcefully - Log.i(TAG, "Forcefully changing the state " + rootState); - rootState = ShellState.READY; - } - runNextSubmission(ctx); - } - }, 10000); - } - } - - @Nullable - @Override - public IBinder onBind(Intent intent) { - return null; - } - - public enum ShellState { - INIT, - READY, - BUSY, - FAIL - } -} \ No newline at end of file From f8e40bccdfffb9d7038172c295fabe2236a2e018 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 1 Sep 2021 10:42:42 +0200 Subject: [PATCH 22/26] fully migrate away from jcenter and replace an unsupported dependency --- build.gradle | 10 +++------- src/main/java/dk/aau/netsec/hostage/model/Profile.java | 2 +- .../aau/netsec/hostage/ui/activity/MainActivity.java | 6 ++++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 72599ea2..a06a8f6b 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,6 @@ buildscript { mavenCentral() google() -// jcenter reached end-of-life, but is required for MQTT until migrated. - jcenter() - } dependencies { classpath 'com.android.tools.build:gradle:7.0.1' @@ -24,7 +21,6 @@ allprojects { repositories { mavenCentral() google() - jcenter() maven { url "https://jitpack.io" } } @@ -87,7 +83,7 @@ dependencies { implementation group: 'com.hivemq', name: 'hivemq-mqtt-client', version: '1.2.2' //SU Library for root - implementation 'eu.chainfire:libsuperuser:1.0.0.201704021214' + implementation "com.github.topjohnwu.libsu:core:3.1.2" //RootTools Library implementation 'com.github.Stericson:RootShell:1.6' @@ -169,8 +165,8 @@ configurations { android { compileSdkVersion 30 defaultConfig { - versionCode 16 - versionName "2.4" + versionCode 17 + versionName "2.4.1" minSdkVersion 24 targetSdkVersion 30 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/src/main/java/dk/aau/netsec/hostage/model/Profile.java b/src/main/java/dk/aau/netsec/hostage/model/Profile.java index 9b781fad..fd898063 100644 --- a/src/main/java/dk/aau/netsec/hostage/model/Profile.java +++ b/src/main/java/dk/aau/netsec/hostage/model/Profile.java @@ -222,7 +222,7 @@ public Profile fromJSON(JSONObject json) { Iterator<String> keys = activeProtocols.keys(); while (keys.hasNext()) { - String protocol = (String) keys.next(); + String protocol = keys.next(); try { mActiveProtocols.put(protocol, activeProtocols.getBoolean(protocol)); } catch (JSONException e) { diff --git a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java index aec42386..7261f15d 100644 --- a/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java +++ b/src/main/java/dk/aau/netsec/hostage/ui/activity/MainActivity.java @@ -58,7 +58,7 @@ import dk.aau.netsec.hostage.ui.fragment.opengl.ThreatIndicatorGLRenderer; import dk.aau.netsec.hostage.ui.model.DrawerListItem; import dk.aau.netsec.hostage.ui.model.LogFilter; -import eu.chainfire.libsuperuser.Shell; +import com.topjohnwu.superuser.Shell; /** @@ -271,7 +271,9 @@ private void executeRoot() { } private static void checkForRoot() { - if (Shell.SU.available()) { + Shell shell = Shell.getShell(); + + if (shell.isRoot()) { Device.checkCapabilities(); if (Api.assertBinaries(getContext(), true)) { try { From e7e5e2c43d4bbdda957af9ba08e56551a04bd625 Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 1 Sep 2021 13:32:03 +0200 Subject: [PATCH 23/26] bump lib versions and minor fixes --- build.gradle | 25 +++---------------- .../dk/aau/netsec/hostage/model/Profile.java | 4 --- src/main/res/layout/fragment_about.xml | 2 +- 3 files changed, 4 insertions(+), 27 deletions(-) diff --git a/build.gradle b/build.gradle index a06a8f6b..c87a897b 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ allprojects { maven { url "https://jitpack.io" } } } + dependencies { //firebase implementation 'com.google.firebase:firebase-crashlytics:18.2.1' @@ -61,7 +62,7 @@ dependencies { // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-amqp-0-8-protocol implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-amqp-0-8-protocol', version: '8.0.6' // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-amqp-1-0-protocol - implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-amqp-1-0-protocol', version: '8.0.4' + implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-amqp-1-0-protocol', version: '8.0.6' // https://mvnrepository.com/artifact/org.apache.qpid/qpid-broker-plugins-memory-store implementation group: 'org.apache.qpid', name: 'qpid-broker-plugins-memory-store', version: '8.0.6' @@ -199,32 +200,12 @@ android { pickFirst "META-INF/INDEX.LIST" pickFirst "META-INF/io.netty.versions.properties" } - // signing for release only works in the console - boolean doSigningForRelease = System.console() != null - if (doSigningForRelease) { - signingConfigs { - release { - storeFile file(System.console().readLine("\n\$ Enter keystore path: ")) - storePassword System.console().readLine("\n\$ Enter keystore password: ") - keyAlias System.console().readLine("\n\$ Enter key alias: ") - keyPassword System.console().readLine("\n\$ Enter key password:") - } - } - } + buildTypes { debug { debuggable true jniDebuggable true // testCoverageEnabled true - //resValue "string", "google_maps_api_key", "AIzaSyDs3xp1-2KQojns5h7mWHHdQxAL-5AZ-q4" - } - if (doSigningForRelease) { - release { - debuggable false - jniDebuggable false - signingConfig signingConfigs.release - //resValue "string", "google_maps_api_key", "AIzaSyDs3xp1-2KQojns5h7mWHHdQxAL-5AZ-q4" - } } release { // signingConfig signingConfigs.config diff --git a/src/main/java/dk/aau/netsec/hostage/model/Profile.java b/src/main/java/dk/aau/netsec/hostage/model/Profile.java index fd898063..69ef6a59 100644 --- a/src/main/java/dk/aau/netsec/hostage/model/Profile.java +++ b/src/main/java/dk/aau/netsec/hostage/model/Profile.java @@ -113,10 +113,6 @@ public void setIcon(Bitmap bitmap) { this.mIcon = bitmap; } - public void setIcon(int icon) { - this.mIcon = BitmapFactory.decodeResource(MainActivity.getContext().getResources(), icon); - } - public Bitmap getIconBitmap() { if (this.mIcon != null) return mIcon; diff --git a/src/main/res/layout/fragment_about.xml b/src/main/res/layout/fragment_about.xml index e2d8d2ea..2681425d 100644 --- a/src/main/res/layout/fragment_about.xml +++ b/src/main/res/layout/fragment_about.xml @@ -58,7 +58,7 @@ android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_alignTop="@+id/linearLayout" android:layout_alignParentLeft="true" + android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginLeft="10dp"> From 106fdc091f8ddba07bc1849672b49e9294c9ee3f Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 1 Sep 2021 13:32:26 +0200 Subject: [PATCH 24/26] adjust gitignore --- .gitignore | 1 + release/output-metadata.json | 18 ------------------ 2 files changed, 1 insertion(+), 18 deletions(-) delete mode 100644 release/output-metadata.json diff --git a/.gitignore b/.gitignore index 9b44b346..7bedbd09 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ native/build.o /javadoc.xml /doc /greenDaoGenerator/ +release/ diff --git a/release/output-metadata.json b/release/output-metadata.json deleted file mode 100644 index cc521e0a..00000000 --- a/release/output-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "APK", - "kind": "Directory" - }, - "applicationId": "dk.aau.netsec.hostage", - "variantName": "release", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "versionCode": 13, - "versionName": "2.4", - "outputFile": "HosTaGe-release.apk" - } - ] -} \ No newline at end of file From 4b7d3f9be14bff5324b03b2a2ea98cc224be7a4b Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Wed, 1 Sep 2021 13:40:38 +0200 Subject: [PATCH 25/26] remove unused file --- proguard-project.txt | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 proguard-project.txt diff --git a/proguard-project.txt b/proguard-project.txt deleted file mode 100644 index f2fe1559..00000000 --- a/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} From 1719c135c2b3a41ffdf4beca41ee477bc41f90ec Mon Sep 17 00:00:00 2001 From: zafodB <filiplama@gmail.com> Date: Thu, 2 Sep 2021 11:37:40 +0200 Subject: [PATCH 26/26] increment gradle version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c87a897b..19b2b79f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.1' + classpath 'com.android.tools.build:gradle:7.0.2' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // add plugin classpath 'com.google.gms:google-services:4.3.10' //added gms support