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