xref: /aosp_15_r20/external/sandboxed-api/contrib/libzip/utils/utils_zip.h (revision ec63e07ab9515d95e79c211197c445ef84cefa6a)
1 *ec63e07aSXin Li // Copyright 2022 Google LLC
2 *ec63e07aSXin Li //
3 *ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4 *ec63e07aSXin Li // you may not use this file except in compliance with the License.
5 *ec63e07aSXin Li // You may obtain a copy of the License at
6 *ec63e07aSXin Li //
7 *ec63e07aSXin Li //     https://www.apache.org/licenses/LICENSE-2.0
8 *ec63e07aSXin Li //
9 *ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10 *ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11 *ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 *ec63e07aSXin Li // See the License for the specific language governing permissions and
13 *ec63e07aSXin Li // limitations under the License.
14 *ec63e07aSXin Li 
15 *ec63e07aSXin Li #ifndef CONTRIB_LIBZIP_UTILS_UTILS_ZIP_H_
16 *ec63e07aSXin Li #define CONTRIB_LIBZIP_UTILS_UTILS_ZIP_H_
17 *ec63e07aSXin Li 
18 *ec63e07aSXin Li #include <fcntl.h>
19 *ec63e07aSXin Li 
20 *ec63e07aSXin Li #include "absl/log/die_if_null.h"
21 *ec63e07aSXin Li #include "contrib/libzip/sandboxed.h"
22 *ec63e07aSXin Li #include "sandboxed_api/util/status_macros.h"
23 *ec63e07aSXin Li 
24 *ec63e07aSXin Li class LibZip {
25 *ec63e07aSXin Li  public:
LibZip(ZipSandbox * sandbox,std::string filename,int flags)26 *ec63e07aSXin Li   explicit LibZip(ZipSandbox* sandbox, std::string filename, int flags)
27 *ec63e07aSXin Li       : sandbox_(ABSL_DIE_IF_NULL(sandbox)),
28 *ec63e07aSXin Li         api_(sandbox_),
29 *ec63e07aSXin Li         filename_(std::move(filename)),
30 *ec63e07aSXin Li         flags_(flags),
31 *ec63e07aSXin Li         rfd_(open(filename.c_str(), O_RDWR | O_CREAT)) {
32 *ec63e07aSXin Li     OpenRemote().IgnoreError();
33 *ec63e07aSXin Li   }
34 *ec63e07aSXin Li 
35 *ec63e07aSXin Li   ~LibZip();
36 *ec63e07aSXin Li 
37 *ec63e07aSXin Li   bool IsOpen();
38 *ec63e07aSXin Li 
39 *ec63e07aSXin Li   absl::StatusOr<std::string> GetName(uint64_t index);
40 *ec63e07aSXin Li   absl::StatusOr<uint64_t> GetNumberEntries();
41 *ec63e07aSXin Li   absl::StatusOr<std::vector<uint8_t>> ReadFile(uint64_t index);
42 *ec63e07aSXin Li   absl::StatusOr<std::vector<uint8_t>> ReadFile(const std::string& filename);
43 *ec63e07aSXin Li   absl::StatusOr<uint64_t> AddFile(const std::string& filename,
44 *ec63e07aSXin Li                                    std::vector<uint8_t>& buf);
45 *ec63e07aSXin Li   absl::StatusOr<uint64_t> AddFile(const std::string& filename, int fd);
46 *ec63e07aSXin Li   absl::Status ReplaceFile(uint64_t index, std::vector<uint8_t>& buf);
47 *ec63e07aSXin Li   absl::Status ReplaceFile(uint64_t index, int fd);
48 *ec63e07aSXin Li   absl::Status DeleteFile(uint64_t index);
49 *ec63e07aSXin Li 
50 *ec63e07aSXin Li   absl::StatusOr<std::string> GetError();
51 *ec63e07aSXin Li 
52 *ec63e07aSXin Li   absl::Status Finish();
53 *ec63e07aSXin Li   // Save a copy of file to another fd.
54 *ec63e07aSXin Li   absl::Status Save(int fd);
55 *ec63e07aSXin Li   // Save a copy to the same fd.
56 *ec63e07aSXin Li   absl::Status Save();
57 *ec63e07aSXin Li 
58 *ec63e07aSXin Li  protected:
59 *ec63e07aSXin Li   bool IsOpenLocal();
60 *ec63e07aSXin Li   absl::Status OpenRemote();
61 *ec63e07aSXin Li   absl::StatusOr<std::vector<uint8_t>> ReadFile(sapi::v::RemotePtr& zipfile,
62 *ec63e07aSXin Li                                                 uint32_t size);
63 *ec63e07aSXin Li   absl::StatusOr<uint64_t> AddFile(const std::string& filename,
64 *ec63e07aSXin Li                                    sapi::v::RemotePtr& rzipsource);
65 *ec63e07aSXin Li   absl::Status ReplaceFile(uint64_t index, sapi::v::RemotePtr& rzipsource);
66 *ec63e07aSXin Li 
67 *ec63e07aSXin Li   absl::StatusOr<void*> GetSource(std::vector<uint8_t>& buf);
68 *ec63e07aSXin Li   absl::StatusOr<void*> GetSource(int fd, const std::string& mode);
69 *ec63e07aSXin Li   absl::StatusOr<void*> CreateSourceFromFd(sapi::v::Fd& rfd);
70 *ec63e07aSXin Li 
71 *ec63e07aSXin Li   absl::Status Save(sapi::v::Fd& fd);
72 *ec63e07aSXin Li 
73 *ec63e07aSXin Li   absl::Status CheckOpen();
74 *ec63e07aSXin Li   absl::Status CheckFinished();
75 *ec63e07aSXin Li 
76 *ec63e07aSXin Li  private:
77 *ec63e07aSXin Li   ZipSandbox* sandbox_;
78 *ec63e07aSXin Li   ZipApi api_;
79 *ec63e07aSXin Li   int flags_;
80 *ec63e07aSXin Li   std::unique_ptr<sapi::v::RemotePtr> zip_;
81 *ec63e07aSXin Li   std::unique_ptr<sapi::v::RemotePtr> zipsource_;
82 *ec63e07aSXin Li   sapi::v::Fd rfd_;
83 *ec63e07aSXin Li   std::string filename_;
84 *ec63e07aSXin Li };
85 *ec63e07aSXin Li 
86 *ec63e07aSXin Li #endif  // CONTRIB_LIBZIP_UTILS_UTILS_ZIP_H_
87