Skip to content

Commit 2d96e9f

Browse files
committed
Adding a file recording function with locking. Processing default textures with sha256 hash
1 parent 11ab75e commit 2d96e9f

File tree

4 files changed

+56
-15
lines changed

4 files changed

+56
-15
lines changed

.env.example

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,4 @@ TEXTURE_COLLECTION_PATH=collection
4949
TEXTURE_EXTENSTION=png
5050

5151
LEGACY_DIGEST=false
52-
MAX_SIZE_BYTES=2M
53-
SKIN_DEFAULT=iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAWlBMVEVHcEwsHg51Ri9qQC+HVTgjIyNOLyK7inGrfWaWb1udZkj///9SPYmAUjaWX0FWScwoKCgAzMwAXl4AqKgAaGgwKHImIVtGOqU6MYkAf38AmpoAr68/Pz9ra2t3xPtNAAAAAXRSTlMAQObYZgAAAZJJREFUeNrUzLUBwDAUA9EPMsmw/7jhNljl9Xdy0J3t5CndmcOBT4Mw8/8P4pfB6sNg9yA892wQvwzSIr8f5JRzSeS7AaiptpxazUq8GPQB5uSe2DH644GTsDFsNrqB9CcDgOCAmffegWWwAExnBrljqowsFBuGYShY5oakgOXs/39zF6voDG9r+wLvTCVUcL+uV4m6uXG/L3Ut691697tgnZgJavinQHOB7DD8awmaLWEmaNuu7YGf6XcIITRm19P1ahbARCRGEc8x/UZ4CroXAQTVIGL0YySrREBADFGicS8XtG8CTS+IGU2F6EgSE34VNKoNz8348mzoXGDxpxkQBpg2bWobjgZSm+uiKDYH2BAO8C4YBmbgAjpq5jUl4yGJC46HQ7HJBfkeTAImIEmgmtpINi44JsHx+CKA/BTuArISXeBTR4AI5gK4C2JqRfPs0HNBkQnG8S4Yxw8IGoIZfXEBOW1D4YJDAdNSXgRevP+ylK6fGBCwsWywmA19EtBkJr8K2t4N5pnAVwH0jptsBp+2gUFj4tL5ywAAAABJRU5ErkJggg==
54-
CAPE_DEFAULT=iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgAQMAAACYU+zHAAAAA1BMVEVHcEyC+tLSAAAAAXRSTlMAQObYZgAAAAxJREFUeAFjGAV4AQABIAABL3HDQQAAAABJRU5ErkJggg==
52+
MAX_SIZE_BYTES=2M

src/Contracts/Texture/Enum/ResponseTypeEnum.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ enum ResponseTypeEnum: int implements JsonSerializable, EnumInterface, EnumReque
2323
case BACK = 7;
2424
case BACK_CAPE = 8;
2525
case BACK_WITH_CAPE = 9;
26-
case CAPE_RESIZE = 10;
26+
case SKIN_RESIZE = 10; // Native
27+
case CAPE_RESIZE = 11;
2728

