69 lines
2.2 KiB
Go
69 lines
2.2 KiB
Go
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),
|
|
})
|
|
}
|