Identity.java revision e32b21f14d52bac429a9c54fe031f9e92c911d64
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays; 23e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilsonimport libcore.base.Objects; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Identity} represents an identity like a person or a company. 272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated The functionality of this class has been replace by 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link Principal}, {@link KeyStore} and the {@code 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.security.cert} package. 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@Deprecated 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Identity implements Principal, Serializable { 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 3609922007826600659L; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String name; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private PublicKey publicKey; 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private String info = "no additional info"; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private IdentityScope scope; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Vector<Certificate> certificates; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code Identity}. 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Identity() { 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new instance of {@code Identity} with the specified name. 542f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of this {@code Identity}. 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Identity(String name) { 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.name = name; 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new instance of {@code Identity} with the specified name and 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the scope of this {@code Identity}. 652f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of this {@code Identity}. 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param scope 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code IdentityScope} of this {@code Identity}. 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an {@code Identity} with the same name is already present 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the specified scope. 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Identity(String name, IdentityScope scope) 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyManagementException { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(name); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (scope != null) { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project scope.addIdentity(this); 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.scope = scope; 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Adds a {@code Certificate} to this {@code Identity}. 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code addIdentityCertificate} to be 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * granted, otherwise a {@code SecurityException} will be thrown. 892f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param certificate 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code Certificate} to be added to this {@code Identity}. 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the certificate is not valid. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void addCertificate(Certificate certificate) 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyManagementException { 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 102f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("addIdentityCertificate"); 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PublicKey certPK = certificate.getPublicKey(); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (publicKey != null) { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!checkKeysEqual(publicKey, certPK)) { 107897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new KeyManagementException("Cert's public key does not match Identity's public key"); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project publicKey = certPK; 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (certificates == null) { 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates = new Vector<Certificate>(); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates.add(certificate); 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static boolean checkKeysEqual(PublicKey pk1, PublicKey pk2) { 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // first, they should have the same format 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // second, their encoded form must be the same 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // assert(pk1 != null); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // assert(pk2 != null); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String format1 = pk1.getFormat(); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String format2; 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pk2 == null) 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || (((format2 = pk2.getFormat()) != null) ^ (format1 != null)) 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || ((format1 != null) && !format1.equals(format2))) { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Arrays.equals(pk1.getEncoded(), pk2.getEncoded()); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Removes the specified {@code Certificate} from this {@code Identity}. 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code "removeIdentityCertificate"} to be 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * granted, otherwise a {@code SecurityException} will be thrown. 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param certificate 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code Certificate} to be removed. 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the certificate is not found. 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void removeCertificate(Certificate certificate) 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyManagementException { 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 162f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("removeIdentityCertificate"); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (certificates != null) { 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!certificates.contains(certificate)) { 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new KeyManagementException("Certificate not found"); 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates.removeElement(certificate); 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 175f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the certificates for this {@code Identity}. External 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modifications of the returned array has no impact on this {@code 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity}. 1812f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code Certificates} for this {@code Identity} 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Certificate[] certificates() { 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (certificates == null) { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Certificate[0]; 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Certificate[] ret = new Certificate[certificates.size()]; 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates.copyInto(ret); 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ret; 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the specified {@code Identity} with this {@code Identity} for 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * equality and returns {@code true} if the specified object is equal, 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To be equal, two {@code Identity} objects need to have the same name and 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the same public keys. 2032f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param identity 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the identity to check for equality. 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the {@code Identity} objects are equal, {@code 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * false} otherwise. 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean identityEquals(Identity identity) { 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!name.equals(identity.name)) { 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (publicKey == null) { 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (identity.publicKey == null); 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return checkKeysEqual(publicKey, identity.publicKey); 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 222f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of the 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code Identity}. 2272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param detailed 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * whether or not this method should return detailed information. 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this {@code Permission}. 2312f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes */ 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString(boolean detailed) { 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String s = toString(); 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (detailed) { 235f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes s += " " + info; 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s; 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 241f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code IdentityScope} of this {@code Identity}. 2452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code IdentityScope} of this {@code Identity}. 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final IdentityScope getScope() { 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return scope; 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 253f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the specified {@code PublicKey} to this {@code Identity}. 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code setIdentityPublicKey} to be 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * granted, otherwise a {@code SecurityException} will be thrown. 2612f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code PublicKey} to be set. 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another {@code Identity} in the same scope as this {@code 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity} already has the same {@code PublicKey}. 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setPublicKey(PublicKey key) throws KeyManagementException { 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 274f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("setIdentityPublicKey"); 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 276f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes // this check does not always work 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((scope != null) && (key != null)) { 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Identity i = scope.getIdentity(key); 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //System.out.println("###DEBUG## Identity: "+i); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((i != null) && (i != this)) { 281897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new KeyManagementException("key already used in scope"); 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.publicKey = key; 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates = null; 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 289f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code PublicKey} associated with this {@code Identity}. 2932f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code PublicKey} associated with this {@code Identity}. 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PublicKey getPublicKey() { 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return publicKey; 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 301f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets an information string for this {@code Identity}. 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code setIdentityInfo} to be granted, 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise a {@code SecurityException} will be thrown. 3092f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param info 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the information to be set. 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setInfo(String info) { 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 319f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("setIdentityInfo"); 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.info = info; 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 325f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the information string of this {@code Identity}. 3292f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the information string of this {@code Identity}. 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getInfo() { 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return info; 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 337f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the specified object with this {@code Identity} for equality and 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returns {@code true} if the specified object is equal, {@code false} 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. {@code Identity} objects are considered equal, if they have 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the same name and are in the same scope. 3442f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param obj 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object to be compared for equality with this {@code 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity}. 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object is equal to this {@code 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity}, otherwise {@code false}. 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean equals(Object obj) { 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this == obj) { 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(obj instanceof Identity)) { 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Identity i = (Identity) obj; 360e32b21f14d52bac429a9c54fe031f9e92c911d64Jesse Wilson if (Objects.equal(name, i.name) && (Objects.equal(scope, i.scope))) { 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return identityEquals(i); 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 367f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the name of this {@code Identity}. 3712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the name of this {@code Identity}. 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final String getName() { 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return name; 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 379f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the hash code value for this {@code Identity}. Returns the same 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hash code for {@code Identity}s that are equal to each other as required 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the general contract of {@link Object#hashCode}. 3852f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the hash code value for this {@code Identity}. 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Object#equals(Object) 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Identity#equals(Object) 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3902f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = 0; 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (name != null) { 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hash += name.hashCode(); 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (scope != null) { 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hash += scope.hashCode(); 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hash; 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 403f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of the 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code Identity} including its name and its scope. 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * needs the {@code SecurityPermission} {@code printIdentity} to be granted, 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise a {@code SecurityException} will be thrown. 4122f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this {@code Identity}. 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 4182f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 4192f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @SuppressWarnings("nls") 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 4232f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes sm.checkSecurityAccess("printIdentity"); 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 4252f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes String s = (this.name == null ? "" : this.name); 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (scope != null) { 4272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes s += " [" + scope.getName() + "]"; 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s; 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 432