edit upload procedure

pull/5/head
Felix Prahl-Kamps 2018-08-19 17:35:20 +02:00
parent 6a582f5ada
commit 125f0b8b9c
4 changed files with 459 additions and 342 deletions

View File

@ -213,11 +213,7 @@ public class QrSyncActivity extends AppCompatActivity implements View.OnClickLis
syncInformationReceivedDialog(new SyncInformationQr(cryptography.decrypt(qrData)));
} catch (JSONException e) {
Log.e("MISP_LOG", "onReadQrCode: ", e);
notExpectedFormatDialog();
}
break;

View File

@ -203,15 +203,15 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
boolean errorFound = false;
for (int i = 0; i < uploadStates.length; i++) {
for(UploadState state : uploadStates) {
if (!errorFound && uploadStates[i].getCurrentState() == UploadState.State.ERROR) {
if (!errorFound && state.getCurrentState() == UploadState.State.ERROR) {
errorFound = true;
continue;
}
if (errorFound) {
uploadStates[i].setFollowError();
state.setFollowError();
}
}
}
@ -233,8 +233,13 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
partnerServer = partnerInformation.getServer();
partnerSyncUser = partnerInformation.getUser();
state.setDone();
executeNextTask();
if (partnerOrganisation == null || partnerServer == null || partnerSyncUser == null) {
state.setError("Partners information format is incorrect");
setApplicationError(false);
} else {
state.setDone();
executeNextTask();
}
} else {
state.setError("Partners information format is incorrect");
@ -260,6 +265,7 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
}
private void createOrganisation(final UploadState state, boolean undo) {
state.setInProgress();
if (!undo) {
@ -268,11 +274,7 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
public void onResult(JSONObject organisationInformation) {
try {
int orgId = new Organisation(organisationInformation).getId();
partnerSyncUser.setOrgId(orgId);
partnerSyncUser.setAuthkey(TempAuth.TMP_AUTH_KEY);
partnerSyncUser.setRoleId(User.RoleId.SYNC_USER);
partnerSyncUser.setOrgId(new Organisation(organisationInformation).getId());
state.setDone();
executeNextTask();
@ -290,12 +292,28 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
setApplicationError(true);
}
});
} else {
mispRequest.removeOrganisation(partnerOrganisation.getId(), new MispRequest.DeleteCallback() {
@Override
public void onSuccess() {
state.setDone();
}
@Override
public void onError(VolleyError volleyError) {
state.setError(ReadableError.toReadable(volleyError));
}
});
}
}
private void createSyncUser(final UploadState state, boolean undo) {
state.setInProgress();
partnerSyncUser.setAuthkey(TempAuth.TMP_AUTH_KEY);
partnerSyncUser.setRoleId(User.RoleId.SYNC_USER);
if (!undo) {
mispRequest.addUser(partnerSyncUser, new MispRequest.UserCallback() {
@Override
@ -310,6 +328,18 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
setApplicationError(true);
}
});
} else {
mispRequest.removeUser(partnerSyncUser.getId(), new MispRequest.DeleteCallback() {
@Override
public void onSuccess() {
state.setDone();
}
@Override
public void onError(VolleyError volleyError) {
state.setError(ReadableError.toReadable(volleyError));
}
});
}
}
@ -350,6 +380,18 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
setApplicationError(true);
}
});
} else {
mispRequest.removeOrganisation(partnerOrganisation.getId(), new MispRequest.DeleteCallback() {
@Override
public void onSuccess() {
state.setDone();
}
@Override
public void onError(VolleyError volleyError) {
state.setError(ReadableError.toReadable(volleyError));
}
});
}
}
@ -369,6 +411,12 @@ public class SyncUploadActivity extends AppCompatActivity implements View.OnClic
state.setError(ReadableError.toReadable(volleyError));
}
});
} else {
}
}
private void addToSyncedList() {
// todo implementation
}
}

