1 #Region "Microsoft.VisualBasic::b2272006afd0b6603d2eef6cecf27a32, Microsoft.VisualBasic.Core\ApplicationServices\Tools\Network\Tcp\Persistent\MessagePushServices\SSLPushServices.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 SSLPushServices
35     
36     '         Properties: CA, Connections, DeclaringModule, InstallCertificates, IsRunning
37     '                     IsShutdown, LocalPort, PrivateKeys, PushServices, RaiseHandshakingEvent
38     '                     RefuseHandshake, Responsehandler
39     
40     '         Constructor: (+1 OverloadsSub New
41     
42     '         Function: __redirect, __responsehandler, Install, (+2 Overloads) Run
43     
44     '         Sub: (+2 Overloads) Dispose, Install, WaitForRunning
45     
46     
47     ' /********************************************************************************/
48
49 #End Region
50
51 Imports System.Reflection
52 Imports System.Runtime.CompilerServices
53 Imports Microsoft.VisualBasic.ComponentModel
54 Imports Microsoft.VisualBasic.Net.Abstract
55 Imports Microsoft.VisualBasic.Net.Persistent.Socket
56 Imports Microsoft.VisualBasic.Net.Protocols
57 Imports Microsoft.VisualBasic.Net.SSL
58
59 Namespace Net.Persistent.Application
60
61     ''' <summary>
62     ''' 消息都是经过加密操作了的
63     ''' </summary>
64     Public Class SSLPushServices : Implements Net.Abstract.IServicesSocket
65         Implements ISSLServices
66
67         Public ReadOnly Property PushServices As Net.Persistent.Application.MessagePushServer
68
69         ''' <summary>
70         ''' 共有密匙
71         ''' </summary>
72         ''' <returns></returns>
73         Public ReadOnly Property CA As Certificate Implements ISSLServices.CA
74         ''' <summary>
75         ''' 连接到当前的这个服务器上面的客户端的私有密匙列表
76         ''' </summary>
77         ''' <returns></returns>
78         Public ReadOnly Property PrivateKeys As Dictionary(Of Long, Certificate) Implements ISSLServices.PrivateKeys
79
80         Public ReadOnly Property IsShutdown As Boolean Implements IServicesSocket.IsShutdown
81             Get
82                 Return _PushServices.IsShutdown
83             End Get
84         End Property
85
86         Public ReadOnly Property LocalPort As Integer Implements IServicesSocket.LocalPort
87             Get
88                 Return _PushServices.LocalPort
89             End Get
90         End Property
91
92         Dim _responsehandler As DataRequestHandler
93
94         Private Property Responsehandler As DataRequestHandler Implements IDataRequestHandler.Responsehandler, ISSLServices.ResponseHandler
95             Get
96                 Return _responsehandler
97             End Get
98             Set(value As DataRequestHandler)
99                 _PushServices.Responsehandler = AddressOf __responsehandler
100                 _responsehandler = value
101             End Set
102         End Property
103
104         Private Function __responsehandler(CA As Long, request As RequestStream, remoteDev As System.Net.IPEndPoint) As RequestStream
105             Return SSL.SSLProtocols.SSLServicesResponseHandler(Me, CA, request, remoteDev, InstallCertificates)
106         End Function
107
108         Public ReadOnly Property Connections As WorkSocket()
109             Get
110                 Return _PushServices.Connections
111             End Get
112         End Property
113
114         Public Property InstallCertificates As InstallCertificates =
115             AddressOf Net.SSL.SSLSynchronizationServicesSocket.InstallCertificates Implements ISSLServices.InstallCertificates
116
117         Public Property RaiseHandshakingEvent As HandshakingEvent =
118             AddressOf SSL.SSLSynchronizationServicesSocket.HandShakingEventDoNothing Implements ISSLServices.RaiseHandshakingEvent
119
120         Public Property RefuseHandshake As Boolean Implements ISSLServices.RefuseHandshake
121
122         Public ReadOnly Property IsRunning As Boolean Implements IServicesSocket.IsRunning
123             Get
124                 Return Me._PushServices.Running
125             End Get
126         End Property
127
128         Public ReadOnly Property DeclaringModule As Object Implements ISSLServices.DeclaringModule
129
130         ''' <summary>
131         ''' 
132         ''' </summary>
133         ''' <param name="LocalPort"></param>
134         ''' <param name="OffLineMessageSendHandler">
135         ''' Public Delegate Sub <see cref="OffLineMessageSendHandler"/>(FromUSER_ID As <see cref="Long"/>, USER_ID As <see cref="Long"/>, Message As <see cref="RequestStream"/>)
136         ''' </param>
137         ''' <param name="exHandler"></param>
138         Sub New(LocalPort As Integer,
139                 container As Object,
140                 Optional OffLineMessageSendHandler As OffLineMessageSendHandler = Nothing,
141                 Optional exHandler As Abstract.ExceptionHandler = Nothing)
142             _PushServices = New MessagePushServer(LocalPort, OffLineMessageSendHandler, exHandler)
143             _DeclaringModule = container
144             Responsehandler = AddressOf __redirect
145             PrivateKeys = New Dictionary(Of Long, Certificate)
146             Call _PushServices.Install(Me)
147         End Sub
148
149         Private Function __redirect(CA As Long, request As RequestStream, remote As System.Net.IPEndPoint) As RequestStream
150             request = _PushServices.ProtocolHandler.HandleRequest(CA, request, remote)
151             Return request
152         End Function
153
154         ''' <summary>
155         ''' 安装新的公有密匙
156         ''' </summary>
157         ''' <param name="CA"></param>
158         Public Sub Install(CA As SSL.Certificate)
159             _CA = CA
160         End Sub
161
162         ''' <summary>
163         ''' 安装新的用户私有密匙
164         ''' </summary>
165         ''' <param name="CA"></param>
166         ''' <param name="[overrides]"></param>
167         ''' <returns></returns>
168         Public Function Install(CA As Certificate, [overrides] As Boolean, <CallerMemberName> Optional trace As String = ""As Boolean Implements ISSLServices.Install
169             Return CAExtensions.InstallCommon(PrivateKeys, CA, [overrides], trace, MethodBase.GetCurrentMethod)
170         End Function
171
172         Public Sub WaitForRunning()
173             Call _PushServices.WaitForRunning()
174         End Sub
175
176         Public Function Run() As Integer Implements IServicesSocket.Run, ITaskDriver.Run
177             Return _PushServices.Run
178         End Function
179
180         Public Function Run(localEndPoint As System.Net.IPEndPoint) As Integer Implements IServicesSocket.Run
181             Call _PushServices.Run(localEndPoint)
182             Return 0
183         End Function
184
185 #Region "IDisposable Support"
186         Private disposedValue As Boolean To detect redundant calls
187
188         ' IDisposable
189         Protected Overridable Sub Dispose(disposing As Boolean)
190             If Not disposedValue Then
191                 If disposing Then
192                     ' TODO: dispose managed state (managed objects).
193                 End If
194
195                 ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below.
196                 ' TODO: set large fields to null.
197             End If
198             disposedValue = True
199         End Sub
200
201         ' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources.
202         'Protected Overrides Sub Finalize()
203         '    ' Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
204         '    Dispose(False)
205         '    MyBase.Finalize()
206         'End Sub
207
208         ' This code added by Visual Basic to correctly implement the disposable pattern.
209         Public Sub Dispose() Implements IDisposable.Dispose
210             Do not change this code.  Put cleanup code in Dispose(disposing As Boolean) above.
211             Dispose(True)
212             ' TODO: uncomment the following line if Finalize() is overridden above.
213             ' GC.SuppressFinalize(Me)
214         End Sub
215 #End Region
216     End Class
217 End Namespace