Skip to content

Commit 9833091

Browse files
Symfony validation added to AuthController
1 parent 89ba0d0 commit 9833091

File tree

5 files changed

+65
-185
lines changed

5 files changed

+65
-185
lines changed

src/ApiBundle/Controller/AuthController.php

Lines changed: 43 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,6 @@ public function postRegisterAction()
232232
$request = $this->container->get('request');
233233
$userManager = $this->get('fos_user.user_manager');
234234

235-
$this->validateClient($request);
236-
$this->validateUsername($request);
237-
$this->validatePassword($request);
238-
$this->validateEmail($request);
239-
$this->validateFirstname($request);
240-
$this->validateDob($request);
241-
242235
$user = $userManager->createUser();
243236

244237
$user->setUsername($request->request->get('username'));
@@ -250,6 +243,26 @@ public function postRegisterAction()
250243
$user->setRoles(array('ROLE_API'));
251244
$user->setEnabled(true);
252245

246+
// Validate user data
247+
$validator = $this->get('validator');
248+
$errors = $validator->validate($user);
249+
250+
if (count($errors) > 0) {
251+
$errorArray = [];
252+
foreach ($errors as $error) {
253+
$constraint = $error->getConstraint();
254+
$errorItem = array(
255+
"code" => 400,
256+
"error" => "Bad Request",
257+
"error_description" => $error->getMessage(),
258+
"show_message" => $this->get('translator')->trans($constraint->payload['api_error'], array(), 'messages', $request->getLocale())
259+
);
260+
array_push($errorArray, $errorItem);
261+
}
262+
return new JsonResponse($errorArray);
263+
}
264+
265+
// Everything ok, now write the user record
253266
$userManager->updateUser($user);
254267

255268
$oAuthRtn = 'Pending';
@@ -297,88 +310,6 @@ private function validateClient(Request $request) {
297310
}
298311
}
299312

