b01fe1524a
--- type: change description: |- Completely refactor naming of everything, in light of new SPEC Writing the SPEC shed some light on just how weakly a lot of concepts, like "commit", had been defined, and prompted the delineation of a lot of things along specific lines (commit vs payload, repo vs project). This commit makes the code reflect the SPEC much better in quite a few ways: * Repo is now Project * Commit is now Payload * GitCommit is now just Commit * Hash is now Fingerprint * A lot of minor fields got renamed * All the XXXInterface types are now just XXX, and their old XXX type is now XXXUnion. More than likely there's still some comments and variable names that have slipped passed, but overall I feel like I got most of the changes. fingerprint: AKkDC5BKhKbfXzZQ/F4KquHeMgVvcNxgLmkZFz/nP/tY credentials: - type: pgp_signature pub_key_id: 95C46FA6A41148AC body: iQIzBAABAgAdFiEEJ6tQKp6olvZKJ0lwlcRvpqQRSKwFAl6l7aYACgkQlcRvpqQRSKxFrA//VQ+f8B6pwGS3ORB4VVBnHvvJTGZvAYTvB0fHuHJx2EreR4FwjhaNakk5ClkwbO7WFMq++2OV4xIkvzwswLdbXZF0IHx3wScQM59v4vIkR4V9Lj5p1aGGhQna52uIKugF2gTqKdU4tqYzmBjDND/c2XDwCN5CwTwwnAHXUSSsHxviiPUYPWV5wzFP7uyRW0ZeK8Isv7QECKRXlsDjcSJa+g+jc091FG/jG9Dkai8fbDbW8YXj7W3ALaXgXWEBJMrgQxZcJJRjgCvLY72FIIrUBquu3FepiyzMtZ0yaIvi4NmGCsYqIv00NcMvMtD7iwhOCZn10Sku4wvaKJ8YBMRduhqC99fnr/ZDW0/HvTNcL7GKx11GjwtmzkJgwsHFPy3zX+kMdF4m3WgtoeI0GwEsBXXZE2C49yAk3Mb/3puegl3a1PPMvOabTzo7Xm6xpWkI6gISChI7My71H3EuKZWhkb+IubPmMvJJXIdVxHnsHPz2dl/BZXLgpfVdEgQa2qWeXtYI4NNm37pLl3gv92V4kka+Kr4gfdoq8mJ7aqvc9was35baJbHg4+fEVJG2Wj+2AQU+ncx3nAFzgYyMxwo9K8VuC4QdfRF4ImyxTnWkuokEn9H6JRrbkBDKIELj6vzdPmsjOUEQ4nsYX66/zSibFD7UvhQmdXFs8Gp8/Qq6g4M= account: mediocregopher
78 lines
3.0 KiB
Go
78 lines
3.0 KiB
Go
package sigcred
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"dehub.dev/src/dehub.git/typeobj"
|
|
)
|
|
|
|
// CredentialUnion represents a credential, signifying a user's approval of a
|
|
// payload. Exactly one field tagged with "type" should be set.
|
|
type CredentialUnion struct {
|
|
PGPSignature *CredentialPGPSignature `type:"pgp_signature"`
|
|
|
|
// AccountID specifies the account which generated this CredentialUnion.
|
|
//
|
|
// NOTE that credentials produced by the direct implementations of Signifier
|
|
// won't fill in this field, unless specifically documented. The Signifier
|
|
// produced by the Signifier() method of SignifierUnion _will_ fill this
|
|
// field in, however.
|
|
AccountID string `yaml:"account,omitempty"`
|
|
|
|
// AnonID specifies an identifier for the anonymous user which produced this
|
|
// credential. This field is mutually exclusive with AccountID, and won't be
|
|
// set by any Signifier implementation unless specifically documented.
|
|
AnonID string `yaml:"-"`
|
|
}
|
|
|
|
// MarshalYAML implements the yaml.Marshaler interface.
|
|
func (c CredentialUnion) MarshalYAML() (interface{}, error) {
|
|
return typeobj.MarshalYAML(c)
|
|
}
|
|
|
|
// UnmarshalYAML implements the yaml.Unmarshaler interface.
|
|
func (c *CredentialUnion) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
|
return typeobj.UnmarshalYAML(c, unmarshal)
|
|
}
|
|
|
|
// ErrNotSelfVerifying is returned from the SelfVerify method of CredentialUnion
|
|
// when the credential does not implement the SelfVerifyingCredential interface.
|
|
// It may also be returned from the SelfVerify method of the
|
|
// SelfVerifyingCredential itself, if the credential can only self-verify under
|
|
// certain circumstances.
|
|
type ErrNotSelfVerifying struct {
|
|
// Subject is a descriptor of the value which could not be verified. It may
|
|
// be a type name or some other identifying piece of information.
|
|
Subject string
|
|
}
|
|
|
|
func (e ErrNotSelfVerifying) Error() string {
|
|
return fmt.Sprintf("%s cannot verify itself", e.Subject)
|
|
}
|
|
|
|
// SelfVerify will attempt to cast the credential as a SelfVerifyingCredential,
|
|
// and returns the result of the SelfVerify method being called on it.
|
|
func (c CredentialUnion) SelfVerify(data []byte) error {
|
|
el, _, err := typeobj.Element(c)
|
|
if err != nil {
|
|
return err
|
|
} else if selfVerifyingCred, ok := el.(SelfVerifyingCredential); !ok {
|
|
return ErrNotSelfVerifying{Subject: fmt.Sprintf("credential of type %T", el)}
|
|
} else if err := selfVerifyingCred.SelfVerify(data); err != nil {
|
|
return fmt.Errorf("self-verifying credential of type %T: %w", el, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// SelfVerifyingCredential is one which is able to prove its own authenticity by
|
|
// some means or another. It is not required for a Credential to implement this
|
|
// interface.
|
|
type SelfVerifyingCredential interface {
|
|
// SelfVerify should return nil if the Credential has successfully verified
|
|
// that it has accredited the given data, or an error describing why it
|
|
// could not do so. It may return ErrNotSelfVerifying if the Credential can
|
|
// only self-verify under certain circumstances, and those circumstances are
|
|
// not met.
|
|
SelfVerify(data []byte) error
|
|
}
|