Identity.java revision f33eae7e84eb6d3b0f4e86b59605bb3de73009f3
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; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.internal.nls.Messages; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Identity} represents an identity like a person or a company. 282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated The functionality of this class has been replace by 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link Principal}, {@link KeyStore} and the {@code 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * java.security.cert} package. 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@Deprecated 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Identity implements Principal, Serializable { 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final long serialVersionUID = 3609922007826600659L; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String name; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private PublicKey publicKey; 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private String info = "no additional info"; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private IdentityScope scope; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Vector<Certificate> certificates; 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code Identity}. 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Identity() { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new instance of {@code Identity} with the specified name. 552f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of this {@code Identity}. 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Identity(String name) { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.name = name; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new instance of {@code Identity} with the specified name and 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the scope of this {@code Identity}. 662f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of this {@code Identity}. 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param scope 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code IdentityScope} of this {@code Identity}. 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an {@code Identity} with the same name is already present 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the specified scope. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Identity(String name, IdentityScope scope) 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyManagementException { 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this(name); 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (scope != null) { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project scope.addIdentity(this); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.scope = scope; 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Adds a {@code Certificate} to this {@code Identity}. 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code addIdentityCertificate} to be 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * granted, otherwise a {@code SecurityException} will be thrown. 902f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param certificate 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code Certificate} to be added to this {@code Identity}. 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the certificate is not valid. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void addCertificate(Certificate certificate) 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyManagementException { 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 103f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("addIdentityCertificate"); 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project PublicKey certPK = certificate.getPublicKey(); 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (publicKey != null) { 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!checkKeysEqual(publicKey, certPK)) { 108f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes throw new KeyManagementException(Messages.getString("security.13")); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project publicKey = certPK; 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (certificates == null) { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates = new Vector<Certificate>(); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates.add(certificate); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static boolean checkKeysEqual(PublicKey pk1, PublicKey pk2) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // first, they should have the same format 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // second, their encoded form must be the same 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // assert(pk1 != null); 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // assert(pk2 != null); 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String format1 = pk1.getFormat(); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String format2; 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((pk2 == null) 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || (((format2 = pk2.getFormat()) != null) ^ (format1 != null)) 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project || ((format1 != null) && !format1.equals(format2))) { 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Arrays.equals(pk1.getEncoded(), pk2.getEncoded()); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Removes the specified {@code Certificate} from this {@code Identity}. 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code "removeIdentityCertificate"} to be 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * granted, otherwise a {@code SecurityException} will be thrown. 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 1502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param certificate 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code Certificate} to be removed. 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the certificate is not found. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void removeCertificate(Certificate certificate) 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyManagementException { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 163f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("removeIdentityCertificate"); 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (certificates != null) { 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!certificates.contains(certificate)) { 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new KeyManagementException("Certificate not found"); 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates.removeElement(certificate); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the certificates for this {@code Identity}. External 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * modifications of the returned array has no impact on this {@code 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity}. 1822f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code Certificates} for this {@code Identity} 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Certificate[] certificates() { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (certificates == null) { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new Certificate[0]; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Certificate[] ret = new Certificate[certificates.size()]; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates.copyInto(ret); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ret; 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 195f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the specified {@code Identity} with this {@code Identity} for 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * equality and returns {@code true} if the specified object is equal, 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * To be equal, two {@code Identity} objects need to have the same name and 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the same public keys. 2042f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param identity 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the identity to check for equality. 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the {@code Identity} objects are equal, {@code 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * false} otherwise. 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean identityEquals(Identity identity) { 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!name.equals(identity.name)) { 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (publicKey == null) { 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (identity.publicKey == null); 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return checkKeysEqual(publicKey, identity.publicKey); 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 223f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of the 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code Identity}. 2282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param detailed 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * whether or not this method should return detailed information. 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this {@code Permission}. 2322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes */ 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString(boolean detailed) { 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String s = toString(); 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (detailed) { 236f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes s += " " + info; 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s; 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 242f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code IdentityScope} of this {@code Identity}. 2462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code IdentityScope} of this {@code Identity}. 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final IdentityScope getScope() { 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return scope; 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 254f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the specified {@code PublicKey} to this {@code Identity}. 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code setIdentityPublicKey} to be 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * granted, otherwise a {@code SecurityException} will be thrown. 2622f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code PublicKey} to be set. 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyManagementException 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if another {@code Identity} in the same scope as this {@code 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity} already has the same {@code PublicKey}. 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setPublicKey(PublicKey key) throws KeyManagementException { 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 275f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("setIdentityPublicKey"); 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 277f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes // this check does not always work 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((scope != null) && (key != null)) { 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Identity i = scope.getIdentity(key); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //System.out.println("###DEBUG## Identity: "+i); 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((i != null) && (i != this)) { 282f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes throw new KeyManagementException(Messages.getString("security.14")); 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.publicKey = key; 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project certificates = null; 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 290f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code PublicKey} associated with this {@code Identity}. 2942f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code PublicKey} associated with this {@code Identity}. 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PublicKey getPublicKey() { 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return publicKey; 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 302f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets an information string for this {@code Identity}. 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method needs 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code SecurityPermission} {@code setIdentityInfo} to be granted, 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise a {@code SecurityException} will be thrown. 3102f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param info 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the information to be set. 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setInfo(String info) { 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 320f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sm.checkSecurityAccess("setIdentityInfo"); 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.info = info; 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 326f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the information string of this {@code Identity}. 3302f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the information string of this {@code Identity}. 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getInfo() { 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return info; 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 338f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Compares the specified object with this {@code Identity} for equality and 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returns {@code true} if the specified object is equal, {@code false} 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. {@code Identity} objects are considered equal, if they have 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the same name and are in the same scope. 3452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param obj 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object to be compared for equality with this {@code 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity}. 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the specified object is equal to this {@code 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Identity}, otherwise {@code false}. 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3522f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean equals(Object obj) { 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (this == obj) { 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(obj instanceof Identity)) { 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Identity i = (Identity) obj; 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((name == i.name || (name != null && name.equals(i.name))) 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && (scope == i.scope || (scope != null && scope.equals(i.scope)))) { 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return identityEquals(i); 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 369f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the name of this {@code Identity}. 3732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the name of this {@code Identity}. 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final String getName() { 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return name; 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 381f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the hash code value for this {@code Identity}. Returns the same 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * hash code for {@code Identity}s that are equal to each other as required 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the general contract of {@link Object#hashCode}. 3872f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the hash code value for this {@code Identity}. 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Object#equals(Object) 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Identity#equals(Object) 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 3922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int hashCode() { 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int hash = 0; 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (name != null) { 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hash += name.hashCode(); 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (scope != null) { 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hash += scope.hashCode(); 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return hash; 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 405f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of the 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code Identity} including its name and its scope. 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a {@code SecurityManager} is installed, code calling this method 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * needs the {@code SecurityPermission} {@code printIdentity} to be granted, 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise a {@code SecurityException} will be thrown. 4142f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this {@code Identity}. 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SecurityException 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a {@code SecurityManager} is installed and the caller does 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not have permission to invoke this method. 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 4202f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 4212f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @SuppressWarnings("nls") 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecurityManager sm = System.getSecurityManager(); 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (sm != null) { 4252f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes sm.checkSecurityAccess("printIdentity"); 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 4272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes String s = (this.name == null ? "" : this.name); 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (scope != null) { 4292f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes s += " [" + scope.getName() + "]"; 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return s; 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 434