lbryschema.go/claim/claim.go

135 lines
2.8 KiB
Go
Raw Normal View History

2017-09-12 18:02:30 +02:00
package claim
import (
"encoding/hex"
2017-09-12 18:02:30 +02:00
"errors"
2018-11-09 23:04:05 +01:00
2017-11-27 16:23:24 +01:00
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
2018-11-09 23:04:05 +01:00
"github.com/lbryio/lbryschema.go/address"
"github.com/lbryio/types/go"
2017-09-12 18:02:30 +02:00
)
2017-11-08 03:39:08 +01:00
type ClaimHelper struct {
*pb.Claim
2017-09-12 18:02:30 +02:00
}
func (c *ClaimHelper) ValidateAddresses(blockchainName string) error {
// check the validity of a fee address
if c.GetClaimType() == pb.Claim_streamType {
fee := c.GetStream().GetMetadata().GetFee()
2017-11-27 16:23:24 +01:00
if fee != nil {
tmp_addr := fee.GetAddress()
if len(tmp_addr) != 25 {
2017-11-27 16:23:24 +01:00
return errors.New("invalid address length: " + string(len(tmp_addr)) + "!")
}
addr := [25]byte{}
for i := range addr {
addr[i] = tmp_addr[i]
}
_, err := address.EncodeAddress(addr, blockchainName)
if err != nil {
return err
}
}
}
return nil
}
2017-11-27 16:22:57 +01:00
func (c *ClaimHelper) ValidateCertificate() error {
certificate := c.GetCertificate()
if certificate == nil {
return nil
}
keyType := certificate.GetKeyType()
_, err := c.GetCertificatePublicKey()
if err != nil {
return err
}
if keyType.String() != SECP256k1 {
return errors.New("wrong curve: " + keyType.String())
}
return nil
}
func (c *ClaimHelper) LoadFromBytes(raw_claim []byte, blockchainName string) error {
if c.String() != "" {
2017-09-12 18:02:30 +02:00
return errors.New("already initialized")
}
if len(raw_claim) < 1 {
return errors.New("there is nothing to decode")
}
2017-11-08 03:39:08 +01:00
2017-09-12 18:02:30 +02:00
claim_pb := &pb.Claim{}
err := proto.Unmarshal(raw_claim, claim_pb)
if err != nil {
return err
}
*c = ClaimHelper{claim_pb}
2017-11-27 16:22:57 +01:00
err = c.ValidateAddresses(blockchainName)
if err != nil {
return err
}
err = c.ValidateCertificate()
if err != nil {
return err
}
2017-09-12 18:02:30 +02:00
return nil
}
func (c *ClaimHelper) LoadFromHexString(claim_hex string, blockchainName string) error {
2017-09-12 18:02:30 +02:00
buf, err := hex.DecodeString(claim_hex)
if err != nil {
return err
}
return c.LoadFromBytes(buf, blockchainName)
2017-09-12 18:02:30 +02:00
}
func DecodeClaimBytes(serialized []byte, blockchainName string) (*ClaimHelper, error) {
2017-11-08 03:39:08 +01:00
claim := &ClaimHelper{&pb.Claim{}}
err := claim.LoadFromBytes(serialized, blockchainName)
2017-09-12 18:02:30 +02:00
if err != nil {
return nil, err
}
return claim, nil
}
func DecodeClaimHex(serialized string, blockchainName string) (*ClaimHelper, error) {
2017-09-12 18:02:30 +02:00
claim_bytes, err := hex.DecodeString(serialized)
if err != nil {
return nil, err
}
return DecodeClaimBytes(claim_bytes, blockchainName)
2017-09-12 18:02:30 +02:00
}
2017-11-08 03:39:08 +01:00
2017-11-27 16:23:24 +01:00
func DecodeClaimJSON(claimJSON string, blockchainName string) (*ClaimHelper, error) {
c := &pb.Claim{}
err := jsonpb.UnmarshalString(claimJSON, c)
if err != nil {
return nil, err
}
return &ClaimHelper{c}, nil
}
func (c *ClaimHelper) GetStream() *pb.Stream {
if c != nil {
return c.Stream
2017-11-08 03:39:08 +01:00
}
return nil
}
func (c *ClaimHelper) GetCertificate() *pb.Certificate {
if c != nil {
return c.Certificate
2017-11-08 03:39:08 +01:00
}
return nil
}
func (c *ClaimHelper) GetPublisherSignature() *pb.Signature {
if c != nil {
return c.PublisherSignature
2017-11-08 03:39:08 +01:00
}
return nil
}