diff --git a/did/did.go b/did/did.go index 19042bf..2d77684 100644 --- a/did/did.go +++ b/did/did.go @@ -102,6 +102,9 @@ func (d DID) PubKey() (crypto.PubKey, error) { // String formats the decentralized identity document (DID) as a string. func (d DID) String() string { + if d == Undef { + return "(undefined)" + } key, _ := mbase.Encode(mbase.Base58BTC, []byte(d.bytes)) return "did:key:" + key } diff --git a/token/delegation/delegation.go b/token/delegation/delegation.go index 4955e48..6bafe49 100644 --- a/token/delegation/delegation.go +++ b/token/delegation/delegation.go @@ -10,8 +10,10 @@ package delegation // TODO: change the "delegation" link above when the specification is merged import ( + "encoding/base64" "errors" "fmt" + "strings" "time" "github.com/ucan-wg/go-ucan/did" @@ -170,6 +172,32 @@ func (t *Token) IsValidAt(ti time.Time) bool { return true } +func (t *Token) String() string { + var res strings.Builder + + var kind string + switch { + case t.issuer == t.subject: + kind = " (root delegation)" + case t.subject == did.Undef: + kind = " (powerline delegation)" + default: + kind = " (normal delegation)" + } + + res.WriteString(fmt.Sprintf("Issuer: %s\n", t.Issuer())) + res.WriteString(fmt.Sprintf("Audience: %s\n", t.Audience())) + res.WriteString(fmt.Sprintf("Subject: %s%s\n", t.Subject(), kind)) + res.WriteString(fmt.Sprintf("Command: %s\n", t.Command())) + res.WriteString(fmt.Sprintf("Policy: %s\n", t.Policy())) + res.WriteString(fmt.Sprintf("Nonce: %s\n", base64.StdEncoding.EncodeToString(t.Nonce()))) + res.WriteString(fmt.Sprintf("Meta: %s\n", t.Meta())) + res.WriteString(fmt.Sprintf("NotBefore: %v\n", t.NotBefore())) + res.WriteString(fmt.Sprintf("Expiration: %v", t.Expiration())) + + return res.String() +} + func (t *Token) validate() error { var errs error diff --git a/token/invocation/invocation.go b/token/invocation/invocation.go index 20c0a47..2535e10 100644 --- a/token/invocation/invocation.go +++ b/token/invocation/invocation.go @@ -8,8 +8,10 @@ package invocation import ( + "encoding/base64" "errors" "fmt" + "strings" "time" "github.com/ipfs/go-cid" @@ -214,6 +216,24 @@ func (t *Token) IsValidAt(ti time.Time) bool { return true } +func (t *Token) String() string { + var res strings.Builder + + res.WriteString(fmt.Sprintf("Issuer: %s\n", t.Issuer())) + res.WriteString(fmt.Sprintf("Audience: %s\n", t.Audience())) + res.WriteString(fmt.Sprintf("Subject: %v\n", t.Subject())) + res.WriteString(fmt.Sprintf("Command: %s\n", t.Command())) + res.WriteString(fmt.Sprintf("Args: %s\n", t.Arguments())) + res.WriteString(fmt.Sprintf("Proof: %v\n", t.Proof())) + res.WriteString(fmt.Sprintf("Nonce: %s\n", base64.StdEncoding.EncodeToString(t.Nonce()))) + res.WriteString(fmt.Sprintf("Meta: %s\n", t.Meta())) + res.WriteString(fmt.Sprintf("Expiration: %v\n", t.Expiration())) + res.WriteString(fmt.Sprintf("Invoked At: %v\n", t.InvokedAt())) + res.WriteString(fmt.Sprintf("Cause: %v", t.Cause())) + + return res.String() +} + func (t *Token) validate() error { var errs error