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