实现读取剪贴板内容

This commit is contained in:
lwch
2021-11-22 14:33:34 +08:00
parent a6dc0813f1
commit 8a4e242023
13 changed files with 126 additions and 17 deletions
+3 -3
View File
@@ -155,8 +155,8 @@ func (conn *Conn) SendVNCScroll(to string, toIdx uint32, id string, x, y int32)
}
}
// SendVNCClipboardSet send vnc set clipboard
func (conn *Conn) SendVNCClipboardSet(to string, toIdx uint32, id, data string) {
// SendVNCClipboardData send vnc clipboard data
func (conn *Conn) SendVNCClipboardData(to string, toIdx uint32, id string, set bool, data string) {
var msg network.Msg
msg.To = to
msg.ToIdx = toIdx
@@ -164,7 +164,7 @@ func (conn *Conn) SendVNCClipboardSet(to string, toIdx uint32, id, data string)
msg.LinkId = id
msg.Payload = &network.Msg_Vclipboard{
Vclipboard: &network.VncClipboard{
Set: true,
Set: set,
XType: network.VncClipboard_text,
Payload: &network.VncClipboard_Data{
Data: data,
+7 -1
View File
@@ -16,6 +16,12 @@ func (v *VNC) Clipboard(pool *pool.Pool, w http.ResponseWriter, r *http.Request)
}
func (v *VNC) getClipboard(pool *pool.Pool, w http.ResponseWriter, r *http.Request) {
if v.link == nil {
http.NotFound(w, r)
return
}
conn := pool.Get(v.link.id)
conn.SendVNCClipboardData(v.link.target, v.link.targetIdx, v.link.id, false, "")
}
func (v *VNC) setClipboard(pool *pool.Pool, w http.ResponseWriter, r *http.Request) {
@@ -25,6 +31,6 @@ func (v *VNC) setClipboard(pool *pool.Pool, w http.ResponseWriter, r *http.Reque
return
}
conn := pool.Get(v.link.id)
conn.SendVNCClipboardSet(v.link.target, v.link.targetIdx, v.link.id, data)
conn.SendVNCClipboardData(v.link.target, v.link.targetIdx, v.link.id, true, data)
fmt.Fprint(w, "ok")
}
+6 -1
View File
@@ -110,7 +110,12 @@ func (link *Link) remoteRead() {
case network.Msg_vnc_scroll:
link.ps.ScrollEvent(msg.GetVscroll())
case network.Msg_vnc_clipboard:
link.ps.ClipboardEvent(msg.GetVclipboard())
if msg.GetVclipboard().GetSet() {
link.ps.SetClipboard(msg.GetVclipboard())
} else {
data := link.ps.GetClipboard()
link.remote.SendVNCClipboardData(link.target, link.targetIdx, link.id, true, data)
}
case network.Msg_disconnect:
logging.Info("link %s disconnected", link.id)
return
+16 -2
View File
@@ -79,8 +79,8 @@ func (p *Process) ScrollEvent(data *network.VncScroll) {
p.chWrite <- &msg
}
// ClipboardEvent dispatch clipboard event to child process
func (p *Process) ClipboardEvent(data *network.VncClipboard) {
// SetClipboard set clipboard data to child process
func (p *Process) SetClipboard(data *network.VncClipboard) {
t := vncnetwork.ClipboardData_unset_type
var payload vncnetwork.ClipboardData_Data
switch data.GetXType() {
@@ -103,3 +103,17 @@ func (p *Process) ClipboardEvent(data *network.VncClipboard) {
}
p.chWrite <- &msg
}
// GetClipboard get clipboard data from child process
func (p *Process) GetClipboard() string {
var msg vncnetwork.VncMsg
msg.XType = vncnetwork.VncMsg_clipboard_event
msg.Payload = &vncnetwork.VncMsg_Clipboard{
Clipboard: &vncnetwork.ClipboardData{
Set: false,
},
}
p.chWrite <- &msg
data := <-p.chClipboard
return data.GetData()
}
+7 -4
View File
@@ -22,10 +22,11 @@ const (
// Process process
type Process struct {
pid int
srv *http.Server
chWrite chan *vncnetwork.VncMsg
chImage chan *vncnetwork.ImageData
pid int
srv *http.Server
chWrite chan *vncnetwork.VncMsg
chImage chan *vncnetwork.ImageData
chClipboard chan *vncnetwork.ClipboardData
}
func (p *Process) listenAndServe() (uint16, error) {
@@ -80,6 +81,8 @@ func (p *Process) ws(w http.ResponseWriter, r *http.Request) {
switch msg.GetXType() {
case vncnetwork.VncMsg_capture_data:
p.chImage <- msg.GetData()
case vncnetwork.VncMsg_clipboard_event:
p.chClipboard <- msg.GetClipboard()
default:
}
}
@@ -95,6 +95,7 @@ func createWorker(name, confDir string, tk windows.Token, showCursor bool) (*Pro
var p Process
p.chWrite = make(chan *vncnetwork.VncMsg)
p.chImage = make(chan *vncnetwork.ImageData)
p.chClipboard = make(chan *vncnetwork.ClipboardData)
port, err := p.listenAndServe()
if err != nil {
return nil, err
@@ -132,6 +133,10 @@ func (p *Process) Close() {
close(p.chImage)
p.chImage = nil
}
if p.chClipboard != nil {
close(p.chClipboard)
p.chClipboard = nil
}
if p.chWrite != nil {
close(p.chWrite)
p.chWrite = nil
+6 -2
View File
@@ -3,7 +3,11 @@
package worker
import "natpass/code/client/rule/vnc/vncnetwork"
import (
"natpass/code/client/rule/vnc/vncnetwork"
"github.com/gorilla/websocket"
)
func runMouse(data *vncnetwork.MouseData) {
}
@@ -14,5 +18,5 @@ func runKeyboard(data *vncnetwork.KeyboardData) {
func runScroll(data *vncnetwork.ScrollData) {
}
func runClipboard(data *vncnetwork.ClipboardData) {
func runClipboard(conn *websocket.Conn, data *vncnetwork.ClipboardData) {
}
+19 -3
View File
@@ -7,7 +7,9 @@ import (
"natpass/code/client/rule/vnc/vncnetwork"
"github.com/go-vgo/robotgo"
"github.com/gorilla/websocket"
"github.com/lwch/logging"
"google.golang.org/protobuf/proto"
)
func runMouse(data *vncnetwork.MouseData) {
@@ -60,7 +62,7 @@ func runScroll(data *vncnetwork.ScrollData) {
robotgo.Scroll(int(data.X), int(data.Y), 1)
}
func runClipboard(data *vncnetwork.ClipboardData) {
func runClipboard(conn *websocket.Conn, data *vncnetwork.ClipboardData) {
detach, err := attachDesktop()
if err != nil {
logging.Error("attach desktop: %v", err)
@@ -70,7 +72,7 @@ func runClipboard(data *vncnetwork.ClipboardData) {
if data.GetSet() {
setClipboard(data)
} else {
getClipboard()
getClipboard(conn)
}
}
@@ -83,5 +85,19 @@ func setClipboard(data *vncnetwork.ClipboardData) {
}
}
func getClipboard() {
func getClipboard(conn *websocket.Conn) {
data, _ := robotgo.ReadAll()
var msg vncnetwork.VncMsg
msg.XType = vncnetwork.VncMsg_clipboard_event
msg.Payload = &vncnetwork.VncMsg_Clipboard{
Clipboard: &vncnetwork.ClipboardData{
Set: true,
XType: vncnetwork.ClipboardData_text,
Payload: &vncnetwork.ClipboardData_Data{
Data: data,
},
},
}
enc, _ := proto.Marshal(&msg)
conn.WriteMessage(websocket.BinaryMessage, enc)
}
+1 -1
View File
@@ -73,7 +73,7 @@ func (worker *Worker) Do(conn *websocket.Conn) {
case vncnetwork.VncMsg_scroll_event:
runScroll(msg.GetScroll())
case vncnetwork.VncMsg_clipboard_event:
runClipboard(msg.GetClipboard())
runClipboard(conn, msg.GetClipboard())
}
}
}