1b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun/*
2b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * Copyright (C) 2014 The Android Open Source Project
3b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun *
4b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * Licensed under the Apache License, Version 2.0 (the "License");
5b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * you may not use this file except in compliance with the License.
6b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * You may obtain a copy of the License at
7b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun *
8b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun *      http://www.apache.org/licenses/LICENSE-2.0
9b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun *
10b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * Unless required by applicable law or agreed to in writing, software
11b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * distributed under the License is distributed on an "AS IS" BASIS,
12b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * See the License for the specific language governing permissions and
14b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * limitations under the License.
15b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun */
16b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
17b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurunpackage android.webkit;
18b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
19b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurunimport java.security.Principal;
20b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurunimport java.security.PrivateKey;
21b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurunimport java.security.cert.X509Certificate;
22b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
23b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun/**
24b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * ClientCertRequest: The user receives an instance of this class as
25b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * a parameter of {@link WebViewClient#onReceivedClientCertRequest}.
26b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * The request includes the parameters to choose the client certificate,
27b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * such as the host name and the port number requesting the cert, the acceptable
28b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * key types and the principals.
29b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun *
30ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun * The user should call one of the class methods to indicate how to deal
31b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * with the client certificate request. All methods should be called on
32b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * UI thread.
33b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun *
34b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * WebView caches the {@link #proceed} and {@link #cancel} responses in memory
35b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * and uses them to handle future client certificate requests for the same
36b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * host/port pair. The user can clear the cached data using
37b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun * {@link WebView#clearClientCertPreferences}.
38b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun *
39b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun */
40ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurunpublic abstract class ClientCertRequest {
41ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun
42ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public ClientCertRequest() { }
43ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun
44b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun    /**
45b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Returns the acceptable types of asymmetric keys (can be null).
46b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     */
47ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public abstract String[] getKeyTypes();
48b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
49b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun    /**
50b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Returns the acceptable certificate issuers for the certificate
51b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     *            matching the private key (can be null).
52b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     */
53ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public abstract Principal[] getPrincipals();
54b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
55b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun    /**
56b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Returns the host name of the server requesting the certificate.
57b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     */
58ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public abstract String getHost();
59b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
60b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun    /**
61b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Returns the port number of the server requesting the certificate.
62b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     */
63ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public abstract int getPort();
64b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
65b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun    /**
66b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Proceed with the specified private key and client certificate chain.
67b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Remember the user's positive choice and use it for future requests.
68b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     */
69ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public abstract void proceed(PrivateKey privateKey, X509Certificate[] chain);
70b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
71b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun    /**
72b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Ignore the request for now. Do not remember user's choice.
73b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     */
74ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public abstract void ignore();
75b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun
76b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun    /**
77b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * Cancel this request. Remember the user's choice and use it for
78b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     * future requests.
79b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun     */
80ee89ab4dd5fa92dbbda255cf74537c44f74e1483Selim Gurun    public abstract void cancel();
81b6aa97e0a0cd13846c148716fc0c7947422cea04Selim Gurun}
82