1 #Region "Microsoft.VisualBasic::136ae1fd52e866f4673e143fade2a4ea, Microsoft.VisualBasic.Core\ApplicationServices\Tools\Network\Tcp\Persistent\MessagePushServices\SSLClient.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 SSLClient
35     
36     '         Properties: PrivateKey, PushUser
37     
38     '         Constructor: (+1 OverloadsSub New
39     
40     '         Function: __sslRedirect, SendMessage
41     
42     '         Sub: Handshaking, Logon, SetDisconnectHandle
43     
44     
45     ' /********************************************************************************/
46
47 #End Region
48
49 Imports System.Net
50 Imports System.Net.Sockets
51 Imports System.Threading
52 Imports Microsoft.VisualBasic.Net.Abstract
53 Imports Microsoft.VisualBasic.Net.Protocols
54 Imports Microsoft.VisualBasic.Net.Protocols.Reflection
55
56 Namespace Net.Persistent.Application
57
58     Public Class SSLClient
59
60         Public ReadOnly Property PrivateKey As Net.SSL.Certificate
61         Public ReadOnly Property PushUser As Net.Persistent.Application.USER
62
63         ReadOnly _DataRequestHandle As PushMessage
64
65         ''' <summary>
66         ''' 
67         ''' </summary>
68         ''' <param name="services"></param>
69         ''' <param name="ID"></param>
70         ''' <param name="DataRequestHandle">Public Delegate Function PushMessage(USER_ID As <see cref="Long"/>, Message As <see cref="RequestStream"/>) As <see cref="RequestStream"/></param>
71         ''' <param name="ExceptionHandler"></param>
72         Sub New(services As System.Net.IPEndPoint, ID As Long, DataRequestHandle As PushMessage, Optional ExceptionHandler As Abstract.ExceptionHandler = Nothing)
73             _DataRequestHandle = DataRequestHandle
74             PushUser = New USER(services, ID, AddressOf __sslRedirect, ExceptionHandler)
75         End Sub
76
77         Private Function __sslRedirect(USER_ID As Long, request As RequestStream) As RequestStream
78             request = PrivateKey.Decrypt(request)  ' 解密之后在讲数据传递到实际的业务逻辑之上
79             request = _DataRequestHandle(USER_ID, request)
80             Return request
81         End Function
82
83         Public Sub Handshaking(PublicToken As Net.SSL.Certificate)
84             Dim Services = New System.Net.IPEndPoint(System.Net.IPAddress.Parse(PushUser.remoteHost), PushUser.remotePort)
85             _PrivateKey = Net.SSL.Certificate.CopyFrom(PublicToken, PushUser.USER_ID)
86             _PrivateKey = Net.SSL.SSLProtocols.Handshaking(PrivateKey, Services)
87             Call PushUser.BeginConnect(PrivateKey, _disconnectHandler)
88         End Sub
89
90         ''' <summary>
91         ''' 使用已经拥有的用户证书登录服务器,这一步省略了握手步骤
92         ''' </summary>
93         ''' <param name="UserToken"></param>
94         Public Sub Logon(UserToken As Net.SSL.Certificate)
95             _PrivateKey = UserToken
96             _PushUser.BeginConnect(UserToken, _disconnectHandler)
97         End Sub
98
99         Dim _disconnectHandler As MethodInvoker
100
101         Public Sub SetDisconnectHandle([handle] As MethodInvoker)
102             _disconnectHandler = handle
103             _PushUser.SetDisconnectHandle(handle)
104         End Sub
105
106         ''' <summary>
107         ''' 消息在这个函数之中自动被加密处理
108         ''' </summary>
109         ''' <param name="USER_ID"></param>
110         ''' <param name="request"></param>
111         ''' <returns></returns>
112         Public Function SendMessage(USER_ID As Long, request As RequestStream) As Boolean
113             Return PushUser.SendMessage(USER_ID, request, PrivateKey)
114         End Function
115     End Class
116 End Namespace