History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/net/ssl/HttpsURLConnection.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/net/ssl/HttpsURLConnection.java+373−0
@@ -0,0 +1,373 @@
1+/*
2+ * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
3+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+ *
5+ * This code is free software; you can redistribute it and/or modify it
6+ * under the terms of the GNU General Public License version 2 only, as
7+ * published by the Free Software Foundation. Oracle designates this
8+ * particular file as subject to the "Classpath" exception as provided
9+ * by Oracle in the LICENSE file that accompanied this code.
10+ *
11+ * This code is distributed in the hope that it will be useful, but WITHOUT
12+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+ * version 2 for more details (a copy is included in the LICENSE file that
15+ * accompanied this code).
16+ *
17+ * You should have received a copy of the GNU General Public License version
18+ * 2 along with this work; if not, write to the Free Software Foundation,
19+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+ *
21+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+ * or visit www.oracle.com if you need additional information or have any
23+ * questions.
24+ */
25+
26+package javax.net.ssl;
27+
28+import java.net.URL;
29+import java.net.HttpURLConnection;
30+import java.security.Principal;
31+import java.security.cert.X509Certificate;
32+import javax.security.auth.x500.X500Principal;
33+
34+/**
35+ * <code>HttpsURLConnection</code> extends <code>HttpURLConnection</code>
36+ * with support for https-specific features.
37+ * <P>
38+ * See <A HREF="http://www.w3.org/pub/WWW/Protocols/">
39+ * http://www.w3.org/pub/WWW/Protocols/</A> and
40+ * <A HREF="http://www.ietf.org/"> RFC 2818 </A>
41+ * for more details on the
42+ * https specification.
43+ * <P>
44+ * This class uses <code>HostnameVerifier</code> and
45+ * <code>SSLSocketFactory</code>.
46+ * There are default implementations defined for both classes.
47+ * However, the implementations can be replaced on a per-class (static) or
48+ * per-instance basis. All new <code>HttpsURLConnection</code>s instances
49+ * will be assigned
50+ * the "default" static values at instance creation, but they can be overriden
51+ * by calling the appropriate per-instance set method(s) before
52+ * <code>connect</code>ing.
53+ *
54+ * @since 1.4
55+ */
56+abstract public
57+class HttpsURLConnection extends HttpURLConnection
58+{
59+ /**
60+ * Creates an <code>HttpsURLConnection</code> using the
61+ * URL specified.
62+ *
63+ * @param url the URL
64+ */
65+ protected HttpsURLConnection(URL url) {
66+ super(url);
67+ }
68+
69+ /**
70+ * Returns the cipher suite in use on this connection.
71+ *
72+ * @return the cipher suite
73+ * @throws IllegalStateException if this method is called before
74+ * the connection has been established.
75+ */
76+ public abstract String getCipherSuite();
77+
78+ /**
79+ * Returns the certificate(s) that were sent to the server during
80+ * handshaking.
81+ * <P>
82+ * Note: This method is useful only when using certificate-based
83+ * cipher suites.
84+ * <P>
85+ * When multiple certificates are available for use in a
86+ * handshake, the implementation chooses what it considers the
87+ * "best" certificate chain available, and transmits that to
88+ * the other side. This method allows the caller to know
89+ * which certificate chain was actually sent.
90+ *
91+ * @return an ordered array of certificates,
92+ * with the client's own certificate first followed by any
93+ * certificate authorities. If no certificates were sent,
94+ * then null is returned.
95+ * @throws IllegalStateException if this method is called before
96+ * the connection has been established.
97+ * @see #getLocalPrincipal()
98+ */
99+ public abstract java.security.cert.Certificate [] getLocalCertificates();
100+
101+ /**
102+ * Returns the server's certificate chain which was established
103+ * as part of defining the session.
104+ * <P>
105+ * Note: This method can be used only when using certificate-based
106+ * cipher suites; using it with non-certificate-based cipher suites,
107+ * such as Kerberos, will throw an SSLPeerUnverifiedException.
108+ *
109+ * @return an ordered array of server certificates,
110+ * with the peer's own certificate first followed by
111+ * any certificate authorities.
112+ * @throws SSLPeerUnverifiedException if the peer is not verified.
113+ * @throws IllegalStateException if this method is called before
114+ * the connection has been established.
115+ * @see #getPeerPrincipal()
116+ */
117+ public abstract java.security.cert.Certificate [] getServerCertificates()
118+ throws SSLPeerUnverifiedException;
119+
120+ /**
121+ * Returns the server's principal which was established as part of
122+ * defining the session.
123+ * <P>
124+ * Note: Subclasses should override this method. If not overridden, it
125+ * will default to returning the X500Principal of the server's end-entity
126+ * certificate for certificate-based ciphersuites, or throw an
127+ * SSLPeerUnverifiedException for non-certificate based ciphersuites,
128+ * such as Kerberos.
129+ *
130+ * @return the server's principal. Returns an X500Principal of the
131+ * end-entity certiticate for X509-based cipher suites, and
132+ * KerberosPrincipal for Kerberos cipher suites.
133+ *
134+ * @throws SSLPeerUnverifiedException if the peer was not verified
135+ * @throws IllegalStateException if this method is called before
136+ * the connection has been established.
137+ *
138+ * @see #getServerCertificates()
139+ * @see #getLocalPrincipal()
140+ *
141+ * @since 1.5
142+ */
143+ public Principal getPeerPrincipal()
144+ throws SSLPeerUnverifiedException {
145+
146+ java.security.cert.Certificate[] certs = getServerCertificates();
147+ return ((X500Principal)
148+ ((X509Certificate)certs[0]).getSubjectX500Principal());
149+ }
150+
151+ /**
152+ * Returns the principal that was sent to the server during handshaking.
153+ * <P>
154+ * Note: Subclasses should override this method. If not overridden, it
155+ * will default to returning the X500Principal of the end-entity certificate
156+ * that was sent to the server for certificate-based ciphersuites or,
157+ * return null for non-certificate based ciphersuites, such as Kerberos.
158+ *
159+ * @return the principal sent to the server. Returns an X500Principal
160+ * of the end-entity certificate for X509-based cipher suites, and
161+ * KerberosPrincipal for Kerberos cipher suites. If no principal was
162+ * sent, then null is returned.
163+ *
164+ * @throws IllegalStateException if this method is called before
165+ * the connection has been established.
166+ *
167+ * @see #getLocalCertificates()
168+ * @see #getPeerPrincipal()
169+ *
170+ * @since 1.5
171+ */
172+ public Principal getLocalPrincipal() {
173+
174+ java.security.cert.Certificate[] certs = getLocalCertificates();
175+ if (certs != null) {
176+ return ((X500Principal)
177+ ((X509Certificate)certs[0]).getSubjectX500Principal());
178+ } else {
179+ return null;
180+ }
181+ }
182+
183+ /**
184+ * <code>HostnameVerifier</code> provides a callback mechanism so that
185+ * implementers of this interface can supply a policy for
186+ * handling the case where the host to connect to and
187+ * the server name from the certificate mismatch.
188+ * <p>
189+ * The default implementation will deny such connections.
190+ */
191+ private static HostnameVerifier defaultHostnameVerifier =
192+ new DefaultHostnameVerifier();
193+
194+ /*
195+ * The initial default <code>HostnameVerifier</code>. Should be
196+ * updated for another other type of <code>HostnameVerifier</code>
197+ * that are created.
198+ */
199+ private static class DefaultHostnameVerifier
200+ implements HostnameVerifier {
201+ public boolean verify(String hostname, SSLSession session) {
202+ return false;
203+ }
204+ }
205+
206+ /**
207+ * The <code>hostnameVerifier</code> for this object.
208+ */
209+ protected HostnameVerifier hostnameVerifier = defaultHostnameVerifier;
210+
211+ /**
212+ * Sets the default <code>HostnameVerifier</code> inherited by a
213+ * new instance of this class.
214+ * <P>
215+ * If this method is not called, the default
216+ * <code>HostnameVerifier</code> assumes the connection should not
217+ * be permitted.
218+ *
219+ * @param v the default host name verifier
220+ * @throws IllegalArgumentException if the <code>HostnameVerifier</code>
221+ * parameter is null.
222+ * @throws SecurityException if a security manager exists and its
223+ * <code>checkPermission</code> method does not allow
224+ * <code>SSLPermission("setHostnameVerifier")</code>
225+ * @see #getDefaultHostnameVerifier()
226+ */
227+ public static void setDefaultHostnameVerifier(HostnameVerifier v) {
228+ if (v == null) {
229+ throw new IllegalArgumentException(
230+ "no default HostnameVerifier specified");
231+ }
232+
233+ SecurityManager sm = System.getSecurityManager();
234+ if (sm != null) {
235+ sm.checkPermission(new SSLPermission("setHostnameVerifier"));
236+ }
237+ defaultHostnameVerifier = v;
238+ }
239+
240+ /**
241+ * Gets the default <code>HostnameVerifier</code> that is inherited
242+ * by new instances of this class.
243+ *
244+ * @return the default host name verifier
245+ * @see #setDefaultHostnameVerifier(HostnameVerifier)
246+ */
247+ public static HostnameVerifier getDefaultHostnameVerifier() {
248+ return defaultHostnameVerifier;
249+ }
250+
251+ /**
252+ * Sets the <code>HostnameVerifier</code> for this instance.
253+ * <P>
254+ * New instances of this class inherit the default static hostname
255+ * verifier set by {@link #setDefaultHostnameVerifier(HostnameVerifier)
256+ * setDefaultHostnameVerifier}. Calls to this method replace
257+ * this object's <code>HostnameVerifier</code>.
258+ *
259+ * @param v the host name verifier
260+ * @throws IllegalArgumentException if the <code>HostnameVerifier</code>
261+ * parameter is null.
262+ * @see #getHostnameVerifier()
263+ * @see #setDefaultHostnameVerifier(HostnameVerifier)
264+ */
265+ public void setHostnameVerifier(HostnameVerifier v) {
266+ if (v == null) {
267+ throw new IllegalArgumentException(
268+ "no HostnameVerifier specified");
269+ }
270+
271+ hostnameVerifier = v;
272+ }
273+
274+ /**
275+ * Gets the <code>HostnameVerifier</code> in place on this instance.
276+ *
277+ * @return the host name verifier
278+ * @see #setHostnameVerifier(HostnameVerifier)
279+ * @see #setDefaultHostnameVerifier(HostnameVerifier)
280+ */
281+ public HostnameVerifier getHostnameVerifier() {
282+ return hostnameVerifier;
283+ }
284+
285+ private static SSLSocketFactory defaultSSLSocketFactory = null;
286+
287+ /**
288+ * The <code>SSLSocketFactory</code> inherited when an instance
289+ * of this class is created.
290+ */
291+ private SSLSocketFactory sslSocketFactory = getDefaultSSLSocketFactory();
292+
293+ /**
294+ * Sets the default <code>SSLSocketFactory</code> inherited by new
295+ * instances of this class.
296+ * <P>
297+ * The socket factories are used when creating sockets for secure
298+ * https URL connections.
299+ *
300+ * @param sf the default SSL socket factory
301+ * @throws IllegalArgumentException if the SSLSocketFactory
302+ * parameter is null.
303+ * @throws SecurityException if a security manager exists and its
304+ * <code>checkSetFactory</code> method does not allow
305+ * a socket factory to be specified.
306+ * @see #getDefaultSSLSocketFactory()
307+ */
308+ public static void setDefaultSSLSocketFactory(SSLSocketFactory sf) {
309+ if (sf == null) {
310+ throw new IllegalArgumentException(
311+ "no default SSLSocketFactory specified");
312+ }
313+
314+ SecurityManager sm = System.getSecurityManager();
315+ if (sm != null) {
316+ sm.checkSetFactory();
317+ }
318+ defaultSSLSocketFactory = sf;
319+ }
320+
321+ /**
322+ * Gets the default static <code>SSLSocketFactory</code> that is
323+ * inherited by new instances of this class.
324+ * <P>
325+ * The socket factories are used when creating sockets for secure
326+ * https URL connections.
327+ *
328+ * @return the default <code>SSLSocketFactory</code>
329+ * @see #setDefaultSSLSocketFactory(SSLSocketFactory)
330+ */
331+ public static SSLSocketFactory getDefaultSSLSocketFactory() {
332+ if (defaultSSLSocketFactory == null) {
333+ defaultSSLSocketFactory =
334+ (SSLSocketFactory)SSLSocketFactory.getDefault();
335+ }
336+ return defaultSSLSocketFactory;
337+ }
338+
339+ /**
340+ * Sets the <code>SSLSocketFactory</code> to be used when this instance
341+ * creates sockets for secure https URL connections.
342+ * <P>
343+ * New instances of this class inherit the default static
344+ * <code>SSLSocketFactory</code> set by
345+ * {@link #setDefaultSSLSocketFactory(SSLSocketFactory)
346+ * setDefaultSSLSocketFactory}. Calls to this method replace
347+ * this object's <code>SSLSocketFactory</code>.
348+ *
349+ * @param sf the SSL socket factory
350+ * @throws IllegalArgumentException if the <code>SSLSocketFactory</code>
351+ * parameter is null.
352+ * @see #getSSLSocketFactory()
353+ */
354+ public void setSSLSocketFactory(SSLSocketFactory sf) {
355+ if (sf == null) {
356+ throw new IllegalArgumentException(
357+ "no SSLSocketFactory specified");
358+ }
359+
360+ sslSocketFactory = sf;
361+ }
362+
363+ /**
364+ * Gets the SSL socket factory to be used when creating sockets
365+ * for secure https URL connections.
366+ *
367+ * @return the <code>SSLSocketFactory</code>
368+ * @see #setSSLSocketFactory(SSLSocketFactory)
369+ */
370+ public SSLSocketFactory getSSLSocketFactory() {
371+ return sslSocketFactory;
372+ }
373+}