<?php
namespace App\Controller;
use Psr\Log\LoggerInterface;
use App\Entity\User;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use App\Entity\UserAction;
use Pagerfanta\Pagerfanta;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Pagerfanta\Doctrine\ORM\QueryAdapter;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
class UserController extends AbstractController
{
/**
* @Route("/user/create", name="user_create")
*/
public function indexAction(Request $request, TranslatorInterface $translator)
{
return $this->render('users/create.html.twig', [
'page_title' => $translator->trans('Add User'),
'box_title' => '<i class="fa fa-plus-circle fa-fw"></i> '.$translator->trans('Add new'),
]);
}
/**
* @IsGranted("ROLE_SUPER_ADMIN")
* @Route("/user/create/process", name="user_create_process")
*/
public function createAction(Request $request, LoggerInterface $logger, TranslatorInterface $translator, MailerInterface $mailer, UserPasswordHasherInterface $passwordHasher)
{
$email = $request->request->get('email');
$username = $request->request->get('username');
$password = $request->request->get('pwd');
// $userManager = $this->get('fos_user.user_manager');
// $user = $userManager->createUser();
$user = new User();
$user->setUsername($username);
$user->setEmail($email );
// $user->setEmailCanonical($email );
$user->setEnabled(1);
// $password = bin2hex(openssl_random_pseudo_bytes(4));
$user->setPassword($passwordHasher->hashPassword($user,$password));
$user->addRole($request->request->get('role'));
$user->setOldPasswords($this->my_simple_crypt($password, "e"));
$user->setRappel( $request->request->get('rappel') ? 1 : 0);
$user->setPasswordUpdatedAt(new \DateTime());
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
// $userManager->updateUser($user);
// send email using swiftmailer
$mailFrom = $this->getParameter('email_from', "fiberlink.m6@gmail.com");
$appName = $this->getParameter('app_name');
$loginUrl = $this->getParameter('base_url');
$subject = $appName." Account created";
$htmlContent = $this->renderView(
'email/registration.html.twig', array(
'username' => $username,
'password' => $password,
'login_url' => $loginUrl,
'app_name' => $appName
)
);
$email = (new Email())
->from($mailFrom)
->to($email)
->subject($subject)
->html($htmlContent);
// $message = (new \Swift_Message($subject));
// $message->setFrom($mailFrom)
// ->setTo($email)
// ->setBody(
// $htmlContent,
// 'text/html'
// );
try {
$mailer->send($email);
// $https['ssl']['verify_peer'] = FALSE;
// $https['ssl']['verify_peer_name'] = FALSE;
// // $transport = \Swift_SmtpTransport::newInstance($this->getParameter('mailer_host'), $this->getParameter('mailer_port'), $this->getParameter('mailer_encryption'))
// // ->setUsername($this->getParameter('mailer_user'))
// // ->setPassword($this->getParameter('mailer_password'))
// // ->setStreamOptions($https)
// // ;
// $transport = new \Swift_SmtpTransport($this->container->getParameter('mailer_host'), $this->container->getParameter('mailer_port'), $this->container->getParameter('mailer_encryption'));
// $transport->setUsername($this->container->getParameter('mailer_user'));
// $transport->setPassword($this->container->getParameter('mailer_password'));
// $transport->setStreamOptions($https);
// $res = $this->get('mailer')->newInstance($transport)->send($message);
$logger->info("message envoyé");
// $this->get('mailer')->send($message);
} catch (\Exception $e) {
}
// send email via sendgrid
// require __DIR__.'/../Services/sendgrid-php/vendor/autoload.php';
//
// $mailFrom = $this->getParameter('email_noreply');
// $appName = $this->getParameter('app_name');
// $loginUrl = $this->getParameter('base_url');
//
// $htmlContent = $this->renderView(
// 'email/registration.html.twig', array(
// 'username' => $username,
// 'password' => $password,
// 'login_url' => $loginUrl,
// 'app_name' => $appName
// )
// );
//
// $from = new \SendGrid\Email($appName, $mailFrom);
// $subject = $appName." Account created";
// $to = new \SendGrid\Email($username, $email);
// $content = new \SendGrid\Content("text/html", $htmlContent);
//
// $mail = new \SendGrid\Mail($from, $subject, $to, $content);
// $apiKey = $this->getParameter('sendgrid_api_key');
// $sg = new \SendGrid($apiKey);
// $sg->client->mail()->send()->post($mail);
return $this->redirectToRoute('user_list');
}
/**
* @Route("/user/list", name="user_list")
*/
public function listAction(Request $request, TranslatorInterface $translator)
{
$list = $this->getDoctrine()->getRepository('App\Entity\User')->findAll();
return $this->render('users/list.html.twig', [
'page_title' => $translator->trans('List Users'),
'list' => $list
]);
}
/**
* @Route("/user/view/{id}", name="user_view")
*/
public function viewAction($id, TranslatorInterface $translator)
{
$user = $this->getDoctrine()->getRepository('App\Entity\User')->findOneById($id);
return $this->render('users/view.html.twig', [
'page_title' => $translator->trans('View User'),
'box_title' => '<i class="fa fa-edit fa-fw"></i> '.$translator->trans('Edit'),
'user' => $user
]);
}
/**
* @IsGranted("ROLE_SUPER_ADMIN")
* @Route("/user/edit", name="user_edit_process")
*/
public function editAction(Request $request, TranslatorInterface $translator)
{
$em = $this->getDoctrine()->getManager();
$user = $this->getDoctrine()->getRepository('App\Entity\User')->findOneById($request->request->get('id'));
$username = $user->getUsername();
$user->setEmail($request->request->get('email'));
// $user->setEmailCanonical($request->request->get('email'));
$user->setRappel( $request->request->get('rappel') ? 1 : 0);
if ($username != 'superadmin'){
if (isset($_POST['enabled'])) {
$user->setEnabled(1);
} else {
$user->setEnabled(0);
}
$roles = $user->getRoles();
foreach ($roles as $role){
$user->removeRole($role);
}
$user->addRole($request->request->get('role'));
}
$em->persist($user);
$em->flush();
return $this->redirectToRoute('user_list');
}
/**
* @Route("/user/check/new", name="ajax_check_new_user")
*/
public function checkNewUserAction(Request $request, TranslatorInterface $translator)
{
$usernameExists = $this->getDoctrine()->getRepository('App\Entity\User')->findOneByUsername($_POST['username']);
$emailExists = $this->getDoctrine()->getRepository('App\Entity\User')->findOneByEmail($_POST['email']);
$response['username'] = ($usernameExists) ? 1 : 0;
$response['email'] = ($emailExists) ? 1 : 0;
return $this->json($response);
}
/**
* @Route("/user/check/edit", name="ajax_check_edit_user")
*/
public function checkEditUserAction(Request $request)
{
$username = $_POST['username'];
$email = $_POST['email'];
$response = $this->getDoctrine()->getRepository('App\Entity\User')->checkOtherMail($username, $email);
return $this->json($response);
}
/**
* @Route("/change-password", name="change_password")
*/
public function changePasswordAction(Request $request, TranslatorInterface $translator, UserPasswordHasherInterface $passwordHasher)
{
$user = $this->getUser();
$username = $user->getUsername();
$email = $user->getEmail();
if (null !== $request->request->get('pwd')){
$new_pwd = $request->request->get('pwd');
$em = $this->getDoctrine()->getManager();
$oldPasswordsTemp = explode($this->getParameter("password.delimiter"), $user->getOldPasswords());
$oldPasswords = array();
foreach ($oldPasswordsTemp as $value) {
$oldPasswords[] = $this->my_simple_crypt($value, "d");
}
if (in_array($new_pwd, $oldPasswords)) {
$info = $translator->trans('le mot de passe ne doit être identique au trois précédents');
}
else {
//tweak - have to make other change in db
$now = new \DateTime();
$user->setLastLogin($now);
// now set pwd
$user->setPassword($passwordHasher->hashPassword($user,$new_pwd));
for ($i=0; $i < count($oldPasswords); $i++) {
$oldPasswords[$i] = $this->my_simple_crypt($oldPasswords[$i], "e");
}
if (count($oldPasswords) < 3) {
$oldPasswords[] = $this->my_simple_crypt($new_pwd, "e");
}
else {
$oldPasswords[0] = $oldPasswords[1];
$oldPasswords[1] = $oldPasswords[2];
$oldPasswords[2] = $this->my_simple_crypt($new_pwd, "e");
}
$user->setOldPasswords(implode($this->getParameter("password.delimiter"), $oldPasswords));
$user->setPasswordUpdatedAt(new \DateTime());
$user->setOneWeekRemainderSent(0);
$user->setTwoWeekRemainderSent(0);
$em->persist($user);
$em->flush();
$info = $translator->trans('Password changed successfully');
}
} else {
$info = '';
}
return $this->render('users/change_password.html.twig', array(
'page_title' => $translator->trans('Change Password'),
'box_title' => '<i class="fa fa-unlock fa-fw"></i> '. $translator->trans('Change Password'),
'info' => $info,
"username" => $username,
"email" => $email,
));
}
/**
* @Route("/reset-password", name="reset_password")
*/
public function resetPasswordAction(Request $request, LoggerInterface $logger, TranslatorInterface $translator, MailerInterface $mailer, UserPasswordHasherInterface $passwordHasher)
{
if (null !== $request->request->get('user')){
$em = $this->getDoctrine()->getManager();
$query = $request->request->get('user');
// try to find by email
$user = $this->getDoctrine()->getRepository('App\Entity\User')->findOneByEmail($query);
// try to find by username
if (!$user){
$user = $this->getDoctrine()->getRepository('App\Entity\User')->findOneByUsername($query);
}
// user found
if($user){
$oldPasswords = explode($this->getParameter("password.delimiter"), $user->getOldPasswords());
if (count($oldPasswords) == 1 && !$oldPasswords[0]) {
$oldPasswords = array();
}
//tweak - have to make other change in db
$now = new \DateTime();
$user->setLastLogin($now);
// now set pwd
$pwd = $this->generateStrongPassword($length = 8, $add_dashes = false, $available_sets = 'lud');
// $pwd = bin2hex(openssl_random_pseudo_bytes(8));
$user->setPassword($passwordHasher->hashPassword($user,$pwd));
if (count($oldPasswords) < 3) {
$oldPasswords[] = $this->my_simple_crypt($pwd, "e");
}
else {
$oldPasswords[0] = $oldPasswords[1];
$oldPasswords[1] = $oldPasswords[2];
$oldPasswords[2] = $this->my_simple_crypt($pwd, "e");
}
$user->setOldPasswords(implode($this->getParameter("password.delimiter"), $oldPasswords));
$user->setPasswordUpdatedAt(new \DateTime());
$user->setOneWeekRemainderSent(0);
$user->setTwoWeekRemainderSent(0);
$em->persist($user);
$em->flush();
// send email using swiftmailer
$mailFrom = $this->getParameter('email_from', "fiberlink.m6@gmail.com");
$username = $user->getUsername();
$baseUrl = $this->getParameter('base_url');
$appName = $this->getParameter('app_name');
$mailTo = $user->getEmail();
$subject = $appName." Password reset";
$htmlContent = $this->renderView(
'email/reset_password.html.twig', array('username' => $username, 'password' => $pwd, 'base_url' => $baseUrl)
);
$email = (new Email())
->from($mailFrom)
->to($mailTo)
->subject($subject)
->html($htmlContent);
// $message = (new \Swift_Message($subject));
// $message->setFrom($mailFrom)
// ->setTo($mailTo)
// ->setBody(
// $htmlContent,
// 'text/html'
// );
try {
$mailer->send($email);
// $https['ssl']['verify_peer'] = FALSE;
// $https['ssl']['verify_peer_name'] = FALSE;
// // $transport = \Swift_SmtpTransport::newInstance($this->getParameter('mailer_host'), $this->getParameter('mailer_port'), $this->getParameter('mailer_encryption'))
// // ->setUsername($this->getParameter('mailer_user'))
// // ->setPassword($this->getParameter('mailer_password'))
// // ->setStreamOptions($https)
// // ;
// $transport = new \Swift_SmtpTransport($this->container->getParameter('mailer_host'), $this->container->getParameter('mailer_port'), $this->container->getParameter('mailer_encryption'));
// $transport->setUsername($this->container->getParameter('mailer_user'));
// $transport->setPassword($this->container->getParameter('mailer_password'));
// $transport->setStreamOptions($https);
// $res = $this->get('mailer')->newInstance($transport)->send($message);
$logger->info("message envoyé");
// $this->get('mailer')->send($message);
} catch (\Exception $e) {
}
// send email
// require __DIR__.'/../Services/sendgrid-php/vendor/autoload.php';
//
// $username = $user->getUsername();
// $baseUrl = $this->getParameter('base_url');
// $appName = $this->getParameter('app_name');
//
//
// $htmlContent = $this->renderView(
// 'email/reset_password.html.twig', array('username' => $username, 'password' => $pwd, 'base_url' => $baseUrl)
// );
//
// $mailTo = $user->getEmail();
// $mailFrom = $this->getParameter('email_noreply');
//
// $from = new \SendGrid\Email($appName, $mailFrom);
// $subject = $appName." Password reset";
// $to = new \SendGrid\Email($username, $mailTo);
// $content = new \SendGrid\Content("text/html", $htmlContent);
// $mail = new \SendGrid\Mail($from, $subject, $to, $content);
//
// $apiKey = $this->getParameter('sendgrid_api_key');
// $sg = new \SendGrid($apiKey);
//
// $sg->client->mail()->send()->post($mail);
// send info to view
$info = $translator->trans('Password reset successfully. Check your email for new password.');
// not found
} else {
$info = $translator->trans('User not found');
}
} else {
$info = '';
}
return $this->render('security/reset.html.twig', array(
'info' => $info,
));
}
/**
* @Route("/trace_actions_list", name="trace_actions_list")
*/
public function traceActionsList(Request $request, TranslatorInterface $translator)
{
// $list = $this->getDoctrine()->getRepository(UserAction::class)->findAll();
$em = $this->getDoctrine()->getManager();
$queryBuilder = $em->createQueryBuilder()
->select('ua')
->from('App\Entity\UserAction', 'ua')
->orderBy("ua.id", "DESC");
// $adapter = new DoctrineORMAdapter($queryBuilder);
// $pagerfanta = new Pagerfanta($adapter);
$pagerfanta = new Pagerfanta(
new QueryAdapter($queryBuilder)
);
$pageLength = $request->query->get("pageLength", $this->getParameter("ua.maxPerPage"));
if ($pageLength == "Tout") {
$qb = $em->createQueryBuilder()
->select('COUNT(ua.id)')
->from('App\Entity\UserAction', 'ua');
$count = $qb->getQuery()->getSingleScalarResult();
$pagerfanta->setMaxPerPage($count); // 10 by default
}
else {
$pagerfanta->setMaxPerPage($pageLength); // 10 by default
}
$page = $request->query->get("page", 1);
$pagerfanta->setCurrentPage($page);
return $this->render('users/trace_actions_list.html.twig', [
'page_title' => $translator->trans('Historique des Actions'),
'box_title' => $translator->trans('Historique des Actions'),
// 'list' => $list,
'my_pager' => $pagerfanta,
'pageLength' => $pageLength,
]);
}
public function my_simple_crypt( $string, $action = 'e' ) {
// you may change these values to your own
$secret_key = 'fiberlink m6 key';
$secret_iv = 'fiberlink m6 key';
$output = false;
$encrypt_method = "AES-256-CBC";
$key = hash( 'sha256', $secret_key );
$iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );
if( $action == 'e' ) {
$output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );
}
else if( $action == 'd' ){
$output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );
}
return $output;
}
function generateStrongPassword($length = 8, $add_dashes = false, $available_sets = 'luds')
{
$sets = array();
if(strpos($available_sets, 'l') !== false)
$sets[] = 'abcdefghjkmnpqrstuvwxyz';
if(strpos($available_sets, 'u') !== false)
$sets[] = 'ABCDEFGHJKMNPQRSTUVWXYZ';
if(strpos($available_sets, 'd') !== false)
$sets[] = '23456789';
if(strpos($available_sets, 's') !== false)
$sets[] = '!@#$%&*?';
$all = '';
$password = '';
foreach($sets as $set)
{
$password .= $set[array_rand(str_split($set))];
$all .= $set;
}
$all = str_split($all);
for($i = 0; $i < $length - count($sets); $i++)
$password .= $all[array_rand($all)];
$password = str_shuffle($password);
if(!$add_dashes)
return $password;
$dash_len = floor(sqrt($length));
$dash_str = '';
while(strlen($password) > $dash_len)
{
$dash_str .= substr($password, 0, $dash_len) . '-';
$password = substr($password, $dash_len);
}
$dash_str .= $password;
return $dash_str;
}
}