diff --git a/lib/Alchemy/Phrasea/Application.php b/lib/Alchemy/Phrasea/Application.php index 13e698b595..29ed265713 100644 --- a/lib/Alchemy/Phrasea/Application.php +++ b/lib/Alchemy/Phrasea/Application.php @@ -22,7 +22,6 @@ use Alchemy\Phrasea\ControllerProvider\Admin\SearchEngine; use Alchemy\Phrasea\ControllerProvider\Admin\Setup; use Alchemy\Phrasea\ControllerProvider\Admin\Subdefs; use Alchemy\Phrasea\ControllerProvider\Admin\TaskManager; -use Alchemy\Phrasea\ControllerProvider\Admin\Users; use Alchemy\Phrasea\ControllerProvider\Client\Root as ClientRoot; use Alchemy\Phrasea\ControllerProvider\Prod\BasketController; use Alchemy\Phrasea\ControllerProvider\Prod\Bridge; @@ -313,6 +312,7 @@ class Application extends SilexApplication $providers = [ 'Alchemy\Phrasea\ControllerProvider\Admin\Collection' => [], 'Alchemy\Phrasea\ControllerProvider\Admin\ConnectedUsers' => [], + 'Alchemy\Phrasea\ControllerProvider\Admin\Users' => [], 'Alchemy\Phrasea\ControllerProvider\Datafiles' => [], 'Alchemy\Phrasea\ControllerProvider\Lightbox' => [], 'Alchemy\Phrasea\ControllerProvider\Minifier' => [], @@ -624,7 +624,6 @@ class Application extends SilexApplication $this->mount('/admin/setup', new Setup()); $this->mount('/admin/search-engine', new SearchEngine()); $this->mount('/admin/publications', new Publications()); - $this->mount('/admin/users', new Users()); $this->mount('/admin/fields', new Fields()); $this->mount('/admin/task-manager', new TaskManager()); $this->mount('/admin/subdefs', new Subdefs()); @@ -672,6 +671,7 @@ class Application extends SilexApplication $providers = [ '/admin/collection' => 'Alchemy\Phrasea\ControllerProvider\Admin\Collection', '/admin/connected-users' => 'Alchemy\Phrasea\ControllerProvider\Admin\ConnectedUsers', + '/admin/users' => 'Alchemy\Phrasea\ControllerProvider\Admin\Users', '/datafiles' => 'Alchemy\Phrasea\ControllerProvider\Datafiles', '/include/minify' => 'Alchemy\Phrasea\ControllerProvider\Minifier', '/lightbox' => 'Alchemy\Phrasea\ControllerProvider\Lightbox', diff --git a/lib/Alchemy/Phrasea/Controller/Admin/UserController.php b/lib/Alchemy/Phrasea/Controller/Admin/UserController.php new file mode 100644 index 0000000000..d8c44a5503 --- /dev/null +++ b/lib/Alchemy/Phrasea/Controller/Admin/UserController.php @@ -0,0 +1,1076 @@ +app = $app; + } + + public function editRightsAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + return $this->render('admin/editusers.html.twig', $rights->get_users_rights()); + } + + public function resetRightsAction(Request $request) + { + try { + $data = ['error' => false]; + + $helper = $this->getUserEditHelper($request); + $helper->resetRights(); + } catch (\Exception $e) { + $data['error'] = true; + $data['message'] = $e->getMessage(); + } + + return $this->app->json($data); + } + + public function deleteUserAction(Request $request) + { + $module = $this->getUserEditHelper($request); + $module->delete_users(); + + return $this->app->redirectPath('admin_users_search'); + } + + public function applyRightsAction(Request $request) + { + $data = ['error' => true]; + + try { + $rights = $this->getUserEditHelper($request); + + $resetBeforeApply = (bool) $request->request->get('reset_before_apply', false); + if (!$resetBeforeApply) { + $rights->apply_rights(); + } + + if ($request->request->get('template')) { + if ($resetBeforeApply) { + $rights->resetRights(); + } + $rights->apply_template(); + } + + $rights->apply_infos(); + + $data = ['error' => false]; + } catch (\Exception $e) { + $data['message'] = $e->getMessage(); + } + + return $this->app->json($data); + } + + public function editQuotasRightsAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + return $this->render('admin/editusers_quotas.html.twig', $rights->get_quotas()); + } + + public function applyQuotasAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + $rights->apply_quotas(); + + return $this->app->json(['message' => '', 'error' => false]); + } + + public function editTimeLimitAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + + return $this->render('admin/editusers_timelimit.html.twig', $rights->get_time()); + } + + public function editTimeLimitSbasAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + + return $this->render('admin/editusers_timelimit_sbas.html.twig', $rights->get_time_sbas()); + } + + public function applyTimeAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + $rights->apply_time(); + + return $this->app->json(['message' => '', 'error' => false]); + } + + public function editMasksAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + + return $this->render('admin/editusers_masks.html.twig', $rights->get_masks()); + } + + public function applyMasksAction(Request $request) + { + $rights = $this->getUserEditHelper($request); + $rights->apply_masks(); + + return $this->app->json(['message' => '', 'error' => false]); + } + + public function searchAction(Request $request) + { + return $this->render('admin/users.html.twig', $this->getUserManageHelper($request)->search()); + } + + public function searchExportAction(Request $request) + { + $users = $this->getUserManageHelper($request); + $userTable = [ + [ + 'ID', + 'Login', + 'Last Name', + 'First Name', + 'E-Mail', + 'Created', + 'Updated', + 'Address', + 'City', + 'Zip', + 'Country', + 'Phone', + 'Fax', + 'Job', + 'Company', + 'Position' + ] + ]; + + foreach ($users->export() as $user) { + $userTable[] = [ + $user->getId(), + $user->getLogin(), + $user->getLastName(), + $user->getFirstName(), + $user->getEmail(), + $user->getCreated()->format(DATE_ATOM), + $user->getUpdated()->format(DATE_ATOM), + $user->getAddress(), + $user->getCity(), + $user->getZipCode(), + $user->getCountry(), + $user->getPhone(), + $user->getFax(), + $user->getJob(), + $user->getCompany(), + $user->getActivity() + ]; + } + + $filename = sprintf('user_export_%s.csv', date('Ymd')); + $exporter = $this->getCsvExporter(); + + return new CSVFileResponse($filename, function () use ($exporter, $userTable) { + $exporter->export('php://output', $userTable); + }); + } + + public function applyTemplateAction(Request $request) + { + $users = $this->getUserEditHelper($request); + if ($request->request->get('reset_before_apply')) { + $users->resetRights(); + } + $users->apply_template(); + + return $this->app->redirectPath('admin_users_search'); + } + + public function typeAheadSearchAction(Request $request) + { + $user_query = $this->createUserQuery(); + + $like_value = $request->query->get('term'); + $rights = $request->query->get('filter_rights') ? : []; + $have_right = $request->query->get('have_right') ? : []; + $have_not_right = $request->query->get('have_not_right') ? : []; + $on_base = $request->query->get('on_base') ? : []; + + $eligible_users = $user_query + ->on_sbas_where_i_am($this->getAclForConnectedUser(), $rights) + ->like(\User_Query::LIKE_EMAIL, $like_value) + ->like(\User_Query::LIKE_FIRSTNAME, $like_value) + ->like(\User_Query::LIKE_LASTNAME, $like_value) + ->like(\User_Query::LIKE_LOGIN, $like_value) + ->like_match(\User_Query::LIKE_MATCH_OR) + ->who_have_right($have_right) + ->who_have_not_right($have_not_right) + ->on_base_ids($on_base) + ->execute() + ->get_results(); + + $data = []; + foreach ($eligible_users as $user) { + $data[] = [ + 'email' => $user->getEmail() ? : '', + 'login' => $user->getLogin() ? : '', + 'name' => $user->getDisplayName(), + 'id' => $user->getId(), + ]; + } + + return $this->app->json($data); + } + + public function createAction(Request $request) + { + $data = ['error' => false, 'message' => '', 'data' => null]; + try { + $module = $this->getUserManageHelper($request); + if ($request->request->get('template') == '1') { + $user = $module->create_template(); + } else { + $user = $module->create_newuser(); + } + if (!$user instanceof User) { + throw new \Exception('Unknown error'); + } + + $data['data'] = $user->getId(); + } catch (\Exception $e) { + $data['error'] = true; + if ($request->request->get('template') == '1') { + $data['message'] = $this->app->trans('Unable to create template, the name is already used.'); + } else { + $data['message'] = $this->app->trans('Unable to create the user.'); + } + } + + return $this->app->json($data); + } + + public function exportAction(Request $request) + { + $user_query = $this->createUserQuery(); + + $like_value = $request->request->get('like_value'); + $like_field = $request->request->get('like_field'); + $on_base = $request->request->get('base_id') ? : null; + $on_sbas = $request->request->get('sbas_id') ? : null; + + $eligible_users = $user_query->on_bases_where_i_am($this->getAclForConnectedUser(), ['canadmin']) + ->like($like_field, $like_value) + ->on_base_ids($on_base) + ->on_sbas_ids($on_sbas); + + $offset = 0; + $buffer = []; + $buffer[] = [ + 'ID', + 'Login', + $this->app->trans('admin::compte-utilisateur nom'), + $this->app->trans('admin::compte-utilisateur prenom'), + $this->app->trans('admin::compte-utilisateur email'), + 'CreationDate', + 'ModificationDate', + $this->app->trans('admin::compte-utilisateur adresse'), + $this->app->trans('admin::compte-utilisateur ville'), + $this->app->trans('admin::compte-utilisateur code postal'), + $this->app->trans('admin::compte-utilisateur pays'), + $this->app->trans('admin::compte-utilisateur telephone'), + $this->app->trans('admin::compte-utilisateur fax'), + $this->app->trans('admin::compte-utilisateur poste'), + $this->app->trans('admin::compte-utilisateur societe'), + $this->app->trans('admin::compte-utilisateur activite'), + ]; + do { + $eligible_users->limit($offset, 20); + $offset += 20; + + $results = $eligible_users->execute()->get_results(); + + foreach ($results as $user) { + $buffer[] = [ + $user->getId(), + $user->getLogin(), + $user->getLastName(), + $user->getFirstName(), + $user->getEmail(), + $this->app['date-formatter']->format_mysql($user->getCreated()), + $this->app['date-formatter']->format_mysql($user->getUpdated()), + $user->getAddress(), + $user->getCity(), + $user->getZipCode(), + $user->getCountry(), + $user->getPhone(), + $user->getFax(), + $user->getJob(), + $user->getCompany(), + $user->getActivity(), + ]; + } + } while (count($results) > 0); + + $filename = sprintf('user_export_%s.csv', date('Ymd')); + $exporter = $this->getCsvExporter(); + return new CSVFileResponse($filename, function () use ($exporter, $buffer) { + $exporter->export('php://output', $buffer); + }); + } + + public function displayRegistrationsAction() + { + $this->getRegistrationManipulator()->deleteOldRegistrations(); + + /** @var UserRepository $userRepository */ + $userRepository = $this->app['repo.users']; + $authenticatedUser = $this->getAuthenticatedUser(); + $models = $userRepository->findTemplateOwner($authenticatedUser); + + $userRegistrations = []; + /** @var RegistrationRepository $registrationRepository */ + $registrationRepository = $this->app['repo.registrations']; + foreach ( + $registrationRepository->getUserRegistrations( + $authenticatedUser, + $this->getAclForConnectedUser()->get_granted_base(['canadmin']) + ) as $registration) { + $user = $registration->getUser(); + $userRegistrations[$user->getId()]['user'] = $user; + $userRegistrations[$user->getId()]['registrations'][$registration->getBaseid()] = $registration; + } + + return $this->render('admin/user/registrations.html.twig', [ + 'user_registrations' => $userRegistrations, + 'models' => $models, + ]); + } + + public function submitRegistrationAction(Request $request) + { + $templates = $this->normalizeTemplateArray($request->request->get('template', [])); + $deny = $this->normalizeDenyArray($request->request->get('deny', []), $templates); + + $accepts = $request->request->get('accept', []); + $accept = $options = []; + foreach ($accepts as $acc) { + $acc = explode('_', $acc); + if (count($acc) == 2 && !isset($templates[$acc[0]])) { + $accept[$acc[0]][$acc[1]] = $acc[1]; + $options[$acc[0]][$acc[1]] = ['HD' => false, 'WM' => false]; + } + } + + foreach ($request->request->get('accept_hd', []) as $accHD) { + $accHD = explode('_', $accHD); + if (count($accHD) == 2 && isset($accept[$accHD[0]]) && isset($options[$accHD[0]][$accHD[1]])) { + $options[$accHD[0]][$accHD[1]]['HD'] = true; + } + } + + foreach ($request->request->get('watermark', []) as $wm) { + $wm = explode('_', $wm); + if (count($wm) == 2 && isset($accept[$wm[0]]) && isset($options[$wm[0]][$wm[1]])) { + $options[$wm[0]][$wm[1]]['WM'] = true; + } + } + + $registrationManipulator = $this->getRegistrationManipulator(); + if (count($templates) > 0 || count($deny) > 0 || count($accept) > 0) { + $cacheToUpdate = $done = []; + + /** @var UserRepository $userRepository */ + $userRepository = $this->app['repo.users']; + $searchedUserIds = array_unique(array_merge( + array_keys($templates), + array_keys($deny), + array_keys($accept) + )); + // Load all user entities needed afterwards + $userRepository->findBy(['id' => $searchedUserIds]); + foreach ($templates as $usr => $template_id) { + /** @var User $user */ + $user = $userRepository->find($usr); + if (null === $user) { + $this->app->abort(400, sprintf("User with id % in provided in 'template' request variable could not be found", $usr)); + } + $cacheToUpdate[$usr] = $user; + + /** @var User $user_template */ + $user_template = $userRepository->find($template_id); + $collections = $this->getAclForUser($user_template)->get_granted_base(); + $baseIds = array_keys($collections); + + $this->getAclForUser($user)->apply_model($user_template, $baseIds); + + foreach ($collections as $collection) { + $done[$usr][$collection->get_base_id()] = true; + } + + $registrationManipulator->deleteUserRegistrations($user, $collections); + } + + /** @var RegistrationRepository $registrationRepository */ + $registrationRepository = $this->app['repo.registrations']; + foreach ($deny as $usr => $bases) { + /** @var User $user */ + $user = $userRepository->find($usr); + if (null === $user) { + $this->app->abort(400, sprintf("User with id % in provided in 'deny' request variable could not be found", $usr)); + } + $cacheToUpdate[$usr] = $user; + foreach ( + $registrationRepository->getUserRegistrations( + $user, + array_map(function ($baseId) { + return \collection::get_from_base_id($this->app, $baseId); + }, $bases) + ) as $registration) { + $registrationManipulator->rejectRegistration($registration); + $done[$usr][$registration->getBaseId()] = false; + } + } + + foreach ($accept as $usr => $bases) { + /** @var User $user */ + $user = $userRepository->find($usr); + if (null === $user) { + $this->app->abort(400, sprintf("User with id % in provided in 'accept' request variable could not be found", $usr)); + } + $cacheToUpdate[$usr] = $user; + foreach ($registrationRepository->getUserRegistrations( + $user, + array_map(function ($baseId) { + return \collection::get_from_base_id($this->app, $baseId); + }, $bases) + ) as $registration) { + $done[$usr][$registration->getBaseId()] = true; + $registrationManipulator->acceptRegistration( + $registration, + $options[$usr][$registration->getBaseId()]['HD'], + $options[$usr][$registration->getBaseId()]['WM'] + ); + } + } + + array_walk($cacheToUpdate, function (User $user) { + $this->getAclForUser($user)->delete_data_from_cache(); + }); + unset ($cacheToUpdate); + + foreach ($done as $usr => $bases) { + $user = $userRepository->find($usr); + $acceptColl = $denyColl = []; + + foreach ($bases as $bas => $isok) { + $collection = \collection::get_from_base_id($this->app, $bas); + + if ($isok) { + $acceptColl[] = $collection->get_label($this->app['locale']); + continue; + } + + $denyColl[] = $collection->get_label($this->app['locale']); + } + + if (0 !== count($acceptColl) || 0 !== count($denyColl)) { + $message = ''; + if (0 !== count($acceptColl)) { + $message .= "\n" . $this->app->trans('login::register:email: Vous avez ete accepte sur les collections suivantes : ') . implode(', ', $acceptColl). "\n"; + } + if (0 !== count($denyColl)) { + $message .= "\n" . $this->app->trans('login::register:email: Vous avez ete refuse sur les collections suivantes : ') . implode(', ', $denyColl) . "\n"; + } + + $receiver = new Receiver(null, $user->getEmail()); + $mail = MailSuccessEmailUpdate::create($this->app, $receiver, null, $message); + + /** @var Deliverer $deliverer */ + $deliverer = $this->app['notification.deliverer']; + $deliverer->deliver($mail); + } + } + } + + return $this->app->redirectPath('users_display_registrations', ['success' => 1]); + } + + public function displayImportFileAction() + { + return $this->render('admin/user/import/file.html.twig'); + } + + public function submitImportFileAction(Request $request) + { + if ((null === $file = $request->files->get('files')) || !$file->isValid()) { + return $this->app->redirectPath('users_display_import_file', ['error' => 'file-invalid']); + } + + $equivalenceToMysqlField = $this->getEquivalenceToMysqlField(); + $loginDefined = $pwdDefined = $mailDefined = false; + $loginNew = []; + $out = [ + 'ignored_row' => [], + 'errors' => [] + ]; + $nbUsrToAdd = 0; + + $lines = []; + /** @var Interpreter $interpreter */ + $interpreter = $this->app['csv.interpreter']; + $interpreter->addObserver(function (array $row) use (&$lines) { + $lines[] = $row; + }); + $this->app['csv.lexer']->parse($file->getPathname(), $interpreter); + + $roughColumns = array_shift($lines); + + $columnsSanitized = array_map(function ($columnName) { + return trim(mb_strtolower($columnName)); + }, $roughColumns); + + $columns = array_filter($columnsSanitized, function ($columnName) use (&$out, $equivalenceToMysqlField) { + if (!isset($equivalenceToMysqlField[$columnName])) { + $out['ignored_row'][] = $columnName; + + return false; + } + + return true; + }); + + foreach ($columns as $columnName) { + if ($equivalenceToMysqlField[$columnName] === 'usr_login') { + $loginDefined = true; + } + + if (($equivalenceToMysqlField[$columnName]) === 'usr_password') { + $pwdDefined = true; + } + + if (($equivalenceToMysqlField[$columnName]) === 'usr_mail') { + $mailDefined = true; + } + } + + if (!$loginDefined) { + return $this->app->redirectPath('users_display_import_file', ['error' => 'row-login']); + } + + if (!$pwdDefined) { + return $this->app->redirectPath('users_display_import_file', ['error' => 'row-pwd']); + } + + if (!$mailDefined) { + return $this->app->redirectPath('users_display_import_file', ['error' => 'row-mail']); + } + + /** @var UserRepository $userRepository */ + $userRepository = $this->app['repo.users']; + foreach ($lines as $nbLine => $line) { + $loginValid = false; + $pwdValid = false; + $mailValid = false; + + foreach ($columns as $nbCol => $colName) { + if (!isset($equivalenceToMysqlField[$colName])) { + unset($lines[$nbCol]); + continue; + } + + $sqlField = $equivalenceToMysqlField[$colName]; + $value = $line[$nbCol]; + + if ($sqlField === 'usr_login') { + $loginToAdd = $value; + if ($loginToAdd === "") { + $out['errors'][] = $this->app->trans("Login line %line% is empty", ['%line%' => $nbLine + 1]); + } elseif (in_array($loginToAdd, $loginNew)) { + $out['errors'][] = $this->app->trans( + "Login %login% is already defined in the file at line %line%", + ['%login%' => $loginToAdd, '%line%' => $nbLine] + ); + } else { + if (null !== $userRepository->findByLogin($loginToAdd)) { + $out['errors'][] = $this->app->trans( + "Login %login% already exists in database", + ['%login%' => $loginToAdd] + ); + } else { + $loginValid = true; + } + } + } + + if ($loginValid && $sqlField === 'usr_mail') { + $mailToAdd = $value; + + if ($mailToAdd === "") { + $out['errors'][] = $this->app->trans("Mail line %line% is empty", ['%line%' => $nbLine + 1]); + } elseif (null !== $userRepository->findByEmail($mailToAdd)) { + $out['errors'][] = $this->app->trans( + "Email '%email%' for login '%login%' already exists in database", + ['%email%' => $mailToAdd, '%login%' => $loginToAdd] + ); + } else { + $mailValid = true; + } + } + + if ($sqlField === 'usr_password') { + $passwordToVerif = $value; + + if ($passwordToVerif === "") { + $out['errors'][] = $this->app->trans("Password is empty at line %line%", ['%line%' => $nbLine]); + } else { + $pwdValid = true; + } + } + } + + if ($loginValid && $pwdValid && $mailValid) { + $loginNew[] = $loginToAdd; + $nbUsrToAdd++; + } + } + + if (count($out['errors']) > 0 && $nbUsrToAdd === 0) { + return $this->render('admin/user/import/file.html.twig', [ + 'errors' => $out['errors'] + ]); + } + + if ($nbUsrToAdd === 0) { + return $this->app->redirectPath('users_display_import_file', [ + 'error' => 'no-user' + ]); + } + + $basList = array_keys($this->getAclForConnectedUser()->get_granted_base(['manage'])); + /** @var NativeQueryProvider $query */ + $query = $this->app['orm.em.native-query']; + $models = $query->getModelForUser($this->getAuthenticatedUser(), $basList); + + return $this->render('/admin/user/import/view.html.twig', [ + 'nb_user_to_add' => $nbUsrToAdd, + 'models' => $models, + 'lines_serialized' => serialize($lines), + 'columns_serialized' => serialize($columns), + 'errors' => $out['errors'] + ]); + } + + public function submitImportAction(Request $request) + { + $nbCreation = 0; + + if ((null === $serializedColumns = $request->request->get('sr_columns')) || ('' === $serializedColumns)) { + $this->app->abort(400); + } + + if ((null === $serializedLines = $request->request->get('sr_lines')) || ('' === $serializedLines)) { + $this->app->abort(400); + } + + if (null === $model = $request->request->get("modelToApply")) { + $this->app->abort(400); + } + + $lines = unserialize($serializedLines); + $columns = unserialize($serializedColumns); + + $equivalenceToMysqlField = $this->getEquivalenceToMysqlField(); + + foreach ($lines as $nbLine => $line) { + $curUser = []; + foreach ($columns as $nbCol => $colName) { + if (!isset($equivalenceToMysqlField[$colName]) || !isset($line[$nbCol])) { + continue; + } + + $sqlField = $equivalenceToMysqlField[$colName]; + $value = trim($line[$nbCol]); + + if ($sqlField === "usr_sexe") { + switch ($value) { + case "Mlle": + case "Mlle.": + case "mlle": + case "Miss": + case "miss": + case "0": + $curUser[$sqlField] = 0; + break; + + case "Mme": + case "Madame": + case "Ms": + case "Ms.": + case "1": + $curUser[$sqlField] = 1; + break; + + case "M": + case "M.": + case "Mr": + case "Mr.": + case "Monsieur": + case "Mister": + case "2": + $curUser[$sqlField] = 2; + break; + } + } else { + $curUser[$sqlField] = $value; + } + } + + /** @var UserRepository $userRepository */ + $userRepository = $this->app['repo.users']; + /** @var UserManipulator $userManipulator */ + $userManipulator = $this->app['manipulator.user']; + if (isset($curUser['usr_login']) && trim($curUser['usr_login']) !== '' + && isset($curUser['usr_password']) && trim($curUser['usr_password']) !== '' + && isset($curUser['usr_mail']) && trim($curUser['usr_mail']) !== '') { + if (null === $userRepository->findByLogin($curUser['usr_login']) + && false === $userRepository->findByEmail($curUser['usr_mail'])) { + + $newUser = $userManipulator + ->createUser($curUser['usr_login'], $curUser['usr_password'], $curUser['usr_mail']); + + $ftpCredential = new FtpCredential(); + $ftpCredential->setUser($newUser); + + if (isset($curUser['activeFTP'])) { + $ftpCredential->setActive((int) $curUser['activeFTP']); + } + if (isset($curUser['addrFTP'])) { + $ftpCredential->setAddress((string) $curUser['addrFTP']); + } + if (isset($curUser['passifFTP'])) { + $ftpCredential->setPassive((int) $curUser['passifFTP']); + } + if (isset($curUser['destFTP'])) { + $ftpCredential->setReceptionFolder($curUser['destFTP']); + } + if (isset($curUser['prefixFTPfolder'])) { + $ftpCredential->setRepositoryPrefixName($curUser['prefixFTPfolder']); + } + if (isset($curUser['usr_prenom'])) { + $newUser->setFirstName($curUser['usr_prenom']); + } + if (isset($curUser['usr_nom'])) { + $newUser->setLastName($curUser['usr_nom']); + } + if (isset($curUser['adresse'])) { + $newUser->setAddress($curUser['adresse']); + } + if (isset($curUser['cpostal'])) { + $newUser->setZipCode($curUser['cpostal']); + } + if (isset($curUser['usr_sexe'])) { + $newUser->setGender((int) ($curUser['usr_sexe'])); + } + if (isset($curUser['tel'])) { + $newUser->setPhone($curUser['tel']); + } + if (isset($curUser['fax'])) { + $newUser->setFax($curUser['fax']); + } + if (isset($curUser['activite'])) { + $newUser->setJob($curUser['activite']); + } + if (isset($curUser['fonction'])) { + $newUser->setPosition($curUser['fonction']); + } + if (isset($curUser['societe'])) { + $newUser->setCompany($curUser['societe']); + } + + $this->getAclForUser($newUser)->apply_model( + $userRepository->find($model), + array_keys($this->getAclForConnectedUser()->get_granted_base(['manage'])) + ); + + $nbCreation++; + } + } + } + + return $this->app->redirectPath('admin_users_search', ['user-updated' => $nbCreation]); + } + + public function importCsvExampleAction() + { + $filename = $this->app['root.path'] . '/resources/examples/example_import_users.csv'; + $contentType = 'text/csv'; + return $this->returnExampleFile($filename, $contentType); + } + + public function importRtfExampleAction() + { + $filename = $this->app['root.path'] . '/resources/examples/fields.rtf'; + $contentType = 'text/rtf'; + return $this->returnExampleFile($filename, $contentType); + } + + public function getEquivalenceToMysqlField() + { + return [ + 'civilite' => 'usr_sexe', + 'gender' => 'usr_sexe', + 'usr_sexe' => 'usr_sexe', + 'nom' => 'usr_nom', + 'name' => 'usr_nom', + 'last name' => 'usr_nom', + 'last_name' => 'usr_nom', + 'usr_nom' => 'usr_nom', + 'first name' => 'usr_prenom', + 'first_name' => 'usr_prenom', + 'prenom' => 'usr_prenom', + 'usr_prenom' => 'usr_prenom', + 'identifiant' => 'usr_login', + 'login' => 'usr_login', + 'usr_login' => 'usr_login', + 'usr_password' => 'usr_password', + 'password' => 'usr_password', + 'mot de passe' => 'usr_password', + 'usr_mail' => 'usr_mail', + 'email' => 'usr_mail', + 'mail' => 'usr_mail', + 'adresse' => 'adresse', + 'adress' => 'adresse', + 'address' => 'adresse', + 'ville' => 'ville', + 'city' => 'ville', + 'zip' => 'cpostal', + 'zipcode' => 'cpostal', + 'zip_code' => 'cpostal', + 'cpostal' => 'cpostal', + 'cp' => 'cpostal', + 'code_postal' => 'cpostal', + 'tel' => 'tel', + 'telephone' => 'tel', + 'phone' => 'tel', + 'fax' => 'fax', + 'job' => 'fonction', + 'fonction' => 'fonction', + 'function' => 'fonction', + 'societe' => 'societe', + 'company' => 'societe', + 'activity' => 'activite', + 'activite' => 'activite', + 'pays' => 'pays', + 'country' => 'pays', + 'ftp_active' => 'activeFTP', + 'compte_ftp_actif' => 'activeFTP', + 'ftpactive' => 'activeFTP', + 'activeftp' => 'activeFTP', + 'ftp_adress' => 'addrFTP', + 'adresse_du_serveur_ftp' => 'addrFTP', + 'addrftp' => 'addrFTP', + 'ftpaddr' => 'addrFTP', + 'loginftp' => 'loginFTP', + 'ftplogin' => 'loginFTP', + 'ftppwd' => 'pwdFTP', + 'pwdftp' => 'pwdFTP', + 'destftp' => 'destFTP', + 'destination_folder' => 'destFTP', + 'dossier_de_destination' => 'destFTP', + 'passive_mode' => 'passifFTP', + 'mode_passif' => 'passifFTP', + 'passifftp' => 'passifFTP', + 'retry' => 'retryFTP', + 'nombre_de_tentative' => 'retryFTP', + 'retryftp' => 'retryFTP', + 'by_default__send' => 'defaultftpdatasent', + 'by_default_send' => 'defaultftpdatasent', + 'envoi_par_defaut' => 'defaultftpdatasent', + 'defaultftpdatasent' => 'defaultftpdatasent', + 'prefix_creation_folder' => 'prefixFTPfolder', + 'prefix_de_creation_de_dossier' => 'prefixFTPfolder', + 'prefixFTPfolder' => 'prefixFTPfolder', + ]; + } + + /** + * @param string $name + * @param array $context + * @return string + */ + private function render($name, array $context = []) + { + /** @var \Twig_Environment $twig */ + $twig = $this->app['twig']; + + return $twig->render($name, $context); + } + + /** + * @param Request $request + * @return UserHelper\Edit + */ + private function getUserEditHelper(Request $request) + { + return new UserHelper\Edit($this->app, $request); + } + + /** + * @param Request $request + * @return UserHelper\Manage + */ + private function getUserManageHelper(Request $request) + { + return new UserHelper\Manage($this->app, $request); + } + + /** + * @return \ACL + */ + private function getAclForConnectedUser() + { + return $this->getAclForUser($this->getAuthenticatedUser()); + + } + + /** + * @return \User_Query + */ + private function createUserQuery() + { + return $this->app['phraseanet.user-query']; + } + + /** + * @return ExporterInterface + */ + private function getCsvExporter() + { + /** @var ExporterInterface $exporter */ + $exporter = $this->app['csv.exporter']; + return $exporter; + } + + /** + * @return User|null + */ + private function getAuthenticatedUser() + { + /** @var Authenticator $authenticator */ + $authenticator = $this->app['authentication']; + return $authenticator->getUser(); + } + + /** + * @param array $template + * @return array + */ + private function normalizeTemplateArray(array $template) + { + $templates = []; + foreach ($template as $tmp) { + if ('' === trim($tmp)) { + continue; + } + + $tmp = explode('_', $tmp); + + if (count($tmp) == 2) { + $templates[$tmp[0]] = $tmp[1]; + } + } + return $templates; + } + + /** + * @param array $denials + * @param array $templates + * @return array + */ + private function normalizeDenyArray(array $denials, array $templates) + { + $deny = []; + foreach ($denials as $den) { + $den = explode('_', $den); + if (count($den) == 2 && !isset($templates[$den[0]])) { + $deny[$den[0]][$den[1]] = $den[1]; + } + } + return $deny; + } + + /** + * @param User $user + * @return \ACL + */ + private function getAclForUser(User $user) + { + /** @var ACLProvider $aclProvider */ + $aclProvider = $this->app['acl']; + return $aclProvider->get($user); + } + + /** + * @return RegistrationManipulator + */ + private function getRegistrationManipulator() + { + return $this->app['manipulator.registration']; + } + + /** + * @param $filename + * @param $contentType + * @return Response + */ + public function returnExampleFile($filename, $contentType) + { + $file = new \SplFileInfo($filename); + + if (!$file->isFile()) { + $this->app->abort(400); + } + + $response = new Response(); + $response->setStatusCode(200); + $response->headers->set('Pragma', 'public'); + $response->headers->set('Content-Disposition', 'attachment; filename=' . $file->getFilename()); + $response->headers->set('Content-Length', $file->getSize()); + $response->headers->set('Content-Type', $contentType); + $response->setContent(file_get_contents($file->getPathname())); + + return $response; + } +} diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Admin/Users.php b/lib/Alchemy/Phrasea/ControllerProvider/Admin/Users.php index 2d68b30422..30f1a2f89c 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Admin/Users.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Admin/Users.php @@ -11,906 +11,76 @@ namespace Alchemy\Phrasea\ControllerProvider\Admin; -use Alchemy\Phrasea\Core\Response\CSVFileResponse; -use Alchemy\Phrasea\Helper\User as UserHelper; -use Alchemy\Phrasea\Model\Entities\FtpCredential; -use Alchemy\Phrasea\Model\Entities\User; +use Alchemy\Phrasea\Controller\Admin\UserController; use Silex\Application; +use Silex\ControllerCollection; use Silex\ControllerProviderInterface; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use Alchemy\Phrasea\Notification\Receiver; -use Alchemy\Phrasea\Notification\Mail\MailSuccessEmailUpdate; +use Silex\ServiceProviderInterface; -class Users implements ControllerProviderInterface +class Users implements ControllerProviderInterface, ServiceProviderInterface { + public function register(Application $app) + { + $app['controller.admin.users'] = $app->share(function () use ($app) { + return new UserController($app); + }); + } + + public function boot(Application $app) + { + } + public function connect(Application $app) { - $app['controller.admin.users'] = $this; - + /** @var ControllerCollection $controllers */ $controllers = $app['controllers_factory']; $app['firewall']->addMandatoryAuthentication($controllers); - $controllers->before(function (Request $request) use ($app) { + $controllers->before(function () use ($app) { $app['firewall']->requireAccessToModule('admin') ->requireRight('manageusers'); }); - $controllers->post('/rights/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - - return $app['twig']->render('admin/editusers.html.twig', $rights->get_users_rights()); - }); - - $controllers->get('/rights/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - - return $app['twig']->render('admin/editusers.html.twig', $rights->get_users_rights()); - }); - - $controllers->post('/rights/reset/', function (Application $app, Request $request) { - try { - $datas = ['error' => false]; - - $helper = new UserHelper\Edit($app, $request); - $helper->resetRights(); - } catch (\Exception $e) { - $datas['error'] = true; - $datas['message'] = $e->getMessage(); - } - - return $app->json($datas); - })->bind('admin_users_rights_reset'); - - $controllers->post('/delete/', function (Application $app) { - $module = new UserHelper\Edit($app, $app['request']); - $module->delete_users(); - - return $app->redirectPath('admin_users_search'); - }); - - $controllers->post('/rights/apply/', function (Application $app) { - $datas = ['error' => true]; - - try { - $rights = new UserHelper\Edit($app, $app['request']); - - if (!$app['request']->request->get('reset_before_apply')) { - $rights->apply_rights(); - } - - if ($app['request']->request->get('template')) { - if ($app['request']->request->get('reset_before_apply')) { - $rights->resetRights(); - } - $rights->apply_template(); - } - - $rights->apply_infos(); - - $datas = ['error' => false]; - } catch (\Exception $e) { - $datas['message'] = $e->getMessage(); - } - - return $app->json($datas); - })->bind('admin_users_rights_apply'); - - $controllers->post('/rights/quotas/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - - return $app['twig']->render('admin/editusers_quotas.html.twig', $rights->get_quotas()); - }); - - $controllers->post('/rights/quotas/apply/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - $rights->apply_quotas(); - - return $app->json(['message' => '', 'error' => false]); - }); - - $controllers->post('/rights/time/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - - return $app['twig']->render('admin/editusers_timelimit.html.twig', $rights->get_time()); - }); - - $controllers->post('/rights/time/sbas/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - - return $app['twig']->render('admin/editusers_timelimit_sbas.html.twig', $rights->get_time_sbas()); - }); - - $controllers->post('/rights/time/apply/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - $rights->apply_time(); - - return $app->json(['message' => '', 'error' => false]); - }); - - $controllers->post('/rights/masks/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - - return $app['twig']->render('admin/editusers_masks.html.twig', $rights->get_masks()); - }); - - $controllers->post('/rights/masks/apply/', function (Application $app) { - $rights = new UserHelper\Edit($app, $app['request']); - $rights->apply_masks(); - - return $app->json(['message' => '', 'error' => false]); - }); - - $controllers->match('/search/', function (Application $app) { - $users = new UserHelper\Manage($app, $app['request']); - - return $app['twig']->render('admin/users.html.twig', $users->search()); - })->bind('admin_users_search'); - - $controllers->post('/search/export/', function () use ($app) { - $users = new UserHelper\Manage($app, $app['request']); - - $userTable = [ - [ - 'ID', - 'Login', - 'Last Name', - 'First Name', - 'E-Mail', - 'Created', - 'Updated', - 'Address', - 'City', - 'Zip', - 'Country', - 'Phone', - 'Fax', - 'Job', - 'Company', - 'Position' - ] - ]; - - foreach ($users->export() as $user) { - $userTable[] = [ - $user->getId(), - $user->getLogin(), - $user->getLastName(), - $user->getFirstName(), - $user->getEmail(), - $user->getCreated()->format(DATE_ATOM), - $user->getUpdated()->format(DATE_ATOM), - $user->getAddress(), - $user->getCity(), - $user->getZipCode(), - $user->getCountry(), - $user->getPhone(), - $user->getFax(), - $user->getJob(), - $user->getCompany(), - $user->getActivity() - ]; - } - - $filename = sprintf('user_export_%s.csv', date('Ymd')); - $response = new CSVFileResponse($filename, function () use ($app, $userTable) { - $app['csv.exporter']->export('php://output', $userTable); - }); - - return $response; - })->bind('admin_users_search_export'); - - $controllers->post('/apply_template/', function () use ($app) { - $users = new UserHelper\Edit($app, $app['request']); - - if ($app['request']->request->get('reset_before_apply')) { - $users->resetRights(); - } - $users->apply_template(); - - return $app->redirectPath('admin_users_search'); - })->bind('admin_users_apply_template'); - - $controllers->get('/typeahead/search/', function (Application $app) { - $request = $app['request']; - - $user_query = $app['phraseanet.user-query']; - $like_value = $request->query->get('term'); - $rights = $request->query->get('filter_rights') ? : []; - $have_right = $request->query->get('have_right') ? : []; - $have_not_right = $request->query->get('have_not_right') ? : []; - $on_base = $request->query->get('on_base') ? : []; - - $eligible_users = $user_query - ->on_sbas_where_i_am($app['acl']->get($app['authentication']->getUser()), $rights) - ->like(\User_Query::LIKE_EMAIL, $like_value) - ->like(\User_Query::LIKE_FIRSTNAME, $like_value) - ->like(\User_Query::LIKE_LASTNAME, $like_value) - ->like(\User_Query::LIKE_LOGIN, $like_value) - ->like_match(\User_Query::LIKE_MATCH_OR) - ->who_have_right($have_right) - ->who_have_not_right($have_not_right) - ->on_base_ids($on_base) - ->execute() - ->get_results(); - - $datas = []; - - foreach ($eligible_users as $user) { - $datas[] = [ - 'email' => $user->getEmail() ? : '', - 'login' => $user->getLogin() ? : '', - 'name' => $user->getDisplayName(), - 'id' => $user->getId(), - ]; - } - - return $app->json($datas); - }); - - $controllers->post('/create/', function (Application $app) { - $datas = ['error' => false, 'message' => '', 'data' => null]; - try { - $request = $app['request']; - $module = new UserHelper\Manage($app, $app['request']); - if ($request->request->get('template') == '1') { - $user = $module->create_template(); - } else { - $user = $module->create_newuser(); - } - if (!$user instanceof User) { - throw new \Exception('Unknown error'); - } - - $datas['data'] = $user->getId(); - } catch (\Exception $e) { - $datas['error'] = true; - if ($request->request->get('template') == '1') { - $datas['message'] = $app->trans('Unable to create template, the name is already used.'); - } else { - $datas['message'] = $app->trans('Unable to create the user.'); - } - } - - return $app->json($datas); - }); - - $controllers->post('/export/csv/', function (Application $app) { - $request = $app['request']; - $user_query = $app['phraseanet.user-query']; - - $like_value = $request->request->get('like_value'); - $like_field = $request->request->get('like_field'); - $on_base = $request->request->get('base_id') ? : null; - $on_sbas = $request->request->get('sbas_id') ? : null; - - $eligible_users = $user_query->on_bases_where_i_am($app['acl']->get($app['authentication']->getUser()), ['canadmin']) - ->like($like_field, $like_value) - ->on_base_ids($on_base) - ->on_sbas_ids($on_sbas); - - $offset = 0; - $buffer = []; - - $buffer[] = [ - 'ID', - 'Login', - $app->trans('admin::compte-utilisateur nom'), - $app->trans('admin::compte-utilisateur prenom'), - $app->trans('admin::compte-utilisateur email'), - 'CreationDate', - 'ModificationDate', - $app->trans('admin::compte-utilisateur adresse'), - $app->trans('admin::compte-utilisateur ville'), - $app->trans('admin::compte-utilisateur code postal'), - $app->trans('admin::compte-utilisateur pays'), - $app->trans('admin::compte-utilisateur telephone'), - $app->trans('admin::compte-utilisateur fax'), - $app->trans('admin::compte-utilisateur poste'), - $app->trans('admin::compte-utilisateur societe'), - $app->trans('admin::compte-utilisateur activite'), - ]; - do { - $eligible_users->limit($offset, 20); - $offset += 20; - - $results = $eligible_users->execute()->get_results(); - - foreach ($results as $user) { - $buffer[] = [ - $user->getId(), - $user->getLogin(), - $user->getLastName(), - $user->getFirstName(), - $user->getEmail(), - $app['date-formatter']->format_mysql($user->getCreated()), - $app['date-formatter']->format_mysql($user->getUpdated()), - $user->getAddress(), - $user->getCity(), - $user->getZipCode(), - $user->getCountry(), - $user->getPhone(), - $user->getFax(), - $user->getJob(), - $user->getCompany(), - $user->getActivity(), - ]; - } - } while (count($results) > 0); - - $filename = sprintf('user_export_%s.csv', date('Ymd')); - $response = new CSVFileResponse($filename, function () use ($app, $buffer) { - $app['csv.exporter']->export('php://output', $buffer); - }); - - return $response; - })->bind('admin_users_export_csv'); - - $controllers->get('/registrations/', function (Application $app) { - $app['manipulator.registration']->deleteOldRegistrations(); - - $models = $app['repo.users']->findTemplateOwner($app['authentication']->getUser()); - - $userRegistrations = []; - foreach ($app['repo.registrations']->getUserRegistrations( - $app['authentication']->getUser(), - $app['acl']->get($app['authentication']->getUser())->get_granted_base(['canadmin']) - ) as $registration) { - $user = $registration->getUser(); - $userRegistrations[$user->getId()]['user'] = $user; - $userRegistrations[$user->getId()]['registrations'][$registration->getBaseid()] = $registration; - } - - return $app['twig']->render('admin/user/registrations.html.twig', [ - 'user_registrations' => $userRegistrations, - 'models' => $models, - ]); - })->bind('users_display_registrations'); - - $controllers->post('/registrations/', function (Application $app, Request $request) { - $templates = $deny = $accept = $options = []; - - foreach ($request->request->get('template', []) as $tmp) { - if ('' === trim($tmp)) { - continue; - } - - $tmp = explode('_', $tmp); - - if (count($tmp) == 2) { - $templates[$tmp[0]] = $tmp[1]; - } - } - - foreach ($request->request->get('deny', []) as $den) { - $den = explode('_', $den); - if (count($den) == 2 && !isset($templates[$den[0]])) { - $deny[$den[0]][$den[1]] = $den[1]; - } - } - - foreach ($request->request->get('accept', []) as $acc) { - $acc = explode('_', $acc); - if (count($acc) == 2 && !isset($templates[$acc[0]])) { - $accept[$acc[0]][$acc[1]] = $acc[1]; - $options[$acc[0]][$acc[1]] = ['HD' => false, 'WM' => false]; - } - } - - foreach ($request->request->get('accept_hd', []) as $accHD) { - $accHD = explode('_', $accHD); - if (count($accHD) == 2 && isset($accept[$accHD[0]]) && isset($options[$accHD[0]][$accHD[1]])) { - $options[$accHD[0]][$accHD[1]]['HD'] = true; - } - } - - foreach ($request->request->get('watermark', []) as $wm) { - $wm = explode('_', $wm); - if (count($wm) == 2 && isset($accept[$wm[0]]) && isset($options[$wm[0]][$wm[1]])) { - $options[$wm[0]][$wm[1]]['WM'] = true; - } - } - - if (count($templates) > 0 || count($deny) > 0 || count($accept) > 0) { - $cacheToUpdate = $done = []; - - foreach ($templates as $usr => $template_id) { - if (null === $user = $app['repo.users']->find($usr)) { - $app->abort(400, srpintf("User with id % in provided in 'template' request variable could not be found", $usr)); - } - $cacheToUpdate[$usr] = $user; - - $user_template = $app['repo.users']->find($template_id); - $collections = $app['acl']->get($user_template)->get_granted_base(); - $baseIds = array_keys($collections); - - $app['acl']->get($user)->apply_model($user_template, $baseIds); - - foreach ($collections as $collection) { - $done[$usr][$collection->get_base_id()] = true; - } - - $app['manipulator.registration']->deleteUserRegistrations($user, $collections); - } - - foreach ($deny as $usr => $bases) { - if (null === $user = $app['repo.users']->find($usr)) { - $app->abort(400, srpintf("User with id % in provided in 'deny' request variable could not be found", $usr)); - } - $cacheToUpdate[$usr] = $user; - foreach ($app['repo.registrations']->getUserRegistrations( - $user, - array_map(function ($baseId) use ($app) { - return \collection::get_from_base_id($app, $baseId); - }, $bases) - ) as $registration) { - $app['manipulator.registration']->rejectRegistration($registration); - $done[$usr][$registration->getBaseId()] = false; - } - } - - foreach ($accept as $usr => $bases) { - if (null === $user = $app['repo.users']->find($usr)) { - $app->abort(400, srpintf("User with id % in provided in 'accept' request variable could not be found", $usr)); - } - $cacheToUpdate[$usr] = $user; - foreach ($app['repo.registrations']->getUserRegistrations( - $user, - array_map(function ($baseId) use ($app) { - return \collection::get_from_base_id($app, $baseId); - }, $bases) - ) as $registration) { - $done[$usr][$registration->getBaseId()] = true; - $app['manipulator.registration']->acceptRegistration( - $registration, - $options[$usr][$registration->getBaseId()]['HD'], - $options[$usr][$registration->getBaseId()]['WM'] - ); - } - } - - array_walk($cacheToUpdate, function (User $user) use ($app) { - $app['acl']->get($user)->delete_data_from_cache(); - }); - unset ($cacheToUpdate); - - foreach ($done as $usr => $bases) { - $user = $app['repo.users']->find($usr); - $acceptColl = $denyColl = []; - - foreach ($bases as $bas => $isok) { - $collection = \collection::get_from_base_id($app, $bas); - - if ($isok) { - $acceptColl[] = $collection->get_label($app['locale']); - continue; - } - - $denyColl[] = $collection->get_label($app['locale']); - } - - if (0 !== count($acceptColl) || 0 !== count($denyColl)) { - $message = ''; - if (0 !== count($acceptColl)) { - $message .= "\n" . $app->trans('login::register:email: Vous avez ete accepte sur les collections suivantes : ') . implode(', ', $acceptColl). "\n"; - } - if (0 !== count($denyColl)) { - $message .= "\n" . $app->trans('login::register:email: Vous avez ete refuse sur les collections suivantes : ') . implode(', ', $denyColl) . "\n"; - } - - $receiver = new Receiver(null, $user->getEmail()); - $mail = MailSuccessEmailUpdate::create($app, $receiver, null, $message); - - $app['notification.deliverer']->deliver($mail); - } - } - } - - return $app->redirectPath('users_display_registrations', ['success' => 1]); - })->bind('users_submit_registrations'); - - $controllers->get('/import/file/', function (Application $app, Request $request) { - return $app['twig']->render('admin/user/import/file.html.twig'); - })->bind('users_display_import_file'); - - $controllers->post('/import/file/', function (Application $app, Request $request) { - - if ((null === $file = $request->files->get('files')) || !$file->isValid()) { - return $app->redirectPath('users_display_import_file', ['error' => 'file-invalid']); - } - - $equivalenceToMysqlField = Users::getEquivalenceToMysqlField(); - $loginDefined = $pwdDefined = $mailDefined = false; - $loginNew = []; - $out = [ - 'ignored_row' => [], - 'errors' => [] - ]; - $nbUsrToAdd = 0; - - $lines = []; - $app['csv.interpreter']->addObserver(function (array $row) use (&$lines) { - $lines[] = $row; - }); - $app['csv.lexer']->parse($file->getPathname(), $app['csv.interpreter']); - - $roughColumns = array_shift($lines); - - $columnsSanitized = array_map(function ($columnName) { - return trim(mb_strtolower($columnName)); - }, $roughColumns); - - $columns = array_filter($columnsSanitized, function ($columnName) use (&$out, $equivalenceToMysqlField) { - if (!isset($equivalenceToMysqlField[$columnName])) { - $out['ignored_row'][] = $columnName; - - return false; - } - - return true; - }); - - foreach ($columns as $columnName) { - if ($equivalenceToMysqlField[$columnName] === 'usr_login') { - $loginDefined = true; - } - - if (($equivalenceToMysqlField[$columnName]) === 'usr_password') { - $pwdDefined = true; - } - - if (($equivalenceToMysqlField[$columnName]) === 'usr_mail') { - $mailDefined = true; - } - } - - if (!$loginDefined) { - return $app->redirectPath('users_display_import_file', ['error' => 'row-login']); - } - - if (!$pwdDefined) { - return $app->redirectPath('users_display_import_file', ['error' => 'row-pwd']); - } - - if (!$mailDefined) { - return $app->redirectPath('users_display_import_file', ['error' => 'row-mail']); - } - - foreach ($lines as $nbLine => $line) { - $loginValid = false; - $pwdValid = false; - $mailValid = false; - - foreach ($columns as $nbCol => $colName) { - if (!isset($equivalenceToMysqlField[$colName])) { - unset($lines[$nbCol]); - continue; - } - - $sqlField = $equivalenceToMysqlField[$colName]; - $value = $line[$nbCol]; - - if ($sqlField === 'usr_login') { - $loginToAdd = $value; - if ($loginToAdd === "") { - $out['errors'][] = $app->trans("Login line %line% is empty", ['%line%' => $nbLine + 1]); - } elseif (in_array($loginToAdd, $loginNew)) { - $out['errors'][] = $app->trans("Login %login% is already defined in the file at line %line%", ['%login%' => $loginToAdd, '%line%' => $nbLine]); - } else { - if (null !== $app['repo.users']->findByLogin($loginToAdd)) { - $out['errors'][] = $app->trans("Login %login% already exists in database", ['%login%' => $loginToAdd]); - } else { - $loginValid = true; - } - } - } - - if ($loginValid && $sqlField === 'usr_mail') { - $mailToAdd = $value; - - if ($mailToAdd === "") { - $out['errors'][] = $app->trans("Mail line %line% is empty", ['%line%' => $nbLine + 1]); - } elseif (null !== $app['repo.users']->findByEmail($mailToAdd)) { - $out['errors'][] = $app->trans("Email '%email%' for login '%login%' already exists in database", ['%email%' => $mailToAdd, '%login%' => $loginToAdd]); - } else { - $mailValid = true; - } - } - - if ($sqlField === 'usr_password') { - $passwordToVerif = $value; - - if ($passwordToVerif === "") { - $out['errors'][] = $app->trans("Password is empty at line %line%", ['%line%' => $nbLine]); - } else { - $pwdValid = true; - } - } - } - - if ($loginValid && $pwdValid && $mailValid) { - $loginNew[] = $loginToAdd; - $nbUsrToAdd++; - } - } - - if (count($out['errors']) > 0 && $nbUsrToAdd === 0) { - return $app['twig']->render('admin/user/import/file.html.twig', [ - 'errors' => $out['errors'] - ]); - } - - if ($nbUsrToAdd === 0) { - return $app->redirectPath('users_display_import_file', [ - 'error' => 'no-user' - ]); - } - - $basList = array_keys($app['acl']->get($app['authentication']->getUser())->get_granted_base(['manage'])); - $models = $app['orm.em.native-query']->getModelForUser($app['authentication']->getUser(), $basList); - - return $app['twig']->render('/admin/user/import/view.html.twig', [ - 'nb_user_to_add' => $nbUsrToAdd, - 'models' => $models, - 'lines_serialized' => serialize($lines), - 'columns_serialized' => serialize($columns), - 'errors' => $out['errors'] - ]); - })->bind('users_submit_import_file'); - - $controllers->post('/import/', function (Application $app, Request $request) { - $nbCreation = 0; - - if ((null === $serializedColumns = $request->request->get('sr_columns')) || ('' === $serializedColumns)) { - $app->abort(400); - } - - if ((null === $serializedLines = $request->request->get('sr_lines')) || ('' === $serializedLines)) { - $app->abort(400); - } - - if (null === $model = $request->request->get("modelToApply")) { - $app->abort(400); - } - - $lines = unserialize($serializedLines); - $columns = unserialize($serializedColumns); - - $equivalenceToMysqlField = Users::getEquivalenceToMysqlField(); - - foreach ($lines as $nbLine => $line) { - $curUser = []; - foreach ($columns as $nbCol => $colName) { - if (!isset($equivalenceToMysqlField[$colName]) || !isset($line[$nbCol])) { - continue; - } - - $sqlField = $equivalenceToMysqlField[$colName]; - $value = trim($line[$nbCol]); - - if ($sqlField === "usr_sexe") { - switch ($value) { - case "Mlle": - case "Mlle.": - case "mlle": - case "Miss": - case "miss": - case "0": - $curUser[$sqlField] = 0; - break; - - case "Mme": - case "Madame": - case "Ms": - case "Ms.": - case "1": - $curUser[$sqlField] = 1; - break; - - case "M": - case "M.": - case "Mr": - case "Mr.": - case "Monsieur": - case "Mister": - case "2": - $curUser[$sqlField] = 2; - break; - } - } else { - $curUser[$sqlField] = $value; - } - } - - if (isset($curUser['usr_login']) && trim($curUser['usr_login']) !== '' - && isset($curUser['usr_password']) && trim($curUser['usr_password']) !== '' - && isset($curUser['usr_mail']) && trim($curUser['usr_mail']) !== '') { - if (null === $app['repo.users']->findByLogin($curUser['usr_login']) - && false === $app['repo.users']->findByEmail($curUser['usr_mail'])) { - - $newUser = $app['manipulator.user']->createUser($curUser['usr_login'], $curUser['usr_password'], $curUser['usr_mail']); - - $ftpCredential = new FtpCredential(); - $ftpCredential->setUser($newUser); - - if (isset($curUser['activeFTP'])) { - $ftpCredential->setActive((int) $curUser['activeFTP']); - } - if (isset($curUser['addrFTP'])) { - $ftpCredential->setAddress((string) $curUser['addrFTP']); - } - if (isset($curUser['passifFTP'])) { - $ftpCredential->setPassive((int) $curUser['passifFTP']); - } - if (isset($curUser['destFTP'])) { - $ftpCredential->setReceptionFolder($curUser['destFTP']); - } - if (isset($curUser['prefixFTPfolder'])) { - $ftpCredential->setRepositoryPrefixName($curUser['prefixFTPfolder']); - } - if (isset($curUser['usr_prenom'])) { - $newUser->setFirstName($curUser['usr_prenom']); - } - if (isset($curUser['usr_nom'])) { - $newUser->setLastName($curUser['usr_nom']); - } - if (isset($curUser['adresse'])) { - $newUser->setAdress($curUser['adresse']); - } - if (isset($curUser['cpostal'])) { - $newUser->setZipCode($curUser['cpostal']); - } - if (isset($curUser['usr_sexe'])) { - $newUser->setGender((int) ($curUser['usr_sexe'])); - } - if (isset($curUser['tel'])) { - $newUser->setPhone($curUser['tel']); - } - if (isset($curUser['fax'])) { - $newUser->setFax($curUser['fax']); - } - if (isset($curUser['activite'])) { - $newUser->setJob($curUser['activite']); - } - if (isset($curUser['fonction'])) { - $newUser->setPosition($curUser['fonction']); - } - if (isset($curUser['societe'])) { - $newUser->setCompany($curUser['societe']); - } - - $app['acl']->get($newUser)->apply_model( - $app['repo.users']->find($model), array_keys($app['acl']->get($app['authentication']->getUser())->get_granted_base(['manage'])) - ); - - $nbCreation++; - } - } - } - - return $app->redirectPath('admin_users_search', ['user-updated' => $nbCreation]); - })->bind('users_submit_import'); - - $controllers->get('/import/example/csv/', function (Application $app) { - - $file = new \SplFileInfo($app['root.path'] . '/resources/examples/example_import_users.csv'); - - if (!$file->isFile()) { - $app->abort(400); - } - - $response = new Response(); - $response->setStatusCode(200); - $response->headers->set('Pragma', 'public'); - $response->headers->set('Content-Disposition', 'attachment; filename=' . $file->getFilename()); - $response->headers->set('Content-Length', $file->getSize()); - $response->headers->set('Content-Type', 'text/csv'); - $response->setContent(file_get_contents($file->getPathname())); - - return $response; - })->bind('users_import_csv'); - - $controllers->get('/import/example/rtf/', function (Application $app) { - - $file = new \SplFileInfo($app['root.path'] . '/resources/examples/fields.rtf'); - - if (!$file->isFile()) { - $app->abort(400); - } - - $response = new Response(); - $response->setStatusCode(200); - $response->headers->set('Pragma', 'public'); - $response->headers->set('Content-Disposition', 'attachment; filename=' . $file->getFilename()); - $response->headers->set('Content-Length', $file->getSize()); - $response->headers->set('Content-Type', 'text/rtf'); - $response->setContent(file_get_contents($file->getPathname())); - - return $response; - })->bind('users_import_rtf'); + $controllers->match('/rights/', 'controller.admin.users:editRightsAction') + ->method('GET|POST'); + $controllers->post('/rights/reset/', 'controller.admin.users:resetRightsAction') + ->bind('admin_users_rights_reset'); + $controllers->post('/delete/', 'controller.admin.users:deleteUserAction'); + $controllers->post('/rights/apply/', 'controller.admin.users:applyRightsAction') + ->bind('admin_users_rights_apply'); + $controllers->post('/rights/quotas/', 'controller.admin.users:editQuotasRightsAction'); + $controllers->post('/rights/quotas/apply/', 'controller.admin.users:applyQuotasAction'); + $controllers->post('/rights/time/', 'controller.admin.users:editTimeLimitAction'); + $controllers->post('/rights/time/sbas/', 'controller.admin.users:editTimeLimitSbasAction'); + $controllers->post('/rights/time/apply/', 'controller.admin.users:applyTimeAction'); + $controllers->post('/rights/masks/', 'controller.admin.users:editMasksAction'); + $controllers->post('/rights/masks/apply/', 'controller.admin.users:applyMasksAction'); + $controllers->match('/search/', 'controller.admin.users:searchAction') + ->bind('admin_users_search'); + $controllers->post('/search/export/', 'controller.admin.users:searchExportAction') + ->bind('admin_users_search_export'); + $controllers->post('/apply_template/', 'controller.admin.users:applyTemplateAction') + ->bind('admin_users_apply_template'); + $controllers->get('/typeahead/search/', 'controller.admin.users:typeAheadSearchAction'); + $controllers->post('/create/', 'controller.admin.users:createAction'); + $controllers->post('/export/csv/', 'controller.admin.users:exportAction') + ->bind('admin_users_export_csv'); + $controllers->get('/registrations/', 'controller.admin.users:displayRegistrationsAction') + ->bind('users_display_registrations'); + $controllers->post('/registrations/', 'controller.admin.users:submitRegistrationAction') + ->bind('users_submit_registrations'); + $controllers->get('/import/file/', 'controller.admin.users:displayImportFileAction') + ->bind('users_display_import_file'); + $controllers->post('/import/file/', 'controller.admin.users:submitImportFileAction') + ->bind('users_submit_import_file'); + $controllers->post('/import/', 'controller.admin.users:submitImportAction') + ->bind('users_submit_import'); + $controllers->get('/import/example/csv/', 'controller.admin.users:importCsvExampleAction') + ->bind('users_import_csv'); + $controllers->get('/import/example/rtf/', 'controller.admin.users:importRtfExampleAction') + ->bind('users_import_rtf'); return $controllers; } - - public static function getEquivalenceToMysqlField() - { - $equivalenceToMysqlField = []; - - $equivalenceToMysqlField['civilite'] = 'usr_sexe'; - $equivalenceToMysqlField['gender'] = 'usr_sexe'; - $equivalenceToMysqlField['usr_sexe'] = 'usr_sexe'; - $equivalenceToMysqlField['nom'] = 'usr_nom'; - $equivalenceToMysqlField['name'] = 'usr_nom'; - $equivalenceToMysqlField['last name'] = 'usr_nom'; - $equivalenceToMysqlField['last_name'] = 'usr_nom'; - $equivalenceToMysqlField['usr_nom'] = 'usr_nom'; - $equivalenceToMysqlField['first name'] = 'usr_prenom'; - $equivalenceToMysqlField['first_name'] = 'usr_prenom'; - $equivalenceToMysqlField['prenom'] = 'usr_prenom'; - $equivalenceToMysqlField['usr_prenom'] = 'usr_prenom'; - $equivalenceToMysqlField['identifiant'] = 'usr_login'; - $equivalenceToMysqlField['login'] = 'usr_login'; - $equivalenceToMysqlField['usr_login'] = 'usr_login'; - $equivalenceToMysqlField['usr_password'] = 'usr_password'; - $equivalenceToMysqlField['password'] = 'usr_password'; - $equivalenceToMysqlField['mot de passe'] = 'usr_password'; - $equivalenceToMysqlField['usr_mail'] = 'usr_mail'; - $equivalenceToMysqlField['email'] = 'usr_mail'; - $equivalenceToMysqlField['mail'] = 'usr_mail'; - $equivalenceToMysqlField['adresse'] = 'adresse'; - $equivalenceToMysqlField['adress'] = 'adresse'; - $equivalenceToMysqlField['address'] = 'adresse'; - $equivalenceToMysqlField['ville'] = 'ville'; - $equivalenceToMysqlField['city'] = 'ville'; - $equivalenceToMysqlField['zip'] = 'cpostal'; - $equivalenceToMysqlField['zipcode'] = 'cpostal'; - $equivalenceToMysqlField['zip_code'] = 'cpostal'; - $equivalenceToMysqlField['cpostal'] = 'cpostal'; - $equivalenceToMysqlField['cp'] = 'cpostal'; - $equivalenceToMysqlField['code_postal'] = 'cpostal'; - $equivalenceToMysqlField['tel'] = 'tel'; - $equivalenceToMysqlField['telephone'] = 'tel'; - $equivalenceToMysqlField['phone'] = 'tel'; - $equivalenceToMysqlField['fax'] = 'fax'; - $equivalenceToMysqlField['job'] = 'fonction'; - $equivalenceToMysqlField['fonction'] = 'fonction'; - $equivalenceToMysqlField['function'] = 'fonction'; - $equivalenceToMysqlField['societe'] = 'societe'; - $equivalenceToMysqlField['company'] = 'societe'; - $equivalenceToMysqlField['activity'] = 'activite'; - $equivalenceToMysqlField['activite'] = 'activite'; - $equivalenceToMysqlField['pays'] = 'pays'; - $equivalenceToMysqlField['country'] = 'pays'; - $equivalenceToMysqlField['ftp_active'] = 'activeFTP'; - $equivalenceToMysqlField['compte_ftp_actif'] = 'activeFTP'; - $equivalenceToMysqlField['ftpactive'] = 'activeFTP'; - $equivalenceToMysqlField['activeftp'] = 'activeFTP'; - $equivalenceToMysqlField['ftp_adress'] = 'addrFTP'; - $equivalenceToMysqlField['adresse_du_serveur_ftp'] = 'addrFTP'; - $equivalenceToMysqlField['addrftp'] = 'addrFTP'; - $equivalenceToMysqlField['ftpaddr'] = 'addrFTP'; - $equivalenceToMysqlField['loginftp'] = 'loginFTP'; - $equivalenceToMysqlField['ftplogin'] = 'loginFTP'; - $equivalenceToMysqlField['ftppwd'] = 'pwdFTP'; - $equivalenceToMysqlField['pwdftp'] = 'pwdFTP'; - $equivalenceToMysqlField['destftp'] = 'destFTP'; - $equivalenceToMysqlField['destination_folder'] = 'destFTP'; - $equivalenceToMysqlField['dossier_de_destination'] = 'destFTP'; - $equivalenceToMysqlField['passive_mode'] = 'passifFTP'; - $equivalenceToMysqlField['mode_passif'] = 'passifFTP'; - $equivalenceToMysqlField['passifftp'] = 'passifFTP'; - $equivalenceToMysqlField['retry'] = 'retryFTP'; - $equivalenceToMysqlField['nombre_de_tentative'] = 'retryFTP'; - $equivalenceToMysqlField['retryftp'] = 'retryFTP'; - $equivalenceToMysqlField['by_default__send'] = 'defaultftpdatasent'; - $equivalenceToMysqlField['by_default_send'] = 'defaultftpdatasent'; - $equivalenceToMysqlField['envoi_par_defaut'] = 'defaultftpdatasent'; - $equivalenceToMysqlField['defaultftpdatasent'] = 'defaultftpdatasent'; - $equivalenceToMysqlField['prefix_creation_folder'] = 'prefixFTPfolder'; - $equivalenceToMysqlField['prefix_de_creation_de_dossier'] = 'prefixFTPfolder'; - $equivalenceToMysqlField['prefixFTPfolder'] = 'prefixFTPfolder'; - - return $equivalenceToMysqlField; - } } diff --git a/lib/Alchemy/Phrasea/Helper/User/Manage.php b/lib/Alchemy/Phrasea/Helper/User/Manage.php index 26bd94a098..e24b691242 100644 --- a/lib/Alchemy/Phrasea/Helper/User/Manage.php +++ b/lib/Alchemy/Phrasea/Helper/User/Manage.php @@ -38,6 +38,9 @@ class Manage extends Helper */ protected $usr_id; + /** + * @return User[] + */ public function export() { $request = $this->request; diff --git a/lib/Alchemy/Phrasea/Model/Entities/Registration.php b/lib/Alchemy/Phrasea/Model/Entities/Registration.php index 304a2bca65..e00b82455f 100644 --- a/lib/Alchemy/Phrasea/Model/Entities/Registration.php +++ b/lib/Alchemy/Phrasea/Model/Entities/Registration.php @@ -116,6 +116,7 @@ class Registration } /** + * @param User $user * @return Registration */ public function setUser(User $user) @@ -126,7 +127,7 @@ class Registration } /** - * @return integer + * @return User */ public function getUser() { diff --git a/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php b/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php index a91d1e25aa..66b761da85 100644 --- a/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php +++ b/lib/Alchemy/Phrasea/Model/Repositories/RegistrationRepository.php @@ -11,6 +11,7 @@ namespace Alchemy\Phrasea\Model\Repositories; +use Alchemy\Phrasea\Model\Entities\Registration; use Doctrine\ORM\EntityRepository; use Alchemy\Phrasea\Model\Entities\User; @@ -28,7 +29,7 @@ class RegistrationRepository extends EntityRepository * @param User $user * @param \collection[] $collections * - * @return array + * @return Registration[] */ public function getUserRegistrations(User $user, array $collections) { diff --git a/lib/classes/ACL.php b/lib/classes/ACL.php index d0efb37db0..52a70740db 100644 --- a/lib/classes/ACL.php +++ b/lib/classes/ACL.php @@ -661,7 +661,7 @@ class ACL implements cache_cacheableInterface * * @param array $rights * @param array|null $sbas_ids Optionnal sbas_id to restrict the query on - * @return array An array of collection + * @return collection[] An array of collection */ public function get_granted_base(Array $rights = [], array $sbas_ids = null) { diff --git a/lib/classes/User/Query.php b/lib/classes/User/Query.php index 66a922f36a..cdbc3bc2e6 100644 --- a/lib/classes/User/Query.php +++ b/lib/classes/User/Query.php @@ -79,7 +79,7 @@ class User_Query implements User_QueryInterface /** * Return query results * - * @return array + * @return User[] */ public function get_results() {