this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Support unsigned label cborgen for signature validation (#612)

There's definitely got to be a better place to put this but I'm just
gonna stick it here for now.

authored by

Jaz and committed by
GitHub
acac567e b4f57855

+377
+5
gen/main.go
··· 11 11 lexutil "github.com/bluesky-social/indigo/lex/util" 12 12 "github.com/bluesky-social/indigo/mst" 13 13 "github.com/bluesky-social/indigo/repo" 14 + "github.com/bluesky-social/indigo/util/labels" 14 15 15 16 cbg "github.com/whyrusleeping/cbor-gen" 16 17 ) ··· 29 30 } 30 31 31 32 if err := cbg.WriteMapEncodersToFile("api/cbor_gen.go", "api", api.CreateOp{}); err != nil { 33 + panic(err) 34 + } 35 + 36 + if err := cbg.WriteMapEncodersToFile("util/labels/cbor_gen.go", "labels", labels.UnsignedLabel{}); err != nil { 32 37 panic(err) 33 38 } 34 39
+337
util/labels/cbor_gen.go
··· 1 + // Code generated by github.com/whyrusleeping/cbor-gen. DO NOT EDIT. 2 + 3 + package labels 4 + 5 + import ( 6 + "fmt" 7 + "io" 8 + "math" 9 + "sort" 10 + 11 + cid "github.com/ipfs/go-cid" 12 + cbg "github.com/whyrusleeping/cbor-gen" 13 + xerrors "golang.org/x/xerrors" 14 + ) 15 + 16 + var _ = xerrors.Errorf 17 + var _ = cid.Undef 18 + var _ = math.E 19 + var _ = sort.Sort 20 + 21 + func (t *UnsignedLabel) MarshalCBOR(w io.Writer) error { 22 + if t == nil { 23 + _, err := w.Write(cbg.CborNull) 24 + return err 25 + } 26 + 27 + cw := cbg.NewCborWriter(w) 28 + fieldCount := 6 29 + 30 + if t.CID == nil { 31 + fieldCount-- 32 + } 33 + 34 + if t.Neg == nil { 35 + fieldCount-- 36 + } 37 + 38 + if _, err := cw.Write(cbg.CborEncodeMajorType(cbg.MajMap, uint64(fieldCount))); err != nil { 39 + return err 40 + } 41 + 42 + // t.CID (string) (string) 43 + if t.CID != nil { 44 + 45 + if uint64(len("cid")) > cbg.MaxLength { 46 + return xerrors.Errorf("Value in field \"cid\" was too long") 47 + } 48 + 49 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("cid"))); err != nil { 50 + return err 51 + } 52 + if _, err := cw.WriteString(string("cid")); err != nil { 53 + return err 54 + } 55 + 56 + if t.CID == nil { 57 + if _, err := cw.Write(cbg.CborNull); err != nil { 58 + return err 59 + } 60 + } else { 61 + if uint64(len(*t.CID)) > cbg.MaxLength { 62 + return xerrors.Errorf("Value in field t.CID was too long") 63 + } 64 + 65 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(*t.CID))); err != nil { 66 + return err 67 + } 68 + if _, err := cw.WriteString(string(*t.CID)); err != nil { 69 + return err 70 + } 71 + } 72 + } 73 + 74 + // t.CTS (string) (string) 75 + if uint64(len("cts")) > cbg.MaxLength { 76 + return xerrors.Errorf("Value in field \"cts\" was too long") 77 + } 78 + 79 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("cts"))); err != nil { 80 + return err 81 + } 82 + if _, err := cw.WriteString(string("cts")); err != nil { 83 + return err 84 + } 85 + 86 + if uint64(len(t.CTS)) > cbg.MaxLength { 87 + return xerrors.Errorf("Value in field t.CTS was too long") 88 + } 89 + 90 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.CTS))); err != nil { 91 + return err 92 + } 93 + if _, err := cw.WriteString(string(t.CTS)); err != nil { 94 + return err 95 + } 96 + 97 + // t.Neg (bool) (bool) 98 + if t.Neg != nil { 99 + 100 + if uint64(len("neg")) > cbg.MaxLength { 101 + return xerrors.Errorf("Value in field \"neg\" was too long") 102 + } 103 + 104 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("neg"))); err != nil { 105 + return err 106 + } 107 + if _, err := cw.WriteString(string("neg")); err != nil { 108 + return err 109 + } 110 + 111 + if t.Neg == nil { 112 + if _, err := cw.Write(cbg.CborNull); err != nil { 113 + return err 114 + } 115 + } else { 116 + if err := cbg.WriteBool(w, *t.Neg); err != nil { 117 + return err 118 + } 119 + } 120 + } 121 + 122 + // t.Src (string) (string) 123 + if uint64(len("src")) > cbg.MaxLength { 124 + return xerrors.Errorf("Value in field \"src\" was too long") 125 + } 126 + 127 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("src"))); err != nil { 128 + return err 129 + } 130 + if _, err := cw.WriteString(string("src")); err != nil { 131 + return err 132 + } 133 + 134 + if uint64(len(t.Src)) > cbg.MaxLength { 135 + return xerrors.Errorf("Value in field t.Src was too long") 136 + } 137 + 138 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Src))); err != nil { 139 + return err 140 + } 141 + if _, err := cw.WriteString(string(t.Src)); err != nil { 142 + return err 143 + } 144 + 145 + // t.URI (string) (string) 146 + if uint64(len("uri")) > cbg.MaxLength { 147 + return xerrors.Errorf("Value in field \"uri\" was too long") 148 + } 149 + 150 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("uri"))); err != nil { 151 + return err 152 + } 153 + if _, err := cw.WriteString(string("uri")); err != nil { 154 + return err 155 + } 156 + 157 + if uint64(len(t.URI)) > cbg.MaxLength { 158 + return xerrors.Errorf("Value in field t.URI was too long") 159 + } 160 + 161 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.URI))); err != nil { 162 + return err 163 + } 164 + if _, err := cw.WriteString(string(t.URI)); err != nil { 165 + return err 166 + } 167 + 168 + // t.Val (string) (string) 169 + if uint64(len("val")) > cbg.MaxLength { 170 + return xerrors.Errorf("Value in field \"val\" was too long") 171 + } 172 + 173 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len("val"))); err != nil { 174 + return err 175 + } 176 + if _, err := cw.WriteString(string("val")); err != nil { 177 + return err 178 + } 179 + 180 + if uint64(len(t.Val)) > cbg.MaxLength { 181 + return xerrors.Errorf("Value in field t.Val was too long") 182 + } 183 + 184 + if err := cw.WriteMajorTypeHeader(cbg.MajTextString, uint64(len(t.Val))); err != nil { 185 + return err 186 + } 187 + if _, err := cw.WriteString(string(t.Val)); err != nil { 188 + return err 189 + } 190 + return nil 191 + } 192 + 193 + func (t *UnsignedLabel) UnmarshalCBOR(r io.Reader) (err error) { 194 + *t = UnsignedLabel{} 195 + 196 + cr := cbg.NewCborReader(r) 197 + 198 + maj, extra, err := cr.ReadHeader() 199 + if err != nil { 200 + return err 201 + } 202 + defer func() { 203 + if err == io.EOF { 204 + err = io.ErrUnexpectedEOF 205 + } 206 + }() 207 + 208 + if maj != cbg.MajMap { 209 + return fmt.Errorf("cbor input should be of type map") 210 + } 211 + 212 + if extra > cbg.MaxLength { 213 + return fmt.Errorf("UnsignedLabel: map struct too large (%d)", extra) 214 + } 215 + 216 + var name string 217 + n := extra 218 + 219 + for i := uint64(0); i < n; i++ { 220 + 221 + { 222 + sval, err := cbg.ReadString(cr) 223 + if err != nil { 224 + return err 225 + } 226 + 227 + name = string(sval) 228 + } 229 + 230 + switch name { 231 + // t.CID (string) (string) 232 + case "cid": 233 + 234 + { 235 + b, err := cr.ReadByte() 236 + if err != nil { 237 + return err 238 + } 239 + if b != cbg.CborNull[0] { 240 + if err := cr.UnreadByte(); err != nil { 241 + return err 242 + } 243 + 244 + sval, err := cbg.ReadString(cr) 245 + if err != nil { 246 + return err 247 + } 248 + 249 + t.CID = (*string)(&sval) 250 + } 251 + } 252 + // t.CTS (string) (string) 253 + case "cts": 254 + 255 + { 256 + sval, err := cbg.ReadString(cr) 257 + if err != nil { 258 + return err 259 + } 260 + 261 + t.CTS = string(sval) 262 + } 263 + // t.Neg (bool) (bool) 264 + case "neg": 265 + 266 + { 267 + b, err := cr.ReadByte() 268 + if err != nil { 269 + return err 270 + } 271 + if b != cbg.CborNull[0] { 272 + if err := cr.UnreadByte(); err != nil { 273 + return err 274 + } 275 + 276 + maj, extra, err = cr.ReadHeader() 277 + if err != nil { 278 + return err 279 + } 280 + if maj != cbg.MajOther { 281 + return fmt.Errorf("booleans must be major type 7") 282 + } 283 + 284 + var val bool 285 + switch extra { 286 + case 20: 287 + val = false 288 + case 21: 289 + val = true 290 + default: 291 + return fmt.Errorf("booleans are either major type 7, value 20 or 21 (got %d)", extra) 292 + } 293 + t.Neg = &val 294 + } 295 + } 296 + // t.Src (string) (string) 297 + case "src": 298 + 299 + { 300 + sval, err := cbg.ReadString(cr) 301 + if err != nil { 302 + return err 303 + } 304 + 305 + t.Src = string(sval) 306 + } 307 + // t.URI (string) (string) 308 + case "uri": 309 + 310 + { 311 + sval, err := cbg.ReadString(cr) 312 + if err != nil { 313 + return err 314 + } 315 + 316 + t.URI = string(sval) 317 + } 318 + // t.Val (string) (string) 319 + case "val": 320 + 321 + { 322 + sval, err := cbg.ReadString(cr) 323 + if err != nil { 324 + return err 325 + } 326 + 327 + t.Val = string(sval) 328 + } 329 + 330 + default: 331 + // Field doesn't exist on this type, so ignore it 332 + cbg.ScanForLinks(r, func(cid.Cid) {}) 333 + } 334 + } 335 + 336 + return nil 337 + }
+35
util/labels/labels.go
··· 1 + package labels 2 + 3 + import ( 4 + "bytes" 5 + 6 + "github.com/bluesky-social/indigo/api/atproto" 7 + ) 8 + 9 + // UnsignedLabel is a label without the signature so we can validate it 10 + type UnsignedLabel struct { 11 + // cid: Optionally, CID specifying the specific version of 'uri' resource this label applies to. 12 + CID *string `json:"cid,omitempty" cborgen:"cid,omitempty"` 13 + // cts: Timestamp when this label was created. 14 + CTS string `json:"cts" cborgen:"cts"` 15 + // neg: If true, this is a negation label, overwriting a previous label. 16 + Neg *bool `json:"neg,omitempty" cborgen:"neg,omitempty"` 17 + // src: DID of the actor who created this label. 18 + Src string `json:"src" cborgen:"src"` 19 + // uri: AT URI of the record, repository (account), or other resource that this label applies to. 20 + URI string `json:"uri" cborgen:"uri"` 21 + // val: The short string name of the value or type of this label. 22 + Val string `json:"val" cborgen:"val"` 23 + } 24 + 25 + // SignedLabel is a label with a signature, this type is generated via lexgen but aliased here for convenience 26 + type SignedLabel atproto.LabelDefs_Label 27 + 28 + // BytesForSigning returns bytes of the DAG-CBOR representation of object 29 + func (ul *UnsignedLabel) BytesForSigning() ([]byte, error) { 30 + buf := new(bytes.Buffer) 31 + if err := ul.MarshalCBOR(buf); err != nil { 32 + return []byte{}, err 33 + } 34 + return buf.Bytes(), nil 35 + }