2829
public static function getDefault(): static
2930
{

src/Helpers/FileSystem.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,23 @@ public static function mkdir(string $directory): void
6666
{
6767
mkdir($directory, 0755, true) ?: throw FileSystemException::createForbidden($directory);
6868
}
69+
public static function save_lock(string $data, string $path): void
70+
{
71+
try {
72+
$fp = fopen($path, 'w');
73+
if ($fp === false) throw new FileSystemException("Не удалось открыть файл для записи");
74+
if (flock($fp, LOCK_EX) === false) throw new FileSystemException("Не удалось заблокировать файл для записи");
75+
if (fwrite($fp, $data) === false) throw new FileSystemException("Ошибка при записи данных в файл");
76+
fflush($fp);
77+
if (flock($fp, LOCK_UN) === false) throw new FileSystemException("Не удалось заблокировать файл для записи");
78+
fclose($fp);
79+
} catch (FileSystemException $e) {
80+
if (isset($fp) && is_resource($fp)) {
81+
fclose($fp);
82+
}
83+
throw $e;
84+
}
85+
}
6986
public function recursiveSearchNameFileCaseInsensitive(string $directory, string $fileName, ?string $extension = null, int $level = -1): string|null
7087
{
7188
$extension ??= '';

src/Utils/Texture.php

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Microwin7\PHPUtils\Utils;
44

55
use Microwin7\PHPUtils\Utils\Path;
6+
use Microwin7\PHPUtils\Rules\Regex;
67
use Microwin7\PHPUtils\Configs\TextureConfig;
78
use function Microwin7\PHPUtils\convertToBytes;
89
use function Microwin7\PHPUtils\ar_slash_string;
@@ -25,17 +26,29 @@ class Texture extends TextureConfig
2526
private const bool LEGACY_DIGEST = false;
2627
/** Максимальный размер загружаемого файла byte => Kbyte, Kbyte => MB * 2 */
2728
private const int MAX_SIZE_BYTES = 2 * 1024 * 1024;
28-
/** https://base64.guru/converter/encode/image */
29-
private const string SKIN_DEFAULT = "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgCAMAAACVQ462AAAAWlBMVEVHcEwsHg51Ri9qQC+HVTgjIyNO
30-
LyK7inGrfWaWb1udZkj///9SPYmAUjaWX0FWScwoKCgAzMwAXl4AqKgAaGgwKHImIVtGOqU6MYkAf38AmpoAr68/Pz9ra2t3xPtNAA
31-
AAAXRSTlMAQObYZgAAAZJJREFUeNrUzLUBwDAUA9EPMsmw/7jhNljl9Xdy0J3t5CndmcOBT4Mw8/8P4pfB6sNg9yA892wQvwzSIr8f
32-
5JRzSeS7AaiptpxazUq8GPQB5uSe2DH644GTsDFsNrqB9CcDgOCAmffegWWwAExnBrljqowsFBuGYShY5oakgOXs/39zF6voDG9r+w
33-
LvTCVUcL+uV4m6uXG/L3Ut691697tgnZgJavinQHOB7DD8awmaLWEmaNuu7YGf6XcIITRm19P1ahbARCRGEc8x/UZ4CroXAQTVIGL0
34-
YySrREBADFGicS8XtG8CTS+IGU2F6EgSE34VNKoNz8348mzoXGDxpxkQBpg2bWobjgZSm+uiKDYH2BAO8C4YBmbgAjpq5jUl4yGJC4
35-
6HQ7HJBfkeTAImIEmgmtpINi44JsHx+CKA/BTuArISXeBTR4AI5gK4C2JqRfPs0HNBkQnG8S4Yxw8IGoIZfXEBOW1D4YJDAdNSXgRe
36-
vP+ylK6fGBCwsWywmA19EtBkJr8K2t4N5pnAVwH0jptsBp+2gUFj4tL5ywAAAABJRU5ErkJggg==";
29+
private const string SKIN_DEFAULT = "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";
3748
private const string CAPE_DEFAULT = "iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgAQMAAACYU+zHAAAAA1BMVEVHcEyC+tLSAAAAAXRSTlMAQObY
3849
ZgAAAAxJREFUeAFjGAV4AQABIAABL3HDQQAAAABJRU5ErkJggg==";
50+
private const string SKIN_DEFAULT_SHA256 = '1e5d79cecb89b1b839b8229cc3b8087bfccaca9d92f195b10fc6739ea92cd957';
51+
private const string CAPE_DEFAULT_SHA256 = 'f2072fdfff5302b7c13672e54fdc8895dc75b3f675be3a43245de6894f971e38';
3952

4053
/** BASE DIR */
4154
public static function STORAGE_DIR(): string
@@ -135,11 +148,23 @@ public static function MAX_SIZE_BYTES(): int
135148
}
136149
public static function SKIN_DEFAULT(): string
137150
{
138-
return base64_decode(getenv()[__FUNCTION__] ?? self::SKIN_DEFAULT) ?: throw new \InvalidArgumentException('Error base64_decode: ' . __FUNCTION__);
151+
return base64_decode(self::SKIN_DEFAULT);
139152
}
140153
public static function CAPE_DEFAULT(): string
141154
{
142-
return base64_decode(getenv()[__FUNCTION__] ?? self::CAPE_DEFAULT) ?: throw new \InvalidArgumentException('Error base64_decode: ' . __FUNCTION__);
155+
return base64_decode(self::CAPE_DEFAULT);
156+
}
157+
public static function SKIN_DEFAULT_SHA256(): string
158+
{
159+
$SKIN_DEFAULT_SHA256 = getenv()[__FUNCTION__] ?? null;
160+
$SKIN_DEFAULT_SHA256 !== null ? Regex::valid_with_pattern($SKIN_DEFAULT_SHA256, Regex::SHA256) : $SKIN_DEFAULT_SHA256 = self::SKIN_DEFAULT_SHA256;
161+
return $SKIN_DEFAULT_SHA256;
162+
}
163+
public static function CAPE_DEFAULT_SHA256(): string
164+
{
165+
$CAPE_DEFAULT_SHA256 = getenv()[__FUNCTION__] ?? null;
166+
$CAPE_DEFAULT_SHA256 !== null ? Regex::valid_with_pattern($CAPE_DEFAULT_SHA256, Regex::SHA256) : $CAPE_DEFAULT_SHA256 = self::CAPE_DEFAULT_SHA256;
167+
return $CAPE_DEFAULT_SHA256;
143168
}
144169
public static function digest(string $data, UserStorageTypeEnum $hashType = UserStorageTypeEnum::DB_SHA256): string
145170
{

0 commit comments

Comments
 (0)