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
package webssh
import (
"net/http"
"strconv"
socketio "github.com/googollee/go-socket.io"
uuid "github.com/satori/go.uuid"
"cocogo/pkg/config"
"cocogo/pkg/logger"
"cocogo/pkg/service"
"strings"
"sync"
)
var (
conf = config.Conf
httpServer *http.Server
cons = &connections{container: make(map[string]*WebConn), mu: new(sync.RWMutex)}
)
func StartHTTPServer() {
server, err := socketio.NewServer(nil)
if err != nil {
logger.Fatal(err)
}
server.OnConnect("/ssh", OnConnectHandler)
server.OnError("/ssh", OnErrorHandler)
server.OnEvent("/ssh", "host", OnHostHandler)
server.OnEvent("/ssh", "token", OnTokenHandler)
server.OnEvent("/ssh", "data", OnDataHandler)
server.OnEvent("/ssh", "resize", OnResizeHandler)
server.OnEvent("/ssh", "logout", OnLogoutHandler)
go server.Serve()
defer server.Close()
http.Handle("/socket.io/", server)
logger.Debug("start HTTP Serving")
httpServer = &http.Server{Addr: conf.BindHost + ":" + strconv.Itoa(conf.HTTPPort), Handler: nil}
logger.Fatal(httpServer.ListenAndServe())
}
func OnConnectHandler(s socketio.Conn) error {
// 首次连接 1.获取当前用户的信息
cookies := strings.Split(s.RemoteHeader().Get("Cookie"), ";")
var csrfToken string
var sessionid string
var remoteIP string
for _, line := range cookies {
if strings.Contains(line, "csrftoken") {
csrfToken = strings.Split(line, "=")[1]
}
if strings.Contains(line, "sessionid") {
sessionid = strings.Split(line, "=")[1]
}
}
user := service.CheckUserCookie(sessionid, csrfToken)
remoteAddrs := s.RemoteHeader().Get("X-Forwarded-For")
if remoteAddrs == "" {
remoteIP = s.RemoteAddr().String()
} else {
remoteIP = strings.Split(remoteAddrs, ",")[0]
}
conn := &WebConn{Cid: s.ID(), Sock: s, Addr: remoteIP, User: user}
cons.AddWebConn(s.ID(), conn)
return nil
}
func OnErrorHandler(e error) {
}
func OnHostHandler(s socketio.Conn, message HostMsg) {
// secret uuid string
//assetID := message.Uuid
//systemUserId := message.UserID
secret := message.Secret
//width, height := message.Size[0], message.Size[1]
clientID := uuid.NewV4().String()
//asset := service.GetAsset(assetID)
//systemUser := service.GetSystemUser(systemUserId)
s.Emit("room", map[string]string{"room": clientID, "secret": secret})
}
func OnTokenHandler(s socketio.Conn, message TokenMsg) {
}
func OnDataHandler(s socketio.Conn, message DataMsg) {
}
func OnResizeHandler(s socketio.Conn, message ReSizeMsg) {
}
func OnLogoutHandler(s socketio.Conn, message string) {
// message: room
}