<?php
namespace App\Controller;
use App\Entity\User;
use App\Form\ResetPasswordType;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
class SecurityController extends AbstractController
{
/** @var UserPasswordHasherInterface */
private $passwordHasher;
public function __construct(UserPasswordHasherInterface $passwordHasher)
{
$this->passwordHasher = $passwordHasher;
}
/**
* @Route("/login", name="auth-login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
/*
// Sample user record
$user = new User();
$user->setUsername('fkaynakli');
$user->setPassword(
$passEncoder->encodePassword($user, '123')
);
dump($user);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
*/
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/logout", name="auth-logout")
*/
public function logout(): void
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* @Route("/auth/hash-password", name="auth-hash-password")
*/
public function hashPassword(Request $request): Response
{
if ($request->isMethod('POST')) {
if (empty($request->get('email'))) {
$data = json_decode($request->getContent(), true);
$email = $data['email'];
$password = $data['password'];
$firma = $data['firma'];
} else {
$email = $request->get('email');
$password = $request->get('password');
$firma = $request->get('firma');
}
if ($firma != $_ENV['FIRMA_KODU']) {
return new Response('[success: false, msg:"Geçersiz firma : ' . $firma . '"]', Response::HTTP_NOT_FOUND);
}
/** @var UserRepository $rep */
$rep = $this->getDoctrine()->getRepository(User::class);
$user = $rep->findOneBy(['username' => $email]);
if ($user) {
$passHash = $this->passwordHasher->hashPassword($user, $password);
$user->setPassword($passHash);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $this->json([
'success' => true,
'msg' => $email,
]);
} else return @new Response(json_encode([
'success' => false,
'msg' => "Kullanıcı blulunamadı!",
'debug' => [$email, $password, $firma],
]), Response::HTTP_NOT_FOUND);
}
return @new Response(json_encode([
'success' => false,
'msg' => "Eksik bilgi!",
'debug' => [$email, $password, $firma],
]), Response::HTTP_NOT_FOUND);
//-return new Response($this->passwordHasher->hashPassword(new \App\Entity\User(), $request->get('password')));
}
/**
* @Route("/auth/eski-sifre", name="auth-eski-sifre")
*/
public function eskiSifre(): Response
{
$user = new \App\Entity\User();
$connection = $this->getDoctrine()->getConnection();
$connection->executeQuery("insert into MOBIL_KULLANICI (CARI_ID, KULLANICI_ADI, ALANLAR, MODULES)
select C.CARI_ID, C.WEBUSERNAME, '[\"yemek\",\"dyemek\",\"kahvalti\",\"kumanya\",\"mesai\",\"folyo\",\"sefertasi\"," .
"\"ekmek\",\"dekmek\",\"ekstra1\",\"ekstra2\",\"ekstra3\",\"ekstra4\"]',
'[\"menu-index\",\"eirsaliye-index\",\"sayi-index\",\"efatura-index\",\"sarf-index\",\"demirbas-index\",\"crm-index\"," .
"\"siparis-index\", \"alerjen-index\", \"anket-index\", \"sozlesme-index\",\"ekmek-index\"]'
from cari_kart C
where C.WEBPASS is not null and not exists(
select 1 from mobil_kullanici K where
K.cari_id=C.cari_id
and K.kullanici_adi = C.WEBUSERNAME)");
$kullanicilar = $connection->executeQuery("select K.ID, C.WEBPASS from MOBIL_KULLANICI K
inner join cari_kart C on C.cari_id = K.cari_id and C.WEBPASS IS NOT NULL
where K.sifre IS NULL")
->fetchAll();
try {
$i = 0;
$c = count($kullanicilar);
foreach ($kullanicilar as $kullanici) {
printf('%d / %d şifre güncelleniyor...<br>', ++$i, $c);
$connection->executeQuery('update MOBIL_KULLANICI set SIFRE=:SIFRE where ID=:ID', [
':ID' => $kullanici['ID'],
':SIFRE' => $this->passwordHasher->hashPassword($user, $kullanici['WEBPASS'])
]);
if ($i >= 10 || $c < 10) {
echo '<script>location.reload();</script>';
break;
}
}
} catch (\Exception $e) {
} finally {
return new Response(sprintf('%d adet şifre güncellendi!', count($kullanicilar)));
}
}
/**
* @Route("auth/reset", name="auth-reset")
*/
public function resetPassword(Request $request, MailerInterface $mailer): Response
{
$result = ['error' => null, 'email' => null, 'tag' => null];
$data = [
'email' => $request->get('email', null),
'tag' => $request->get('tag', null),
'password' => trim($request->get('password', null)),
'password2' => trim($request->get('password2', null)),
];
if (filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
$result['email'] = $data['email'];
/** @var EntityManager $em */
$em = $this->getdoctrine()->getmanager();
/** @var UserRepository $rep */
$rep = $em->getrepository(User::class);
if ($request->isMethod('POST')) {
$user = $rep->findOneBy([
'username' => $data['email'],
'ActivationKey' => $data['tag'],
]);
if (!$user) {
$result['error'] = "Kullanıcı bulunamadı:\n" . $data['email'] . "\n" . $data['id'];
} else {
if (empty($data['password']) || ($data['password'] != $data['password2'])) {
$result['error'] = 'Şifreler aynı değil!';
} elseif (strlen($data['password']) < User::MIN_PASSWORD_LENGTH) {
$result['error'] = sprintf('Şifre en az %d karakter uzunluğunda olmalı!', User::MIN_PASSWORD_LENGTH);
} else {
$user->setActivationKey(null);
$user->setModifiedAt(null);
$user->setPassword($rep->encodePassword($data['password']));
try {
$em->persist($user);
$em->flush();
$this->addFlash('success', 'Şifreniz başarıyla değiştirildi. Şimdi oturum açabilirsiniz.');
return $this->redirectToRoute('auth-login');
} catch (\Exception $e) {
$result['error'] = sprintf("Şifre güncellenirken hata oluştu:\n%s", $e->getMessage());
}
}
}
} else {
$user = $rep->findOneBy(['username' => $data['email']]);
if (!$user) {
$result['error'] = "Kullanıcı bulunamadı:\n" . $data['email'] . "\n" . $data['id'];
} else {
$result['tag'] = $user->getActivationKey();
if ($result['tag'] != $data['tag']) {
$result['error'] = 'Geçersiz şifre sıfırlama bağlantısı!';
} elseif ($user->getModifiedAt()->getTimestamp() < time()) {
$result['error'] = 'Zaman aşımından dolayı şifre sıfırlama yapamazsınız!';
}
}
}
} else {
$result['error'] = 'Geçersiz e-posta adresi: ' . $data['email'];
}
return $this->render('security/reset.html.twig', $result);
}
/**
* @Route("auth/forgot", name="auth-forgot")
*/
public function forgotPassword(Request $request, MailerInterface $mailer): Response
{
$result = ['email' => null, 'error' => null];
if ($request->isMethod('POST')) {
$result['email'] = $request->get('email');
$response = $this->resetSendMail($request, $mailer);
$response = json_decode($response->getContent());
if (!$response->success) {
$result['error'] = true;
}
}
return $this->render('security/forgot.html.twig', $result);
}
/**
* @Route("auth/reset/sendmail", name="auth-reset-sendmail")
*/
public function resetSendMail(Request $request, MailerInterface $mailer): Response
{
if (empty($request->get('email', null))) {
$data = json_decode($request->getContent(), true);
} else {
$data = [
'email' => $request->get('email', null),
'id' => $request->get('id', null),
];
}
$result = ['success' => false, 'msg' => ''];
if (filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
$result['msg'] = $data['email'];
try {
$filter = ['username' => $data['email']];
if (!empty($data['id']))
$filter['id'] = $data['id'];
/** @var EntityManager $em */
$em = $this->getdoctrine()->getmanager();
/** @var UserRepository $rep */
$rep = $em->getrepository(User::class);
$user = $rep->findOneBy($filter);
if (!$user) {
$result['msg'] = "Kullanıcı bulunamadı:\n" . $data['email'] . "\n" . $data['id'];
} else {
$data['tag'] = $user->generateActivationKey();
$data['validuntil'] = $user->getModifiedAt()->getTimestamp();
$em->persist($user);
$em->flush();
$this->sendEmail($data, $mailer);
$result['success'] = true;
}
} catch (TransportExceptionInterface $e) {
$result['msg'] = $e->getMessage();
} catch (\Exception $e) {
$result['msg'] = $e->getMessage();
}
} else {
$result['msg'] = 'Geçersiz e-posta adresi: ' . $data['email'];
}
return new JsonResponse($result);
}
/**
* Şifre sıfırlama formu için kullanıcıya eposta gönderir
* @param $data array
* @param MailerInterface $mailer
* @throws TransportExceptionInterface
*/
protected function sendEmail(array $data, MailerInterface $mailer)
{
$email = (new TemplatedEmail())
->to($data['email'])
->subject('Foodsoft - Şifre Sıfırlama')
->text('Şifre sıfırlama için aşağıdaki bağlantıyı kullanabilirsiniz!')
->htmlTemplate('_email/reset-password.html.twig')
->context(['kullanici' => $data]);
$mailer->send($email);
}
}