1 #Region "Microsoft.VisualBasic::21658a0aca1119ab3cd31c6a84e96494, Microsoft.VisualBasic.Core\ApplicationServices\Tools\Network\SSL\SSLSynchronizationServicesSocket.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class SSLSynchronizationServicesSocket
35     
36     '         Properties: CA, DeclaringModule, IsRunning, IsShutdown, ISSLServices_InstallCertificates
37     '                     LocalPort, PrivateKeys, RaiseHandshakingEvent, RefuseHandshake, Responsehandler
38     
39     '         Constructor: (+1 OverloadsSub New
40     
41     '         Function: __responsehandler, Install, InstallCertificates, (+2 Overloads) Run, ToString
42     
43     '         Sub: (+2 Overloads) Dispose, HandShakingEventDoNothing, WaitForStart
44     
45     
46     ' /********************************************************************************/
47
48 #End Region
49
50 Imports System.Reflection
51 Imports System.Runtime.CompilerServices
52 Imports Microsoft.VisualBasic.ComponentModel
53 Imports Microsoft.VisualBasic.Net.Abstract
54 Imports Microsoft.VisualBasic.Net.Protocols
55
56 Namespace Net.SSL
57
58     Public Class SSLSynchronizationServicesSocket
59         Implements IDisposable
60         Implements ITaskDriver
61         Implements IServicesSocket
62         Implements SSL.SSLProtocols.ISSLServices
63
64         Dim _ServicesSocket As Net.TcpSynchronizationServicesSocket
65
66         ''' <summary>
67         ''' 这个数字证书是当前版本下的服务器的客户端的数字签名,服务器会使用这个证书来验证客户端的文件是否被恶意破解,相当于公有密匙
68         ''' </summary>
69         Public ReadOnly Property CA As Certificate Implements ISSLServices.CA
70         ''' <summary>
71         ''' A table stores the certificates of the current connected clients on this server.
72         ''' (连接上来的客户端的私有证书列表)
73         ''' </summary>
74         ''' <returns></returns>
75         Public ReadOnly Property PrivateKeys As Dictionary(Of Long, Certificate) Implements ISSLServices.PrivateKeys
76
77         ''' <summary>
78         ''' 
79         ''' </summary>
80         ''' <param name="LocalPort"></param>
81         ''' <param name="CA">服务器在部署的时候向对应版本您的客户端的数字签名</param>
82         ''' <param name="exHandler">Public Delegate Sub <see cref="Abstract.ExceptionHandler"/>(ex As <see cref="Exception"/>)</param>
83         Sub New(LocalPort As Integer,
84                 CA As SSL.Certificate,
85                 container As Object,
86                 Optional exHandler As Abstract.ExceptionHandler = Nothing)
87
88             _DeclaringModule = container
89             _ServicesSocket = New TcpSynchronizationServicesSocket(LocalPort, exHandler)
90             _CA = CA
91             _PrivateKeys = New Dictionary(Of Long, Certificate)
92         End Sub
93
94         Public ReadOnly Property IsShutdown As Boolean Implements IServicesSocket.IsShutdown
95             Get
96                 If _ServicesSocket Is Nothing Then
97                     Return True
98                 End If
99
100                 Return _ServicesSocket.IsShutdown
101             End Get
102         End Property
103
104         Public ReadOnly Property IsRunning As Boolean Implements IServicesSocket.IsRunning
105             Get
106                 If _ServicesSocket Is Nothing Then
107                     Return False
108                 End If
109
110                 Return _ServicesSocket.Running
111             End Get
112         End Property
113
114         ''' <summary>
115         ''' 底层工作socket所监听的端口号
116         ''' </summary>
117         ''' <returns></returns>
118         Public ReadOnly Property LocalPort As Integer Implements IServicesSocket.LocalPort
119             Get
120                 Return _ServicesSocket.LocalPort
121             End Get
122         End Property
123
124         Public Overrides Function ToString() As String
125             Return Me._ServicesSocket.ToString
126         End Function
127
128 #Region "Responsehandler"
129
130         ''' <summary>
131         ''' <see cref="DataRequestHandler"/>: 
132         ''' Public Delegate Function <see cref="DataRequestHandler"/>(CA As <see cref="System.int64"/>, request As <see cref="RequestStream"/>, 
133         ''' RemoteAddress As <see cref="System.Net.IPEndPoint"/>) As <see cref="System.Net.IPEndPoint"/>
134         ''' </summary>
135         ''' <returns></returns>
136         Public Property Responsehandler As DataRequestHandler Implements IServicesSocket.Responsehandler, ISSLServices.ResponseHandler
137             Get
138                 Return _responsehandler
139             End Get
140             Set(value As DataRequestHandler)
141                 _ServicesSocket.Responsehandler = New DataRequestHandler(AddressOf __responsehandler)
142                 _responsehandler = value
143             End Set
144         End Property
145
146         ''' <summary>
147         ''' 生成证书的方法
148         ''' </summary>
149         ''' <returns></returns>
150         Public Property ISSLServices_InstallCertificates As InstallCertificates =
151             AddressOf InstallCertificates Implements ISSLServices.InstallCertificates
152
153         ''' <summary>
154         ''' 客户端和服务器握手之后触发这个动作
155         ''' </summary>
156         ''' <returns></returns>
157         Public Property RaiseHandshakingEvent As HandshakingEvent =
158             AddressOf SSLSynchronizationServicesSocket.HandShakingEventDoNothing Implements ISSLServices.RaiseHandshakingEvent
159
160         ''' <summary>
161         ''' Does this ssl server accepts the handshaking from the user client or just allow the client connect to this server from manual imports their certificates by using method <see cref="Install(Certificate, BooleanString)"/>
162         ''' </summary>
163         ''' <returns></returns>
164         Public Property RefuseHandshake As Boolean Implements ISSLServices.RefuseHandshake
165
166         Public ReadOnly Property DeclaringModule As Object Implements ISSLServices.DeclaringModule
167
168         Dim _responsehandler As DataRequestHandler
169
170         Private Function __responsehandler(CA As Long, request As RequestStream, remoteDev As System.Net.IPEndPoint) As RequestStream
171             Return SSL.SSLProtocols.SSLServicesResponseHandler(Me, CA, request, remoteDev, ISSLServices_InstallCertificates)
172         End Function
173 #End Region
174
175         ''' <summary>
176         ''' 等待底层socket成功进入监听模式
177         ''' </summary>
178         Public Sub WaitForStart()
179             Call _ServicesSocket.WaitForStart()
180         End Sub
181
182         ''' <summary>
183         ''' This server waits for a connection and then uses  asychronous operations to
184         ''' accept the connection, get data from the connected client,
185         ''' echo that data back to the connected client.
186         ''' It then disconnects from the client and waits for another client.(请注意,当服务器的代码运行到这里之后,代码将被阻塞在这里)
187         ''' </summary>
188         ''' <remarks></remarks>
189         Public Function Run(localEndPoint As System.Net.IPEndPoint) As Integer Implements IServicesSocket.Run
190             Return _ServicesSocket.Run(localEndPoint)
191         End Function
192
193         ''' <summary>
194         ''' This server waits for a connection and then uses  asychronous operations to
195         ''' accept the connection, get data from the connected client,
196         ''' echo that data back to the connected client.
197         ''' It then disconnects from the client and waits for another client.(请注意,当服务器的代码运行到这里之后,代码将被阻塞在这里)
198         ''' </summary>
199         ''' <remarks></remarks>
200         Public Function Run() As Integer Implements IServicesSocket.Run, ITaskDriver.Run
201             Return _ServicesSocket.Run
202         End Function
203
204 #Region "IDisposable Support"
205         Private disposedValue As Boolean To detect redundant calls
206
207         ' IDisposable
208         Protected Overridable Sub Dispose(disposing As Boolean)
209             If Not disposedValue Then
210                 If disposing Then
211                     ' TODO: dispose managed state (managed objects).
212                     Call Me._ServicesSocket.Free
213                 End If
214
215                 ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
216                 ' TODO: set large fields to null.
217             End If
218             disposedValue = True
219         End Sub
220
221         ' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
222         'Protected Overrides Sub Finalize()
223         '    ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
224         '    Dispose(False)
225         '    MyBase.Finalize()
226         'End Sub
227
228         ' This code added by Visual Basic to correctly implement the disposable pattern.
229         Public Sub Dispose() Implements IDisposable.Dispose
230             Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
231             Dispose(True)
232             ' TODO: uncomment the following line if Finalize() is overridden above.
233             ' GC.SuppressFinalize(Me)
234         End Sub
235 #End Region
236
237         Public Shared Function InstallCertificates(privateKey As String, uid As LongAs SSL.Certificate
238             Return New SSL.Certificate(privateKey, uid)
239         End Function
240
241         Public Shared Sub HandShakingEventDoNothing(uid As Long, CA As SSL.Certificate, remote As System.Net.IPEndPoint)
242             ' DO NOTHING
243         End Sub
244
245         ''' <summary>
246         ''' If the property of <see cref="SSLSynchronizationServicesSocket.RefuseHandshake"/> is set to TRUE, then no more new client can be connect to this server object.
247         ''' The only way to add new client on this server is using this function to imports the client's certificates direct manually.
248         ''' (假若ssl层关闭了握手协议,则不可能会再有新的客户端可以连接到这个服务器上面了,则这个时候就可以使用这个方法来手工的为新的客户端导入数字证书,从而可以只接受指定的客户端的连接操作
249         ''' 假若是证书同步操作的话,则可以将app授权证书通过这个方法导入到服务器模块接收主节点的证书同步操作)
250         ''' </summary>
251         ''' <param name="CA"></param>
252         ''' <param name="[overrides]"></param>
253         ''' <returns></returns>
254         Public Function Install(CA As Certificate, [overrides] As Boolean, <CallerMemberName> Optional trace As String = ""As Boolean Implements ISSLServices.Install
255             Return CAExtensions.InstallCommon(PrivateKeys, CA, [overrides], trace, MethodBase.GetCurrentMethod)
256         End Function
257     End Class
258 End Namespace