12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package pkg
- import (
- "archive/zip"
- "context"
- "fmt"
- "github.com/ente-io/cli/internal/crypto"
- "github.com/ente-io/cli/pkg/model"
- "github.com/ente-io/cli/utils"
- "github.com/ente-io/cli/utils/encoding"
- "io"
- "log"
- "os"
- "path/filepath"
- "strings"
- )
- func (c *ClICtrl) downloadAndDecrypt(
- ctx context.Context,
- file model.RemoteFile,
- deviceKey []byte,
- ) (*string, error) {
- dir := c.tempFolder
- downloadPath := fmt.Sprintf("%s/%d", dir, file.ID)
- // check if file exists
- if stat, err := os.Stat(downloadPath); err == nil && stat.Size() == file.Info.FileSize {
- log.Printf("File already exists %s (%s)", file.GetTitle(), utils.ByteCountDecimal(file.Info.FileSize))
- } else {
- log.Printf("Downloading %s (%s)", file.GetTitle(), utils.ByteCountDecimal(file.Info.FileSize))
- err := c.Client.DownloadFile(ctx, file.ID, downloadPath)
- if err != nil {
- return nil, fmt.Errorf("error downloading file %d: %w", file.ID, err)
- }
- }
- decryptedPath := fmt.Sprintf("%s/%d.decrypted", dir, file.ID)
- err := crypto.DecryptFile(downloadPath, decryptedPath, file.Key.MustDecrypt(deviceKey), encoding.DecodeBase64(file.FileNonce))
- if err != nil {
- log.Printf("Error decrypting file %d: %s", file.ID, err)
- return nil, model.ErrDecryption
- } else {
- _ = os.Remove(downloadPath)
- }
- return &decryptedPath, nil
- }
- func UnpackLive(src string) (imagePath, videoPath string, retErr error) {
- var filenames []string
- reader, err := zip.OpenReader(src)
- if err != nil {
- retErr = err
- return
- }
- defer reader.Close()
- dest := filepath.Dir(src)
- for _, file := range reader.File {
- destFilePath := filepath.Join(dest, file.Name)
- filenames = append(filenames, destFilePath)
- destDir := filepath.Dir(destFilePath)
- if err := os.MkdirAll(destDir, 0755); err != nil {
- retErr = err
- return
- }
- destFile, err := os.Create(destFilePath)
- if err != nil {
- retErr = err
- return
- }
- defer destFile.Close()
- srcFile, err := file.Open()
- if err != nil {
- retErr = err
- return
- }
- defer srcFile.Close()
- _, err = io.Copy(destFile, srcFile)
- if err != nil {
- retErr = err
- return
- }
- }
- for _, filepath := range filenames {
- if strings.Contains(strings.ToLower(filepath), "image") {
- imagePath = filepath
- } else if strings.Contains(strings.ToLower(filepath), "video") {
- videoPath = filepath
- } else {
- retErr = fmt.Errorf("unexpcted file in zip %s", filepath)
- }
- }
- return
- }
|