View File

@ -24,30 +24,30 @@ import java.util.Map;
*/
public class MispRequest {
private static MispRequest instance;
private static MispRequest instance;
private RequestQueue requestQueue;
private PreferenceManager preferenceManager;
private String serverUrl, automationKey;
private RequestQueue requestQueue;
private PreferenceManager preferenceManager;
private String serverUrl, automationKey;
/**
* @param context for Volley and PreferenceManager
*/
private MispRequest(Context context, boolean loadSavedCredentials) {
requestQueue = Volley.newRequestQueue(context);
/**
* @param context for Volley and PreferenceManager
*/
private MispRequest(Context context, boolean loadSavedCredentials) {
requestQueue = Volley.newRequestQueue(context);
if (loadSavedCredentials) {
preferenceManager = PreferenceManager.Instance(context);
loadSavedCredentials();
}
}
if (loadSavedCredentials) {
preferenceManager = PreferenceManager.Instance(context);
loadSavedCredentials();
}
}
private void loadSavedCredentials() {
serverUrl = preferenceManager.getMyServerUrl();
automationKey = preferenceManager.getMyServerAutomationKey();
}
private void loadSavedCredentials() {
serverUrl = preferenceManager.getMyServerUrl();
automationKey = preferenceManager.getMyServerAutomationKey();
}
public void testConnection(final ConnectionCallback callback) {
public void testConnection(final ConnectionCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
@ -71,293 +71,362 @@ public class MispRequest {
requestQueue.add(r);
}
/**
* @param orgId organisation ID on the MISP-Instance
* @param callback returns a single Organisation-JSON
*/
public void getOrganisation(int orgId, final OrganisationCallback callback) {
public void getOrganisations(final OrganisationsCallback callback) {
Response.Listener<JSONArray> listener = new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(Organisation.ROOT_KEY));
} catch (JSONException e) {
e.printStackTrace();
}
}
};
JSONArray resultArray = new JSONArray();
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
int orgCount = response.length();
for (int i = 0; i < orgCount; i++) {
try {
resultArray.put(response.getJSONObject(i).getJSONObject("Organisation"));
} catch (JSONException e) {
e.printStackTrace();
}
}
Request r = objectRequest(Request.Method.GET,
serverUrl + "/organisations/view/" + orgId,
null,
listener,
errorListener);
callback.onResult(resultArray);
}
};
requestQueue.add(r);
}
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
/**
* Typically used to get the organisation linked with this user
*
* @param callback return user associated with this API-Key
*/
public void getMyUser(final UserCallback callback) {
Request r = arrayRequestWithJsonObject(
Request.Method.GET,
serverUrl + "/organisations/index",
null,
listener,
errorListener);
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(User.ROOT_KEY));
return;
} catch (JSONException e) {
e.printStackTrace();
}
callback.onResult(response);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
if (serverUrl.isEmpty() || automationKey.isEmpty()) {
return;
}
Request r = objectRequest(
Request.Method.GET,
serverUrl + "/users/view/me",
null,
listener,
errorListener);
requestQueue.add(r);
}
/**
* @param organisation The organisation that will be added
* @param callback returns complete organisation JSON
*/
public void addOrganisation(Organisation organisation, final OrganisationCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(Organisation.ROOT_KEY));
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/admin/organisations/add",
organisation.toJSON(),
listener,
errorListener
);
requestQueue.add(r);
}
public void getOrganisations(final OrganisationsCallback callback) {
Response.Listener<JSONArray> listener = new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
JSONArray resultArray = new JSONArray();
int orgCount = response.length();
for(int i = 0; i < orgCount; i++) {
try {
resultArray.put(response.getJSONObject(i).getJSONObject("Organisation"));
} catch (JSONException e) {
e.printStackTrace();
}
}
callback.onResult(resultArray);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = arrayRequestWithJsonObject(
Request.Method.GET,
serverUrl + "/organisations/index",
null,
listener,
errorListener);
requestQueue.add(r);
}
public void addUser(User user, final UserCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(User.ROOT_KEY));
return;
} catch (JSONException e) {
e.printStackTrace();
}
callback.onResult(response);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/admin/users/add",
user.toJSON(),
listener,
errorListener
);
requestQueue.add(r);
}
public void addServer(Server server, final ServerCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(Server.ROOT_KEY));
return;
} catch (JSONException e) {
e.printStackTrace();
}
callback.onResult(response);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/servers/add",
server.toJSON(),
listener,
errorListener
);
requestQueue.add(r);
}
private JsonArrayRequestWithJsonObject arrayRequestWithJsonObject(int method, String url,
@Nullable JSONObject body,
Response.Listener<JSONArray> listener,
Response.ErrorListener errorListener) {
return new JsonArrayRequestWithJsonObject(method, url, body, listener, errorListener) {
@Override
public Map<String, String> getHeaders() {
Map<String, String> params = new HashMap<>();
params.put("Authorization", automationKey);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; utf-8");
return params;
}
};
}
private JsonObjectRequest objectRequest(int method, String url,
@Nullable JSONObject body,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
return new JsonObjectRequest(method, url, body, listener, errorListener) {
@Override
public Map<String, String> getHeaders() {
Map<String, String> params = new HashMap<>();
params.put("Authorization", automationKey);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; utf-8");
return params;
}
};
}
public void setServerCredentials(String serverUrl, String automationKey) {
this.serverUrl = serverUrl;
this.automationKey = automationKey;
}
public static MispRequest Instance(Context context, boolean loadSavedCredentials) {
if (instance == null) {
instance = new MispRequest(context, loadSavedCredentials);
}
return instance;
}
public interface ConnectionCallback {
void onResult(boolean connected);
requestQueue.add(r);
}
public interface OrganisationsCallback {
void onResult(JSONArray organisations);
void onError(VolleyError volleyError);
}
public interface OrganisationCallback {
void onResult(JSONObject organisationInformation);
void onError(VolleyError volleyError);
}
public interface UserCallback {
void onResult(JSONObject userInformation);
void onError(VolleyError volleyError);
}
public interface ServerCallback {
void onResult(JSONObject server);
void onError(VolleyError volleyError);
}
/**
* @param orgId organisation ID on the MISP-Instance
* @param callback returns a single Organisation-JSON
*/
public void getOrganisation(int orgId, final OrganisationCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(Organisation.ROOT_KEY));
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(Request.Method.GET,
serverUrl + "/organisations/view/" + orgId,
null,
listener,
errorListener);
requestQueue.add(r);
}
/**
* Typically used to get the organisation linked with this user
*
* @param callback return user associated with this API-Key
*/
public void getMyUser(final UserCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(User.ROOT_KEY));
return;
} catch (JSONException e) {
e.printStackTrace();
}
callback.onResult(response);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
if (serverUrl.isEmpty() || automationKey.isEmpty()) {
return;
}
Request r = objectRequest(
Request.Method.GET,
serverUrl + "/users/view/me",
null,
listener,
errorListener);
requestQueue.add(r);
}
/**
* @param organisation The organisation that will be added
* @param callback returns complete organisation JSON
*/
public void addOrganisation(Organisation organisation, final OrganisationCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(Organisation.ROOT_KEY));
} catch (JSONException e) {
e.printStackTrace();
}
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/admin/organisations/add",
organisation.toJSON(),
listener,
errorListener
);
requestQueue.add(r);
}
public void removeOrganisation(int organisationID, final DeleteCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callback.onSuccess();
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
callback.onError(volleyError);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/admin/organisations/delete/" + organisationID,
null,
listener,
errorListener
);
requestQueue.add(r);
}
public void addUser(User user, final UserCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(User.ROOT_KEY));
return;
} catch (JSONException e) {
e.printStackTrace();
}
callback.onResult(response);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/admin/users/add",
user.toJSON(),
listener,
errorListener
);
requestQueue.add(r);
}
public void removeUser(int userID, final DeleteCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
callback.onSuccess();
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/admin/users/delete/" + userID,
null,
listener,
errorListener
);
requestQueue.add(r);
}
public void addServer(Server server, final ServerCallback callback) {
Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
callback.onResult(response.getJSONObject(Server.ROOT_KEY));
return;
} catch (JSONException e) {
e.printStackTrace();
}
callback.onResult(response);
}
};
Response.ErrorListener errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onError(error);
}
};
Request r = objectRequest(
Request.Method.POST,
serverUrl + "/servers/add",
server.toJSON(),
listener,
errorListener
);
requestQueue.add(r);
}
public void removeServer(Server server, final DeleteCallback callback) {
}
private JsonArrayRequestWithJsonObject arrayRequestWithJsonObject(int method, String url,
@Nullable JSONObject body,
Response.Listener<JSONArray> listener,
Response.ErrorListener errorListener) {
return new JsonArrayRequestWithJsonObject(method, url, body, listener, errorListener) {
@Override
public Map<String, String> getHeaders() {
Map<String, String> params = new HashMap<>();
params.put("Authorization", automationKey);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; utf-8");
return params;
}
};
}
private JsonObjectRequest objectRequest(int method, String url,
@Nullable JSONObject body,
Response.Listener<JSONObject> listener,
Response.ErrorListener errorListener) {
return new JsonObjectRequest(method, url, body, listener, errorListener) {
@Override
public Map<String, String> getHeaders() {
Map<String, String> params = new HashMap<>();
params.put("Authorization", automationKey);
params.put("Accept", "application/json");
params.put("Content-Type", "application/json; utf-8");
return params;
}
};
}
public void setServerCredentials(String serverUrl, String automationKey) {
this.serverUrl = serverUrl;
this.automationKey = automationKey;
}
public static MispRequest Instance(Context context, boolean loadSavedCredentials) {
if (instance == null) {
instance = new MispRequest(context, loadSavedCredentials);
}
return instance;
}
public interface DeleteCallback {
void onSuccess();
void onError(VolleyError volleyError);
}
public interface ConnectionCallback {
void onResult(boolean connected);
}
public interface OrganisationsCallback {
void onResult(JSONArray organisations);
void onError(VolleyError volleyError);
}
public interface OrganisationCallback {
void onResult(JSONObject organisationInformation);
void onError(VolleyError volleyError);
}
public interface UserCallback {
void onResult(JSONObject userInformation);
void onError(VolleyError volleyError);
}
public interface ServerCallback {
void onResult(JSONObject server);
void onError(VolleyError volleyError);
}
}

View File

@ -35,36 +35,40 @@
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fabSize="normal"
android:tint="@color/colorWhite"
android:src="@drawable/icon_check"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_gravity="bottom">
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_retry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fabSize="normal"
android:tint="@color/colorWhite"
android:src="@drawable/icon_retry"
app:layout_anchor="@id/fab_finish"
app:layout_anchorGravity="start|center_vertical"
android:layout_gravity="start|center_vertical"
android:layout_margin="16dp"/>
<View android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="1"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fabSize="normal"
android:tint="@color/colorWhite"
android:src="@drawable/icon_cloud_upload"
android:layout_gravity="bottom|end"
android:layout_margin="16dp"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_finish"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fabSize="normal"
android:tint="@color/colorWhite"
android:src="@drawable/icon_check"
android:layout_margin="16dp"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_retry"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fabSize="normal"
android:tint="@color/colorWhite"
android:src="@drawable/icon_retry"
android:layout_margin="16dp"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fabSize="normal"
android:tint="@color/colorWhite"
android:src="@drawable/icon_cloud_upload"
android:layout_margin="16dp"/>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>