<commit_before><?php
/**
 * Created by PhpStorm.
 * User: cedric.gallard
 * Date: 23/04/14
 * Time: 12:23
 */

namespace Modules\DenyAppAccess;


use Components\Item;
use Components\Menu;
use FileSystem\Fs;
use Front;
use Logs\Alert;
use Logs\EventLog;
use Logs\EventsManager;
use Modules\Module;
use Modules\ModulesManagement;
use Sanitize;
use Settings\Field;
use Settings\Form;
use Settings\PostedData;
use Users\ACL;

/**
 * Class DenyAppAccess
 *
 * Permet d'empêcher l'accès à une application via un paramètre changé dans un script vbs qui appelle l'application à bloquer.
 *
 * @package Modules\DenyAppAccess
 */
class DenyAppAccess extends Module{

	protected $name = 'Accès aux applications';
	protected $title = 'Empêcher l\'accès à une application Citrix';

	/**
	 * Liste des applications
	 * @var array
	 */
	protected $apps = array();

	public function __construct(){
		// On appelle la méthode de la classe Module
		parent::__construct();

		// Passons maintenant au module proprement dit
		$this->populateApps();
	}

	/**
	 * Installe le module en bdd, avec ses paramètres
	 */
	public function install(){
		// On renseigne le chemin du module
		$this->path = basename(__DIR__).DIRECTORY_SEPARATOR.basename(__FILE__);

		// Définition des ACL par défaut pour ce module
		$defaultACL = array(
		  'type'  => 'modify',
		  'value' => true
		);

		return ModulesManagement::installModule($this, $defaultACL);
	}

	/**
	 * Définit les paramètres
	 *
	 * Les paramètres sont définis non pas avec des objets Setting mais avec des objets Field (sans quoi on ne pourra pas créer d'écran de paramétrage)
	 */
	public function defineSettings(){
		/**
		 * @see Db\Db->createTable pour plus de détails sur la création d'une table.
		 */
		$this->dbTables['module_applis'] = array(
			'name'        => 'module_applis',
			'desc'        => 'Liste des applications',
			'fields'      => array(
				'id'    => array(
					'show'          => false,
					'type'          => 'int',
					'length'        => 11,
					'null'          => false,
					'autoIncrement' => true,
				),
			  'title' => array(
				  'label'   => 'Nom affiché dans le menu',
				  'type'    => 'string',
			    'length'  => 150,
			    'null'    => false
			  ),
			  'file'  => array(
				  'label'   => 'Script VBS',
				  'type'    => 'string',
			    'length'  => 255,
			    'null'    => false
			  )
			),
			'primaryKey'  => 'id',
		  'uniqueKey'   => 'title',
		  'uniqueMultiKey' => array('id', 'title'),
		  'onDuplicateKeyUpdate' => array('title', 'file')
		);
		$this->settings['vbsPath'] = new Field('vbsPath', 'string', 'global', '\\\\intra.epsi.fr\profils\xen\xenlogin\scripts', 'Chemin des scripts de lancement VBS', '\\\\intra.epsi.fr\profils\xen\xenlogin\scripts', null, null, null, null, true);
		// Cette table sera gérée via les paramètres
		$this->settings['apps'] = new Field('apps', 'dbTable', 'global', 'module_applis', 'Liste des applications', null, $this->dbTables['module_applis']);
	}

	/**
	 * Permet d'ajouter des items au menu général
	 */
	public static function getMainMenuItems(){
		Front::$mainMenu->add(new Item('acces', 'Accès aux applications', '?module='.end(explode('\\', get_class())), 'Empêcher les utilisateurs d\'accéder à certaines applications', null, null));
	}

	public function display(){
		if (!$this->getPage()){
			if (isset($_REQUEST['app'])){
				$appR = htmlspecialchars($_REQUEST['app']);
				if (array_key_exists($appR, $this->apps)){
					/**
					 * @var App $app
					 */
					$app = $this->apps[$appR];
					$this->breadCrumb['children'] = array(
						'title' => $app->getTitle(),
						'link'  => $this->url.'&app='.$app->getName()
					);
					Front::displayBreadCrumb($this->breadCrumb);
					$this->displayApp($app);
					return 0;
				}else{
					new Alert('error', 'L\'application demandée n\'existe pas !');
				}
			}
			Front::displayBreadCrumb($this->breadCrumb);
			$this->mainDisplay();
		}
	}

