blob: 7cb491ec7381974ec2340364eb6b414056699d7b [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.android.apps.account_manager;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.widget.ListView;
import android.widget.Toast;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import java.util.ArrayList;
import java.util.List;
import io.v.v23.security.Constants;
import io.v.v23.security.VCertificate;
import io.v.v23.verror.VException;
import io.v.v23.vom.VomUtil;
import io.v.v23.security.Caveat;
import io.v.v23.uniqueid.Id;
/**
* Displays a single certificate.
*/
public class CertificateDisplayActivity extends PreferenceActivity {
public static final String TAG = "BlessingDetailsDisplay";
public static final String EXTRA_CERTIFICATE_VOM = "EXTRA_CERTIFICATE_VOM";
private static final String NAME_TITLE = "Name";
private static final String PUBLIC_KEY_TITLE = "Public Key";
private static final String CAVEATS_TITLE = "Caveats";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
byte[] certificateVom = getIntent().getByteArrayExtra(EXTRA_CERTIFICATE_VOM);
VCertificate certificate = null;
try {
certificate = (VCertificate) VomUtil.decode(certificateVom, VCertificate.class);
} catch (Exception e) {
handleError("Couldn't display certificate: " + e);
return;
}
PreferenceScreen prefScreen = getPreferenceManager().createPreferenceScreen(this);
ListView listView = new ListView(this);
prefScreen.bind(listView);
PreferenceCategory nameCategory = new PreferenceCategory(this);
nameCategory.setTitle(NAME_TITLE);
prefScreen.addPreference(nameCategory);
Preference namePref = new Preference(this);
namePref.setTitle(certificate.getExtension());
namePref.setEnabled(false);
nameCategory.addPreference(namePref);
PreferenceCategory publicKeyCategory = new PreferenceCategory(this);
publicKeyCategory.setTitle(PUBLIC_KEY_TITLE);
prefScreen.addPreference(publicKeyCategory);
// Display the fields of the certificate
Preference publicKeyPreference = new Preference(this);
publicKeyPreference.setSummary(
VomUtil.bytesToHexString(certificate.getPublicKey()).toString());
publicKeyPreference.setEnabled(false);
publicKeyCategory.addPreference(publicKeyPreference);
PreferenceCategory caveatsCategory = new PreferenceCategory(this);
caveatsCategory.setTitle(CAVEATS_TITLE);
prefScreen.addPreference(caveatsCategory);
for (Caveat caveat: certificate.getCaveats()) {
String caveatDescription = caveatText(caveat);
Preference caveatPreference = new Preference(this);
caveatPreference.setSummary(caveatDescription);
caveatPreference.setEnabled(true);
caveatsCategory.addPreference(caveatPreference);
}
setPreferenceScreen(prefScreen);
}
/**
* Returns a human-readable description of a caveat.
*
* @param caveat the caveat to be examined
* @return a human-readable description of the caveat
*/
public static String caveatText(Caveat caveat) {
Id caveatId = caveat.getId();
if (caveatId.equals(Constants.CONST_CAVEAT.getId())) {
return "Const Caveat";
} else if (caveatId.equals(Constants.EXPIRY_CAVEAT.getId())) {
String ret = "Expiry Caveat: ";
try {
DateTime expiry = expiryCaveatPayload(caveat);
ret += expiry.toString(DateTimeFormat.mediumDateTime());
} catch (VException e) {
android.util.Log.e(TAG, "Error parsing expiry caveat payload: " + e);
ret += "Could not get expiry time";
}
return ret;
} else if (caveatId.equals(Constants.METHOD_CAVEAT.getId())) {
String ret = "Method Caveat: ";
try {
List<String> methods = methodCaveatPayload(caveat);
for (String name: methods) {
ret += name + "\n";
}
} catch (VException e) {
android.util.Log.e(TAG, "Error parsing method caveat payload: " + e);
ret += "Could not get method names";
}
return ret;
} else if (caveatId.equals(Constants.PEER_BLESSINGS_CAVEAT.getId())) {
return "Peer Blessings Caveat";
} else if (caveatId.equals(Constants.PUBLIC_KEY_THIRD_PARTY_CAVEAT.getId())) {
return "Public Key Third Party Caveat";
} else {
return "Unknown Caveat";
}
}
/**
* Returns expiry time that the caveat restricts the blessing usage to.
*
* @param caveat the caveat to be examined.
* @return expiry time
* @throws VException if the given caveat is not a method caveat, or if there
* was a problem getting the method names
*/
public static DateTime expiryCaveatPayload(Caveat caveat) throws VException {
Object param = VomUtil.decode(caveat.getParamVom());
if (param == null) {
param = new DateTime(0);
}
if (!(param instanceof DateTime)) {
throw new VException(String.format(
"Caveat param %s of wrong type: want %s", param, DateTime.class));
}
return (DateTime) param;
}
/**
* Returns method names that the caveat restricts the blessing usage to.
*
* @param caveat the caveat to be examined.
* @return list of methods that the blessing is valid for
* @throws VException if the given caveat is not a method caveat, or if there
* was a problem getting the method names
*/
public static List<String> methodCaveatPayload(Caveat caveat) throws VException {
Object param = VomUtil.decode(caveat.getParamVom());
if (param == null) {
param = new ArrayList<String>();
}
if (!(param instanceof List<?>)) {
throw new VException(String.format(
"Caveat param %s of wrong type: want List<?>", param));
}
try {
return (List<String>) param;
} catch (Exception e) {
throw new VException(String.format(
"Caveat param %s of wrong type: want List<String>", param));
}
}
private void handleError(String error) {
String msg = "Caveat display error: " + error;
android.util.Log.e(TAG, msg);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
}