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