/*
* *
* Copyright (C) 2014 Open Whisper Systems
*
* 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.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* /
*/
package org.anhonesteffort.flock.registration;
import android.content.Context;
import android.util.Log;
import org.anhonesteffort.flock.util.guava.Optional;
import org.anhonesteffort.flock.auth.DavAccount;
import org.anhonesteffort.flock.registration.model.AugmentedFlockAccount;
import org.anhonesteffort.flock.registration.model.FlockCardInformation;
import org.anhonesteffort.flock.registration.model.SubscriptionPlan;
import org.anhonesteffort.flock.util.Base64;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
/**
* Programmer: rhodey
*/
public class RegistrationApi {
private static final String TAG = "org.anhonesteffort.flock.registration.RegistrationApi";
private final DefaultHttpClient httpClient;
public RegistrationApi(Context context) throws RegistrationApiException {
this.httpClient = new HttpClientFactory(context).buildClient();
}
private static void authorizeRequest(HttpRequestBase httpRequest, DavAccount account) {
String encodedAuth = account.getUserId() + ":" + account.getAuthToken();
httpRequest.addHeader("Authorization", "Basic " + Base64.encodeBytes(encodedAuth.getBytes()));
}
private static void throwExceptionIfNotOK(HttpResponse response)
throws RegistrationApiException
{
Log.d(TAG, "response status code: " + response.getStatusLine().getStatusCode());
Integer status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300)
return;
switch (status) {
case OwsRegistration.STATUS_UNAUTHORIZED:
throw new AuthorizationException("Registration API returned status unauthorized.");
case OwsRegistration.STATUS_RESOURCE_NOT_FOUND:
throw new ResourceNotFoundException("Registration API returned status resource not found.");
case OwsRegistration.STATUS_RESOURCE_ALREADY_EXISTS:
throw new ResourceAlreadyExistsException("Registration API returned status 403, resource already exists.");
case OwsRegistration.STATUS_PAYMENT_REQUIRED:
throw new PaymentRequiredException("Registration API didn't like the card or purchase token we gave it");
case OwsRegistration.STATUS_RATE_LIMITED:
throw new RegistrationApiException("we are being rate limited for some reason, bummer.");
}
throw new RegistrationApiException(
"got bad status: " + response.getStatusLine().getReasonPhrase() + ", " + status, status
);
}
public AugmentedFlockAccount createAccount(DavAccount account)
throws RegistrationApiException, IOException
{
Log.d(TAG, "createAccount()");
List<NameValuePair> nameValuePairs = new LinkedList<>();
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_ACCOUNT_ID, account.getUserId()));
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_ACCOUNT_VERSION, Integer.toString(2)));
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_ACCOUNT_PASSWORD, account.getAuthToken()));
String accountsControllerHref = OwsRegistration.getHrefWithParameters(
OwsRegistration.HREF_ACCOUNT_COLLECTION,
nameValuePairs
);
HttpPost httpPost = new HttpPost(accountsControllerHref);
HttpResponse response = httpClient.execute(httpPost);
throwExceptionIfNotOK(response);
return ModelFactory.buildAccount(response);
}
public AugmentedFlockAccount getAccount(DavAccount account)
throws RegistrationApiException, IOException
{
String HREF = OwsRegistration.getHrefForAccount(account.getUserId());
HttpGet httpGet = new HttpGet(HREF);
authorizeRequest(httpGet, account);
HttpResponse response = httpClient.execute(httpGet);
throwExceptionIfNotOK(response);
return ModelFactory.buildAccount(response);
}
public void setAccountVersion(DavAccount account, Integer version)
throws RegistrationApiException, IOException
{
Log.d(TAG, "setAccountVersion()");
List<NameValuePair> nameValuePairs = new LinkedList<>();
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_ACCOUNT_VERSION, version.toString()));
String accountControllerHref = OwsRegistration.getHrefWithParameters(
OwsRegistration.getHrefForAccount(account.getUserId()),
nameValuePairs
);
HttpPut httpPut = new HttpPut(accountControllerHref);
authorizeRequest(httpPut, account);
HttpResponse response = httpClient.execute(httpPut);
throwExceptionIfNotOK(response);
}
public void setAccountPassword(DavAccount account, String newPassword)
throws RegistrationApiException, IOException
{
Log.d(TAG, "setAccountPassword()");
List<NameValuePair> nameValuePairs = new LinkedList<>();
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_ACCOUNT_PASSWORD, newPassword));
String accountControllerHref = OwsRegistration.getHrefWithParameters(
OwsRegistration.getHrefForAccount(account.getUserId()),
nameValuePairs
);
HttpPut httpPut = new HttpPut(accountControllerHref);
authorizeRequest(httpPut, account);
HttpResponse response = httpClient.execute(httpPut);
throwExceptionIfNotOK(response);
}
public Optional<FlockCardInformation> getCard(DavAccount account)
throws RegistrationApiException, IOException
{
String cardControllerHref = OwsRegistration.getHrefForCard(account.getUserId());
HttpGet httpGet = new HttpGet(cardControllerHref);
authorizeRequest(httpGet, account);
HttpResponse response = httpClient.execute(httpGet);
try {
throwExceptionIfNotOK(response);
} catch (ResourceNotFoundException e) {
return Optional.absent();
}
return Optional.of(ModelFactory.buildCard(response));
}
public void setStripeCard(DavAccount account, String stripeCardToken)
throws RegistrationApiException, IOException
{
List<NameValuePair> nameValuePairs = new LinkedList<>();
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_STRIPE_CARD_TOKEN, stripeCardToken));
String cardControllerHref = OwsRegistration.getHrefWithParameters(
OwsRegistration.getHrefForCard(account.getUserId()),
nameValuePairs
);
HttpPut httpPut = new HttpPut(cardControllerHref);
authorizeRequest(httpPut, account);
HttpResponse response = httpClient.execute(httpPut);
throwExceptionIfNotOK(response);
}
public boolean getIsPlanAutoRenewing(DavAccount account)
throws RegistrationApiException, IOException
{
String planControllerHref = OwsRegistration.getHrefForPlan(account.getUserId());
HttpGet httpGet = new HttpGet(planControllerHref);
authorizeRequest(httpGet, account);
HttpResponse response = httpClient.execute(httpGet);
throwExceptionIfNotOK(response);
return ModelFactory.buildBoolean(response);
}
public void putNewGooglePlan(DavAccount account, String planId, String purchaseToken)
throws RegistrationApiException, IOException
{
Log.d(TAG, "putNewGooglePlan()");
List<NameValuePair> nameValuePairs = new LinkedList<>();
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_PLAN_TYPE, Integer.toString(SubscriptionPlan.PLAN_TYPE_GOOGLE)));
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_PLAN_ID, planId));
nameValuePairs.add(new BasicNameValuePair(OwsRegistration.PARAM_PURCHASE_TOKEN, purchaseToken));
String planControllerHref = OwsRegistration.getHrefWithParameters(
OwsRegistration.getHrefForPlan(account.getUserId()),
nameValuePairs
);
HttpPut httpPut = new HttpPut(planControllerHref);
authorizeRequest(httpPut, account);
HttpResponse response = httpClient.execute(httpPut);
throwExceptionIfNotOK(response);
}
public void migrateBillingToStripeSubscriptionModel(DavAccount account)
throws RegistrationApiException, IOException
{
Log.d(TAG, "migrateBillingToStripeSubscriptionModel()");
List<NameValuePair> nameValuePairs = new LinkedList<>();
nameValuePairs.add(new BasicNameValuePair(
OwsRegistration.PARAM_PLAN_TYPE,
Integer.toString(SubscriptionPlan.PLAN_TYPE_STRIPE)
));
String planControllerHref = OwsRegistration.getHrefWithParameters(
OwsRegistration.getHrefForPlan(account.getUserId()),
nameValuePairs
);
HttpPut httpPut = new HttpPut(planControllerHref);
authorizeRequest(httpPut, account);
HttpResponse response = httpClient.execute(httpPut);
throwExceptionIfNotOK(response);
}
public void cancelSubscription(DavAccount account)
throws RegistrationApiException, IOException
{
Log.d(TAG, "cancelSubscription()");
String planController = OwsRegistration.getHrefForPlan(account.getUserId());
HttpDelete httpDelete = new HttpDelete(planController);
authorizeRequest(httpDelete, account);
HttpResponse response = httpClient.execute(httpDelete);
throwExceptionIfNotOK(response);
}
public void deleteAccount(DavAccount account)
throws RegistrationApiException, IOException
{
Log.d(TAG, "deleteAccount()");
String accountControllerHref = OwsRegistration.getHrefForAccount(account.getUserId());
HttpDelete httpDelete = new HttpDelete(accountControllerHref);
authorizeRequest(httpDelete, account);
HttpResponse response = httpClient.execute(httpDelete);
throwExceptionIfNotOK(response);
}
}