1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package org.apache.harmony.xnet.provider.jsse; 19 20 import java.io.IOException; 21 import java.net.InetAddress; 22 import java.net.Socket; 23 import javax.net.ssl.SSLServerSocket; 24 25 /** 26 * SSLServerSocket implementation 27 * @see javax.net.ssl.SSLServerSocket class documentation for more information. 28 */ 29 public class SSLServerSocketImpl extends SSLServerSocket { 30 31 // the sslParameters object encapsulates all the info 32 // about supported and enabled cipher suites and protocols, 33 // as well as the information about client/server mode of 34 // ssl socket, whether it require/want client authentication or not, 35 // and controls whether new SSL sessions may be established by this 36 // socket or not. 37 private final SSLParametersImpl sslParameters; 38 39 // logger 40 private Logger.Stream logger = Logger.getStream("ssocket"); 41 42 /** 43 * Ctor 44 * @param sslParameters: SSLParameters 45 * @throws IOException 46 */ 47 protected SSLServerSocketImpl(SSLParametersImpl sslParameters) 48 throws IOException { 49 super(); 50 this.sslParameters = sslParameters; 51 } 52 53 /** 54 * Ctor 55 * @param port: int 56 * @param sslParameters: SSLParameters 57 * @throws IOException 58 */ 59 protected SSLServerSocketImpl(int port, SSLParametersImpl sslParameters) 60 throws IOException { 61 super(port); 62 this.sslParameters = sslParameters; 63 } 64 65 /** 66 * Ctor 67 * @param port: int 68 * @param backlog: int 69 * @param sslParameters: SSLParameters 70 * @throws IOException 71 */ 72 protected SSLServerSocketImpl(int port, int backlog, 73 SSLParametersImpl sslParameters) throws IOException { 74 super(port, backlog); 75 this.sslParameters = sslParameters; 76 } 77 78 /** 79 * Ctor 80 * @param port: int 81 * @param backlog: int 82 * @param iAddress: InetAddress 83 * @param sslParameters: SSLParameters 84 * @throws IOException 85 */ 86 protected SSLServerSocketImpl(int port, int backlog, 87 InetAddress iAddress, 88 SSLParametersImpl sslParameters) 89 throws IOException { 90 super(port, backlog, iAddress); 91 this.sslParameters = sslParameters; 92 } 93 94 // --------------- SSLParameters based methods --------------------- 95 96 /** 97 * This method works according to the specification of implemented class. 98 * @see javax.net.ssl.SSLServerSocket#getSupportedCipherSuites() 99 * method documentation for more information 100 */ 101 @Override 102 public String[] getSupportedCipherSuites() { 103 return CipherSuite.getSupportedCipherSuiteNames(); 104 } 105 106 /** 107 * This method works according to the specification of implemented class. 108 * @see javax.net.ssl.SSLServerSocket#getEnabledCipherSuites() 109 * method documentation for more information 110 */ 111 @Override 112 public String[] getEnabledCipherSuites() { 113 return sslParameters.getEnabledCipherSuites(); 114 } 115 116 /** 117 * This method works according to the specification of implemented class. 118 * @see javax.net.ssl.SSLServerSocket#setEnabledCipherSuites(String[]) 119 * method documentation for more information 120 */ 121 @Override 122 public void setEnabledCipherSuites(String[] suites) { 123 sslParameters.setEnabledCipherSuites(suites); 124 } 125 126 /** 127 * This method works according to the specification of implemented class. 128 * @see javax.net.ssl.SSLServerSocket#getSupportedProtocols() 129 * method documentation for more information 130 */ 131 @Override 132 public String[] getSupportedProtocols() { 133 return ProtocolVersion.supportedProtocols.clone(); 134 } 135 136 /** 137 * This method works according to the specification of implemented class. 138 * @see javax.net.ssl.SSLServerSocket#getEnabledProtocols() 139 * method documentation for more information 140 */ 141 @Override 142 public String[] getEnabledProtocols() { 143 return sslParameters.getEnabledProtocols(); 144 } 145 146 /** 147 * This method works according to the specification of implemented class. 148 * @see javax.net.ssl.SSLServerSocket#setEnabledProtocols(String[]) 149 * method documentation for more information 150 */ 151 @Override 152 public void setEnabledProtocols(String[] protocols) { 153 sslParameters.setEnabledProtocols(protocols); 154 } 155 156 /** 157 * This method works according to the specification of implemented class. 158 * @see javax.net.ssl.SSLServerSocket#setUseClientMode(boolean) 159 * method documentation for more information 160 */ 161 @Override 162 public void setUseClientMode(boolean mode) { 163 sslParameters.setUseClientMode(mode); 164 } 165 166 /** 167 * This method works according to the specification of implemented class. 168 * @see javax.net.ssl.SSLServerSocket#getUseClientMode() 169 * method documentation for more information 170 */ 171 @Override 172 public boolean getUseClientMode() { 173 return sslParameters.getUseClientMode(); 174 } 175 176 /** 177 * This method works according to the specification of implemented class. 178 * @see javax.net.ssl.SSLServerSocket#setNeedClientAuth(boolean) 179 * method documentation for more information 180 */ 181 @Override 182 public void setNeedClientAuth(boolean need) { 183 sslParameters.setNeedClientAuth(need); 184 } 185 186 /** 187 * This method works according to the specification of implemented class. 188 * @see javax.net.ssl.SSLServerSocket#getNeedClientAuth() 189 * method documentation for more information 190 */ 191 @Override 192 public boolean getNeedClientAuth() { 193 return sslParameters.getNeedClientAuth(); 194 } 195 196 /** 197 * This method works according to the specification of implemented class. 198 * @see javax.net.ssl.SSLServerSocket#setWantClientAuth(boolean) 199 * method documentation for more information 200 */ 201 @Override 202 public void setWantClientAuth(boolean want) { 203 sslParameters.setWantClientAuth(want); 204 } 205 206 /** 207 * This method works according to the specification of implemented class. 208 * @see javax.net.ssl.SSLServerSocket#getWantClientAuth() 209 * method documentation for more information 210 */ 211 @Override 212 public boolean getWantClientAuth() { 213 return sslParameters.getWantClientAuth(); 214 } 215 216 /** 217 * This method works according to the specification of implemented class. 218 * @see javax.net.ssl.SSLServerSocket#setEnableSessionCreation(boolean) 219 * method documentation for more information 220 */ 221 @Override 222 public void setEnableSessionCreation(boolean flag) { 223 sslParameters.setEnableSessionCreation(flag); 224 } 225 226 /** 227 * This method works according to the specification of implemented class. 228 * @see javax.net.ssl.SSLServerSocket#getEnableSessionCreation() 229 * method documentation for more information 230 */ 231 @Override 232 public boolean getEnableSessionCreation() { 233 return sslParameters.getEnableSessionCreation(); 234 } 235 236 237 // ------------- ServerSocket's methods overridings ---------------- 238 239 /** 240 * This method works according to the specification of implemented class. 241 * @see java.net.ServerSocket#accept() 242 * method documentation for more information 243 */ 244 @Override 245 public Socket accept() throws IOException { 246 if (logger != null) { 247 logger.println("SSLServerSocketImpl.accept .."); 248 } 249 SSLSocketImpl s = new SSLSocketImpl( 250 (SSLParametersImpl) sslParameters.clone()); 251 implAccept(s); 252 SecurityManager sm = System.getSecurityManager(); 253 if (sm != null) { 254 try { 255 sm.checkAccept(s.getInetAddress().getHostAddress(), 256 s.getPort()); 257 } catch(SecurityException e) { 258 s.close(); 259 throw e; 260 } 261 } 262 s.init(); 263 if (logger != null) { 264 logger.println("SSLServerSocketImpl: accepted, initialized"); 265 } 266 return s; 267 } 268 269 /** 270 * Returns the string representation of the object. 271 */ 272 @Override 273 public String toString() { 274 return "[SSLServerSocketImpl]"; 275 } 276 277 // ----------------------------------------------------------------- 278 } 279 280