	/**
	 * Affichage principal
	 */
	protected function mainDisplay(){
		global $db;
		?>
		<div class="row">
			<div class="col-md-10 col-md-offset-1">
				<div class="page-header">
					<h1>Gestion des accès applicatifs <?php $this->manageModuleButtons(); ?></h1>
				</div>
				<p>
					Certaines applications sont lancées via des scripts VBS pour permettre en cas de mise à jour ou de maintenance applicative d'empêcher les utilisateurs de s'y connecter.<br />
					Cependant tout le monde n'est pas à l'aise avec les scripts VBS, d'autant qu'une fausse manip' plante tout le script avec un vilain message d'erreur.<br />
					C'est pourquoi ce petit module vous permet de gérer l'accès aux applications : vous cochez/décochez une case, vous saisissez un message de notification pour les utilisateurs, et une armée de lutins fera tout le sale boulot en allant éditer pour vous ces fichiers de script.<br /><br />
					Rappel : il est possible de passer outre l'interdiction de lancer l'application en ajoutant l'argument <code>admin</code> dans le raccourci de lancement du script, afin de tester l'appli sans pour autant la rendre disponible à tout le monde.
				</p>
				<?php $this->displayAppList(); ?>
				<h3>Logs de la gestion d'accès</h3>
				<?php
				$events = EventsManager::displayLogs(null, null, end(explode('\\', get_class())), null, true);
				$usersList = array();
				$usersDb = $db->get('users', array('id', 'name'));
				foreach ($usersDb as $user){
					$usersList[$user->id] = $user->name;
				}
				?>
				<table class="table table-striped">
					<thead>
						<tr>
							<th>Horodatage</th>
							<th>Utilisateur</th>
							<th>Action</th>
							<th>Application</th>
						</tr>
					</thead>
					<tbody>
					<?php
					foreach ($events as $event){
						?>
						<tr>
							<td><?php echo Sanitize::date($event->time, 'dateTime'); ?></td>
							<td><?php echo (isset($usersList[$event->user])) ? $usersList[$event->user] : 'Utilisateur supprimé (id <code>'.$event->user.'</code>)'; ?></td>
							<td><?php echo ($event->type == 'BLOCK') ? 'a bloqué' : 'a autorisé'; ?></td>
							<td><?php echo $this->apps[$event->data]->getTitle(); ?></td>
						</tr>
					<?php
					}
					?>
					</tbody>
				</table>
				<?php
				?>
			</div>
		</div>
	<?php
	}

	/********* Méthodes propres au module *********/

