60 lines
2.0 KiB
Go
60 lines
2.0 KiB
Go
package browserbridge
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
"strings"
|
|
|
|
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 = DefaultGRPCAddress
|
|
}
|
|
if strings.TrimSpace(conn.BearerToken) == "" {
|
|
return nil, nil, nil, fmt.Errorf("browser bridge bearer token is required")
|
|
}
|
|
address := strings.TrimSpace(conn.GRPCAddress)
|
|
grpcConn, err := grpc.NewClient("passthrough:///"+address,
|
|
grpc.WithTransportCredentials(insecure.NewCredentials()),
|
|
grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) {
|
|
return net.Dial("tcp", address)
|
|
}),
|
|
)
|
|
if err != nil {
|
|
return nil, nil, nil, fmt.Errorf("dial gRPC host %s: %w", address, 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),
|
|
})
|
|
}
|