mirror of
https://github.com/mitchell/selfpass.git
synced 2026-02-11 17:56:51 +00:00
Implemented remaining transport layer methods; added logging middleware;
added Dockerfile; added gen cert Makefile cmds; added Redis repo
This commit is contained in:
parent
719a462048
commit
c289eecd54
20 changed files with 1977 additions and 143 deletions
|
|
@ -9,7 +9,6 @@ import (
|
|||
"github.com/mitchell/selfpass/credentials/types"
|
||||
)
|
||||
|
||||
// NewDynamoTable TODO
|
||||
func NewDynamoTable(name string) DynamoTable {
|
||||
cfg, err := external.LoadDefaultAWSConfig()
|
||||
if err != nil {
|
||||
|
|
@ -21,22 +20,20 @@ func NewDynamoTable(name string) DynamoTable {
|
|||
}
|
||||
}
|
||||
|
||||
// DynamoTable TODO
|
||||
type DynamoTable struct {
|
||||
name string
|
||||
svc *dynamodb.DynamoDB
|
||||
}
|
||||
|
||||
// GetAllMetadata TODO
|
||||
func (t DynamoTable) GetAllMetadata(ctx context.Context, sourceService string, errch chan<- error) (output <-chan types.Metadata) {
|
||||
func (t DynamoTable) GetAllMetadata(ctx context.Context, sourceHost string, errch chan<- error) (output <-chan types.Metadata) {
|
||||
mdch := make(chan types.Metadata, 1)
|
||||
in := &dynamodb.ScanInput{TableName: &t.name}
|
||||
|
||||
if sourceService != "" {
|
||||
if sourceHost != "" {
|
||||
filterExpr := "SourceHost = :sh"
|
||||
in.FilterExpression = &filterExpr
|
||||
in.ExpressionAttributeValues = map[string]dynamodb.AttributeValue{
|
||||
":sh": {S: &sourceService},
|
||||
":sh": {S: &sourceHost},
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -68,7 +65,6 @@ func (t DynamoTable) GetAllMetadata(ctx context.Context, sourceService string, e
|
|||
return mdch
|
||||
}
|
||||
|
||||
// Get TODO
|
||||
func (t DynamoTable) Get(ctx context.Context, id string) (output types.Credential, err error) {
|
||||
req := t.svc.GetItemRequest(&dynamodb.GetItemInput{
|
||||
TableName: &t.name,
|
||||
|
|
@ -86,7 +82,6 @@ func (t DynamoTable) Get(ctx context.Context, id string) (output types.Credentia
|
|||
return output, err
|
||||
}
|
||||
|
||||
// Put TODO
|
||||
func (t DynamoTable) Put(ctx context.Context, c types.Credential) (err error) {
|
||||
item, err := dynamodbattribute.MarshalMap(c)
|
||||
if err != nil {
|
||||
|
|
@ -104,7 +99,6 @@ func (t DynamoTable) Put(ctx context.Context, c types.Credential) (err error) {
|
|||
return err
|
||||
}
|
||||
|
||||
// Delete TODO
|
||||
func (t DynamoTable) Delete(ctx context.Context, id string) (err error) {
|
||||
req := t.svc.DeleteItemRequest(&dynamodb.DeleteItemInput{
|
||||
TableName: &t.name,
|
||||
|
|
|
|||
111
credentials/repositories/redis.go
Normal file
111
credentials/repositories/redis.go
Normal file
|
|
@ -0,0 +1,111 @@
|
|||
package repositories
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/mediocregopher/radix/v3"
|
||||
"github.com/mitchell/selfpass/credentials/types"
|
||||
)
|
||||
|
||||
func NewRedisConn(cfg ConnConfig) (c RedisConn, err error) {
|
||||
p, err := radix.NewPool(cfg.NetworkType, cfg.Address, int(cfg.Size), cfg.Options...)
|
||||
return RedisConn{p: p}, err
|
||||
}
|
||||
|
||||
type ConnConfig struct {
|
||||
NetworkType string
|
||||
Address string
|
||||
Size uint
|
||||
Options []radix.PoolOpt
|
||||
}
|
||||
|
||||
type RedisConn struct {
|
||||
p *radix.Pool
|
||||
}
|
||||
|
||||
func (conn RedisConn) GetAllMetadata(ctx context.Context, sourceHost string, errch chan<- error) (output <-chan types.Metadata) {
|
||||
mdch := make(chan types.Metadata, 1)
|
||||
|
||||
go func() {
|
||||
defer close(mdch)
|
||||
|
||||
var key string
|
||||
scr := radix.NewScanner(conn.p, radix.ScanOpts{Command: scan, Pattern: sourceHost + star})
|
||||
|
||||
for scr.Next(&key) {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
var md types.Metadata
|
||||
|
||||
if err := conn.p.Do(radix.Cmd(&md, hGetAll, key)); err != nil {
|
||||
errch <- err
|
||||
return
|
||||
}
|
||||
|
||||
mdch <- md
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
return mdch
|
||||
}
|
||||
|
||||
func (conn RedisConn) Get(ctx context.Context, id string) (output types.Credential, err error) {
|
||||
var key string
|
||||
scr := radix.NewScanner(conn.p, radix.ScanOpts{Command: scan, Pattern: star + id, Count: 1})
|
||||
|
||||
if !scr.Next(&key) {
|
||||
return output, nil
|
||||
}
|
||||
|
||||
if err = scr.Close(); err != nil {
|
||||
return output, err
|
||||
}
|
||||
|
||||
err = conn.p.Do(radix.Cmd(&output, hGetAll, key))
|
||||
|
||||
return output, err
|
||||
}
|
||||
|
||||
func (conn RedisConn) Put(ctx context.Context, c types.Credential) (err error) {
|
||||
err = conn.p.Do(radix.FlatCmd(nil, hMSet, c.SourceHost+dash+c.ID, c))
|
||||
return err
|
||||
}
|
||||
|
||||
func (conn RedisConn) Delete(ctx context.Context, id string) (err error) {
|
||||
var key string
|
||||
scr := radix.NewScanner(conn.p, radix.ScanOpts{Command: scan, Pattern: star + id, Count: 1})
|
||||
|
||||
if !scr.Next(&key) {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err = scr.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = conn.p.Do(radix.Cmd(nil, del, key))
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (conn RedisConn) DumpDB(ctx context.Context) (bs []byte, err error) {
|
||||
bs = []byte{}
|
||||
|
||||
if err := conn.p.Do(radix.Cmd(&bs, "DUMP")); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return bs, nil
|
||||
}
|
||||
|
||||
const (
|
||||
dash = "-"
|
||||
star = "*"
|
||||
scan = "SCAN"
|
||||
hGetAll = "HGETALL"
|
||||
hMSet = "HMSET"
|
||||
del = "DEL"
|
||||
)
|
||||
Loading…
Add table
Add a link
Reference in a new issue