Line data Source code
1 : /*
2 : * Copyright (C) 2004-2026 Savoir-faire Linux Inc.
3 : *
4 : * This program is free software: you can redistribute it and/or modify
5 : * it under the terms of the GNU General Public License as published by
6 : * the Free Software Foundation, either version 3 of the License, or
7 : * (at your option) any later version.
8 : *
9 : * This program is distributed in the hope that it will be useful,
10 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 : * GNU General Public License for more details.
13 : *
14 : * You should have received a copy of the GNU General Public License
15 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 : */
17 : #pragma once
18 : #include "jami/def.h"
19 :
20 : #include <dhtnet/fileutils.h>
21 :
22 : #include <string>
23 : #include <vector>
24 : #include <chrono>
25 : #include <mutex>
26 : #include <cstdio>
27 : #include <ios>
28 : #include <filesystem>
29 : #include <string_view>
30 :
31 : #ifndef _WIN32
32 : #include <sys/stat.h> // mode_t
33 : #define DIR_SEPARATOR_STR "/" // Directory separator string
34 : #define DIR_SEPARATOR_CH '/' // Directory separator char
35 : #define DIR_SEPARATOR_STR_ESC "\\/" // Escaped directory separator string
36 : #else
37 : #define mode_t unsigned
38 : #define DIR_SEPARATOR_STR "\\" // Directory separator string
39 : #define DIR_SEPARATOR_CH '\\' // Directory separator char
40 : #define DIR_SEPARATOR_STR_ESC "//*" // Escaped directory separator string
41 : #endif
42 :
43 : namespace jami {
44 : namespace fileutils {
45 :
46 : using namespace std::literals;
47 :
48 : std::filesystem::path get_config_dir(const char* pkg);
49 : std::filesystem::path get_data_dir(const char* pkg);
50 : std::filesystem::path get_cache_dir(const char* pkg);
51 :
52 : const std::filesystem::path& get_home_dir();
53 : const std::filesystem::path& get_config_dir();
54 : const std::filesystem::path& get_data_dir();
55 : const std::filesystem::path& get_cache_dir();
56 :
57 : /**
58 : * Set the program's resource directory path. This is used for clients that may be installed in
59 : * different locations and are deployed with ringtones and other resources in an application
60 : * relative directory.
61 : * @param resource_dir_path The path to the ringtone directory.
62 : */
63 : LIBJAMI_PUBLIC void set_resource_dir_path(const std::filesystem::path& resourceDirPath);
64 :
65 : /**
66 : * Get the resource directory path that was set with set_resource_dir_path.
67 : * @return The resource directory path.
68 : */
69 : const std::filesystem::path& get_resource_dir_path();
70 :
71 : /**
72 : * Expand the given path.
73 : * @param path The path to be expanded.
74 : * @return The expanded path as a string.
75 : */
76 : std::string expand_path(const std::string& path);
77 :
78 : bool isPathRelative(const std::filesystem::path& path);
79 :
80 : /**
81 : * If path is contained in base, return the suffix, otherwise return the full path.
82 : * @param base must not finish with DIR_SEPARATOR_STR, can be empty
83 : * @param path the path
84 : */
85 : std::string getCleanPath(const std::string& base, const std::string& path);
86 : /**
87 : * If path is relative, it is appended to base.
88 : */
89 : std::filesystem::path getFullPath(const std::filesystem::path& base, const std::filesystem::path& path);
90 :
91 : bool createFileLink(const std::filesystem::path& src, const std::filesystem::path& dest, bool hard = false);
92 :
93 : std::string_view getFileExtension(std::string_view filename);
94 :
95 : bool isDirectoryWritable(const std::string& directory);
96 :
97 : /**
98 : * Read the full content of a file at path.
99 : * If path is relative, it is appended to default_dir.
100 : */
101 : std::vector<uint8_t> loadFile(const std::filesystem::path& path, const std::filesystem::path& default_dir = {});
102 : std::string loadTextFile(const std::filesystem::path& path, const std::filesystem::path& default_dir = {});
103 :
104 : void saveFile(const std::filesystem::path& path, const uint8_t* data, size_t data_size, mode_t mode = 0644);
105 : inline void
106 1572 : saveFile(const std::filesystem::path& path, const std::vector<uint8_t>& data, mode_t mode = 0644)
107 : {
108 1572 : saveFile(path, data.data(), data.size(), mode);
109 1572 : }
110 :
111 : std::vector<uint8_t> loadCacheFile(const std::filesystem::path& path, std::chrono::system_clock::duration maxAge);
112 : std::string loadCacheTextFile(const std::filesystem::path& path, std::chrono::system_clock::duration maxAge);
113 :
114 : static constexpr auto ARCHIVE_AUTH_SCHEME_NONE = ""sv;
115 : static constexpr auto ARCHIVE_AUTH_SCHEME_PASSWORD = "password"sv;
116 : static constexpr auto ARCHIVE_AUTH_SCHEME_KEY = "key"sv;
117 :
118 : struct ArchiveStorageData
119 : {
120 : std::string data;
121 : std::vector<uint8_t> salt;
122 : };
123 : ArchiveStorageData readArchive(const std::filesystem::path& path, std::string_view scheme, const std::string& pwd);
124 :
125 : bool writeArchive(const std::string& data,
126 : const std::filesystem::path& path,
127 : std::string_view scheme,
128 : const std::string& password = {},
129 : const std::vector<uint8_t>& password_salt = {});
130 :
131 : std::string sha3File(const std::filesystem::path& path);
132 : std::string sha3sum(const std::vector<uint8_t>& buffer);
133 :
134 : /**
135 : * Windows compatibility wrapper for checking read-only attribute
136 : */
137 : int accessFile(const std::string& file, int mode);
138 :
139 : /**
140 : * Return the last write time (epoch time) of a given file path (in seconds).
141 : */
142 : uint64_t lastWriteTimeInSeconds(const std::filesystem::path& filePath);
143 :
144 : std::string getOrCreateLocalDeviceId();
145 :
146 : } // namespace fileutils
147 : } // namespace jami
|