Add encrypted day storage and personal backups
This commit is contained in:
@@ -4,6 +4,13 @@ declare(strict_types=1);
|
||||
|
||||
final class EntryRepository
|
||||
{
|
||||
private EntryCrypto $crypto;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->crypto = new EntryCrypto();
|
||||
}
|
||||
|
||||
public function save(string $username, string $date, array $entry, array $evaluation): void
|
||||
{
|
||||
$path = $this->pathFor($username, $date);
|
||||
@@ -13,7 +20,8 @@ final class EntryRepository
|
||||
mkdir($directory, 0775, true);
|
||||
}
|
||||
|
||||
file_put_contents($path, $this->toMarkdown($username, $date, $entry, $evaluation));
|
||||
$markdown = $this->toMarkdown($username, $date, $entry, $evaluation);
|
||||
file_put_contents($path, $this->crypto->encrypt($markdown), LOCK_EX);
|
||||
}
|
||||
|
||||
public function find(string $username, string $date): ?array
|
||||
@@ -24,7 +32,14 @@ final class EntryRepository
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->parse((string) file_get_contents($path), $date);
|
||||
$content = (string) file_get_contents($path);
|
||||
$plaintext = $this->crypto->decrypt($content);
|
||||
|
||||
if ($this->crypto->shouldEncrypt() && !$this->crypto->isEncrypted($content)) {
|
||||
file_put_contents($path, $this->crypto->encrypt($plaintext), LOCK_EX);
|
||||
}
|
||||
|
||||
return $this->parse($plaintext, $date);
|
||||
}
|
||||
|
||||
public function all(string $username): array
|
||||
@@ -41,7 +56,14 @@ final class EntryRepository
|
||||
$entries = [];
|
||||
foreach ($files as $file) {
|
||||
$date = basename($file, '.txt');
|
||||
$parsed = $this->parse((string) file_get_contents($file), $date);
|
||||
$content = (string) file_get_contents($file);
|
||||
$plaintext = $this->crypto->decrypt($content);
|
||||
|
||||
if ($this->crypto->shouldEncrypt() && !$this->crypto->isEncrypted($content)) {
|
||||
file_put_contents($file, $this->crypto->encrypt($plaintext), LOCK_EX);
|
||||
}
|
||||
|
||||
$parsed = $this->parse($plaintext, $date);
|
||||
if ($parsed !== null) {
|
||||
$entries[] = $parsed;
|
||||
}
|
||||
@@ -50,6 +72,18 @@ final class EntryRepository
|
||||
return $entries;
|
||||
}
|
||||
|
||||
public function parseMarkdown(string $content, string $fallbackDate): ?array
|
||||
{
|
||||
$plaintext = $this->crypto->decrypt($content);
|
||||
|
||||
return $this->parse($plaintext, $fallbackDate);
|
||||
}
|
||||
|
||||
public function exportMarkdown(string $username, string $date, array $entry, array $evaluation): string
|
||||
{
|
||||
return $this->toMarkdown($username, $date, $entry, $evaluation);
|
||||
}
|
||||
|
||||
private function directoryFor(string $username): string
|
||||
{
|
||||
return storage_path('users/' . normalize_username($username) . '/days');
|
||||
|
||||
Reference in New Issue
Block a user