processEncryptedMetaBlob decrypts dat (the data for the br meta blob) and parses its meta lines, updating the index. processEncryptedMetaBlob is not thread-safe.
(br blob.Ref, dat []byte)
| 209 | // |
| 210 | // processEncryptedMetaBlob is not thread-safe. |
| 211 | func (s *storage) processEncryptedMetaBlob(br blob.Ref, dat []byte) error { |
| 212 | plainBytes := pools.BytesBuffer() |
| 213 | defer pools.PutBuffer(plainBytes) |
| 214 | |
| 215 | if err := s.decryptBlob(plainBytes, bytes.NewBuffer(dat)); err != nil { |
| 216 | return err |
| 217 | } |
| 218 | |
| 219 | header, err := plainBytes.ReadString('\n') |
| 220 | if err != nil { |
| 221 | return errors.New("No first line") |
| 222 | } |
| 223 | if header != "#camlistore/encmeta=2\n" { |
| 224 | if len(header) > 80 { |
| 225 | header = header[:80] |
| 226 | } |
| 227 | return fmt.Errorf("unsupported first line %q", header) |
| 228 | } |
| 229 | var plains []blob.Ref |
| 230 | for { |
| 231 | line, err := plainBytes.ReadString('\n') |
| 232 | if err != nil && len(line) != 0 { |
| 233 | return io.ErrUnexpectedEOF |
| 234 | } else if err != nil { |
| 235 | break |
| 236 | } |
| 237 | parts := strings.Split(strings.TrimRight(line, "\n"), "/") |
| 238 | if len(parts) != 3 { |
| 239 | if len(line) > 80 { |
| 240 | line = line[:80] |
| 241 | } |
| 242 | return fmt.Errorf("malformed line %q", line) |
| 243 | } |
| 244 | // We do very limited checking here, as we signed the blob and we check |
| 245 | // the value anyway on s.index.Get. |
| 246 | plainBR, ok := blob.ParseKnown(parts[0]) |
| 247 | if !ok { |
| 248 | if len(line) > 80 { |
| 249 | line = line[:80] |
| 250 | } |
| 251 | return fmt.Errorf("malformed line %q", line) |
| 252 | } |
| 253 | plains = append(plains, plainBR) |
| 254 | if err := s.index.Set(parts[0], parts[1]+"/"+parts[2]); err != nil { |
| 255 | return err |
| 256 | } |
| 257 | } |
| 258 | s.recordMeta(&metaBlob{br: br, plains: plains}) |
| 259 | return nil |
| 260 | } |
| 261 | |
| 262 | func (s *storage) readAllMetaBlobs() error { |
| 263 | type encMB struct { |
no test coverage detected