300-
/**
301-
* Validate username
302-
*/
303-
private function validateUsername(Request $request) {
304-
$username = $request->request->get('username');
305-
306-
// Check if username is empty
307-
if (null == $username) {
308-
$this->logAndThrowError(400, 'Empty username', $this->get('translator')->trans('api.show_error_username_missing', array(), 'messages', $request->getLocale()), $request->getLocale());
309-
}
310-
311-
// Do a check for existing user with userManager->findByUsername
312-
/** @var $user UserInterface */
313-
$user = $this->container->get('fos_user.user_manager')->findUserByUsernameOrEmail($username);
314-
if (null != $user) {
315-
$this->logAndThrowError(400, 'User already exists. Username: '.$user->getUsername(), $this->get('translator')->trans('api.show_error_username_taken', array(), 'messages', $request->getLocale()), $request->getLocale());
316-
}
317-
318-
if ( preg_match($this->container->getParameter('username_regex'), $username ) == false ) {
319-
$this->logAndThrowError(400, 'Username should be 3-16 characters long with any lowercase letter (a-z), number (0-9), an underscore, or a hyphen.', $this->get('translator')->trans('api.show_error_username_policy', array(), 'messages', $request->getLocale()), $request->getLocale());
320-
}
321-
}
322-
323-
/**
324-
* Validate password
325-
*/
326-
private function validatePassword(Request $request) {
327-
$password = $request->request->get('password');
328-
329-
// Check if password is empty
330-
if (null == $password) {
331-
$this->logAndThrowError(400, 'Invalid empty password', $this->get('translator')->trans('api.show_error_password', array(), 'messages', $request->getLocale()), $request->getLocale());
332-
}
333-
334-
if ( preg_match($this->container->getParameter('password_regex'), $password ) == false ) {
335-
$this->logAndThrowError(400, 'Password should be 8-15 characters long and must contain alphanumeric and @*# characters.', $this->get('translator')->trans('api.show_error_password_policy', array(), 'messages', $request->getLocale()), $request->getLocale());
336-
}
337-
}
338-
339-
/**
340-
* Validate email
341-
*/
342-
private function validateEmail(Request $request) {
343-
$email = $request->request->get('email');
344-
345-
// Check if email is valid
346-
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
347-
$this->logAndThrowError(400, 'Invalid email: '.$email, $this->get('translator')->trans('api.show_error_email', array(), 'messages', $request->getLocale()), $request->getLocale());
348-
}
349-
350-
$user = $this->container->get('fos_user.user_manager')->findUserByUsernameOrEmail($email);
351-
if (null != $user) {
352-
$this->logAndThrowError(400, 'Email '.$user->getEmail().' already taken by Username: '.$user->getUsername(), $this->get('translator')->trans('api.show_error_email_taken', array(), 'messages', $request->getLocale()), $request->getLocale());
353-
}
354-
}
355-
356-
/**
357-
* Validate firstname
358-
*/
359-
private function validateFirstname(Request $request) {
360-
$firstname = $request->request->get('firstname');
361-
362-
// Check if firstname is empty. At least firstname is required.
363-
if (null == $firstname) {
364-
$this->logAndThrowError(400, 'Invalid empty firstname', $this->get('translator')->trans('api.show_error_firstname', array(), 'messages', $request->getLocale()), $request->getLocale());
365-
}
366-
367-
}
368-
369-
/**
370-
* Validate dob
371-
*/
372-
private function validateDob(Request $request) {
373-
$dob = $request->request->get('dob');
374-
375-
// Check if dob is valid
376-
list($mm,$dd,$yyyy) = explode('/',$dob);
377-
if (!checkdate($mm,$dd,$yyyy)) {
378-
$this->logAndThrowError(400, 'Invalid mm/dd/yyyy DOB: '.$dob, $this->get('translator')->trans('api.show_error_dob', array(), 'messages', $request->getLocale()), $request->getLocale());
379-
}
380-
}
381-
382313
/**
383314
* Change Password request. Will return a JsonResponse(username, msg) upon success.
384315
*
@@ -489,11 +420,9 @@ public function getProfileAction()
489420
* resource=true,
490421
* description="Update User profile detail. Access token to be provided in header (Authorization = Bearer <access token>)",
491422
* parameters={
492-
* {"name"="username", "dataType"="string", "required"=true, "description"="username, leave null if unchanged"},
493423
* {"name"="firstname", "dataType"="string", "required"=true, "description"="firstname, leave null if unchanged"},
494424
* {"name"="lastname", "dataType"="string", "required"=true, "description"="lastname, leave null if unchanged"},
495425
* {"name"="dob", "dataType"="datetime", "required"=true, "description"="date of birth mm/dd/yyyy, leave null if unchanged"},
496-
* {"name"="email", "dataType"="email", "required"=true, "description"="Email, leave null if unchanged"},
497426
* {"name"="_locale", "dataType"="string", "required"=false, "description"="User locale. Will default to en"}
498427
* },
499428
* )
@@ -511,12 +440,30 @@ public function editProfileAction()
511440

512441
$data = $request->request->all();
513442

514-
$this->handleKeyUsername($user, $request);
515-
$this->handleKeyEmail($user, $request);
516-
$this->handleKeyFirstname($user, $request);
517-
$this->handleKeyLastname($user, $request);
518-
$this->handleKeyDob($user, $request);
443+
$user->setFirstname(array_key_exists('firstname', $data) ? $data['firstname'] : $user->getFirstname() );
444+
$user->setLastname(array_key_exists('lastname', $data) ? $data['lastname'] : $user->getLastname() );
445+
$user->setDob( array_key_exists('dob', $data) ? $data['dob'] : $user->getDob() );
446+
447+
// Validate user data
448+
$validator = $this->get('validator');
449+
$errors = $validator->validate($user, null, array('profile_edit'));
450+
451+
if (count($errors) > 0) {
452+
$errorArray = [];
453+
foreach ($errors as $error) {
454+
$constraint = $error->getConstraint();
455+
$errorItem = array(
456+
"code" => 400,
457+
"error" => "Bad Request",
458+
"error_description" => $error->getMessage(),
459+
"show_message" => $this->get('translator')->trans($constraint->payload['api_error'], array(), 'messages', $request->getLocale())
460+
);
461+
array_push($errorArray, $errorItem);
462+
}
463+
return new JsonResponse($errorArray);
464+
}
519465

466+
// Everything ok, now update the user record
520467
$userManager->updateUser($user);
521468

522469
$msg = 'Profile changed successfully';
@@ -531,92 +478,6 @@ public function editProfileAction()
531478
));
532479
}
533480

534-
/**
535-
* Checks $request if it contains a key - username
536-
*/
537-
private function handleKeyUsername(UserInterface $user, Request $request) {
538-
$data = $request->request->all();
539-
540-
if (array_key_exists('username', $data)) {
541-
// Change username only if username is changed
542-
if ($data['username'] != $user->getUsername()) {
543-
// Check if username is already taken
544-
$user1 = $this->container->get('fos_user.user_manager')->findUserByUsernameOrEmail($data['username']);
545-
if (null != $user1) {
546-
$this->logAndThrowError(400, 'Already taken by Username: '.$user1->getUsername(), $this->get('translator')->trans('api.show_error_username_taken', array(), 'messages', $request->getLocale()), $request->getLocale());
547-
}
548-
$user->setUsername($data['username']);
549-
}
550-
}
551-
}
552-
553-
/**
554-
* Checks $request if it contains a key - email
555-
*/
556-
private function handleKeyEmail(UserInterface $user, Request $request) {
557-
$data = $request->request->all();
558-
559-
if (array_key_exists('email', $data)) {
560-
// Check if email is valid
561-
if (!filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
562-
$this->logAndThrowError(400, 'Invalid email: '.$data['email'], 'Invalid email: '.$data['email']);
563-
}
564-
// Update email only if email is changed
565-
if ($data['email'] != $user->getEmail()) {
566-
// Check if email is already taken
567-
$user1 = $this->container->get('fos_user.user_manager')->findUserByUsernameOrEmail($data['email']);
568-
if (null != $user1) {
569-
$this->logAndThrowError(400, 'Email ' .$user1->getEmail().' already taken by Username: '.$user1->getUsername(), $this->get('translator')->trans('api.show_error_email_taken', array(), 'messages', $request->getLocale()), $request->getLocale());
570-
}
571-
$user->setEmail($data['email']);
572-
}
573-
}
574-
}
575-
576-
/**
577-
* Checks $request if it contains a key - firstname
578-
*/
579-
private function handleKeyFirstname(UserInterface $user, Request $request) {
580-
$data = $request->request->all();
581-
582-
if (array_key_exists('firstname', $data)) {
583-
// Check if firstname is empty. At least firstname is required.
584-
if (null == $data['firstname']) {
585-
$this->logAndThrowError(400, 'Invalid empty firstname', $this->get('translator')->trans('api.show_error_firstname', array(), 'messages', $request->getLocale()), $request->getLocale());
586-
}
587-
$user->setFirstname($data['firstname']);
588-
}
589-
590-
}
591-
592-
/**
593-
* Checks $request if it contains a key - lastname
594-
*/
595-
private function handleKeyLastname(UserInterface $user, Request $request) {
596-
$data = $request->request->all();
597-
598-
if (array_key_exists('lastname', $data)) {
599-
$user->setLastname($data['lastname']);
600-
}
601-
}
602-
603-
/**
604-
* Checks $request if it contains a key - dob
605-
*/
606-
private function handleKeyDob(UserInterface $user, Request $request) {
607-
$data = $request->request->all();
608-
609-
if (array_key_exists('dob', $data)) {
610-
// Check if dob is valid
611-
list($mm,$dd,$yyyy) = array_merge( explode('/',$data['dob']), array(0,0,0) );
612-
if (!checkdate($mm,$dd,$yyyy)) {
613-
$this->logAndThrowError(400, 'Invalid mm/dd/yyyy DOB: '.$data['dob'], $this->get('translator')->trans('api.show_error_dob', array(), 'messages', $request->getLocale()), $request->getLocale());
614-
}
615-
$user->setDob($data['dob']);
616-
}
617-
618-
}
619-
620481
/**
621482
* Request reset user password. A mail will be sent, if not sent earlier else will return error msg.
622483
*

src/ApiBundle/Resources/config/validation.yml

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,50 @@ ApiBundle\Entity\User:
44
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
55
fields: username
66
message: "user.show_error_username_taken"
7+
payload:
8+
api_error: 'api.show_error_username_taken'
79
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity:
810
fields: email
911
message: "user.show_error_email_taken"
12+
payload:
13+
api_error: 'api.show_error_email_taken'
1014
properties:
1115
firstname:
1216
- NotBlank:
17+
groups: [profile_edit]
1318
message: "user.show_error_firstname"
19+
payload:
20+
api_error: 'api.show_error_firstname'
1421
username:
1522
- Regex:
1623
pattern: '/^[a-z0-9_-]{3,16}$/'
1724
match: true
1825
message: "user.show_error_username_policy"
26+
payload:
27+
api_error: 'api.show_error_username_policy'
1928
password:
2029
- Regex:
2130
pattern: '/^([a-zA-Z0-9@*#]{8,15})$/'
2231
match: true
2332
message: "user.show_error_password_policy"
33+
payload:
34+
api_error: 'api.show_error_password_policy'
2435
email:
2536
- Email:
2637
message: "user.show_error_email"
2738
checkMX: false
39+
payload:
40+
api_error: 'api.show_error_email'
2841
dob:
2942
- Date:
43+
groups: [profile_edit]
3044
message: "user.show_error_dob"
45+
payload:
46+
api_error: 'api.show_error_dob'
3147
roles:
32-
- Type:
33-
type: array
34-
message: The value {{ value }} is not a valid {{ type }}.
3548
- Choice:
3649
choices: ['ROLE_USER', 'ROLE_API']
50+
multiple: true
3751
message: "user.show_error_role"
52+
payload:
53+
api_error: 'api.show_error_role'

src/ApiBundle/Resources/translations/messages.en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,4 @@ api:
145145
show_error_reset_req: Password reset request already received
146146
show_error_username_policy: Username should be 3-16 characters long with any lowercase letter (a-z), number (0-9), an underscore, or a hyphen
147147
show_error_password_policy: Password should be 8-15 characters long and must contain alphanumeric and @*# characters
148+
show_error_role: Sorry! Wrong Role!

src/ApiBundle/Resources/translations/messages.fr.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,4 @@ api:
134134
show_error_server_fault: Erreur du serveur! Veuillez réessayer après un certain temps !!
135135
show_error_username_policy: Le nom d'utilisateur doit comporter entre 3 et 16 caractères avec une lettre minuscule (a-z), un chiffre (0-9), un trait de soulignement ou un tiret
136136
show_error_password_policy: Le mot de passe doit comporter entre 8 et 15 caractères et contenir des caractères alphanumériques et @*#
137+
show_error_role: Pardon! Mauvais rôle!

src/ApiBundle/Resources/translations/messages.hi.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,4 @@ api:
134134
show_error_server_fault: सर्वर त्रुटि! कुछ समय के बाद फिर से कोशिश करें !!
135135
show_error_username_policy: यूजर का नाम किसी भी छोटा अक्षर (a-z), संख्या (0-9), एक अंडरस्कोर, या एक हाइफन के साथ 3-16 अक्षर का होना चाहिए
136136
show_error_password_policy: पासवर्ड 8-15 अक्षर का होना चाहिए और अल्फान्यूमेरिक और शामिल होना चाहिए @#* अक्षर
137+
show_error_role: माफ़ कीजिये! गलत भूमिका!

0 commit comments

Comments
 (0)