You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.2 KiB
PHP
85 lines
2.2 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: eater
|
|
* Date: 4/4/16
|
|
* Time: 9:23 PM
|
|
*/
|
|
|
|
namespace Eater\Glim\Handler\Panel\Certificates\_New;
|
|
|
|
|
|
use Eater\Glim\Handler\Session;
|
|
use Eater\Glim\Model\Certificate;
|
|
use Eater\Glim\Model\CertificateQuery;
|
|
use Eater\Glim\Service\CA;
|
|
use Slim\Http\Response;
|
|
|
|
class Action extends Session
|
|
{
|
|
protected $shouldHaveUser = true;
|
|
|
|
/**
|
|
* @return Response
|
|
*/
|
|
public function handle()
|
|
{
|
|
$user = $this->getUser();
|
|
$core = $this->getCore();
|
|
/** @var CA $ca */
|
|
$ca = $this->get('ca');
|
|
|
|
$name = $this->post('name');
|
|
$csr = $this->post('csr');
|
|
|
|
$amount = CertificateQuery::create()
|
|
->filterByName($name)
|
|
->filterByUser($user)
|
|
->count();
|
|
if ($amount > 0) {
|
|
return $this->json([
|
|
"error" => "You already have an Certificate with the name '$name'",
|
|
"success" => false
|
|
]);
|
|
}
|
|
|
|
try {
|
|
$commonName = $ca->getCommonNameFromCsr($csr);
|
|
}catch (\Exception $e) {
|
|
return $this->json([
|
|
"error" => $e->getMessage(),
|
|
"success" => false
|
|
]);
|
|
}
|
|
|
|
$designatedCommonName = $name . '.' . $user->getUsername();
|
|
|
|
if ($commonName !== $name . '.' . $user->getUsername()) {
|
|
return $this->json([
|
|
"error" => "CommonName of CSR isn't '$designatedCommonName'",
|
|
"success" => false
|
|
]);
|
|
}
|
|
|
|
$crt = $ca->signClientCsr($csr);
|
|
|
|
$details = openssl_x509_parse($crt);
|
|
|
|
$certificate = new Certificate();
|
|
$certificate->setName($name);
|
|
$certificate->setCertificate($crt);
|
|
$certificate->setExpiresOn(new \DateTime('@' . $details['validTo_time_t']));
|
|
$certificate->setSerial($details['serialNumber']);
|
|
|
|
$user->addCertificate($certificate);
|
|
$user->save();
|
|
|
|
return $this->json([
|
|
"success" => true,
|
|
"zip" => [
|
|
"ca.crt" => file_get_contents($core->getBaseDir() . '/storage/ca/ca.crt'),
|
|
$designatedCommonName . '.crt' => $crt
|
|
]
|
|
]);
|
|
}
|
|
} |