Add communication class for HostAuth

We want a separate class for communicating HostAuth objects
to and from IEmailService. The issue is that the HostAuth object
was being used for both to and from the database, and to and from
IEmailService. This is dangerous because The Email app may change
out of band with the Exchange app, and may need to change the
format of HostAuth. This bit us before when adding OAuth.
Now communication to IEmailService is done using HostAuthCompat.

Change-Id: I2fb8c2bd8158f58a7bb9bc3dc83a7936948c718c
This commit is contained in:
Martin Hibdon 2014-07-02 13:29:58 -07:00
parent c11f7b9027
commit 1d8fd9c054
8 changed files with 169 additions and 15 deletions

View File

@ -25,9 +25,7 @@ import android.os.RemoteException;
import com.android.emailcommon.Device;
import com.android.emailcommon.TempDirectory;
import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.provider.Policy;
import com.android.mail.utils.LogUtils;
@ -145,15 +143,15 @@ public class EmailServiceProxy extends ServiceProxy implements IEmailService {
* address that serves the specified protocol and credentials sufficient to be authorized
* by the server to do so.
*
* @param hostAuth the hostauth object to validate
* @param hostAuthCom the hostAuthCom object to validate
* @return a Bundle as described above
*/
@Override
public Bundle validate(final HostAuth hostAuth) throws RemoteException {
public Bundle validate(final HostAuthCompat hostAuthCom) throws RemoteException {
setTask(new ProxyTask() {
@Override
public void run() throws RemoteException{
mReturn = mService.validate(hostAuth);
mReturn = mService.validate(hostAuthCom);
}
}, "validate");
waitForCompletion();

View File

@ -0,0 +1,18 @@
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.emailcommon.service;
parcelable HostAuthCompat;

View File

@ -0,0 +1,132 @@
package com.android.emailcommon.service;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.android.emailcommon.provider.Credential;
import com.android.emailcommon.provider.HostAuth;
import com.google.common.base.Objects;
/*
* This class is explicitly for communicating HostAuth information to different implementations of
* IEmailService. We do not want to use the regular HostAuth class because it's used in many ways
* and could need to change at some point, which could break Exchange.
*/
public class HostAuthCompat implements Parcelable {
private String mProtocol;
private String mAddress;
private int mPort;
private int mFlags;
private String mLogin;
private String mPassword;
private String mDomain;
private String mClientCertAlias;
private byte[] mServerCert;
private String mProviderId;
private String mAccessToken;
private String mRefreshToken;
private long mExpiration;
public HostAuthCompat(HostAuth hostAuth) {
mProtocol = hostAuth.mProtocol;
mAddress = hostAuth.mAddress;
mPort = hostAuth.mPort;
mFlags = hostAuth.mFlags;
mLogin = hostAuth.mLogin;
mPassword = hostAuth.mPassword;
mDomain = hostAuth.mDomain;
mClientCertAlias = hostAuth.mClientCertAlias;
mServerCert = hostAuth.mServerCert;
if (hostAuth.mCredential != null) {
mProviderId = hostAuth.mCredential.mProviderId;
mAccessToken = hostAuth.mCredential.mAccessToken;
mRefreshToken = hostAuth.mCredential.mRefreshToken;
mExpiration = hostAuth.mCredential.mExpiration;
}
}
public HostAuth toHostAuth() {
HostAuth hostAuth = new HostAuth();
hostAuth.mProtocol = mProtocol;
hostAuth.mAddress = mAddress;
hostAuth.mPort = mPort;
hostAuth.mFlags = mFlags;
hostAuth.mLogin = mLogin;
hostAuth.mPassword = mPassword;
hostAuth.mDomain = mDomain;
hostAuth.mClientCertAlias = mClientCertAlias;
hostAuth.mServerCert = mServerCert;
if (!TextUtils.isEmpty(mProviderId)) {
hostAuth.mCredential = new Credential();
hostAuth.mCredential.mProviderId = mProviderId;
hostAuth.mCredential.mAccessToken = mAccessToken;
hostAuth.mCredential.mRefreshToken = mRefreshToken;
hostAuth.mCredential.mExpiration = mExpiration;
}
return hostAuth;
}
@Override
public int describeContents() {
return 0;
}
@Override
public String toString() {
return "[protocol " + mProtocol + "]";
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(mProtocol);
parcel.writeString(mAddress);
parcel.writeInt(mPort);
parcel.writeInt(mFlags);
parcel.writeString(mLogin);
parcel.writeString(mPassword);
parcel.writeString(mDomain);
parcel.writeString(mClientCertAlias);
parcel.writeByteArray(mServerCert);
parcel.writeString(mProviderId);
parcel.writeString(mAccessToken);
parcel.writeString(mRefreshToken);
parcel.writeLong(mExpiration);
}
/**
* Supports Parcelable
*/
public HostAuthCompat(Parcel in) {
mProtocol = in.readString();
mAddress = in.readString();
mPort = in.readInt();
mFlags = in.readInt();
mLogin = in.readString();
mPassword = in.readString();
mDomain = in.readString();
mClientCertAlias = in.readString();
mServerCert = in.createByteArray();
mProviderId = in.readString();
mAccessToken = in.readString();
mRefreshToken = in.readString();
mExpiration = in.readLong();
}
/**
* Supports Parcelable
*/
public static final Parcelable.Creator<HostAuthCompat> CREATOR
= new Parcelable.Creator<HostAuthCompat>() {
@Override
public HostAuthCompat createFromParcel(Parcel in) {
return new HostAuthCompat(in);
}
@Override
public HostAuthCompat[] newArray(int size) {
return new HostAuthCompat[size];
}
};
}

View File

@ -17,8 +17,7 @@
package com.android.emailcommon.service;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.service.HostAuthCompat;
import com.android.emailcommon.service.IEmailServiceCallback;
import com.android.emailcommon.service.SearchParams;
@ -45,9 +44,7 @@ interface IEmailService {
void pushModify(long accountId);
// Other email operations.
// TODO: Decouple this call from HostAuth (i.e. use a dedicated data structure, or just pass
// the necessary strings directly).
Bundle validate(in HostAuth hostauth);
Bundle validate(in HostAuthCompat hostauth);
int searchMessages(long accountId, in SearchParams params, long destMailboxId);
@ -55,6 +52,7 @@ interface IEmailService {
oneway void sendMeetingResponse(long messageId, int response);
// Specific to EAS protocol.
// TODO: this passes a HostAuth back in the bundle. We should be using a HostAuthCom for that.
Bundle autoDiscover(String userName, String password);
// Service control operations (i.e. does not generate a client-server message).

View File

@ -34,6 +34,7 @@ import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Policy;
import com.android.emailcommon.service.EmailServiceProxy;
import com.android.emailcommon.service.HostAuthCompat;
import com.android.emailcommon.utility.Utility;
import com.android.mail.utils.LogUtils;
@ -358,8 +359,12 @@ public class AccountCheckSettingsFragment extends Fragment {
} else if (errorCode != MessagingException.NO_ERROR) {
return new AutoDiscoverResults(false, null);
} else {
HostAuth serverInfo =
final HostAuthCompat hostAuthCompat =
result.getParcelable(EmailServiceProxy.AUTO_DISCOVER_BUNDLE_HOST_AUTH);
HostAuth serverInfo = null;
if (hostAuthCompat != null) {
serverInfo = hostAuthCompat.toHostAuth();
}
return new AutoDiscoverResults(false, serverInfo);
}
}

View File

@ -26,6 +26,7 @@ import com.android.emailcommon.mail.MessagingException;
import com.android.emailcommon.provider.Account;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.service.EmailServiceProxy;
import com.android.emailcommon.service.HostAuthCompat;
import com.android.emailcommon.service.IEmailService;
/**
@ -66,7 +67,8 @@ public class ServiceStore extends Store {
if (svc instanceof EmailServiceProxy) {
((EmailServiceProxy)svc).setTimeout(90);
}
return svc.validate(mHostAuth);
HostAuthCompat hostAuthCom = new HostAuthCompat(mHostAuth);
return svc.validate(hostAuthCom);
} catch (RemoteException e) {
throw new MessagingException("Call to validate generated an exception", e);
}

View File

@ -51,9 +51,9 @@ import com.android.emailcommon.provider.EmailContent.Body;
import com.android.emailcommon.provider.EmailContent.BodyColumns;
import com.android.emailcommon.provider.EmailContent.MailboxColumns;
import com.android.emailcommon.provider.EmailContent.MessageColumns;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.provider.Mailbox;
import com.android.emailcommon.service.EmailServiceStatus;
import com.android.emailcommon.service.HostAuthCompat;
import com.android.emailcommon.service.IEmailService;
import com.android.emailcommon.service.IEmailServiceCallback;
import com.android.emailcommon.service.SearchParams;
@ -90,7 +90,7 @@ public abstract class EmailServiceStub extends IEmailService.Stub implements IEm
}
@Override
public Bundle validate(HostAuth hostauth) throws RemoteException {
public Bundle validate(HostAuthCompat hostAuthCom) throws RemoteException {
// TODO Auto-generated method stub
return null;
}

View File

@ -54,6 +54,7 @@ import com.android.emailcommon.provider.EmailContent.HostAuthColumns;
import com.android.emailcommon.provider.HostAuth;
import com.android.emailcommon.service.EmailServiceProxy;
import com.android.emailcommon.service.EmailServiceStatus;
import com.android.emailcommon.service.HostAuthCompat;
import com.android.emailcommon.service.IEmailService;
import com.android.emailcommon.service.IEmailServiceCallback;
import com.android.emailcommon.service.SearchParams;
@ -654,7 +655,7 @@ public class EmailServiceUtils {
}
@Override
public Bundle validate(HostAuth hostauth) throws RemoteException {
public Bundle validate(HostAuthCompat hostauth) throws RemoteException {
return null;
}