-
-
Notifications
You must be signed in to change notification settings - Fork 162
/
lockdownhandler.go
86 lines (75 loc) · 2.77 KB
/
lockdownhandler.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
package debugproxy
import (
"bytes"
"io"
ios "github.com/danielpaulus/go-ios/ios"
log "github.com/sirupsen/logrus"
"howett.net/plist"
)
func proxyLockDownConnection(p *ProxyConnection, lockdownOnUnixSocket *ios.LockDownConnection, lockdownToDevice *ios.LockDownConnection) {
for {
request, err := lockdownOnUnixSocket.ReadMessage()
if err != nil {
lockdownOnUnixSocket.Close()
lockdownToDevice.Close()
if err == io.EOF {
p.LogClosed()
return
}
p.log.Info("Failed reading LockdownMessage", err)
return
}
var decodedRequest map[string]interface{}
decoder := plist.NewDecoder(bytes.NewReader(request))
err = decoder.Decode(&decodedRequest)
if err != nil {
p.log.Info("Failed decoding LockdownMessage", request, err)
}
p.logJSONMessageToDevice(map[string]interface{}{"payload": decodedRequest, "type": "LOCKDOWN"})
p.log.WithFields(log.Fields{"ID": p.id, "direction": "host2device"}).Info(decodedRequest)
err = lockdownToDevice.Send(decodedRequest)
p.log.Info("done sending to device")
if err != nil {
p.log.Errorf("Failed forwarding message to device: %x", request)
}
response, err := lockdownToDevice.ReadMessage()
if err != nil {
log.Errorf("error reading from device: %+v", err)
response, err = lockdownToDevice.ReadMessage()
log.Infof("second read: %+v %+v", response, err)
}
var decodedResponse map[string]interface{}
decoder = plist.NewDecoder(bytes.NewReader(response))
err = decoder.Decode(&decodedResponse)
if err != nil {
p.log.Info("Failed decoding LockdownMessage", decodedResponse, err)
}
p.logJSONMessageFromDevice(map[string]interface{}{"payload": decodedResponse, "type": "LOCKDOWN"})
p.log.WithFields(log.Fields{"ID": p.id, "direction": "device2host"}).Info(decodedResponse)
err = lockdownOnUnixSocket.Send(decodedResponse)
if err != nil {
p.log.Info("Failed sending LockdownMessage from device to host service", decodedResponse, err)
}
if decodedResponse["EnableSessionSSL"] == true {
lockdownToDevice.EnableSessionSsl(p.pairRecord)
lockdownOnUnixSocket.EnableSessionSslServerMode(p.pairRecord)
}
if decodedResponse["Request"] == "StartService" && decodedResponse["Error"] == nil {
useSSL := false
if decodedResponse["EnableServiceSSL"] != nil {
useSSL = decodedResponse["EnableServiceSSL"].(bool)
}
info := PhoneServiceInformation{
ServicePort: uint16(decodedResponse["Port"].(uint64)),
ServiceName: decodedResponse["Service"].(string),
UseSSL: useSSL}
p.log.Debugf("Detected Service Start:%+v", info)
p.debugProxy.storeServiceInformation(info)
}
if decodedResponse["Request"] == "StopSession" {
p.log.Info("Stop Session detected, disabling SSL")
lockdownOnUnixSocket.DisableSessionSSL()
lockdownToDevice.DisableSessionSSL()
}
}
}