1 /*
2  * hunt-proton: AMQP Protocol library for D programming language.
3  *
4  * Copyright (C) 2018-2019 HuntLabs
5  *
6  * Website: https://www.huntlabs.net/
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11 
12 module hunt.proton.engine.impl.ssl.SslImpl;
13 
14 import hunt.io.ByteBuffer;
15 
16 import hunt.proton.engine.impl.ssl.SslHandshakeSniffingTransportWrapper;
17 import hunt.proton.engine.Ssl;
18 import hunt.proton.engine.SslDomain;
19 import hunt.proton.engine.SslPeerDetails;
20 import hunt.proton.engine.Transport;
21 import hunt.proton.engine.TransportException;
22 import hunt.proton.engine.impl.PlainTransportWrapper;
23 import hunt.proton.engine.impl.TransportInput;
24 import hunt.proton.engine.impl.TransportLayer;
25 import hunt.proton.engine.impl.TransportOutput;
26 import hunt.proton.engine.impl.TransportWrapper;
27 import hunt.proton.engine.impl.ssl.SslTransportWrapper;
28 import hunt.proton.engine.impl.ssl.ProtonSslEngineProvider;
29 import hunt.proton.engine.impl.ssl.SimpleSslTransportWrapper;
30 import hunt.Exceptions;
31 
32 //class SslImpl : Ssl, TransportLayer
33 //{
34 //    private SslTransportWrapper _unsecureClientAwareTransportWrapper;
35 //
36 //    private SslDomain _domain;
37 //    private ProtonSslEngineProvider _protonSslEngineProvider;
38 //
39 //    private SslPeerDetails _peerDetails;
40 //    private TransportException _initException;
41 //
42 //    /**
43 //     * @param domain must implement {@link hunt.proton.engine.impl.ssl.ProtonSslEngineProvider}. This is not possible
44 //     * enforce at the API level because {@link hunt.proton.engine.impl.ssl.ProtonSslEngineProvider} is not part of the
45 //     * public Proton API.
46 //     */
47 //    this(SslDomain domain, SslPeerDetails peerDetails)
48 //    {
49 //        _domain = domain;
50 //        _protonSslEngineProvider = cast(ProtonSslEngineProvider)domain;
51 //        _peerDetails = peerDetails;
52 //
53 //        if(_domain.getMode() is null) {
54 //            throw new IllegalStateException("Client/server mode must be configured, SslDomain must have init called.");
55 //        }
56 //
57 //        if(_peerDetails is null && _domain.getPeerAuthentication() == VerifyMode.VERIFY_PEER_NAME) {
58 //            throw new IllegalArgumentException("Peer hostname verification is enabled, but no peer details were provided");
59 //        }
60 //    }
61 //
62 //    public TransportWrapper wrap(TransportInput inputProcessor, TransportOutput outputProcessor)
63 //    {
64 //        if (_unsecureClientAwareTransportWrapper !is null)
65 //        {
66 //            throw new IllegalStateException("Transport already wrapped");
67 //        }
68 //
69 //        _unsecureClientAwareTransportWrapper = new UnsecureClientAwareTransportWrapper(inputProcessor, outputProcessor);
70 //        return _unsecureClientAwareTransportWrapper;
71 //    }
72 //
73 //
74 //    public string getCipherName()
75 //    {
76 //        if(_unsecureClientAwareTransportWrapper is null)
77 //        {
78 //            throw new IllegalStateException("Transport wrapper is uninitialised");
79 //        }
80 //
81 //        return _unsecureClientAwareTransportWrapper.getCipherName();
82 //    }
83 //
84 //
85 //    public string getProtocolName()
86 //    {
87 //        if(_unsecureClientAwareTransportWrapper is null)
88 //        {
89 //            throw new IllegalStateException("Transport wrapper is uninitialised");
90 //        }
91 //
92 //        return _unsecureClientAwareTransportWrapper.getProtocolName();
93 //    }
94 //
95 //    class UnsecureClientAwareTransportWrapper : SslTransportWrapper
96 //    {
97 //        private TransportInput _inputProcessor;
98 //        private TransportOutput _outputProcessor;
99 //        private SslTransportWrapper _transportWrapper;
100 //
101 //        this(TransportInput inputProcessor,
102 //                TransportOutput outputProcessor)
103 //        {
104 //            _inputProcessor = inputProcessor;
105 //            _outputProcessor = outputProcessor;
106 //        }
107 //
108 //
109 //        public int capacity()
110 //        {
111 //            initTransportWrapperOnFirstIO();
112 //            if (_initException is null) {
113 //                return _transportWrapper.capacity();
114 //            } else {
115 //                return Transport.END_OF_STREAM;
116 //            }
117 //        }
118 //
119 //
120 //        public int position()
121 //        {
122 //            initTransportWrapperOnFirstIO();
123 //            if (_initException is null) {
124 //                return _transportWrapper.position();
125 //            } else {
126 //                return Transport.END_OF_STREAM;
127 //            }
128 //        }
129 //
130 //
131 //        public ByteBuffer tail()
132 //        {
133 //            initTransportWrapperOnFirstIO();
134 //            if (_initException is null) {
135 //                return _transportWrapper.tail();
136 //            } else {
137 //                return null;
138 //            }
139 //        }
140 //
141 //
142 //
143 //        public void process()
144 //        {
145 //            initTransportWrapperOnFirstIO();
146 //            if (_initException is null) {
147 //                _transportWrapper.process();
148 //            } else {
149 //                throw new TransportException(_initException);
150 //            }
151 //        }
152 //
153 //
154 //        public void close_tail()
155 //        {
156 //            initTransportWrapperOnFirstIO();
157 //            if (_initException is null) {
158 //                _transportWrapper.close_tail();
159 //            }
160 //        }
161 //
162 //
163 //        public int pending()
164 //        {
165 //            initTransportWrapperOnFirstIO();
166 //            if (_initException is null) {
167 //                return _transportWrapper.pending();
168 //            } else {
169 //                throw new TransportException(_initException);
170 //            }
171 //        }
172 //
173 //
174 //        public ByteBuffer head()
175 //        {
176 //            initTransportWrapperOnFirstIO();
177 //            if (_initException is null) {
178 //                return _transportWrapper.head();
179 //            } else {
180 //                return null;
181 //            }
182 //        }
183 //
184 //
185 //        public void pop(int bytes)
186 //        {
187 //            initTransportWrapperOnFirstIO();
188 //            if (_initException is null) {
189 //                _transportWrapper.pop(bytes);
190 //            }
191 //        }
192 //
193 //
194 //        public void close_head()
195 //        {
196 //            initTransportWrapperOnFirstIO();
197 //            if (_initException is null) {
198 //                _transportWrapper.close_head();
199 //            }
200 //        }
201 //
202 //
203 //        public string getCipherName()
204 //        {
205 //            if (_transportWrapper is null)
206 //            {
207 //                return null;
208 //            }
209 //            else
210 //            {
211 //                return _transportWrapper.getCipherName();
212 //            }
213 //        }
214 //
215 //
216 //        public string getProtocolName()
217 //        {
218 //            if(_transportWrapper is null)
219 //            {
220 //                return null;
221 //            }
222 //            else
223 //            {
224 //                return _transportWrapper.getProtocolName();
225 //            }
226 //        }
227 //
228 //        private void initTransportWrapperOnFirstIO()
229 //        {
230 //            try {
231 //                if (_initException is null && _transportWrapper is null)
232 //                {
233 //                    SslTransportWrapper sslTransportWrapper = new SimpleSslTransportWrapper
234 //                        (_protonSslEngineProvider.createSslEngine(_peerDetails),
235 //                         _inputProcessor, _outputProcessor);
236 //
237 //                    if (_domain.allowUnsecuredClient() && _domain.getMode() == SslDomain.Mode.SERVER)
238 //                    {
239 //                        TransportWrapper plainTransportWrapper = new PlainTransportWrapper
240 //                            (_outputProcessor, _inputProcessor);
241 //                        _transportWrapper = new SslHandshakeSniffingTransportWrapper
242 //                            (sslTransportWrapper, plainTransportWrapper);
243 //                    }
244 //                    else
245 //                    {
246 //                        _transportWrapper = sslTransportWrapper;
247 //                    }
248 //                }
249 //            } catch (TransportException e) {
250 //                _initException = e;
251 //            }
252 //        }
253 //    }
254 //
255 //    /**
256 //     * {@inheritDoc}
257 //     * @throws ProtonUnsupportedOperationException
258 //     */
259 //
260 //    public void setPeerHostname(string hostname)
261 //    {
262 //        implementationMissing(false);
263 //        //throw new ProtonUnsupportedOperationException();
264 //    }
265 //
266 //    /**
267 //     * {@inheritDoc}
268 //     * @throws ProtonUnsupportedOperationException
269 //     */
270 //
271 //    public string getPeerHostname()
272 //    {
273 //        implementationMissing(false);
274 //       // throw new ProtonUnsupportedOperationException();
275 //    }
276 //}