/** * Display the tabs of the users page */ public function index() { $tabs = array('users' => $this->listUsers(), 'roles' => RoleController::getInstance()->listRoles(), 'questions' => QuestionController::getInstance()->listQuestions()); $this->addCss(Plugin::current()->getCssUrl('users.less')); $this->addJavaScript(Plugin::current()->getJsUrl('users.js')); $page = View::make(Plugin::current()->getViewsDir() . 'users.tpl', array('tabs' => $tabs)); return NoSidebarTab::make(array('page' => $page, 'icon' => 'users', 'title' => 'Utilisateurs')); }
/** * Display the main page of the permission settings */ public function index() { $permissionGroups = Permission::getAllGroupByPlugin(); $example = isset($this->roleId) ? array('roleId' => $this->roleId) : array(); $data = RolePermission::getListByExample(new DBExample($example)); $values = array(); foreach ($data as $value) { $values[$value->permissionId][$value->roleId] = $value->value; } $roles = isset($this->roleId) ? array(Role::getById($this->roleId)) : Role::getAll(null, array(), array(), true); $param = array('id' => 'permissions-form', 'fieldsets' => array('form' => array(), '_submits' => array(new SubmitInput(array('name' => 'valid', 'value' => Lang::get('main.valid-button')))))); foreach ($roles as $role) { foreach ($permissionGroups as $group => $permissions) { if (Plugin::get($group)) { foreach ($permissions as $permission) { if ($role->id == Role::ADMIN_ROLE_ID) { $default = 1; } elseif (isset($values[$permission->id][$role->id])) { $default = $values[$permission->id][$role->id]; } else { $default = 0; } $param['fieldsets']['form'][] = new CheckboxInput(array('name' => "permission-{$permission->id}-{$role->id}", 'disabled' => $role->id == Role::ADMIN_ROLE_ID || $role->id == Role::GUEST_ROLE_ID && !$permission->availableForGuests, 'default' => $default, 'class' => $permission->id == Permission::ALL_PRIVILEGES_ID ? 'select-all' : '', 'nl' => false)); } } } } $form = new Form($param); if (!$form->submitted()) { $page = View::make(Plugin::current()->getView("permissions.tpl"), array('permissions' => $permissionGroups, 'fields' => $form->inputs, 'roles' => $roles)); return NoSidebarTab::make(array('icon' => 'unlock-alt', 'title' => Lang::get('permissions.page-title'), 'page' => $form->wrap($page))); } else { try { foreach ($form->inputs as $name => $field) { if (preg_match('/^permission\\-(\\d+)\\-(\\d+)$/', $name, $match)) { $permissionId = $match[1]; $roleId = $match[2]; $value = App::request()->getBody($name) ? 1 : 0; if ($roleId != Role::ADMIN_ROLE_ID && !($roleId == Role::GUEST_ROLE_ID && !$permission->availableForGuests)) { $permission = new RolePermission(); $permission->set(array('roleId' => $roleId, 'permissionId' => $permissionId, 'value' => $value)); $permission->save(); } } } App::logger()->info('Permissions were succesfully updated'); return $form->response(Form::STATUS_SUCCESS, Lang::get("roles.permissions-update-success")); } catch (Exception $e) { App::logger()->error('An error occured while updating permissions'); return $form->response(Form::STATUS_ERROR, DEBUG_MODE ? $e->getMessage() : Lang::get("roles.permissions-update-error")); } } }
/** * Display and treat application settings */ public function settings() { $languages = array_map(function ($language) { return $language->label; }, Language::getAll('tag')); $roleObjects = Role::getListByExample(new DBExample(array('id' => array('$ne' => 0))), 'id'); $roles = array(); foreach ($roleObjects as $role) { $roles[$role->id] = Lang::get("roles.role-{$role->id}-label"); } $items = MenuItem::getAvailableItems(); $menuItems = array(); foreach ($items as $item) { if ($item->action && !preg_match('/^(javascript\\:|#)/', $item->action) && (!$item->target || $item->target == 'newtab')) { if ($item->label === 'user.username') { $item->label = App::session()->getUser()->username; } $menuItems[$item->action] = $item->label; } else { foreach ($item->visibleItems as $subitem) { if ($item->label === 'user.username') { $item->label = App::session()->getUser()->username; } if (!preg_match('/^(javascript\\:|#)/', $subitem->action) && (!$subitem->target || $subitem->target == 'newtab')) { $menuItems[$subitem->action] = $item->label . " > " . $subitem->label; } } } } $api = new HawkApi(); try { $updates = $api->getCoreAvailableUpdates(); } catch (\Hawk\HawkApiException $e) { $updates = array(); } $param = array('id' => 'settings-form', 'upload' => true, 'fieldsets' => array('main' => array(new TextInput(array('name' => 'main_sitename', 'required' => true, 'default' => Option::get('main.sitename'), 'label' => Lang::get('admin.settings-sitename-label'))), new SelectInput(array('name' => 'main_language', 'required' => true, 'options' => $languages, 'default' => Option::get('main.language'), 'label' => Lang::get('admin.settings-language-label'))), new SelectInput(array('name' => 'main_timezone', 'required' => true, 'options' => array_combine(\DateTimeZone::listIdentifiers(), \DateTimeZone::listIdentifiers()), 'default' => Option::get('main.timezone'), 'label' => Lang::get('admin.settings-timezone-label'))), new SelectInput(array('name' => 'main_currency', 'required' => true, 'options' => array('EUR' => 'Euro (€)', 'USD' => 'US Dollar ($)'), 'default' => Option::get('main.currency'), 'label' => Lang::get('admin.settings-currency-label'))), new FileInput(array('name' => 'logo', 'label' => Lang::get('admin.settings-logo-label'), 'after' => Option::get('main.logo') ? '<img src="' . Plugin::get('main')->getUserfilesUrl(Option::get('main.logo')) . '" class="settings-logo-preview" />' : '', 'maxSize' => 200000, 'extensions' => array('gif', 'png', 'jpg', 'jpeg'))), new FileInput(array('name' => 'favicon', 'label' => Lang::get('admin.settings-favicon-label'), 'after' => Option::get('main.favicon') ? '<img src="' . Plugin::get('main')->getUserfilesUrl(Option::get('main.favicon')) . '" class="settings-favicon-preview" />' : '', 'maxSize' => 20000, 'extensions' => array('gif', 'png', 'jpg', 'jpeg', 'ico')))), 'referencing' => call_user_func(function () use($languages) { $inputs = array(); foreach ($languages as $tag => $language) { $inputs[] = new TextInput(array('name' => 'main_page-title-' . $tag, 'default' => Option::get('main.page-title-' . $tag))); $inputs[] = new TextareaInput(array('name' => 'main_page-description-' . $tag, 'default' => Option::get('main.page-description-' . $tag))); $inputs[] = new TextInput(array('name' => 'main_page-keywords-' . $tag, 'default' => Option::get('main.page-keywords-' . $tag))); } return $inputs; }), 'home' => array(new RadioInput(array('name' => 'main_home-page-type', 'options' => array('default' => Lang::get('admin.settings-home-page-type-default'), 'custom' => Lang::get('admin.settings-home-page-type-custom'), 'page' => Lang::get('admin.settings-home-page-type-page')), 'default' => Option::get('main.home-page-type') ? Option::get('main.home-page-type') : 'default', 'label' => Lang::get('admin.settings-home-page-type-label'), 'layout' => 'vertical', 'attributes' => array('e-value' => 'homePage.type'))), new WysiwygInput(array('name' => 'main_home-page-html', 'id' => 'home-page-html', 'label' => Lang::get('admin.settings-home-page-html-label'), 'default' => Option::get('main.home-page-html'))), new SelectInput(array('name' => 'main_home-page-item', 'id' => 'home-page-item', 'label' => Lang::get('admin.settings-home-page-item-label'), 'options' => $menuItems, 'value' => Option::get('main.home-page-item'))), new CheckboxInput(array('name' => 'main_open-last-tabs', 'label' => Lang::get('admin.settings-open-last-tabs'), 'default' => Option::get('main.open-last-tabs'), 'dataType' => 'int'))), 'users' => array(new RadioInput(array('name' => 'main_allow-guest', 'options' => array(0 => Lang::get('main.no-txt'), 1 => Lang::get('main.yes-txt')), 'default' => Option::get('main.allow-guest') ? Option::get('main.allow-guest') : 0, 'label' => Lang::get('admin.settings-allow-guest-label'))), new RadioInput(array('name' => 'main_open-register', 'options' => array(0 => Lang::get('admin.settings-open-register-off'), 1 => Lang::get('admin.settings-open-register-on')), 'layout' => 'vertical', 'label' => Lang::get('admin.settings-open-registers-label'), 'default' => Option::get('main.open-register') ? Option::get('main.open-register') : 0, 'attributes' => array('e-value' => 'register.open'))), new CheckboxInput(array('name' => 'main_confirm-register-email', 'label' => Lang::get('admin.settings-confirm-email-label'), 'default' => Option::get('main.confirm-register-email'), 'dataType' => 'int', 'attributes' => array('e-value' => 'register.checkEmail'))), new WysiwygInput(array('name' => 'main_confirm-email-content', 'id' => 'settings-confirm-email-content-input', 'default' => Option::get('main.confirm-email-content'), 'label' => Lang::get('admin.settings-confirm-email-content-label'), 'labelWidth' => 'auto')), new CheckboxInput(array('name' => 'main_confirm-register-terms', 'label' => Lang::get('admin.settings-confirm-terms-label'), 'default' => Option::get('main.confirm-register-terms'), 'dataType' => 'int', 'labelWidth' => 'auto', 'attributes' => array('e-value' => 'register.checkTerms'))), new WysiwygInput(array('name' => 'main_terms', 'id' => 'settings-terms-input', 'label' => Lang::get('admin.settings-terms-label'), 'labelWidth' => 'auto', 'default' => Option::get('main.terms'))), new SelectInput(array('name' => 'roles_default-role', 'label' => Lang::get('admin.settings-default-role-label'), 'options' => $roles, 'default' => Option::get('roles.default-role')))), 'email' => array(new EmailInput(array('name' => 'main_mailer-from', 'default' => Option::get('main.mailer-from') ? Option::get('main.mailer-from') : App::session()->getUser()->email, 'label' => Lang::get('admin.settings-mailer-from-label'))), new TextInput(array('name' => 'main_mailer-from-name', 'default' => Option::get('main.mailer-from-name') ? Option::get('main.mailer-from-name') : App::session()->getUser()->getDisplayName(), 'label' => Lang::get('admin.settings-mailer-from-name-label'))), new SelectInput(array('name' => 'main_mailer-type', 'default' => Option::get('main.mailer-type'), 'options' => array('mail' => Lang::get('admin.settings-mailer-type-mail-value'), 'smtp' => Lang::get('admin.settings-mailer-type-smtp-value'), 'pop3' => Lang::get('admin.settings-mailer-type-pop3-value')), 'label' => Lang::get('admin.settings-mailer-type-label'), 'attributes' => array('e-value' => 'mail.type'))), new TextInput(array('name' => 'main_mailer-host', 'default' => Option::get('main.mailer-host'), 'label' => Lang::get('admin.settings-mailer-host-label'))), new IntegerInput(array('name' => 'main_mailer-port', 'default' => Option::get('main.mailer-port'), 'label' => Lang::get('admin.settings-mailer-port-label'), 'size' => 4)), new TextInput(array('name' => 'main_mailer-username', 'default' => Option::get('main.mailer-username'), 'label' => Lang::get('admin.settings-mailer-username-label'))), new PasswordInput(array('name' => 'main_mailer-password', 'encrypt' => 'Crypto::aes256Encode', 'decrypt' => 'Crypto::aes256Decode', 'default' => Option::get('main.mailer-password'), 'label' => Lang::get('admin.settings-mailer-password-label'))), new SelectInput(array('name' => 'main_smtp-secured', 'options' => array('' => Lang::get('main.no-txt'), 'ssl' => 'SSL', 'tsl' => 'TSL'), 'label' => Lang::get('admin.settings-smtp-secured-label')))), '_submits' => array(empty($updates) ? new HtmlInput(array('value' => '<span class="btn btn-success">' . Lang::get('admin.hawk-version-up-to-date', array('version' => HAWK_VERSION)) . '</span>')) : new ButtonInput(array('name' => 'update-hawk', 'value' => Lang::get('admin.update-page-update-hawk-btn', array('version' => end($updates)['version'])), 'icon' => 'refresh', 'id' => 'update-hawk-btn', 'attributes' => array('e-click' => 'function(){ updateHawk("' . end($updates)['version'] . '"); }'), 'class' => 'btn-warning')), new SubmitInput(array('name' => 'save', 'value' => Lang::get('main.valid-button'), 'class' => 'pull-right'))))); $form = new Form($param); if (!$form->submitted()) { // Display the form $this->addCss(Plugin::current()->getCssUrl('settings.less')); $page = View::make(Plugin::current()->getView('settings.tpl'), array('form' => $form, 'languages' => $languages)); $this->addKeysToJavaScript('admin.update-page-confirm-update-hawk'); $this->addJavaScript(Plugin::current()->getJsUrl('settings.js')); return NoSidebarTab::make(array('icon' => 'cogs', 'title' => Lang::get('admin.settings-page-name'), 'description' => Lang::get('admin.settings-page-description'), 'page' => $page)); } else { // treat the form try { if ($form->check()) { // register scalar values foreach ($form->inputs as $name => $field) { if (!$field instanceof \Hawk\FileInput && !$field instanceof \Hawk\ButtonInput && !$field instanceof \Hawk\HtmlInput) { $value = $field->dbvalue(); if ($value === null) { $value = '0'; } $optionName = str_replace('_', '.', $name); App::logger()->error("Option name =" . $optionName . 'X'); App::logger()->error("basename=" . $value . 'X'); Option::set($optionName, $value); } elseif ($field instanceof \Hawk\FileInput) { $upload = Upload::getInstance($name); if ($upload) { try { $file = $upload->getFile(); $dir = Plugin::get('main')->getPublicUserfilesDir(); if (!is_dir($dir)) { mkdir($dir, 0755); } if ($name == 'favicon') { $basename = uniqid() . '.ico'; $generator = new \PHPICO($file->tmpFile, array(array(16, 16), array(32, 32), array(48, 48), array(64, 64))); $generator->save_ico($dir . $basename); } else { $basename = uniqid() . '.' . $file->extension; $upload->move($file, $dir, $basename); } // remove the old image @unlink($dir . Option::get("main.{$name}")); App::logger()->error("Option name = " . $name); App::logger()->error("main.{$name}"); App::logger()->error("basename=" . $basename); Option::set("main.{$name}", $basename); } catch (ImageException $e) { $form->error($name, Lang::get('form.image-format')); throw $e; } } } } // Register the favicon App::logger()->info('The options of the application has been updated by ' . App::session()->getUser()->username); return $form->response(Form::STATUS_SUCCESS, Lang::get('admin.settings-save-success')); } } catch (Exception $e) { App::logger()->error('An error occured while updating application options'); return $form->response(Form::STATUS_ERROR, DEBUG_MODE ? $e->getMessage() : Lang::get('admin.settings-save-error')); } } }
/** * Create or edit an user */ public function edit() { $user = App::session()->getUser(); $roles = array_map(function ($role) { return $role->getLabel(); }, Role::getAll('id')); $param = array('id' => 'user-profile-form', 'upload' => true, 'object' => $user, 'fieldsets' => array('general' => array('legend' => Lang::get('admin.user-form-general-legend'), new TextInput(array('name' => 'username', 'required' => true, 'label' => Lang::get('admin.user-form-username-label'), 'disabled' => true)), new EmailInput(array('name' => 'email', 'required' => true, 'label' => Lang::get('admin.user-form-email-label')))), 'profile' => array('legend' => Lang::get('admin.user-form-profile-legend')), '_submits' => array(new SubmitInput(array('name' => 'valid', 'value' => Lang::get($this->_plugin . '.valid-button'))))), 'onsuccess' => 'app.dialog("close")'); // Get the user profile questions $questions = ProfileQuestion::getAll('name', array(), array('order' => DB::SORT_ASC)); // Generate the question fields foreach ($questions as $question) { if ($question->displayInProfile && $question->isAllowedForRole($user->roleId)) { $classname = '\\Hawk\\' . ucwords($question->type) . 'Input'; $field = json_decode($question->parameters, true); $field['name'] = $question->name; $field['id'] = 'user-form-' . $question->name . '-input'; $field['independant'] = true; $field['label'] = Lang::get('admin.profile-question-' . $question->name . '-label'); if (isset($field['readonly'])) { if ($field['readonly']) { $field['required'] = false; } } if ($user) { if ($question->type == "file") { $field['after'] = sprintf('<img src="%s" class="profile-image" />', $user->getProfileData($question->name) ? $user->getProfileData($question->name) : ''); } else { $field['default'] = $user->getProfileData($question->name); } } if ($question->name == 'language') { // Get language options $languages = Language::getAllActive(); $options = array(); foreach ($languages as $language) { $options[$language->tag] = $language->label; } $field['options'] = $options; if (!$field['default']) { $field['default'] = Option::get($this->_plugin . '.language'); } } $param['fieldsets']['profile'][] = new $classname($field); } } $form = new Form($param); if (!$form->submitted()) { return NoSidebarTab::make(array('title' => Lang::get('admin.user-form-title'), 'page' => array('content' => $form))); } else { try { foreach ($questions as $question) { if ($question->displayInProfile && $question->isAllowedForRole($user->roleId)) { if ($question->type === 'file') { $upload = Upload::getInstance($question->name); if ($upload) { $file = $upload->getFile(0); $dir = Plugin::current()->getPublicUserfilesDir() . 'img/'; $url = Plugin::current()->getUserfilesUrl() . 'img/'; if (!is_dir($dir)) { mkdir($dir, 0755, true); } $basename = uniqid() . $file->extension; $upload->move($file, $dir, $basename); $user->setProfileData($question->name, $url . $basename); } } else { $user->setProfileData($question->name, $form->inputs[$question->name]->dbvalue()); } } } $user->saveProfile(); if ($form->getData('email') !== $user->email) { // The user asked to reset it email // Check this email is not used by another user on the application $existingUser = User::getByExample(new DBExample(array('id' => array('$ne' => $user->id), 'email' => $form->getData('email')))); if ($existingUser) { return $form->response(Form::STATUS_CHECK_ERROR, Lang::get($this->_plugin . '.reset-email-already-used')); } // Send the email to validate the new email // Create the token to validate the new email $tokenData = array('userId' => $user->id, 'currentEmail' => $user->email, 'newEmail' => $form->getData('email'), 'createTime' => time()); $token = base64_encode(Crypto::aes256Encode(json_encode($tokenData))); // Create the email content $emailContent = View::make($this->getPlugin()->getView('change-email-validation.tpl'), array('sitename' => Option::get($this->_plugin . '.sitename'), 'validationUrl' => App::router()->getUrl('validate-new-email', array('token' => $token)))); $email = new Mail(); $email->to($form->getData('email'))->from(Option::get('main.mailer-from'), Option::get('main.mailer-from-name'))->title(Lang::get($this->_plugin . '.reset-email-title', array('sitename' => Option::get($this->_plugin . '.sitename'))))->content($emailContent)->subject(Lang::get($this->_plugin . '.reset-email-title', array('sitename' => Option::get($this->_plugin . '.sitename'))))->send(); return $form->response(Form::STATUS_SUCCESS, Lang::get($this->_plugin . '.user-profile-update-success-with-email')); } return $form->response(Form::STATUS_SUCCESS, Lang::get($this->_plugin . '.user-profile-update-success')); } catch (Exception $e) { return $form->response(Form::STATUS_ERROR, Lang::get($this->_plugin . '.user-profile-update-error')); } } }