62 lines
1.0 KiB
Go
62 lines
1.0 KiB
Go
package indexer
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"time"
|
|
)
|
|
|
|
type PeerRecordValidator struct{}
|
|
|
|
func (v PeerRecordValidator) Validate(key string, value []byte) error {
|
|
|
|
var rec PeerRecord
|
|
if err := json.Unmarshal(value, &rec); err != nil {
|
|
return errors.New("invalid json")
|
|
}
|
|
|
|
// PeerID must exist
|
|
if rec.PeerID == "" {
|
|
return errors.New("missing peerID")
|
|
}
|
|
|
|
// Expiry check
|
|
if rec.ExpiryDate.Before(time.Now().UTC()) {
|
|
return errors.New("record expired")
|
|
}
|
|
|
|
// Signature verification
|
|
rec2 := PeerRecord{
|
|
Name: rec.Name,
|
|
DID: rec.DID,
|
|
PubKey: rec.PubKey,
|
|
PeerID: rec.PeerID,
|
|
}
|
|
|
|
if _, err := rec2.Verify(); err != nil {
|
|
return errors.New("invalid signature")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (v PeerRecordValidator) Select(key string, values [][]byte) (int, error) {
|
|
|
|
var newest time.Time
|
|
index := 0
|
|
|
|
for i, val := range values {
|
|
var rec PeerRecord
|
|
if err := json.Unmarshal(val, &rec); err != nil {
|
|
continue
|
|
}
|
|
|
|
if rec.ExpiryDate.After(newest) {
|
|
newest = rec.ExpiryDate
|
|
index = i
|
|
}
|
|
}
|
|
|
|
return index, nil
|
|
}
|