(stream proto.DRPCProvisionerDaemon_UploadFileStream)
| 1486 | } |
| 1487 | |
| 1488 | func (s *server) UploadFile(stream proto.DRPCProvisionerDaemon_UploadFileStream) error { |
| 1489 | var file *sdkproto.DataBuilder |
| 1490 | // Always terminate the stream with an empty response. |
| 1491 | //nolint:errcheck // We can't do much about send errors here. |
| 1492 | defer stream.SendAndClose(&proto.Empty{}) |
| 1493 | |
| 1494 | file, err := provisionersdk.HandleReceivingDataUpload(stream) |
| 1495 | if err != nil { |
| 1496 | return err |
| 1497 | } |
| 1498 | |
| 1499 | fileData, err := file.Complete() |
| 1500 | if err != nil { |
| 1501 | return xerrors.Errorf("complete file upload: %w", err) |
| 1502 | } |
| 1503 | |
| 1504 | // Just rehash the data to be sure it is correct. |
| 1505 | hashBytes := sha256.Sum256(fileData) |
| 1506 | hash := hex.EncodeToString(hashBytes[:]) |
| 1507 | |
| 1508 | var insert database.InsertFileParams |
| 1509 | |
| 1510 | switch file.Type { |
| 1511 | case sdkproto.DataUploadType_UPLOAD_TYPE_MODULE_FILES: |
| 1512 | insert = database.InsertFileParams{ |
| 1513 | ID: uuid.New(), |
| 1514 | Hash: hash, |
| 1515 | CreatedAt: dbtime.Now(), |
| 1516 | CreatedBy: uuid.Nil, |
| 1517 | Mimetype: tarMimeType, |
| 1518 | Data: fileData, |
| 1519 | } |
| 1520 | default: |
| 1521 | return xerrors.Errorf("unsupported file upload type: %s", file.Type) |
| 1522 | } |
| 1523 | |
| 1524 | //nolint:gocritic // Provisionerd actor |
| 1525 | _, err = s.Database.InsertFile(dbauthz.AsProvisionerd(s.lifecycleCtx), insert) |
| 1526 | if err != nil { |
| 1527 | // Duplicated files already exist in the database, so we can ignore this error. |
| 1528 | if !database.IsUniqueViolation(err, database.UniqueFilesHashCreatedByKey) { |
| 1529 | return xerrors.Errorf("insert file: %w", err) |
| 1530 | } |
| 1531 | } |
| 1532 | |
| 1533 | s.Logger.Info(s.lifecycleCtx, "file uploaded to database", |
| 1534 | slog.F("type", file.Type.String()), |
| 1535 | slog.F("hash", hash), |
| 1536 | slog.F("size", len(fileData)), |
| 1537 | // new_insert indicates whether the file was newly inserted or already existed. |
| 1538 | slog.F("new_insert", err == nil), |
| 1539 | ) |
| 1540 | |
| 1541 | return nil |
| 1542 | } |
| 1543 | |
| 1544 | // DownloadFile pulls the requested file from the database and sends it over the protobuf stream in chunks. |
| 1545 | func (s *server) DownloadFile(request *proto.FileRequest, stream proto.DRPCProvisionerDaemon_DownloadFileStream) error { |
nothing calls this directly
no test coverage detected