-
Notifications
You must be signed in to change notification settings - Fork 0
/
init.go
113 lines (98 loc) · 2.59 KB
/
init.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
package controller
import (
"encoding/base64"
"fmt"
"io"
"log"
"os"
"time"
)
func (vps *Vps) Security() {
sshstr := vps.IP
name := vps.name
key := base64.StdEncoding.EncodeToString([]byte(sshstr))
// fmt.Println("[debug]:", key)
steam, err := NewStreamWithBase64Key(key)
if err != nil {
log.Fatal("base Login Ssh as crypter err ")
}
base_root := steam.FlowEn(ROOT)
ROOT = Join("/tmp", base_root)
MSG_HISTORY = steam.FlowEn(MSG_HISTORY)
MSG_FILE = steam.FlowEn(MSG_FILE)
MSG_HELLO = steam.FlowEn(MSG_HELLO)
MSG_FILE_ROOT = steam.FlowEn(MSG_FILE_ROOT)
MSG_HEART = steam.FlowEn(MSG_HEART)
MSG_PRIVATE_KEY = steam.FlowEn(MSG_PRIVATE_KEY)
MSG_ICON = steam.FlowEn(MSG_ICON)
GROUP_TAIL = steam.FlowEn(GROUP_TAIL)
MSG_KICK = steam.FlowEn(MSG_KICK)
MSG_TMP_FILE = steam.FlowEn(MSG_TMP_FILE)
vps.myhome = Join(ROOT, steam.FlowEn(name))
vps.myenname = steam.FlowEn(name)
vps.steam = steam
}
func (chat *ChatRoom) Init(sshstr string) (err error) {
chat.vps = Parse(sshstr)
SecurityCheckName(chat.vps.name)
chat.IP = chat.vps.IP
chat.recvMsg = make(chan *Message, 1024)
chat.MyName = chat.vps.name
return
}
func (vps *Vps) SetMsgTo(name string) {
vps.msgto = vps.steam.FlowEn(name)
}
func (vps *Vps) GetRawMsgTo() string {
return vps.steam.FlowDe(vps.msgto)
}
func (vps *Vps) GetVpsName() string {
return vps.steam.FlowEn(vps.name)
}
func (chat *ChatRoom) Login(restoresKey ...string) (logined bool) {
if restoresKey != nil && restoresKey[0] != "" {
chat.RestoreKeyFromServer(restoresKey[0])
}
var err error
chat.stream, err = NewStreamWithAuthor(chat.vps.name, false)
if err != nil {
log.Println("chat logined failed: ", err)
return
}
if err := chat.vps.Init(); err != nil {
log.Println("chat logined failed: ", err)
return
} else {
if restoresKey != nil && restoresKey[0] != "" {
fmt.Println("share key in remote:", chat.SaveKeyToServer(restoresKey[0]))
}
return true
}
}
func (vps *Vps) Init() (err error) {
vps.Security()
if !vps.CreateMe() {
return fmt.Errorf("login failed: user already exists but key is err!%s", "")
}
vps.heartInterval = 1
vps.liveInterval = 1200
if vps.IfLogined() {
vps.KickOld()
}
go vps.HeartBeat()
go vps.backgroundRecvMsgs()
return
}
func (vps *Vps) KickOld() {
kickpath := Join(vps.myhome, MSG_KICK)
content := vps.steam.En([]byte(MSG_KICK))
vps.WithSftpWrite(kickpath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, func(fp io.WriteCloser) error {
_, err := fp.Write(content)
if err != nil {
log.Println("write kick err!!:", content, err)
}
return err
})
log.Println("kicking old login !!!! wait 3s")
time.Sleep(3 * time.Second)
}