diff options
| author | Kristoffer Dalby <kristoffer@tailscale.com> | 2023-11-17 10:32:16 +0100 |
|---|---|---|
| committer | Kristoffer Dalby <kristoffer@tailscale.com> | 2023-11-17 10:32:16 +0100 |
| commit | 43a73a856dd852c33d08c1d3b6d2c8606c03d3ef (patch) | |
| tree | 6aadc0372a6636d908774d2f13f477de7fd4baa4 | |
| parent | 3bd382f3693a63d16be2c73ba5880b4baef5c274 (diff) | |
| download | tailscale-kradalby/keys-db-interface.tar.xz tailscale-kradalby/keys-db-interface.zip | |
types/key: add database scan/value to publickeyskradalby/keys-db-interface
Signed-off-by: Kristoffer Dalby <kristoffer@tailscale.com>
| -rw-r--r-- | types/key/disco.go | 25 | ||||
| -rw-r--r-- | types/key/machine.go | 25 | ||||
| -rw-r--r-- | types/key/node.go | 24 |
3 files changed, 74 insertions, 0 deletions
diff --git a/types/key/disco.go b/types/key/disco.go index 14005b506..a1cc4d0a5 100644 --- a/types/key/disco.go +++ b/types/key/disco.go @@ -5,6 +5,8 @@ package key import ( "crypto/subtle" + "database/sql/driver" + "errors" "fmt" "go4.org/mem" @@ -142,6 +144,29 @@ func (k *DiscoPublic) UnmarshalText(b []byte) error { return parseHex(k.k[:], mem.B(b), mem.S(discoPublicHexPrefix)) } +func (k DiscoPublic) Value() (driver.Value, error) { + return k.MarshalText() +} + +func (k *DiscoPublic) Scan(value interface{}) error { + var val []byte + switch value.(type) { + case string: + val = []byte(value.(string)) + case []byte: + val = value.([]byte) + default: + return errors.New("Incompatible type for DiscoPublic") + } + + err := k.UnmarshalText(val) + if err != nil { + return err + } + + return nil +} + type DiscoShared struct { _ structs.Incomparable // because == isn't constant-time k [32]byte diff --git a/types/key/machine.go b/types/key/machine.go index a05f3cc1f..2d42f7502 100644 --- a/types/key/machine.go +++ b/types/key/machine.go @@ -6,7 +6,9 @@ package key import ( "bytes" "crypto/subtle" + "database/sql/driver" "encoding/hex" + "errors" "go4.org/mem" "golang.org/x/crypto/curve25519" @@ -262,3 +264,26 @@ func (k MachinePublic) MarshalText() ([]byte, error) { func (k *MachinePublic) UnmarshalText(b []byte) error { return parseHex(k.k[:], mem.B(b), mem.S(machinePublicHexPrefix)) } + +func (k MachinePublic) Value() (driver.Value, error) { + return k.MarshalText() +} + +func (k *MachinePublic) Scan(value interface{}) error { + var val []byte + switch value.(type) { + case string: + val = []byte(value.(string)) + case []byte: + val = value.([]byte) + default: + return errors.New("Incompatible type for MachinePublic") + } + + err := k.UnmarshalText(val) + if err != nil { + return err + } + + return nil +} diff --git a/types/key/node.go b/types/key/node.go index 6142bf68a..1fb24be80 100644 --- a/types/key/node.go +++ b/types/key/node.go @@ -7,6 +7,7 @@ import ( "bufio" "bytes" "crypto/subtle" + "database/sql/driver" "encoding/hex" "errors" "fmt" @@ -379,3 +380,26 @@ func (k NodePublic) WireGuardGoString() string { b[second+3] = b64((k.k[31] << 2) & 63) return string(b) } + +func (k NodePublic) Value() (driver.Value, error) { + return k.MarshalText() +} + +func (k *NodePublic) Scan(value interface{}) error { + var val []byte + switch value.(type) { + case string: + val = []byte(value.(string)) + case []byte: + val = value.([]byte) + default: + return errors.New("Incompatible type for NodePublic") + } + + err := k.UnmarshalText(val) + if err != nil { + return err + } + + return nil +} |
