Merge "Save OwnerInfo so CryptKeeper can display at boot time"

This commit is contained in:
Paul Lawrence
2014-04-04 14:05:55 +00:00
committed by Android (Google) Code Review
3 changed files with 136 additions and 2 deletions

View File

@@ -713,10 +713,9 @@ public interface IMountService extends IInterface {
public void clearPassword() throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
mRemote.transact(Stub.TRANSACTION_clearPassword, _data, _reply, 0);
mRemote.transact(Stub.TRANSACTION_clearPassword, _data, _reply, IBinder.FLAG_ONEWAY);
_reply.readException();
} finally {
_reply.recycle();
@@ -724,6 +723,38 @@ public interface IMountService extends IInterface {
}
}
public void setField(String field, String data) throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(field);
_data.writeString(data);
mRemote.transact(Stub.TRANSACTION_setField, _data, _reply, IBinder.FLAG_ONEWAY);
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
public String getField(String field) throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(field);
mRemote.transact(Stub.TRANSACTION_getField, _data, _reply, 0);
_reply.readException();
_result = _reply.readString();
} finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
public StorageVolume[] getVolumeList() throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
@@ -882,6 +913,10 @@ public interface IMountService extends IInterface {
static final int TRANSACTION_clearPassword = IBinder.FIRST_CALL_TRANSACTION + 37;
static final int TRANSACTION_setField = IBinder.FIRST_CALL_TRANSACTION + 38;
static final int TRANSACTION_getField = IBinder.FIRST_CALL_TRANSACTION + 39;
/**
* Cast an IBinder object into an IMountService interface, generating a
* proxy if needed.
@@ -1255,6 +1290,22 @@ public interface IMountService extends IInterface {
reply.writeNoException();
return true;
}
case TRANSACTION_setField: {
data.enforceInterface(DESCRIPTOR);
String field = data.readString();
String contents = data.readString();
setField(field, contents);
reply.writeNoException();
return true;
}
case TRANSACTION_getField: {
data.enforceInterface(DESCRIPTOR);
String field = data.readString();
String contents = getField(field);
reply.writeNoException();
reply.writeString(contents);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
@@ -1504,4 +1555,18 @@ public interface IMountService extends IInterface {
* Securely clear password from vold
*/
public void clearPassword() throws RemoteException;
/**
* Set a field in the crypto header.
* @param field field to set
* @param contents contents to set in field
*/
public void setField(String field, String contents) throws RemoteException;
/**
* Gets a field from the crypto header.
* @param field field to get
* @return contents of field
*/
public String getField(String field) throws RemoteException;
}

View File

@@ -564,12 +564,37 @@ public class LockPatternUtils {
}
}
private void updateCryptoUserInfo() {
int userId = getCurrentOrCallingUserId();
if (userId != UserHandle.USER_OWNER) {
return;
}
final String ownerInfo = isOwnerInfoEnabled() ? getOwnerInfo(userId) : "";
IBinder service = ServiceManager.getService("mount");
if (service == null) {
Log.e(TAG, "Could not find the mount service to update the user info");
return;
}
IMountService mountService = IMountService.Stub.asInterface(service);
try {
Log.d(TAG, "Setting owner info");
mountService.setField("OwnerInfo", ownerInfo);
} catch (RemoteException e) {
Log.e(TAG, "Error changing user info", e);
}
}
public void setOwnerInfo(String info, int userId) {
setString(LOCK_SCREEN_OWNER_INFO, info, userId);
updateCryptoUserInfo();
}
public void setOwnerInfoEnabled(boolean enabled) {
setBoolean(LOCK_SCREEN_OWNER_INFO_ENABLED, enabled);
updateCryptoUserInfo();
}
public String getOwnerInfo(int userId) {

View File

@@ -158,6 +158,7 @@ class MountService extends IMountService.Stub
public static final int VolumeListResult = 110;
public static final int AsecListResult = 111;
public static final int StorageUsersListResult = 112;
public static final int CryptfsGetfieldResult = 113;
/*
* 200 series - Requestion action has been successfully completed.
@@ -2251,6 +2252,49 @@ class MountService extends IMountService.Stub
}
}
/**
* Set a field in the crypto header.
* @param field field to set
* @param contents contents to set in field
*/
@Override
public void setField(String field, String contents) throws RemoteException {
waitForReady();
final NativeDaemonEvent event;
try {
event = mConnector.execute("cryptfs", "setfield", field, contents);
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
/**
* Gets a field from the crypto header.
* @param field field to get
* @return contents of field
*/
@Override
public String getField(String field) throws RemoteException {
waitForReady();
final NativeDaemonEvent event;
try {
final String[] contents = NativeDaemonEvent.filterMessageList(
mConnector.executeForList("cryptfs", "getfield", field),
VoldResponseCode.CryptfsGetfieldResult);
String result = new String();
for (String content : contents) {
result += content;
}
return result;
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
@Override
public String getPassword() throws RemoteException {
if (!isReady()) {