summaryrefslogtreecommitdiffhomepage
path: root/tunnel/tools/libwg-go/service.go
diff options
context:
space:
mode:
Diffstat (limited to 'tunnel/tools/libwg-go/service.go')
-rw-r--r--tunnel/tools/libwg-go/service.go123
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
+}