package browserbridge import ( "context" "fmt" "net" "runtime" "strings" "git.julianfamily.org/keepassgo/internal/grpcaddr" keepassgov1 "git.julianfamily.org/keepassgo/proto/keepassgo/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" ) type GRPCClient struct { client keepassgov1.VaultServiceClient } func Dial(ctx context.Context, conn Connection) (*grpc.ClientConn, *GRPCClient, context.Context, error) { if strings.TrimSpace(conn.GRPCAddress) == "" { conn.GRPCAddress = grpcaddr.Default(runtime.GOOS) } if strings.TrimSpace(conn.BearerToken) == "" { return nil, nil, nil, fmt.Errorf("browser bridge bearer token is required") } network, endpoint, err := grpcaddr.Parse(conn.GRPCAddress) if err != nil { return nil, nil, nil, err } target := endpoint if network == "unix" { target = "passthrough:///" + endpoint } grpcConn, err := grpc.NewClient(target, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return net.Dial(network, endpoint) }), ) if err != nil { return nil, nil, nil, fmt.Errorf("dial gRPC host %s: %w", strings.TrimSpace(conn.GRPCAddress), err) } ctx = metadata.AppendToOutgoingContext(ctx, "authorization", "Bearer "+strings.TrimSpace(conn.BearerToken)) return grpcConn, &GRPCClient{client: keepassgov1.NewVaultServiceClient(grpcConn)}, ctx, nil } func (c *GRPCClient) Status(ctx context.Context) (*keepassgov1.GetSessionStatusResponse, error) { return c.client.GetSessionStatus(ctx, &keepassgov1.GetSessionStatusRequest{}) } func (c *GRPCClient) FindBrowserLogins(ctx context.Context, pageURL string) ([]*keepassgov1.BrowserLoginMatch, error) { resp, err := c.client.FindBrowserLogins(ctx, &keepassgov1.FindBrowserLoginsRequest{ PageUrl: strings.TrimSpace(pageURL), }) if err != nil { return nil, err } return resp.GetMatches(), nil } func (c *GRPCClient) GetBrowserCredential(ctx context.Context, entryID, pageURL string) (*keepassgov1.GetBrowserCredentialResponse, error) { return c.client.GetBrowserCredential(ctx, &keepassgov1.GetBrowserCredentialRequest{ Id: strings.TrimSpace(entryID), PageUrl: strings.TrimSpace(pageURL), }) }