diff options
Diffstat (limited to 'tunnel/tools/libwg-go/service.go')
-rw-r--r-- | tunnel/tools/libwg-go/service.go | 123 |
1 files changed, 122 insertions, 1 deletions
diff --git a/tunnel/tools/libwg-go/service.go b/tunnel/tools/libwg-go/service.go index 780ab8c8..c201e45d 100644 --- a/tunnel/tools/libwg-go/service.go +++ b/tunnel/tools/libwg-go/service.go @@ -3,26 +3,41 @@ package main import ( "context" "fmt" + "io" "net" "os" "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" + "golang.zx2c4.com/go118/netip" gen "golang.zx2c4.com/wireguard/android/gen" "golang.zx2c4.com/wireguard/device" ) +const ( + IPPROTO_TCP = 6 +) + type LibwgServiceImpl struct { gen.UnimplementedLibwgServer logger *device.Logger + http_proxy *HttpProxy + uidRequest chan netip.AddrPort + uidResponse chan string } var _ gen.LibwgServer = (*LibwgServiceImpl)(nil) var server *grpc.Server func NewLibwgService(logger *device.Logger) gen.LibwgServer { - return &LibwgServiceImpl{logger: logger} + return &LibwgServiceImpl{ + logger: logger, + uidRequest: make(chan netip.AddrPort), + uidResponse: make(chan string), + } } func StartGrpc(sock_path string, logger *device.Logger) (int, string) { @@ -77,3 +92,109 @@ func (e *LibwgServiceImpl) StopGrpc(ctx context.Context, req *emptypb.Empty) (*e return r, nil } + +func (e *LibwgServiceImpl) StartHttpProxy(ctx context.Context, req *gen.StartHttpProxyRequest) (*gen.StartHttpProxyResponse, error) { + if e.http_proxy != nil { + listen_port := e.http_proxy.GetAddrPort().Port() + r := &gen.StartHttpProxyResponse{ + ListenPort: uint32(listen_port), + Error: &gen.Error{ + Message: fmt.Sprintf("Http proxy already running"), + }, + } + return r, nil + } + + e.http_proxy = NewHttpProxy(e.uidRequest, e.uidResponse, e.logger) + listen_port, err := e.http_proxy.Start() + + if err != nil { + r := &gen.StartHttpProxyResponse{ + Error: &gen.Error{ + Message: fmt.Sprintf("Http proxy start: %v", err), + }, + } + return r, nil + } + + r := &gen.StartHttpProxyResponse{ + ListenPort: uint32(listen_port), + } + + e.logger.Verbosef("Started http proxy") + return r, nil +} + +func (e *LibwgServiceImpl) StopHttpProxy(ctx context.Context, req *gen.StopHttpProxyRequest) (*gen.StopHttpProxyResponse, error) { + if e.http_proxy == nil { + r := &gen.StopHttpProxyResponse{ + Error: &gen.Error{ + Message: fmt.Sprintf("Http proxy not running"), + }, + } + return r, nil + } + + e.http_proxy.Stop() + e.http_proxy = nil + r := &gen.StopHttpProxyResponse{} + e.logger.Verbosef("Stopped http proxy") + return r, nil +} + +func (e *LibwgServiceImpl) Reverse(stream gen.Libwg_ReverseServer) error { + e.logger.Verbosef("Reverse enter loop") + for { + var err error + + // err := contextError(stream.Context()) + err = stream.Context().Err() + if err != nil { + e.logger.Verbosef("Reverse: context: %v", err) + return err + } + + select { + case addr_port := <-e.uidRequest: + r := &gen.ReverseResponse{ + Request: &gen.ReverseResponse_Uid{ + Uid: &gen.GetConnectionOwnerUidRequest{ + Protocol: IPPROTO_TCP, + Local: &gen.InetSocketAddress{ + Address: &gen.InetAddress{ + Address: addr_port.Addr().AsSlice(), + }, + Port: uint32(addr_port.Port()), + }, + Remote: &gen.InetSocketAddress{ + Address: &gen.InetAddress{ + Address: e.http_proxy.GetAddrPort().Addr().AsSlice(), + }, + Port: uint32(e.http_proxy.GetAddrPort().Port()), + }, + }, + }, + } + + stream.Send(r) + } + + req, err := stream.Recv() + if err == io.EOF { + e.logger.Verbosef("no more data") + break + } + if err != nil { + err = status.Errorf(codes.Unknown, "cannot receive stream request: %v", err) + e.logger.Verbosef("Reverse: %v", err) + return err + } + + e.logger.Verbosef("Reverse: received, wait: %v", req) + e.uidResponse <- req.GetUid().GetPackage() + } + + + e.logger.Verbosef("Reverse returns") + return nil +} |