diff --git a/app/src/main/java/lu/circl/mispbump/activities/ExchangeActivity.java b/app/src/main/java/lu/circl/mispbump/activities/ExchangeActivity.java index 978c186..007bb8e 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/ExchangeActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/ExchangeActivity.java @@ -121,79 +121,73 @@ public class ExchangeActivity extends AppCompatActivity { syncInformation.syncUserAuthkey = new RandomString(40).nextString(); syncInformation.baseUrl = preferenceManager.getUserCredentials().first; syncInformation.syncUserPassword = new RandomString(16).nextString(); - syncInformation.syncUserEmail = preferenceManager.getUserInfo().email; + syncInformation.syncUserEmail = preferenceManager.getUserInfo().getEmail(); return syncInformation; } private void showQrCode(final Bitmap bitmap) { - runOnUiThread(new Runnable() { - @Override - public void run() { - qrCode.setImageBitmap(bitmap); - qrFrame.setVisibility(View.VISIBLE); - } + runOnUiThread(() -> { + qrCode.setImageBitmap(bitmap); + qrFrame.setVisibility(View.VISIBLE); }); } private void setSyncState(SyncState state) { currentSyncState = state; - runOnUiThread(new Runnable() { - @Override - public void run() { - switch (currentSyncState) { - case KEY_EXCHANGE: - prevButton.setImageDrawable(getDrawable(R.drawable.ic_close)); - prevButton.setVisibility(View.VISIBLE); - nextButton.setVisibility(View.GONE); + runOnUiThread(() -> { + switch (currentSyncState) { + case KEY_EXCHANGE: + prevButton.setImageDrawable(getDrawable(R.drawable.ic_close)); + prevButton.setVisibility(View.VISIBLE); + nextButton.setVisibility(View.GONE); - setCameraPreviewEnabled(true); - showQrCode(publicKeyQr); + setCameraPreviewEnabled(true); + showQrCode(publicKeyQr); - setReadQrStatus(ReadQrStatus.PENDING); - scanFeedbackText.setText(R.string.scan_qr_hint); - qrContentInfo.setText(R.string.public_key); - break; - case KEY_EXCHANGE_DONE: - prevButton.setImageDrawable(getDrawable(R.drawable.ic_close)); - prevButton.setVisibility(View.VISIBLE); - nextButton.setImageDrawable(getDrawable(R.drawable.ic_arrow_forward)); - nextButton.setVisibility(View.VISIBLE); + setReadQrStatus(ReadQrStatus.PENDING); + scanFeedbackText.setText(R.string.scan_qr_hint); + qrContentInfo.setText(R.string.public_key); + break; + case KEY_EXCHANGE_DONE: + prevButton.setImageDrawable(getDrawable(R.drawable.ic_close)); + prevButton.setVisibility(View.VISIBLE); + nextButton.setImageDrawable(getDrawable(R.drawable.ic_arrow_forward)); + nextButton.setVisibility(View.VISIBLE); - setCameraPreviewEnabled(false); - showQrCode(publicKeyQr); + setCameraPreviewEnabled(false); + showQrCode(publicKeyQr); - setReadQrStatus(ReadQrStatus.SUCCESS); - scanFeedbackText.setText(R.string.public_key_received_hint); - qrContentInfo.setText(R.string.public_key); - break; - case DATA_EXCHANGE: - prevButton.setImageDrawable(getDrawable(R.drawable.ic_arrow_back)); - prevButton.setVisibility(View.VISIBLE); - nextButton.setVisibility(View.GONE); + setReadQrStatus(ReadQrStatus.SUCCESS); + scanFeedbackText.setText(R.string.public_key_received_hint); + qrContentInfo.setText(R.string.public_key); + break; + case DATA_EXCHANGE: + prevButton.setImageDrawable(getDrawable(R.drawable.ic_arrow_back)); + prevButton.setVisibility(View.VISIBLE); + nextButton.setVisibility(View.GONE); - setCameraPreviewEnabled(true); - showQrCode(dataQr); + setCameraPreviewEnabled(true); + showQrCode(dataQr); - setReadQrStatus(ReadQrStatus.PENDING); - scanFeedbackText.setText(R.string.scan_qr_hint); - qrContentInfo.setText(R.string.sync_information); - break; - case DATA_EXCHANGE_DONE: - prevButton.setImageDrawable(getDrawable(R.drawable.ic_arrow_back)); - prevButton.setVisibility(View.VISIBLE); - nextButton.setImageDrawable(getDrawable(R.drawable.ic_check)); - nextButton.setVisibility(View.VISIBLE); + setReadQrStatus(ReadQrStatus.PENDING); + scanFeedbackText.setText(R.string.scan_qr_hint); + qrContentInfo.setText(R.string.sync_information); + break; + case DATA_EXCHANGE_DONE: + prevButton.setImageDrawable(getDrawable(R.drawable.ic_arrow_back)); + prevButton.setVisibility(View.VISIBLE); + nextButton.setImageDrawable(getDrawable(R.drawable.ic_check)); + nextButton.setVisibility(View.VISIBLE); - setCameraPreviewEnabled(false); - showQrCode(dataQr); + setCameraPreviewEnabled(false); + showQrCode(dataQr); - setReadQrStatus(ReadQrStatus.SUCCESS); - scanFeedbackText.setText(R.string.sync_info_received_hint); - qrContentInfo.setText(R.string.public_key); - break; - } + setReadQrStatus(ReadQrStatus.SUCCESS); + scanFeedbackText.setText(R.string.sync_info_received_hint); + qrContentInfo.setText(R.string.public_key); + break; } }); } @@ -261,107 +255,98 @@ public class ExchangeActivity extends AppCompatActivity { private CameraFragment.QrScanCallback onQrScanned() { - return new CameraFragment.QrScanCallback() { - @Override - public void qrScanResult(String qrData) { - cameraFragment.setReadQrEnabled(false); + return qrData -> { + cameraFragment.setReadQrEnabled(false); - switch (currentSyncState) { - case KEY_EXCHANGE: - try { - diffieHellman.setForeignPublicKey(DiffieHellman.publicKeyFromString(qrData)); - setSyncState(SyncState.KEY_EXCHANGE_DONE); - dataQr = generateLocalSyncInfoBitmap(); - } catch (InvalidKeySpecException | NoSuchAlgorithmException e) { - if (currentReadQrStatus == ReadQrStatus.PENDING) { - setReadQrStatus(ReadQrStatus.FAILURE); - Snackbar.make(rootLayout, "Public key not parsable", Snackbar.LENGTH_LONG).show(); - } - - cameraFragment.setReadQrEnabled(true); + switch (currentSyncState) { + case KEY_EXCHANGE: + try { + diffieHellman.setForeignPublicKey(DiffieHellman.publicKeyFromString(qrData)); + setSyncState(SyncState.KEY_EXCHANGE_DONE); + dataQr = generateLocalSyncInfoBitmap(); + } catch (InvalidKeySpecException | NoSuchAlgorithmException e) { + if (currentReadQrStatus == ReadQrStatus.PENDING) { + setReadQrStatus(ReadQrStatus.FAILURE); + Snackbar.make(rootLayout, "Public key not parsable", Snackbar.LENGTH_LONG).show(); } - break; - case DATA_EXCHANGE: - try { - final SyncInformation remoteSyncInfo = new Gson().fromJson(diffieHellman.decrypt(qrData), SyncInformation.class); - final List uploadInformationList = preferenceManager.getUploadInformationList(); + cameraFragment.setReadQrEnabled(true); + } + break; + case DATA_EXCHANGE: + try { + final SyncInformation remoteSyncInfo = new Gson().fromJson(diffieHellman.decrypt(qrData), SyncInformation.class); - for (final UploadInformation ui : uploadInformationList) { - if (ui.getRemote().organisation.getUuid().equals(remoteSyncInfo.organisation.getUuid())) { - DialogManager.syncAlreadyExistsDialog(ui.getRemote(), remoteSyncInfo, ExchangeActivity.this, new DialogManager.IDialogFeedback() { - @Override - public void positive() { - // update remote info only - uploadInformation.setUuid(ui.getUuid()); - uploadInformation.setDate(); - } + final List uploadInformationList = preferenceManager.getUploadInformationList(); - @Override - public void negative() { - // replace credentials too - uploadInformationList.remove(ui); - preferenceManager.setUploadInformationList(uploadInformationList); - } - }); + for (final UploadInformation ui : uploadInformationList) { + if (ui.getRemote().organisation.getUuid().equals(remoteSyncInfo.organisation.getUuid())) { + DialogManager.syncAlreadyExistsDialog(ui.getRemote(), remoteSyncInfo, ExchangeActivity.this, new DialogManager.IDialogFeedback() { + @Override + public void positive() { + // update remote info only + uploadInformation.setUuid(ui.getUuid()); + uploadInformation.setDate(); + } - break; - } + @Override + public void negative() { + // replace credentials too + uploadInformationList.remove(ui); + preferenceManager.setUploadInformationList(uploadInformationList); + } + }); + + break; } - - uploadInformation.setRemote(remoteSyncInfo); - preferenceManager.addUploadInformation(uploadInformation); - setSyncState(SyncState.DATA_EXCHANGE_DONE); - } catch (JsonSyntaxException e) { - if (currentReadQrStatus == ReadQrStatus.PENDING) { - setReadQrStatus(ReadQrStatus.FAILURE); - Snackbar.make(rootLayout, "Sync information not parsable", Snackbar.LENGTH_LONG).show(); - } - - cameraFragment.setReadQrEnabled(true); } - break; - } + + uploadInformation.setRemote(remoteSyncInfo); + preferenceManager.addUploadInformation(uploadInformation); + setSyncState(SyncState.DATA_EXCHANGE_DONE); + } catch (JsonSyntaxException e) { + if (currentReadQrStatus == ReadQrStatus.PENDING) { + setReadQrStatus(ReadQrStatus.FAILURE); + Snackbar.make(rootLayout, "Sync information not parsable", Snackbar.LENGTH_LONG).show(); + } + + cameraFragment.setReadQrEnabled(true); + } + break; } }; } private View.OnClickListener onPrevClicked() { - return new View.OnClickListener() { - @Override - public void onClick(View v) { - switch (currentSyncState) { - case KEY_EXCHANGE: - case KEY_EXCHANGE_DONE: - // TODO warning that sync will be lost - finish(); - break; - case DATA_EXCHANGE: - case DATA_EXCHANGE_DONE: - setSyncState(SyncState.KEY_EXCHANGE_DONE); - break; - } + return v -> { + switch (currentSyncState) { + case KEY_EXCHANGE: + case KEY_EXCHANGE_DONE: + // TODO warning that sync will be lost + finish(); + break; + case DATA_EXCHANGE: + case DATA_EXCHANGE_DONE: + setSyncState(SyncState.KEY_EXCHANGE_DONE); + break; } }; } private View.OnClickListener onNextClicked() { - return new View.OnClickListener() { - @Override - public void onClick(View v) { - switch (currentSyncState) { - case KEY_EXCHANGE_DONE: - setSyncState(SyncState.DATA_EXCHANGE); - break; - case DATA_EXCHANGE_DONE: - uploadInformation.setCurrentSyncStatus(UploadInformation.SyncStatus.PENDING); - preferenceManager.addUploadInformation(uploadInformation); - Intent i = new Intent(ExchangeActivity.this, UploadInfoActivity.class); - i.putExtra(UploadInfoActivity.EXTRA_UPLOAD_INFO_UUID, uploadInformation.getUuid()); - startActivity(i); - finish(); - break; - } + return v -> { + switch (currentSyncState) { + case KEY_EXCHANGE_DONE: + setSyncState(SyncState.DATA_EXCHANGE); + break; + case DATA_EXCHANGE_DONE: + uploadInformation.setCurrentSyncStatus(UploadInformation.SyncStatus.PENDING); + preferenceManager.addUploadInformation(uploadInformation); + Intent i = new Intent(ExchangeActivity.this, UploadInfoActivity.class); + i.putExtra(UploadInfoActivity.EXTRA_UPLOAD_INFO_UUID, uploadInformation.getUuid()); + startActivity(i); + finish(); + break; } }; } diff --git a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java index b3bf483..6a2ffc6 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/HomeActivity.java @@ -3,6 +3,7 @@ package lu.circl.mispbump.activities; import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -11,6 +12,7 @@ import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.core.app.ActivityOptionsCompat; +import androidx.core.util.Pair; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -20,9 +22,12 @@ import java.util.List; import lu.circl.mispbump.R; import lu.circl.mispbump.adapters.UploadInfoAdapter; +import lu.circl.mispbump.auxiliary.MispRestClient; import lu.circl.mispbump.auxiliary.PreferenceManager; import lu.circl.mispbump.interfaces.OnRecyclerItemClickListener; +import lu.circl.mispbump.models.SyncModel; import lu.circl.mispbump.models.UploadInformation; +import lu.circl.mispbump.models.restModels.Server; public class HomeActivity extends AppCompatActivity { @@ -62,7 +67,6 @@ public class HomeActivity extends AppCompatActivity { return true; } - // invoke superclass to handle unrecognized item (eg. homeAsUp) return super.onOptionsItemSelected(item); } @@ -80,12 +84,7 @@ public class HomeActivity extends AppCompatActivity { setSupportActionBar(myToolbar); FloatingActionButton syncFab = findViewById(R.id.home_fab); - syncFab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - startActivity(new Intent(HomeActivity.this, ExchangeActivity.class)); - } - }); + syncFab.setOnClickListener(v -> startActivity(new Intent(HomeActivity.this, ExchangeActivity.class))); } private void initRecyclerView() { @@ -97,6 +96,32 @@ public class HomeActivity extends AppCompatActivity { } private void refreshRecyclerView() { + + Pair credentials = preferenceManager.getUserCredentials(); + MispRestClient mispRestClient = MispRestClient.getInstance(credentials.first, credentials.second); + + mispRestClient.getAllServers(new MispRestClient.AllServersCallback() { + @Override + public void success(Server[] servers) { + SyncModel.createFromServer(mispRestClient, servers[0], new SyncModel.InitializeWithServerObject() { + @Override + public void success(SyncModel syncModel) { + Log.d("DEBUG", syncModel.toString()); + } + + @Override + public void failure(String error) { + + } + }); + } + + @Override + public void failure(String error) { + + } + }); + uploadInformationList = preferenceManager.getUploadInformationList(); if (uploadInformationList.isEmpty()) { @@ -111,15 +136,12 @@ public class HomeActivity extends AppCompatActivity { private OnRecyclerItemClickListener onRecyclerItemClickListener() { - return new OnRecyclerItemClickListener() { - @Override - public void onClick(View v, Integer index) { - Intent i = new Intent(HomeActivity.this, UploadInfoActivity.class); - i.putExtra(UploadInfoActivity.EXTRA_UPLOAD_INFO_UUID, uploadInformationList.get(index).getUuid()); + return (v, index) -> { + Intent i = new Intent(HomeActivity.this, UploadInfoActivity.class); + i.putExtra(UploadInfoActivity.EXTRA_UPLOAD_INFO_UUID, uploadInformationList.get(index).getUuid()); - ActivityOptionsCompat options = ActivityOptionsCompat.makeClipRevealAnimation(v.findViewById(R.id.rootLayout), (int) v.getX(), (int) v.getY(), v.getWidth(), v.getHeight()); - startActivity(i, options.toBundle()); - } + ActivityOptionsCompat options = ActivityOptionsCompat.makeClipRevealAnimation(v.findViewById(R.id.rootLayout), (int) v.getX(), (int) v.getY(), v.getWidth(), v.getHeight()); + startActivity(i, options.toBundle()); }; } } 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 851e3c8..b7c99db 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/LoginActivity.java @@ -133,7 +133,7 @@ public class LoginActivity extends AppCompatActivity { public void success(final User user) { preferenceManager.setUserInfo(user); for (Role role : roles) { - if (role.getId().equals(user.role_id)) { + if (role.getId().equals(user.getRole_id())) { if (!role.getPermAdmin()) { progressBar.setVisibility(View.GONE); Snackbar.make(constraintLayout, "No admin is associated with this authkey.", Snackbar.LENGTH_LONG).show(); @@ -142,7 +142,7 @@ public class LoginActivity extends AppCompatActivity { } } - mispRestClient.getOrganisation(user.org_id, new MispRestClient.OrganisationCallback() { + mispRestClient.getOrganisation(user.getRole_id(), new MispRestClient.OrganisationCallback() { @Override public void success(Organisation organisation) { preferenceManager.setUserOrgInfo(organisation); diff --git a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java index 7af22e5..f65dae9 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/PreferenceActivity.java @@ -8,17 +8,24 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import lu.circl.mispbump.R; +import lu.circl.mispbump.auxiliary.PreferenceManager; public class PreferenceActivity extends AppCompatActivity { + private PreferenceManager preferenceManager; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preference); + + preferenceManager = PreferenceManager.getInstance(PreferenceActivity.this); + initializeViews(); } @@ -32,15 +39,27 @@ public class PreferenceActivity extends AppCompatActivity { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); - fragmentTransaction.add(R.id.fragmentContainer, new PreferencesFragment(), PreferencesFragment.class.getSimpleName()); + PreferencesFragment preferencesFragment = new PreferencesFragment(); + preferencesFragment.onDeleteAllSyncsListener = preference -> { + preferenceManager.clearUploadInformation(); + return true; + }; + + fragmentTransaction.add(R.id.fragmentContainer, preferencesFragment, PreferencesFragment.class.getSimpleName()); fragmentTransaction.commit(); } public static class PreferencesFragment extends PreferenceFragmentCompat { + + Preference.OnPreferenceClickListener onDeleteAllSyncsListener; + @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preference_screen_main, rootKey); - findPreference("PREF_DELETE_ALL_SYNCS").setOnPreferenceClickListener(preference -> true); + + Preference deleteAllSyncInfo = findPreference("PREF_DELETE_ALL_SYNCS"); + assert deleteAllSyncInfo != null; + deleteAllSyncInfo.setOnPreferenceClickListener(onDeleteAllSyncsListener); } } } diff --git a/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java b/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java index 58177ec..3ffb150 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/ProfileActivity.java @@ -152,7 +152,7 @@ public class ProfileActivity extends AppCompatActivity { @Override public void success(final User user) { preferenceManager.setUserInfo(user); - mispRestClient.getOrganisation(user.org_id, new MispRestClient.OrganisationCallback() { + mispRestClient.getOrganisation(user.getRole_id(), new MispRestClient.OrganisationCallback() { @Override public void success(Organisation organisation) { fabLoadingDrawable.stop(); diff --git a/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java b/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java index ef34c31..b396970 100644 --- a/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java +++ b/app/src/main/java/lu/circl/mispbump/activities/UploadActivity.java @@ -216,26 +216,26 @@ public class UploadActivity extends AppCompatActivity { private User generateSyncUser(Organisation organisation) { User syncUser = new User(); - syncUser.org_id = organisation.getId(); - syncUser.role_id = User.ROLE_SYNC_USER; - syncUser.email = uploadInformation.getRemote().syncUserEmail; - syncUser.password = uploadInformation.getRemote().syncUserPassword; - syncUser.authkey = uploadInformation.getRemote().syncUserAuthkey; - syncUser.termsaccepted = true; + syncUser.setOrg_id(organisation.getId()); +// syncUser.role_id = User.ROLE_SYNC_USER; + syncUser.setEmail(uploadInformation.getRemote().syncUserEmail); + syncUser.setPassword(uploadInformation.getRemote().syncUserPassword); + syncUser.setAuthkey(uploadInformation.getRemote().syncUserAuthkey); + syncUser.setTermsaccepted(true); return syncUser; } private Server generateSyncServer() { Server server = new Server(); - server.name = uploadInformation.getRemote().organisation.getName() + "'s Sync Server"; - server.url = uploadInformation.getRemote().baseUrl; - server.remote_org_id = uploadInformation.getRemote().organisation.getId(); - server.authkey = uploadInformation.getLocal().syncUserAuthkey; - server.pull = uploadInformation.isPull(); - server.push = uploadInformation.isPush(); - server.caching_enabled = uploadInformation.isCached(); - server.self_signed = uploadInformation.isAllowSelfSigned(); + server.setName(uploadInformation.getRemote().organisation.getName() + "'s Sync Server"); + server.setUrl(uploadInformation.getRemote().baseUrl); + server.setRemote_org_id(uploadInformation.getRemote().organisation.getId()); + server.setAuthkey(uploadInformation.getLocal().syncUserAuthkey); + server.setPull(uploadInformation.isPull()); + server.setPush(uploadInformation.isPush()); + server.setCaching_enabled(uploadInformation.isCached()); + server.setSelf_signed(uploadInformation.isAllowSelfSigned()); return server; } @@ -302,9 +302,9 @@ public class UploadActivity extends AppCompatActivity { Server serverToUpload = generateSyncServer(); for (Server server : servers) { - if (server.remote_org_id.equals(serverToUpload.remote_org_id)) { + if (server.getRemote_org_id().equals(serverToUpload.getRemote_org_id())) { // server already exists: override id to update instead - serverToUpload.id = server.id; + serverToUpload.setId(server.getId()); break; } } diff --git a/app/src/main/java/lu/circl/mispbump/adapters/UploadInfoAdapter.java b/app/src/main/java/lu/circl/mispbump/adapters/UploadInfoAdapter.java index 7ebcaf1..9e1594e 100644 --- a/app/src/main/java/lu/circl/mispbump/adapters/UploadInfoAdapter.java +++ b/app/src/main/java/lu/circl/mispbump/adapters/UploadInfoAdapter.java @@ -25,7 +25,6 @@ public class UploadInfoAdapter extends RecyclerView.Adapter items; - private OnRecyclerItemClickListener onRecyclerItemClickListener; private OnRecyclerItemClickListener onRecyclerPositionClickListener; @@ -64,19 +63,7 @@ public class UploadInfoAdapter extends RecyclerView.Adapter onRecyclerPositionClickListener.onClick(view, position)); } @Override @@ -90,18 +77,10 @@ public class UploadInfoAdapter extends RecyclerView.Adapter onRecyclerItemClickListener) { - this.onRecyclerItemClickListener = onRecyclerItemClickListener; - } - public void setOnRecyclerPositionClickListener(OnRecyclerItemClickListener onRecyclerPositionClickListener) { this.onRecyclerPositionClickListener = onRecyclerPositionClickListener; } - // viewHolder static class ViewHolder extends RecyclerView.ViewHolder { View rootView; 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 75c5941..621fc4e 100644 --- a/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java +++ b/app/src/main/java/lu/circl/mispbump/auxiliary/MispRestClient.java @@ -274,7 +274,7 @@ public class MispRestClient { @Override public void success(User[] users) { for (User user : users) { - if (user.email.equals(emailAddress)) { + if (user.getEmail().equals(emailAddress)) { callback.success(user); return; } @@ -474,16 +474,14 @@ public class MispRestClient { if (!response.isSuccessful()) { callback.failure(extractError(response)); } else { - List mispServers = response.body(); assert mispServers != null; Server[] servers = new Server[mispServers.size()]; for (int i = 0; i < servers.length; i++) { - servers[i] = mispServers.get(i).server; + servers[i] = mispServers.get(i).getServer(); } - callback.success(servers); } } @@ -495,6 +493,26 @@ public class MispRestClient { }); } + public void getAllServers(final AllRawServersCallback callback) { + Call> call = mispRestInterface.getAllServers(); + + call.enqueue(new Callback>() { + @Override + public void onResponse(@NonNull Call> call, @NonNull Response> response) { + if (!response.isSuccessful()) { + callback.failure(extractError(response)); + } else { + callback.success(response.body()); + } + } + + @Override + public void onFailure(@NonNull Call> call, @NonNull Throwable t) { + callback.failure(t.getMessage()); + } + }); + } + /** * Add a server to the MISP instance * @@ -631,6 +649,12 @@ public class MispRestClient { void failure(String error); } + public interface AllRawServersCallback { + void success(List mispServers); + + void failure(String error); + } + public interface AllRolesCallback { void success(Role[] roles); diff --git a/app/src/main/java/lu/circl/mispbump/models/SyncInformation.java b/app/src/main/java/lu/circl/mispbump/models/SyncInformation.java index 607f58b..ccbf113 100644 --- a/app/src/main/java/lu/circl/mispbump/models/SyncInformation.java +++ b/app/src/main/java/lu/circl/mispbump/models/SyncInformation.java @@ -1,12 +1,13 @@ package lu.circl.mispbump.models; +import androidx.annotation.NonNull; + import lu.circl.mispbump.models.restModels.Organisation; /** * A Class that holds the information needed synchronize two misp instances. - * This class can be serialized and passed via QR code. */ public class SyncInformation { @@ -16,9 +17,7 @@ public class SyncInformation { public String syncUserAuthkey; public String baseUrl; - public SyncInformation() { - } - + @NonNull @Override public String toString() { return "SyncInformation{" + diff --git a/app/src/main/java/lu/circl/mispbump/models/SyncModel.java b/app/src/main/java/lu/circl/mispbump/models/SyncModel.java new file mode 100644 index 0000000..97656c3 --- /dev/null +++ b/app/src/main/java/lu/circl/mispbump/models/SyncModel.java @@ -0,0 +1,91 @@ +package lu.circl.mispbump.models; + + +import androidx.annotation.NonNull; + +import java.util.UUID; + +import lu.circl.mispbump.auxiliary.MispRestClient; +import lu.circl.mispbump.models.restModels.Organisation; +import lu.circl.mispbump.models.restModels.Server; + + +public class SyncModel { + + private UUID uuid; + + private Server server; + private Organisation organisation; + private Organisation remoteOrganisation; + + + public Server getServer() { + return server; + } + + public void setServer(Server server) { + this.server = server; + } + + public Organisation getOrganisation() { + return organisation; + } + + public void setOrganisation(Organisation organisation) { + this.organisation = organisation; + } + + public Organisation getRemoteOrganisation() { + return remoteOrganisation; + } + + public void setRemoteOrganisation(Organisation remoteOrganisation) { + this.remoteOrganisation = remoteOrganisation; + } + + + public static void createFromServer(MispRestClient mispRestClient, Server server, InitializeWithServerObject callback) { + SyncModel syncModel = new SyncModel(); + + syncModel.server = server; + + mispRestClient.getOrganisation(server.getOrg_id(), new MispRestClient.OrganisationCallback() { + @Override + public void success(Organisation organisation) { + syncModel.organisation = organisation; + + mispRestClient.getOrganisation(server.getRemote_org_id(), new MispRestClient.OrganisationCallback() { + @Override + public void success(Organisation organisation) { + syncModel.remoteOrganisation = organisation; + + callback.success(syncModel); + } + + @Override + public void failure(String error) { + callback.failure(error); + } + }); + } + + @Override + public void failure(String error) { + callback.failure(error); + } + }); + } + + + @NonNull + @Override + public String toString() { + return server.toString() + "\n" + organisation.toString() + "\n" + remoteOrganisation.toString(); + } + + public interface InitializeWithServerObject { + void success(SyncModel syncModel); + + void failure(String error); + } +} diff --git a/app/src/main/java/lu/circl/mispbump/models/restModels/MispServer.java b/app/src/main/java/lu/circl/mispbump/models/restModels/MispServer.java index efc2fcd..9ca3941 100644 --- a/app/src/main/java/lu/circl/mispbump/models/restModels/MispServer.java +++ b/app/src/main/java/lu/circl/mispbump/models/restModels/MispServer.java @@ -1,7 +1,8 @@ package lu.circl.mispbump.models.restModels; -import com.google.gson.annotations.Expose; +import androidx.annotation.NonNull; + import com.google.gson.annotations.SerializedName; import java.util.List; @@ -9,26 +10,50 @@ import java.util.List; public class MispServer { - public MispServer() { - } - - public MispServer(Server server, Organisation organisation, Organisation remoteOrganisation) { - this.server = server; - this.organisation = organisation; - this.remoteOrg = remoteOrganisation; - } - @SerializedName("Server") - @Expose - public Server server; - @SerializedName("Organisation") - @Expose - public Organisation organisation; - @SerializedName("RemoteOrg") - @Expose - public Organisation remoteOrg; - @SerializedName("User") - @Expose - public List user; + private Server server; + @SerializedName("Organisation") + private Organisation organisation; + + @SerializedName("RemoteOrg") + private Organisation remoteOrganisation; + + @SerializedName("User") + private List user; + + + public Server getServer() { + return server; + } + public void setServer(Server server) { + this.server = server; + } + + public Organisation getOrganisation() { + return organisation; + } + public void setOrganisation(Organisation organisation) { + this.organisation = organisation; + } + + public Organisation getRemoteOrganisation() { + return remoteOrganisation; + } + public void setRemoteOrganisation(Organisation remoteOrganisation) { + this.remoteOrganisation = remoteOrganisation; + } + + public List getUser() { + return user; + } + public void setUser(List user) { + this.user = user; + } + + @NonNull + @Override + public String toString() { + return server.toString() + "\n" + organisation.toString() + "\n" + remoteOrganisation.toString(); + } } diff --git a/app/src/main/java/lu/circl/mispbump/models/restModels/Organisation.java b/app/src/main/java/lu/circl/mispbump/models/restModels/Organisation.java index 946efaa..9eef1b0 100644 --- a/app/src/main/java/lu/circl/mispbump/models/restModels/Organisation.java +++ b/app/src/main/java/lu/circl/mispbump/models/restModels/Organisation.java @@ -1,6 +1,9 @@ package lu.circl.mispbump.models.restModels; +import androidx.annotation.NonNull; + + /** * Information gathered from Misp API about a organisation. */ @@ -17,25 +20,16 @@ public class Organisation { private String description; private Boolean local; private String uuid; - private String[] restricted_to_domain; +// private String[] restricted_to_domain; private String created_by; private Integer user_count; public Organisation() { } - public Organisation(String name) { - this.name = name; - } - - public Organisation(String name, String description) { - this.name = name; - this.description = description; - } - public Organisation toSyncOrganisation() { Organisation organisation = new Organisation(); - organisation.local = true; + organisation.local = true; // TODO REMOVE FROME HERE! organisation.name = name; organisation.uuid = uuid; organisation.description = description; @@ -136,13 +130,13 @@ public class Organisation { this.uuid = uuid; } - public String[] getRestricted_to_domain() { - return restricted_to_domain; - } +// public String[] getRestricted_to_domain() { +// return restricted_to_domain; +// } - public void setRestricted_to_domain(String[] restricted_to_domain) { - this.restricted_to_domain = restricted_to_domain; - } +// public void setRestricted_to_domain(String[] restricted_to_domain) { +// this.restricted_to_domain = restricted_to_domain; +// } public String getCreated_by() { return created_by; @@ -160,6 +154,7 @@ public class Organisation { this.user_count = user_count; } + @NonNull @Override public String toString() { return "Organisation{" + @@ -174,7 +169,7 @@ public class Organisation { ", description='" + description + '\'' + ", local=" + local + ", uuid='" + uuid + '\'' + - ", restricted_to_domain='" + restricted_to_domain + '\'' + +// ", restricted_to_domain='" + Arrays.toString(restricted_to_domain) + '\'' + ", created_by='" + created_by + '\'' + ", user_count=" + user_count + '}'; diff --git a/app/src/main/java/lu/circl/mispbump/models/restModels/Server.java b/app/src/main/java/lu/circl/mispbump/models/restModels/Server.java index 33b7e0d..43ae978 100644 --- a/app/src/main/java/lu/circl/mispbump/models/restModels/Server.java +++ b/app/src/main/java/lu/circl/mispbump/models/restModels/Server.java @@ -1,87 +1,212 @@ package lu.circl.mispbump.models.restModels; -import com.google.gson.annotations.SerializedName; +import androidx.annotation.NonNull; public class Server { - public Server() { + private Integer id; + private String name; + private String url; + private String authkey; + private Integer org_id; + private Boolean push; + private Boolean pull; + private Object lastpulledid; + private Object lastpushedid; + private Object organization; + private Integer remote_org_id; + private Boolean publish_without_email; + private Boolean unpublish_event; + private Boolean self_signed; + private String pull_rules; + private String push_rules; + private Object cert_file; + private Object client_cert_file; + private Boolean internal; + private Boolean skip_proxy; + private Boolean caching_enabled; + private Boolean cache_timestamp; + + + public Integer getId() { + return id; } - public Server(String name, String url, String authkey, Integer remote_org_id) { + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { this.url = url; + } + + public String getAuthkey() { + return authkey; + } + + public void setAuthkey(String authkey) { this.authkey = authkey; + } + + public Integer getOrg_id() { + return org_id; + } + + public void setOrg_id(Integer org_id) { + this.org_id = org_id; + } + + public Boolean getPush() { + return push; + } + + public void setPush(Boolean push) { + this.push = push; + } + + public Boolean getPull() { + return pull; + } + + public void setPull(Boolean pull) { + this.pull = pull; + } + + public Object getLastpulledid() { + return lastpulledid; + } + + public void setLastpulledid(Object lastpulledid) { + this.lastpulledid = lastpulledid; + } + + public Object getLastpushedid() { + return lastpushedid; + } + + public void setLastpushedid(Object lastpushedid) { + this.lastpushedid = lastpushedid; + } + + public Object getOrganization() { + return organization; + } + + public void setOrganization(Object organization) { + this.organization = organization; + } + + public Integer getRemote_org_id() { + return remote_org_id; + } + + public void setRemote_org_id(Integer remote_org_id) { this.remote_org_id = remote_org_id; } - @SerializedName("id") - public Integer id; + public Boolean getPublish_without_email() { + return publish_without_email; + } - @SerializedName("name") - public String name; + public void setPublish_without_email(Boolean publish_without_email) { + this.publish_without_email = publish_without_email; + } - @SerializedName("url") - public String url; + public Boolean getUnpublish_event() { + return unpublish_event; + } - @SerializedName("authkey") - public String authkey; + public void setUnpublish_event(Boolean unpublish_event) { + this.unpublish_event = unpublish_event; + } - @SerializedName("org_id") - public Integer org_id; + public Boolean getSelf_signed() { + return self_signed; + } - @SerializedName("push") - public Boolean push; + public void setSelf_signed(Boolean self_signed) { + this.self_signed = self_signed; + } - @SerializedName("pull") - public Boolean pull; + public String getPull_rules() { + return pull_rules; + } - @SerializedName("lastpulledid") - public Object lastpulledid; + public void setPull_rules(String pull_rules) { + this.pull_rules = pull_rules; + } - @SerializedName("lastpushedid") - public Object lastpushedid; + public String getPush_rules() { + return push_rules; + } - @SerializedName("organization") - public Object organization; + public void setPush_rules(String push_rules) { + this.push_rules = push_rules; + } - @SerializedName("remote_org_id") - public Integer remote_org_id; + public Object getCert_file() { + return cert_file; + } - @SerializedName("publish_without_email") - public Boolean publish_without_email = false; + public void setCert_file(Object cert_file) { + this.cert_file = cert_file; + } - @SerializedName("unpublish_event") - public Boolean unpublish_event; + public Object getClient_cert_file() { + return client_cert_file; + } - @SerializedName("self_signed") - public Boolean self_signed = false; + public void setClient_cert_file(Object client_cert_file) { + this.client_cert_file = client_cert_file; + } - @SerializedName("pull_rules") - public String pull_rules; + public Boolean getInternal() { + return internal; + } - @SerializedName("push_rules") - public String push_rules; + public void setInternal(Boolean internal) { + this.internal = internal; + } - @SerializedName("cert_file") - public Object cert_file; + public Boolean getSkip_proxy() { + return skip_proxy; + } - @SerializedName("client_cert_file") - public Object client_cert_file; + public void setSkip_proxy(Boolean skip_proxy) { + this.skip_proxy = skip_proxy; + } - @SerializedName("internal") - public Boolean internal; + public Boolean getCaching_enabled() { + return caching_enabled; + } - @SerializedName("skip_proxy") - public Boolean skip_proxy = false; + public void setCaching_enabled(Boolean caching_enabled) { + this.caching_enabled = caching_enabled; + } - @SerializedName("caching_enabled") - public Boolean caching_enabled; + public Boolean getCache_timestamp() { + return cache_timestamp; + } - @SerializedName("cache_timestamp") - public Boolean cache_timestamp; + public void setCache_timestamp(Boolean cache_timestamp) { + this.cache_timestamp = cache_timestamp; + } + @NonNull @Override public String toString() { return "Server{" + diff --git a/app/src/main/java/lu/circl/mispbump/models/restModels/User.java b/app/src/main/java/lu/circl/mispbump/models/restModels/User.java index b9965e8..9c1539f 100644 --- a/app/src/main/java/lu/circl/mispbump/models/restModels/User.java +++ b/app/src/main/java/lu/circl/mispbump/models/restModels/User.java @@ -1,102 +1,213 @@ package lu.circl.mispbump.models.restModels; -import com.google.gson.annotations.Expose; -import com.google.gson.annotations.SerializedName; +import androidx.annotation.NonNull; public class User { - public static final int ROLE_ADMIN = 1; - public static final int ROLE_ORG_ADMIN = 2; - public static final int ROLE_USER = 3; - public static final int ROLE_PUBLISHER = 4; - public static final int ROLE_SYNC_USER = 5; - public static final int ROLE_READ_ONLY = 6; + private Integer id; + private String password; + private Integer org_id; + private String email; + private Boolean autoalert; + private String authkey; + private String invited_by; + private Object gpgkey; + private String certif_public; + private String nids_sid; + private Boolean termsaccepted; + private String newsread; + private Integer role_id; + private String change_pw; + private Boolean contactalert; + private Boolean disabled; + private Object expiration; + private String current_login; + private String last_login; + private Boolean force_logout; + private Object date_created; + private String date_modified; - public User() { + + public Integer getId() { + return id; } - public User(Integer org_id, String email, Integer role_id) { - this.org_id = org_id; - this.email = email; - this.role_id = role_id; + public void setId(Integer id) { + this.id = id; } - public User(Integer org_id, String email, Integer role_id, String password) { + public String getPassword() { + return password; + } + + public void setPassword(String password) { this.password = password; + } + + public Integer getOrg_id() { + return org_id; + } + + public void setOrg_id(Integer org_id) { this.org_id = org_id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { this.email = email; + } + + public Boolean getAutoalert() { + return autoalert; + } + + public void setAutoalert(Boolean autoalert) { + this.autoalert = autoalert; + } + + public String getAuthkey() { + return authkey; + } + + public void setAuthkey(String authkey) { + this.authkey = authkey; + } + + public String getInvited_by() { + return invited_by; + } + + public void setInvited_by(String invited_by) { + this.invited_by = invited_by; + } + + public Object getGpgkey() { + return gpgkey; + } + + public void setGpgkey(Object gpgkey) { + this.gpgkey = gpgkey; + } + + public String getCertif_public() { + return certif_public; + } + + public void setCertif_public(String certif_public) { + this.certif_public = certif_public; + } + + public String getNids_sid() { + return nids_sid; + } + + public void setNids_sid(String nids_sid) { + this.nids_sid = nids_sid; + } + + public Boolean getTermsaccepted() { + return termsaccepted; + } + + public void setTermsaccepted(Boolean termsaccepted) { + this.termsaccepted = termsaccepted; + } + + public String getNewsread() { + return newsread; + } + + public void setNewsread(String newsread) { + this.newsread = newsread; + } + + public Integer getRole_id() { + return role_id; + } + + public void setRole_id(Integer role_id) { this.role_id = role_id; } - @SerializedName("id") - @Expose - public Integer id; - @SerializedName("password") - @Expose - public String password; - @SerializedName("org_id") - @Expose - public Integer org_id; - @SerializedName("email") - @Expose - public String email; - @SerializedName("autoalert") - @Expose - public Boolean autoalert; - @SerializedName("authkey") - @Expose - public String authkey; - @SerializedName("invited_by") - @Expose - public String invited_by; - @SerializedName("gpgkey") - @Expose - public Object gpgkey; - @SerializedName("certif_public") - @Expose - public String certif_public; - @SerializedName("nids_sid") - @Expose - public String nids_sid; - @SerializedName("termsaccepted") - @Expose - public Boolean termsaccepted; - @SerializedName("newsread") - @Expose - public String newsread; - @SerializedName("role_id") - @Expose - public Integer role_id; - @SerializedName("change_pw") - @Expose - public String change_pw; - @SerializedName("contactalert") - @Expose - public Boolean contactalert; - @SerializedName("disabled") - @Expose - public Boolean disabled; - @SerializedName("expiration") - @Expose - public Object expiration; - @SerializedName("current_login") - @Expose - public String current_login; - @SerializedName("last_login") - @Expose - public String last_login; - @SerializedName("force_logout") - @Expose - public Boolean force_logout; - @SerializedName("date_created") - @Expose - public Object date_created; - @SerializedName("date_modified") - @Expose - public String date_modified; + public String getChange_pw() { + return change_pw; + } + public void setChange_pw(String change_pw) { + this.change_pw = change_pw; + } + + public Boolean getContactalert() { + return contactalert; + } + + public void setContactalert(Boolean contactalert) { + this.contactalert = contactalert; + } + + public Boolean getDisabled() { + return disabled; + } + + public void setDisabled(Boolean disabled) { + this.disabled = disabled; + } + + public Object getExpiration() { + return expiration; + } + + public void setExpiration(Object expiration) { + this.expiration = expiration; + } + + public String getCurrent_login() { + return current_login; + } + + public void setCurrent_login(String current_login) { + this.current_login = current_login; + } + + public String getLast_login() { + return last_login; + } + + public void setLast_login(String last_login) { + this.last_login = last_login; + } + + public Boolean getForce_logout() { + return force_logout; + } + + public void setForce_logout(Boolean force_logout) { + this.force_logout = force_logout; + } + + public Object getDate_created() { + return date_created; + } + + public void setDate_created(Object date_created) { + this.date_created = date_created; + } + + public String getDate_modified() { + return date_modified; + } + + public void setDate_modified(String date_modified) { + this.date_modified = date_modified; + } + + + @NonNull @Override public String toString() { return "User{" +