	/**
	 * Récupère la liste des applications, la met en forme, remplit toutes ses propriétés et crée les items de menus en rapport
	 */
	protected function populateApps(){
		global $db;
		$menu = new Menu($this->name, 'Applications', '', '', '');<commit_msg>Ajout d'une vérification sur les événements dans le module DenyAppAccess<commit_after><?php
/**
 * Created by PhpStorm.
 * User: cedric.gallard
 * Date: 23/04/14
 * Time: 12:23
 */

namespace Modules\DenyAppAccess;


use Components\Item;
use Components\Menu;
use FileSystem\Fs;
use Front;
use Logs\Alert;
use Logs\EventLog;
use Logs\EventsManager;
use Modules\Module;
use Modules\ModulesManagement;
use Sanitize;
use Settings\Field;
use Settings\Form;
use Settings\PostedData;
use Users\ACL;

/**
 * Class DenyAppAccess
 *
 * Permet d'empêcher l'accès à une application via un paramètre changé dans un script vbs qui appelle l'application à bloquer.
 *
 * @package Modules\DenyAppAccess
 */
class DenyAppAccess extends Module{

	protected $name = 'Accès aux applications';
	protected $title = 'Empêcher l\'accès à une application Citrix';

	/**
	 * Liste des applications
	 * @var array
	 */
	protected $apps = array();

	public function __construct(){
		// On appelle la méthode de la classe Module
		parent::__construct();

		// Passons maintenant au module proprement dit
		$this->populateApps();
	}

	/**
	 * Installe le module en bdd, avec ses paramètres
	 */
	public function install(){
		// On renseigne le chemin du module
		$this->path = basename(__DIR__).DIRECTORY_SEPARATOR.basename(__FILE__);

		// Définition des ACL par défaut pour ce module
		$defaultACL = array(
		  'type'  => 'modify',
		  'value' => true
		);

		return ModulesManagement::installModule($this, $defaultACL);
	}

	/**
	 * Définit les paramètres
	 *
	 * Les paramètres sont définis non pas avec des objets Setting mais avec des objets Field (sans quoi on ne pourra pas créer d'écran de paramétrage)
	 */
	public function defineSettings(){
		/**
		 * @see Db\Db->createTable pour plus de détails sur la création d'une table.
		 */
		$this->dbTables['module_applis'] = array(
			'name'        => 'module_applis',
			'desc'        => 'Liste des applications',
			'fields'      => array(
				'id'    => array(
					'show'          => false,
					'type'          => 'int',
					'length'        => 11,
					'null'          => false,
					'autoIncrement' => true,
				),
			  'title' => array(
				  'label'   => 'Nom affiché dans le menu',
				  'type'    => 'string',
			    'length'  => 150,
			    'null'    => false
			  ),
			  'file'  => array(
				  'label'   => 'Script VBS',
				  'type'    => 'string',
			    'length'  => 255,
			    'null'    => false
			  )
			),
			'primaryKey'  => 'id',
		  'uniqueKey'   => 'title',
		  'uniqueMultiKey' => array('id', 'title'),
		  'onDuplicateKeyUpdate' => array('title', 'file')
		);
		$this->settings['vbsPath'] = new Field('vbsPath', 'string', 'global', '\\\\intra.epsi.fr\profils\xen\xenlogin\scripts', 'Chemin des scripts de lancement VBS', '\\\\intra.epsi.fr\profils\xen\xenlogin\scripts', null, null, null, null, true);
		// Cette table sera gérée via les paramètres
		$this->settings['apps'] = new Field('apps', 'dbTable', 'global', 'module_applis', 'Liste des applications', null, $this->dbTables['module_applis']);
	}

	/**
	 * Permet d'ajouter des items au menu général
	 */
	public static function getMainMenuItems(){
		Front::$mainMenu->add(new Item('acces', 'Accès aux applications', '?module='.end(explode('\\', get_class())), 'Empêcher les utilisateurs d\'accéder à certaines applications', null, null));
	}

	public function display(){
		if (!$this->getPage()){
			if (isset($_REQUEST['app'])){
				$appR = htmlspecialchars($_REQUEST['app']);
				if (array_key_exists($appR, $this->apps)){
					/**
					 * @var App $app
					 */
					$app = $this->apps[$appR];
					$this->breadCrumb['children'] = array(
						'title' => $app->getTitle(),
						'link'  => $this->url.'&app='.$app->getName()
					);
					Front::displayBreadCrumb($this->breadCrumb);
					$this->displayApp($app);
					return 0;
				}else{
					new Alert('error', 'L\'application demandée n\'existe pas !');
				}
			}
			Front::displayBreadCrumb($this->breadCrumb);
			$this->mainDisplay();
		}
	}

	/**
	 * Affichage principal
	 */
	protected function mainDisplay(){
		global $db;
		?>
		<div class="row">
			<div class="col-md-10 col-md-offset-1">
				<div class="page-header">
					<h1>Gestion des accès applicatifs <?php $this->manageModuleButtons(); ?></h1>
				</div>
				<p>
					Certaines applications sont lancées via des scripts VBS pour permettre en cas de mise à jour ou de maintenance applicative d'empêcher les utilisateurs de s'y connecter.<br />
					Cependant tout le monde n'est pas à l'aise avec les scripts VBS, d'autant qu'une fausse manip' plante tout le script avec un vilain message d'erreur.<br />
					C'est pourquoi ce petit module vous permet de gérer l'accès aux applications : vous cochez/décochez une case, vous saisissez un message de notification pour les utilisateurs, et une armée de lutins fera tout le sale boulot en allant éditer pour vous ces fichiers de script.<br /><br />
					Rappel : il est possible de passer outre l'interdiction de lancer l'application en ajoutant l'argument <code>admin</code> dans le raccourci de lancement du script, afin de tester l'appli sans pour autant la rendre disponible à tout le monde.
				</p>
				<?php $this->displayAppList(); ?>
				<h3>Logs de la gestion d'accès</h3>
				<?php
				$events = EventsManager::displayLogs(null, null, end(explode('\\', get_class())), null, true);
				if (!empty($events)){
					$usersList = array();
					$usersDb = $db->get('users', array('id', 'name'));
					foreach ($usersDb as $user){
						$usersList[$user->id] = $user->name;
					}
					?>
					<table class="table table-striped">
						<thead>
							<tr>
								<th>Horodatage</th>
								<th>Utilisateur</th>
								<th>Action</th>
								<th>Application</th>
							</tr>
						</thead>
						<tbody>
						<?php
						foreach ($events as $event){
							?>
							<tr>
								<td><?php echo Sanitize::date($event->time, 'dateTime'); ?></td>
								<td><?php echo (isset($usersList[$event->user])) ? $usersList[$event->user] : 'Utilisateur supprimé (id <code>'.$event->user.'</code>)'; ?></td>
								<td><?php echo ($event->type == 'BLOCK') ? 'a bloqué' : 'a autorisé'; ?></td>
								<td><?php echo $this->apps[$event->data]->getTitle(); ?></td>
							</tr>
						<?php
						}
						?>
						</tbody>
					</table>
				<?php	}else{ ?>
					<div class="alert alert-info">Il n'y a aucun événement à afficher.</div>
				<?php }	?>
				</div>
			</div>
		<?php
	}

	/********* Méthodes propres au module *********/

	/**
	 * Récupère la liste des applications, la met en forme, remplit toutes ses propriétés et crée les items de menus en rapport
	 */
	protected function populateApps(){
		global $db;
		$menu = new Menu($this->name, 'Applications', '', '', '');
{'fraction_non_alphanumeric': 0.16095066185318893, 'fraction_numerical': 0.003910950661853189, 'mean_word_length': 3.114170792079208, 'pattern_counts': {'":': 0, '<': 122, '<?xml version=': 0, '>': 240, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3938962', 'n_tokens_mistral': 5296, 'n_tokens_neox': 4454, 'n_words': 1244}