download.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package pkg
  2. import (
  3. "archive/zip"
  4. "context"
  5. "fmt"
  6. "github.com/ente-io/cli/internal/crypto"
  7. "github.com/ente-io/cli/pkg/model"
  8. "github.com/ente-io/cli/utils"
  9. "github.com/ente-io/cli/utils/encoding"
  10. "io"
  11. "log"
  12. "os"
  13. "path/filepath"
  14. "strings"
  15. )
  16. func (c *ClICtrl) downloadAndDecrypt(
  17. ctx context.Context,
  18. file model.RemoteFile,
  19. deviceKey []byte,
  20. ) (*string, error) {
  21. dir := c.tempFolder
  22. downloadPath := fmt.Sprintf("%s/%d", dir, file.ID)
  23. // check if file exists
  24. if stat, err := os.Stat(downloadPath); err == nil && stat.Size() == file.Info.FileSize {
  25. log.Printf("File already exists %s (%s)", file.GetTitle(), utils.ByteCountDecimal(file.Info.FileSize))
  26. } else {
  27. log.Printf("Downloading %s (%s)", file.GetTitle(), utils.ByteCountDecimal(file.Info.FileSize))
  28. err := c.Client.DownloadFile(ctx, file.ID, downloadPath)
  29. if err != nil {
  30. return nil, fmt.Errorf("error downloading file %d: %w", file.ID, err)
  31. }
  32. }
  33. decryptedPath := fmt.Sprintf("%s/%d.decrypted", dir, file.ID)
  34. err := crypto.DecryptFile(downloadPath, decryptedPath, file.Key.MustDecrypt(deviceKey), encoding.DecodeBase64(file.FileNonce))
  35. if err != nil {
  36. log.Printf("Error decrypting file %d: %s", file.ID, err)
  37. return nil, model.ErrDecryption
  38. } else {
  39. _ = os.Remove(downloadPath)
  40. }
  41. return &decryptedPath, nil
  42. }
  43. func UnpackLive(src string) (imagePath, videoPath string, retErr error) {
  44. var filenames []string
  45. reader, err := zip.OpenReader(src)
  46. if err != nil {
  47. retErr = err
  48. return
  49. }
  50. defer reader.Close()
  51. dest := filepath.Dir(src)
  52. for _, file := range reader.File {
  53. destFilePath := filepath.Join(dest, file.Name)
  54. filenames = append(filenames, destFilePath)
  55. destDir := filepath.Dir(destFilePath)
  56. if err := os.MkdirAll(destDir, 0755); err != nil {
  57. retErr = err
  58. return
  59. }
  60. destFile, err := os.Create(destFilePath)
  61. if err != nil {
  62. retErr = err
  63. return
  64. }
  65. defer destFile.Close()
  66. srcFile, err := file.Open()
  67. if err != nil {
  68. retErr = err
  69. return
  70. }
  71. defer srcFile.Close()
  72. _, err = io.Copy(destFile, srcFile)
  73. if err != nil {
  74. retErr = err
  75. return
  76. }
  77. }
  78. for _, filepath := range filenames {
  79. if strings.Contains(strings.ToLower(filepath), "image") {
  80. imagePath = filepath
  81. } else if strings.Contains(strings.ToLower(filepath), "video") {
  82. videoPath = filepath
  83. } else {
  84. retErr = fmt.Errorf("unexpcted file in zip %s", filepath)
  85. }
  86. }
  87. return
  88. }