diff options
| author | 2026-06-06 21:56:49 +0000 | |
|---|---|---|
| committer | 2026-06-06 21:56:49 +0000 | |
| commit | ee8e3133a221a6ab7e0e737ad1df9b2ef3279f9b (patch) | |
| tree | d9ca296edd6fba53f37af51408097b46467c8e11 | |
| parent | object/header: Use sentinel errors (diff) | |
| signature | No signature | |
object/signature: Detailed along with sentinel
| -rw-r--r-- | object/signature/parse.go | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/object/signature/parse.go b/object/signature/parse.go index bb6f18ed..f8c1666e 100644 --- a/object/signature/parse.go +++ b/object/signature/parse.go @@ -3,6 +3,7 @@ package signature import ( "bytes" "errors" + "fmt" "strconv" "lindenii.org/go/lgo/intconv" @@ -17,12 +18,12 @@ var ErrInvalidSignature = errors.New("object/signature: invalid signature") func Parse(line []byte) (*Signature, error) { lt := bytes.IndexByte(line, '<') if lt < 0 { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: missing '<' before email", ErrInvalidSignature) } gtRel := bytes.IndexByte(line[lt+1:], '>') if gtRel < 0 { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: missing '>' after email", ErrInvalidSignature) } gt := lt + 1 + gtRel @@ -32,24 +33,24 @@ func Parse(line []byte) (*Signature, error) { rest := line[gt+1:] if len(rest) == 0 || rest[0] != ' ' { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: missing ' ' before timestamp", ErrInvalidSignature) } rest = rest[1:] before, after, ok := bytes.Cut(rest, []byte{' '}) if !ok { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: missing ' ' between timestamp and timezone", ErrInvalidSignature) } when, err := strconv.ParseInt(string(before), 10, 64) if err != nil { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timestamp %q: %w", ErrInvalidSignature, before, err) } tz := after if len(tz) < 5 { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timezone %q is too short", ErrInvalidSignature, tz) } sign := 1 @@ -59,32 +60,32 @@ func Parse(line []byte) (*Signature, error) { sign = -1 case '+': default: - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timezone sign %q is not '+' or '-'", ErrInvalidSignature, tz[0]) } hh, err := strconv.Atoi(string(tz[1:3])) if err != nil { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timezone hour %q: %w", ErrInvalidSignature, tz[1:3], err) } mm, err := strconv.Atoi(string(tz[3:5])) if err != nil { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timezone minute %q: %w", ErrInvalidSignature, tz[3:5], err) } if hh < 0 || hh > 23 { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timezone hour %d out of range", ErrInvalidSignature, hh) } if mm < 0 || mm > 59 { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timezone minute %d out of range", ErrInvalidSignature, mm) } total := int64(hh)*60 + int64(mm) offset, err := intconv.Int64ToInt32(total) if err != nil { - return nil, ErrInvalidSignature + return nil, fmt.Errorf("%w: timezone offset out of range", ErrInvalidSignature) } if sign < 0 { |
