/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.sync.jpake.stage;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.GeneralSecurityException;
import org.mozilla.gecko.sync.Logger;
import org.mozilla.gecko.sync.jpake.JPakeClient;
import org.mozilla.gecko.sync.net.BaseResource;
import org.mozilla.gecko.sync.net.SyncResourceDelegate;
import org.mozilla.gecko.sync.setup.auth.AccountAuthenticator;
import ch.boye.httpclientandroidlib.HttpResponse;
import ch.boye.httpclientandroidlib.client.ClientProtocolException;
import ch.boye.httpclientandroidlib.client.methods.HttpRequestBase;
import ch.boye.httpclientandroidlib.impl.client.DefaultHttpClient;
import ch.boye.httpclientandroidlib.message.BasicHeader;
public class DeleteChannel {
private static final String LOG_TAG = "DeleteChannel";
public static final String KEYEXCHANGE_ID_HEADER = "X-KeyExchange-Id";
public static final String KEYEXCHANGE_CID_HEADER = "X-KeyExchange-Cid";
public void execute(final JPakeClient jClient, final String reason) {
final BaseResource httpResource;
try {
httpResource = new BaseResource(jClient.channelUrl);
} catch (URISyntaxException e) {
Logger.debug(LOG_TAG, "Encountered URISyntax exception, displaying abort anyway.");
jClient.displayAbort(reason);
return;
}
httpResource.delegate = new SyncResourceDelegate(httpResource) {
@Override
public void addHeaders(HttpRequestBase request, DefaultHttpClient client) {
request.setHeader(new BasicHeader(KEYEXCHANGE_ID_HEADER, jClient.clientId));
request.setHeader(new BasicHeader(KEYEXCHANGE_CID_HEADER, jClient.channel));
}
@Override
public void handleHttpResponse(HttpResponse response) {
try {
int statusCode = response.getStatusLine().getStatusCode();
switch (statusCode) {
case 200:
Logger.info(LOG_TAG, "Successfully reported error to server.");
break;
case 403:
Logger.info(LOG_TAG, "IP is blacklisted.");
break;
case 400:
Logger.info(LOG_TAG, "Bad request (missing logs, or bad ids");
break;
default:
Logger.info(LOG_TAG, "Server returned " + statusCode);
}
} finally {
BaseResource.consumeEntity(response);
// Always call displayAbort, even if abort fails. We can't do anything about it.
jClient.displayAbort(reason);
}
}
@Override
public void handleHttpProtocolException(ClientProtocolException e) {
Logger.debug(LOG_TAG, "Encountered HttpProtocolException, displaying abort anyway.");
jClient.displayAbort(reason);
}
@Override
public void handleHttpIOException(IOException e) {
Logger.debug(LOG_TAG, "Encountered IOException, displaying abort anyway.");
jClient.displayAbort(reason);
}
@Override
public void handleTransportException(GeneralSecurityException e) {
Logger.debug(LOG_TAG, "Encountered GeneralSecurityException, displaying abort anyway.");
jClient.displayAbort(reason);
}
};
AccountAuthenticator.runOnThread(new Runnable() {
@Override
public void run() {
httpResource.delete();
}
});
}
}