Auth2FA/app/Core/Funkce.php

239 lines
9.3 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Core;
use Nette\Utils\Image;
use Nette\Utils\ImageType;
use DateInterval;
/**
* Třída plná užitečných funkcí.
*/
class Funkce
{
/**
* Rozšifruje data, která jsme předtím zašifrovali pomocí
* funkce QRURL ve vb.net
*/
public static function decrypt($data)
{
$password = '3sc3RLrpd17tvl';
$password = substr(hash('sha256', $password, true), 0, 32);
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
$decrypted = openssl_decrypt(base64_decode($data), 'aes-256-cbc', $password, OPENSSL_RAW_DATA, $iv);
return $decrypted;
}
/**
* Šifrovací funkce. Měla by odpovídat .NETovské verzi. Funfuje s funkcí decrypt().
*/
public static function encrypt($data)
{
$password = '3sc3RLrpd17tvl';
$password = substr(hash('sha256', $password, true), 0, 32);
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
return base64_encode(openssl_encrypt($data, 'aes-256-cbc', $password, OPENSSL_RAW_DATA, $iv));
}
/**
* Používáme pro zašifrování cookie s passwordem.
* Raději jiná funkce než pro šifrování / dešifrování údajů předaných z VB.NET
* Vzato odtud: https://www.w3docs.com/snippets/php/how-to-encrypt-and-decrypt-a-string-in-php.html
* @param mixed $password
* @return bool|string
*/
public static function encrypt_password($password)
{
$ciphering = "AES-128-CTR";
$iv_length = openssl_cipher_iv_length($ciphering);
$options = 0;
$encryption_iv = '1233567881014121';
$encryption_key = "sfb16196a19ibniv";
return openssl_encrypt($password, $ciphering, $encryption_key, $options, $encryption_iv);
}
/**
* Používáme pro zašifrování cookie s passwordem.
* Raději jiná funkce než pro šifrování / dešifrování údajů předaných z VB.NET
* Vzato odtud: https://www.w3docs.com/snippets/php/how-to-encrypt-and-decrypt-a-string-in-php.html
* @param mixed $encrypted
* @return bool|string
*/
public static function decrypt_password($encrypted)
{
$ciphering = "AES-128-CTR";
$options = 0;
$decryption_iv = '1233567881014121';
$decryption_key = "sfb16196a19ibniv";
return openssl_decrypt($encrypted, $ciphering, $decryption_key, $options, $decryption_iv);
}
/**
* Slouží pro testování, zda se připojujeme pouze do cloudových serverů.
* V podstatě opis funkce IsCloudIP z VB.NET.
* Pozor, v proměnné $server může být např "data.xzajic.cz,2000"
* Tedy i port.
* @param string $server
* @return bool
*/
public static function is_cloud_ip(string $server): bool
{
$cloudoveservery = array(
"data.xzajic.cz",
"boromir.xzajic.cz",
"faramir.xzajic.cz",
"galadriel.xzajic.cz",
"sql.xzajic.cz",
"sql2.xzajic.cz",
"base.xzajic.cz",
"merkur.xzajic.cz",
"mars.xzajic.cz",
"data.powercare.cz",
"kadan.pecovatelska.cz",
"novybor.pecovatelska.cz",
"decin.pecovatelska.cz",
"lomnice.pecovatelska.cz",
"zbraslav.pecovatelska.cz",
"semily.pecovatelska.cz",
"jesenik.pecovatelska.cz",
"ledax.pecovatelska.cz",
"venuse.xzajic.cz",
"136.243.90.39", //136.243.90.39 Venuše
"173.212.216.246", //173.212.216.246 Merkur
"173.249.52.108", //173.249.52.108 Base
"195.201.86.17", //195.201.86.17 Mars
"kmetix.cz" //debug
);
$server = strtolower($server);
foreach ($cloudoveservery as $cloudovyserver) {
if (str_contains($server, $cloudovyserver))
return true;
}
return false;
}
/**
* Občas uživatel zadá staré jméno serveru, tak tato funkce nahradí staré jméno novým.
* @param mixed $server
* @return void
*/
public static function GetServerAlias(&$server)
{
//osekat mezery:
//'data.xzajic.cz, 1433' vs. 'data.xzajic.cz,1433'
$server = strtolower(trim(str_replace(' ', '', $server)));
$aliasy = array(
//"base.xzajic.cz" => "base.xzajic.cz",
"data.xzajic.cz" => "base.xzajic.cz",
"faramir.xzajic.cz" => "base.xzajic.cz",
"sql2.xzajic.cz" => "base.xzajic.cz",
"data.powercare.cz" => "base.xzajic.cz",
//"merkur.xzajic.cz" => "merkur.xzajic.cz",
"bilbo.xzajic.cz" => "merkur.xzajic.cz",
"boromir.xzajic.cz" => "merkur.xzajic.cz",
"galadriel.xzajic.cz" => "merkur.xzajic.cz",
"haldir.xzajic.cz" => "merkur.xzajic.cz",
"sql.xzajic.cz" => "merkur.xzajic.cz",
"kadan.pecovatelska.cz" => "merkur.xzajic.cz",
"novybor.pecovatelska.cz" => "merkur.xzajic.cz",
"decin.pecovatelska.cz" => "merkur.xzajic.cz",
"lomnice.pecovatelska.cz" => "merkur.xzajic.cz",
"zbraslav.pecovatelska.cz" => "merkur.xzajic.cz",
"semily.pecovatelska.cz" => "merkur.xzajic.cz",
"jesenik.pecovatelska.cz" => "merkur.xzajic.cz",
"ledax.pecovatelska.cz" => "merkur.xzajic.cz",
//"mars.xzajic.cz" => "mars.xzajic.cz",
);
foreach ($aliasy as $key => $value) {
if (str_contains($server, $key)) { //existuje alias v serveru?
$server = str_replace($key, $value, $server); //nahraď pravým jménem serveru
break;
}
}
}
public static function CreateBarevnyKolecko(int $barva)
{
// barvičky do int, toto php neumí (asi):
$barvaHEX = substr(dechex($barva), -6);
$red = hexdec(substr($barvaHEX, 0, 2));
$green = hexdec(substr($barvaHEX, 2, 2));
$blue = hexdec(substr($barvaHEX, 4, 2));
// create a blank image
$image = imagecreatetruecolor(17, 17);
imagealphablending($image, true);
imagesavealpha($image, true);
// fill the background color
//$bg = imagecolorallocate($image, 0, 0, 0 );
$white = imagecolorallocatealpha($image, 255, 255, 255, 127); //plná průhlednost!!!
imagefill($image, 0, 0, $white);
// choose a color for the ellipse
$col_ellipse = imagecolorallocatealpha($image, $red, $green, $blue, 0);
// draw the white ellipse
imagefilledellipse($image, 8, 8, 16, 16, $col_ellipse);
// output the picture
ob_start();
imagepng($image);
$image_data = ob_get_contents();
ob_end_clean();
$image = Image::fromString($image_data);
$image->send(ImageType::PNG);
}
/**
* Test na svátek nebo so/ne.
* @param mixed $datum
* @return bool
*/
public static function jeSoNeSv(\DateTimeInterface $datum): bool
{
// nejdříve test na sobotu nebo neděli:
if ($datum->format("N") == 6 or $datum->format("N") == 7)
return true;
//pak svátky:
$svatky = array();
$svatky[] = date_create($datum->format("Y") . "-01-01"); // Nový rok
// Velký pátek:
$velkyPatek = date_create(date("m/d/Y", easter_date((int) $datum->format("Y")))); // výchozí den je Velikonoční neděle
$velkyPatekInt = DateInterval::createFromDateString("2 days");
$velkyPatekInt->invert = 1;
$svatky[] = date_add($velkyPatek, $velkyPatekInt); // Velký pátek = neděle - 2 dny
// Velikonoční pondělí:
$velikonocniPondeli = date_create(date("m/d/Y", easter_date((int) $datum->format("Y")))); //výchozí den je Velikonoční neděle
$velikonocniPondeliInt = DateInterval::createFromDateString("1 days");
$svatky[] = date_add($velikonocniPondeli, $velikonocniPondeliInt); // Velikonoční pondělí = neděle + 1 den
$svatky[] = date_create($datum->format("Y") . "-05-01"); // Svátek práce
$svatky[] = date_create($datum->format("Y") . "-05-08"); // Den osvobození
$svatky[] = date_create($datum->format("Y") . "-07-05"); // Den slovanských věrozvěstů Cyrila a Metoděje
$svatky[] = date_create($datum->format("Y") . "-07-06"); // Den upálení mistra Jana Husa
$svatky[] = date_create($datum->format("Y") . "-09-28"); // Den české státnosti
$svatky[] = date_create($datum->format("Y") . "-10-28"); // Den vzniku samostatného československého státu
$svatky[] = date_create($datum->format("Y") . "-11-17"); // Den boje za svobodu a demokracii
$svatky[] = date_create($datum->format("Y") . "-12-24"); // Štědrý den
$svatky[] = date_create($datum->format("Y") . "-12-25"); // 1. svátek vánoční
$svatky[] = date_create($datum->format("Y") . "-12-26"); // 2. svátek vánoční
// test na svátek:
foreach ($svatky as $svatek) {
if ($datum->format("Y-m-d") == $svatek->format("Y-m-d"))
return true;
}
return false;
}
}