-
Notifications
You must be signed in to change notification settings - Fork 0
/
connect_module.go
139 lines (126 loc) · 4.83 KB
/
connect_module.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package protocol
import (
"bytes"
"crypto/des"
"encoding/binary"
"gdcl/fsm"
)
const (
CONN_IDLE = iota
CONN_INITIATE
CONN_DESKTOP_INFO
CONN_WHICH_ICONS
CONN_SET_TIMEOUT
CONN_PASSWORD
CONN_UP
)
const (
SESSION_NONE byte = 0
SESSION_SETTING_UP byte = 1
SESSION_SYNCHRONIZE byte = 2
SESSION_RESTORE byte = 3
SESSION_LOAD_PACKAGE byte = 4
SESSION_TEST_COMM byte = 5
SESSION_LOAD_PATCH byte = 6
SESSION_UPDATING_STORES byte = 7
)
const (
DESKTOP_MAC byte = 0
DESKTOP_WIN byte = 1
PROTOCOL_VERSION byte = 10
DOCK_TIMEOUT byte = 5
)
const (
BACKUP_ICON byte = 1
RESTORE_ICON byte = 2
INSTALL_ICON byte = 4
IMPORT_ICON byte = 8
SYNC_ICON byte = 16
KEYBOARD_ICON byte = 32
ALL_ICONS byte = 63
)
type ConnectModule struct {
DockModule
sessionType byte
newtonChallenge uint64
newtonPassword uint64
}
func requestToDock(state int, input interface{}, output interface{}, data interface{}) {
module := data.(*ConnectModule)
packet := DantePacketNew(INITIATE_DOCKING, []byte{0, 0, 0, module.sessionType})
module.ToDockLink <- *packet
}
func desktopInfo(state int, input interface{}, output interface{}, data interface{}) {
module := data.(*ConnectModule)
packet := DantePacketNew(DESKTOP_INFO, []byte{
0, 0, 0, PROTOCOL_VERSION,
0, 0, 0, DESKTOP_MAC,
0x64, 0x23, 0xef, 0x02,
0xfb, 0xcd, 0xc5, 0xa5,
0, 0, 0, SESSION_SETTING_UP,
0, 0, 0, 1,
0x02, 0x05, 0x01, 0x06, 0x03, 0x07, 0x02, 0x69, 0x64, 0x07,
0x04, 0x6e, 0x61, 0x6d, 0x65, 0x07, 0x07, 0x76, 0x65, 0x72,
0x73, 0x69, 0x6f, 0x6e, 0x00, 0x08, 0x08, 0x38, 0x00, 0x4e,
0x00, 0x65, 0x00, 0x77, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x6e,
0x00, 0x20, 0x00, 0x43, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x6e,
0x00, 0x65, 0x00, 0x63, 0x00, 0x74, 0x00, 0x69, 0x00, 0x6f,
0x00, 0x6e, 0x00, 0x20, 0x00, 0x55, 0x00, 0x74, 0x00, 0x69,
0x00, 0x6c, 0x00, 0x69, 0x00, 0x74, 0x00, 0x69, 0x00, 0x65,
0x00, 0x73, 0x00, 0x00, 0x00, 0x04})
module.ToDockLink <- *packet
}
func whichIcons(state int, input interface{}, output interface{}, data interface{}) {
module := data.(*ConnectModule)
newton_info := input.(*DantePacket)
buf := bytes.NewBuffer(newton_info.data[4:])
binary.Read(buf, binary.BigEndian, &module.newtonChallenge)
packet := DantePacketNew(WHICH_ICONS, []byte{0, 0, 0, ALL_ICONS})
module.ToDockLink <- *packet
}
func setTimeout(state int, input interface{}, output interface{}, data interface{}) {
module := data.(*ConnectModule)
packet := DantePacketNew(SET_TIMEOUT, []byte{0, 0, 0, DOCK_TIMEOUT})
module.ToDockLink <- *packet
}
func appDisconnect(state int, input interface{}, output interface{}, data interface{}) {
module := data.(*ConnectModule)
packet := DantePacketNew(DISCONNECT, []byte{})
module.ToDockLink <- *packet
}
func password(state int, input interface{}, output interface{}, data interface{}) {
module := data.(*ConnectModule)
var buf bytes.Buffer
d, _ := des.NewCipher([]byte{0xe4, 0x0f, 0x7e, 0x9f, 0x0a, 0x36, 0x2c, 0xfa})
binary.Write(&buf, binary.BigEndian, &module.newtonChallenge)
d.Encrypt(buf.Bytes(), buf.Bytes())
packet := DantePacketNew(PASSWORD, buf.Bytes())
module.ToDockLink <- *packet
}
func ConnectModuleNew(toDockLink chan DantePacket, sessionType byte) *ConnectModule {
var module ConnectModule
module.DockModule.DockModuleInit(toDockLink, &module)
module.sessionType = sessionType
if module.sessionType == SESSION_NONE {
module.stateTable = map[int][]fsm.State{
fsm.ANY: {{Input: DantePacketCommand{APP_DISCONNECT}, NewState: CONN_IDLE, Action: appDisconnect}},
CONN_IDLE: {{Input: DantePacketCommand{REQUEST_TO_DOCK}, NewState: CONN_INITIATE, Action: requestToDock}},
CONN_INITIATE: {{Input: DantePacketCommand{NEWTON_NAME}, NewState: CONN_DESKTOP_INFO, Action: desktopInfo}},
CONN_DESKTOP_INFO: {{Input: DantePacketCommand{NEWTON_INFO}, NewState: CONN_WHICH_ICONS, Action: whichIcons}},
CONN_WHICH_ICONS: {{Input: DantePacketCommand{RESULT}, NewState: CONN_SET_TIMEOUT, Action: setTimeout}},
CONN_SET_TIMEOUT: {{Input: DantePacketCommand{PASSWORD}, NewState: CONN_UP, Action: password}},
CONN_PASSWORD: {{Input: DantePacketCommand{RESULT}, NewState: CONN_IDLE}},
CONN_UP: {{Input: DantePacketCommand{DISCONNECT}, NewState: CONN_IDLE}},
}
} else {
module.stateTable = map[int][]fsm.State{
fsm.ANY: {{Input: DantePacketCommand{APP_DISCONNECT}, NewState: CONN_IDLE, Action: appDisconnect}},
CONN_IDLE: {{Input: DantePacketCommand{REQUEST_TO_DOCK}, NewState: CONN_INITIATE, Action: requestToDock}},
CONN_INITIATE: {{Input: DantePacketCommand{NEWTON_NAME}, NewState: CONN_SET_TIMEOUT, Action: setTimeout}},
CONN_SET_TIMEOUT: {{Input: DantePacketCommand{RESULT}, NewState: CONN_UP}},
CONN_UP: {{Input: DantePacketCommand{DISCONNECT}, NewState: CONN_IDLE}},
}
}
module.reader()
return &module
}