diff --git a/README.md b/README.md index 5458fee..0fa3981 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,17 @@ # Screenshots +## Login + + + ## Home -Entrypoint of the app. Actions: **Profile View** (Menubar) and **New Sync** (Floating Action Button)  ## Profile -Basic information about the organisation that is currently logged in. +Organisation information loaded automatically from your MISP instance Actions: **Delete and logout** (Menubar) and **Update Info** (Floating Action Button) @@ -34,7 +37,7 @@ After a successfull exchange an entry for this organisation will appear. Actions: **Delete Sync information** (Menubar) and **Upload** (Floating Action Button in settings tab) -**Credentials:** With this credentials you will be able to log in on the other MISP instance (SyncUser) +**Credentials:** With these credentials you will be able to log in on the other MISP instance (SyncUser)  diff --git a/app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java b/app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java index fdcbd5f..b53a874 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java @@ -33,6 +33,8 @@ import lu.circl.mispbump.models.restModels.User; public class LoginActivity extends AppCompatActivity { private PreferenceManager preferenceManager; + private MispRestClient mispRestClient; + private ConstraintLayout constraintLayout; private TextInputLayout serverAutomationKey; private TextInputLayout serverUrl; @@ -42,6 +44,12 @@ public class LoginActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + + preferenceManager = PreferenceManager.getInstance(this); + mispRestClient = MispRestClient.getInstance(LoginActivity.this); + + getWindow().setStatusBarColor(getColor(R.color.colorPrimary)); + initializeViews(); } @@ -62,26 +70,25 @@ public class LoginActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } + private void initializeViews() { + constraintLayout = findViewById(R.id.rootLayout); + // populate Toolbar (Actionbar) Toolbar myToolbar = findViewById(R.id.appbar); setSupportActionBar(myToolbar); - ActionBar ab = getSupportActionBar(); if (ab != null) { ab.setDisplayHomeAsUpEnabled(false); + ab.setDisplayShowTitleEnabled(false); } - constraintLayout = findViewById(R.id.rootLayout); - Button downloadInfoButton = findViewById(R.id.login_download_button); downloadInfoButton.setOnClickListener(onClickDownload); serverUrl = findViewById(R.id.login_server_url); serverAutomationKey = findViewById(R.id.login_automation_key); progressBar = findViewById(R.id.login_progressbar); - - preferenceManager = PreferenceManager.getInstance(this); } /** @@ -91,8 +98,8 @@ public class LoginActivity extends AppCompatActivity { @Override public void onClick(View v) { - String url = Objects.requireNonNull(serverUrl.getEditText()).getText().toString(); - String authkey = Objects.requireNonNull(serverAutomationKey.getEditText()).getText().toString(); + final String url = Objects.requireNonNull(serverUrl.getEditText()).getText().toString(); + final String authkey = Objects.requireNonNull(serverAutomationKey.getEditText()).getText().toString(); boolean error = false; @@ -113,14 +120,7 @@ public class LoginActivity extends AppCompatActivity { return; } - // save authkey - preferenceManager.setAutomationKey(authkey); - - // save url - preferenceManager.setServerUrl(url); - - // instance of MispRestClient with given URL - final MispRestClient mispRestClient = MispRestClient.getInstance(getApplicationContext()); + mispRestClient.initMispRestInterface(url); // display progress bar progressBar.setVisibility(View.VISIBLE); @@ -137,6 +137,13 @@ public class LoginActivity extends AppCompatActivity { @Override public void success(Organisation organisation) { preferenceManager.setUserOrgInfo(organisation); + + // save authkey + preferenceManager.setAutomationKey(authkey); + + // save url + preferenceManager.setServerUrl(url); + progressBar.setVisibility(View.GONE); Intent home = new Intent(getApplicationContext(), HomeActivity.class); startActivity(home); @@ -170,7 +177,7 @@ public class LoginActivity extends AppCompatActivity { }; /** - * Check if url is valid. + * TODO: Check if url is valid. * * @param url url to check * @return true or false @@ -186,7 +193,7 @@ public class LoginActivity extends AppCompatActivity { } /** - * Check if automation key is valid. + * TODO: Check if automation key is valid. * * @param automationKey the key to check * @return true or false diff --git a/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java b/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java index 2657063..c72257e 100644 --- a/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java +++ b/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java @@ -59,26 +59,31 @@ public class MispRestClient { public interface AllUsersCallback { void success(User[] users); + void failure(String error); } public interface OrganisationCallback { void success(Organisation organisation); + void failure(String error); } public interface AllOrganisationsCallback { void success(Organisation[] organisations); + void failure(String error); } public interface ServerCallback { void success(Server server); + void failure(String error); } public interface AllServersCallback { void success(Server[] servers); + void failure(String error); } @@ -97,21 +102,41 @@ public class MispRestClient { return instance; } + public static MispRestClient getInstance(Context context, String url) { + if (instance == null) { + instance = new MispRestClient(context, url); + } + + return instance; + } + + + private MispRestClient(Context context) { + this(context, null); + } + /** * Initializes the rest client to communicate with a MISP instance. * * @param context needed to access the preferences for loading credentials */ - private MispRestClient(Context context) { + private MispRestClient(Context context, String url) { + preferenceManager = PreferenceManager.getInstance(context); - String url = preferenceManager.getServerUrl(); + if (url == null) { + url = preferenceManager.getServerUrl(); + } + initMispRestInterface(url); + } + + public void initMispRestInterface(String url) { try { Retrofit retrofit = new Retrofit.Builder() .baseUrl(url) .addConverterFactory(GsonConverterFactory.create()) - .client(getCustomClient(true, true)) + .client(getCustomClient(true, false)) .build(); mispRestInterface = retrofit.create(MispRestInterface.class); @@ -120,9 +145,9 @@ public class MispRestClient { } } + /** - * - * @param unsafe whether to accept all certificates or only trusted ones + * @param unsafe whether to accept all certificates or only trusted ones * @param logging whether to log Retrofit calls (for debugging) * @return {@link OkHttpClient} */ @@ -159,7 +184,7 @@ public class MispRestClient { // Create an ssl socket factory with our all-trusting manager final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); - builder.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]); + builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]); builder.hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { @@ -224,7 +249,6 @@ public class MispRestClient { } - /** * Fetches information about the user that is associated with saved auth key. * @@ -549,8 +573,9 @@ public class MispRestClient { /** * Converts error {@link Response}s to human readable info. + * * @param response erroneous response - * @param <T> type of response + * @param <T> type of response * @return human readable String that describes the error */ private <T> String extractError(Response<T> response) { @@ -603,6 +628,7 @@ public class MispRestClient { /** * Converts a {@link Throwable} to a human readable error message. + * * @param t throwable * @return human readable String that describes the error. */ diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 671a44b..f7bce35 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,23 +1,44 @@ <?xml version="1.0" encoding="utf-8"?> -<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.constraintlayout.widget.ConstraintLayout + xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rootLayout" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".activities.LoginActivity"> + tools:context=".activities.LoginActivity" + android:focusableInTouchMode="true" + android:animateLayoutChanges="true"> - <androidx.appcompat.widget.Toolbar - android:id="@+id/appbar" + <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" - android:layout_height="?attr/actionBarSize" - android:background="@color/colorPrimary" - android:elevation="6dp" - android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" - app:popupTheme="@style/ThemeOverlay.AppCompat.Light" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_height="wrap_content" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintEnd_toEndOf="parent"> + + <androidx.appcompat.widget.Toolbar + android:id="@+id/appbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="@color/colorPrimary" + android:theme="@style/ToolbarTheme" + app:popupTheme="@style/PopupTheme" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + <TextView + android:text="MISPbump" + android:textAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center" + android:layout_gravity="center"/> + + </androidx.appcompat.widget.Toolbar> + + </com.google.android.material.appbar.AppBarLayout> <com.google.android.material.textfield.TextInputLayout android:id="@+id/login_server_url" @@ -71,13 +92,13 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:layout_marginTop="32dp" + android:layout_marginTop="16dp" android:layout_marginEnd="16dp" android:text="@string/login" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/login_automation_key" /> + app:layout_constraintTop_toBottomOf="@+id/login_progressbar" /> <ProgressBar android:id="@+id/login_progressbar" @@ -87,19 +108,17 @@ android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" - android:layout_marginBottom="16dp" android:visibility="gone" - app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@+id/appbar" /> + app:layout_constraintTop_toBottomOf="@+id/login_automation_key" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" - app:layout_constraintGuide_percent="0.5" /> + app:layout_constraintGuide_percent="0.4" /> </androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/screenshots/mispbump-home-0.png b/screenshots/mispbump-home-0.png index 8610614..9359118 100644 Binary files a/screenshots/mispbump-home-0.png and b/screenshots/mispbump-home-0.png differ diff --git a/screenshots/mispbump-home.png b/screenshots/mispbump-home.png index b515900..7ff3975 100644 Binary files a/screenshots/mispbump-home.png and b/screenshots/mispbump-home.png differ diff --git a/screenshots/mispbump-login.png b/screenshots/mispbump-login.png new file mode 100644 index 0000000..3fcda41 Binary files /dev/null and b/screenshots/mispbump-login.png differ diff --git a/screenshots/mispbump-profile.png b/screenshots/mispbump-profile.png index 4d233ec..3bfe4f0 100644 Binary files a/screenshots/mispbump-profile.png and b/screenshots/mispbump-profile.png differ diff --git a/screenshots/mispbump-sync-0.png b/screenshots/mispbump-sync-0.png index ec5ef4d..ef53d07 100644 Binary files a/screenshots/mispbump-sync-0.png and b/screenshots/mispbump-sync-0.png differ diff --git a/screenshots/mispbump-sync-1.png b/screenshots/mispbump-sync-1.png index 761febf..e796a28 100644 Binary files a/screenshots/mispbump-sync-1.png and b/screenshots/mispbump-sync-1.png differ diff --git a/screenshots/mispbump-sync-2.png b/screenshots/mispbump-sync-2.png index 1449306..3c49de0 100644 Binary files a/screenshots/mispbump-sync-2.png and b/screenshots/mispbump-sync-2.png differ diff --git a/screenshots/mispbump-sync-3.png b/screenshots/mispbump-sync-3.png index 8209280..bd0d7b9 100644 Binary files a/screenshots/mispbump-sync-3.png and b/screenshots/mispbump-sync-3.png differ diff --git a/screenshots/mispbump-sync-info-credentials.png b/screenshots/mispbump-sync-info-credentials.png index f0769bd..3751290 100644 Binary files a/screenshots/mispbump-sync-info-credentials.png and b/screenshots/mispbump-sync-info-credentials.png differ diff --git a/screenshots/mispbump-sync-info-settings.png b/screenshots/mispbump-sync-info-settings.png index 3179020..04d4526 100644 Binary files a/screenshots/mispbump-sync-info-settings.png and b/screenshots/mispbump-sync-info-settings.png differ diff --git a/screenshots/mispbump-upload-0.png b/screenshots/mispbump-upload-0.png index 4a0a2a0..6616cb7 100644 Binary files a/screenshots/mispbump-upload-0.png and b/screenshots/mispbump-upload-0.png differ diff --git a/screenshots/mispbump-upload-1.png b/screenshots/mispbump-upload-1.png index 368720f..14dab90 100644 Binary files a/screenshots/mispbump-upload-1.png and b/screenshots/mispbump-upload-1.png differ diff --git a/screenshots/mispbump-upload-2.png b/screenshots/mispbump-upload-2.png index 6702beb..544cc14 100644 Binary files a/screenshots/mispbump-upload-2.png and b/screenshots/mispbump-upload-2.png differ