mirror of
https://github.com/24eme/signaturepdf
synced 2026-03-14 13:55:44 +01:00
share action create admin key stored on server side and localstorage if adminKey found on localStorage, display a small trash icon if clicked, send an ajax request, verify the key, and delete both localstorage and files on the server
115 lines
3.2 KiB
PHP
115 lines
3.2 KiB
PHP
<?php
|
|
|
|
class GPGCryptography
|
|
{
|
|
private $symmetricKey = null;
|
|
private $pathHash = null;
|
|
|
|
function __construct($key, $pathHash) {
|
|
$this->symmetricKey = $key;
|
|
$this->pathHash = $pathHash;
|
|
}
|
|
|
|
private function getFiles($isGpg) {
|
|
$suffix = "";
|
|
if ($isGpg) {
|
|
$suffix = ".gpg";
|
|
}
|
|
$filesTab = glob($this->pathHash.'/*.pdf'.$suffix);
|
|
|
|
if(file_exists($this->pathHash."/filename.txt".$suffix)) {
|
|
$filesTab[] = $this->pathHash."/filename.txt".$suffix;
|
|
}
|
|
|
|
return $filesTab;
|
|
}
|
|
|
|
public function encrypt() {
|
|
putenv('HOME='.sys_get_temp_dir());
|
|
foreach ($this->getFiles(false) as $file) {
|
|
$outputFile = $file.".gpg";
|
|
if(file_exists($outputFile)) {
|
|
unlink($outputFile);
|
|
}
|
|
$command = "gpg --batch --passphrase $this->symmetricKey --symmetric --cipher-algo AES256 -o $outputFile $file > /dev/null";
|
|
$result = shell_exec($command);
|
|
if ($result) {
|
|
echo "Cipher failure";
|
|
return $result;
|
|
}
|
|
$this->hardUnlink($file);
|
|
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public function decryptFile($file) {
|
|
if (!file_exists($file.'.gpg')) {
|
|
return $file;
|
|
}
|
|
if (!$this->symmetricKey) {
|
|
return false;
|
|
}
|
|
$decryptTmpFile = sys_get_temp_dir()."/".uniqid('pdfsignature.decrypted.'.getmypid().md5($file), true).'_'.basename($file);
|
|
|
|
$this->runDecryptFile($file.'.gpg', $decryptTmpFile);
|
|
|
|
return $decryptTmpFile;
|
|
}
|
|
|
|
public function runDecryptFile($file, $outputFile) {
|
|
putenv('HOME='.sys_get_temp_dir());
|
|
return shell_exec("gpg --batch --passphrase $this->symmetricKey --decrypt -o $outputFile $file > /dev/null");
|
|
}
|
|
|
|
public function isEncrypted() {
|
|
return self::isPathEncrypted($this->pathHash);
|
|
}
|
|
|
|
public static function isPathEncrypted($pathHash) {
|
|
return file_exists($pathHash."/filename.txt.gpg");
|
|
}
|
|
|
|
public static function hardUnlink($element) {
|
|
if (!$element) {
|
|
return;
|
|
}
|
|
if (is_dir($element)) {
|
|
foreach (glob($element.'/*') as $file) {
|
|
self::hardUnlink($file);
|
|
}
|
|
rmdir($element);
|
|
return;
|
|
}
|
|
$eraser = str_repeat(0, strlen(file_get_contents($element)));
|
|
file_put_contents($element, $eraser);
|
|
unlink($element);
|
|
}
|
|
|
|
public static function protectSymmetricKey($key) {
|
|
return preg_replace('/[^0-9a-zA-Z]*/', '', $key);
|
|
}
|
|
|
|
public static function createSymmetricKey($length = 15) {
|
|
$keySpace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
$pieces = [];
|
|
$max = mb_strlen($keySpace, '8bit') - 1;
|
|
for ($i = 0; $i < $length; ++$i) {
|
|
$pieces []= $keySpace[random_int(0, $max)];
|
|
}
|
|
|
|
return implode('', $pieces);
|
|
}
|
|
|
|
public static function isGpgInstalled() {
|
|
$output = null;
|
|
$returnCode = null;
|
|
|
|
exec('gpg --version', $output, $returnCode);
|
|
|
|
if (!$output) {
|
|
return array(false);
|
|
}
|
|
return $output;
|
|
}
|
|
}
|