source: branches/1.2/workflow/inc/class.WorkflowWatcher.inc.php @ 1349

Revision 1349, 4.7 KB checked in by niltonneto, 15 years ago (diff)

Ticket #561 - Inclusão do módulo Workflow faltante nessa versão.

  • Property svn:executable set to *
Line 
1<?php
2/**************************************************************************\
3* eGroupWare                                                               *
4* http://www.egroupware.org                                                *
5* --------------------------------------------                             *
6*  This program is free software; you can redistribute it and/or modify it *
7*  under the terms of the GNU General Public License as published by the   *
8*  Free Software Foundation; either version 2 of the License, or (at your  *
9*  option) any later version.                                              *
10\**************************************************************************/
11
12require_once 'common.inc.php';
13
14/**
15 * Classe utilizada para protejer objetos do código dos processos. Essa classe atua como um intermediário entre o objeto protegido e o trecho de código que tenta acessar um de seus métodos/atributos.
16 * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com
17 * @version 1.0
18 * @package Workflow
19 * @license http://www.gnu.org/copyleft/gpl.html GPL
20 */
21class WorkflowWatcher
22{
23        /**
24         * @var object $protectedObject O objeto que está sendo protegido
25         * @access private
26         */
27        private $protectedObject;
28
29        /**
30         * @var string $currentDir O diretório a partir do qual, os arquivos de código podem utilizar o objeto protegido
31         * @access private
32         */
33        private $currentDir;
34
35        /**
36         * @var int $currentDirLength O número de caracteres de $currentDir
37         * @access private
38         */
39        private $currentDirLength;
40
41        /**
42         * @var bool $enabledSecurity Indica se a segurança está ativa ou não
43         * @access private
44         */
45        private static $enabledSecurity = false;
46
47        /**
48         * Verifica se o arquivo que está acessando um método/atributo do objeto possui permissão para tal
49         * @param int $index O índice da pilha de chamadas de métodos e funções que deve ser verificado para se encontrar a origem da chamada ao objeto protegido
50         * @return bool true caso o objeto possa ser acessado ou false caso contrário
51         * @access private
52         */
53        private final function workflowWatcherCheckSecurity($index = 2)
54        {
55                if (self::$enabledSecurity == false)
56                        return true;
57
58                /* busca a pilha das chamadas de métodos/funções */
59                $debugBacktrace = debug_backtrace();
60
61                /* checa se o acesso ao objeto será permitido ou não */
62                if ((!isset($debugBacktrace[$index]['file'])) || (substr($debugBacktrace[$index]['file'], 0, $this->currentDirLength) === $this->currentDir))
63                        return true;
64                else
65                        return false;
66        }
67
68        /**
69         * Aplica as diretivas de segurança do módulo
70         * @return void
71         * @access public
72         */
73        public final function WorkflowWatcher($object)
74        {
75                $this->protectedObject = $object;
76                $this->currentDir = dirname(__FILE__);
77                $this->currentDir = substr($this->currentDir, 0, -13);
78                $this->currentDirLength = strlen($this->currentDir);
79        }
80
81        /**
82         * Ativa a verificação de acesso ao objeto protegido. Por padrão a segurança fica desabilitada pois ela só é interessante antes da execução do código dos processos e, sendo assim, só é habilitada nestes casos.
83         * @return void
84         * @access public
85         */
86        public final static function workflowWatcherEnableSecurity()
87        {
88                self::$enabledSecurity = true;
89        }
90
91        /**
92         * Implementação do método mágico "__call" que intercepta as chamadas ao objeto protegido
93         * @param string $methodName O nome do método que está sendo requisitado
94         * @param array $arguments Os parâmetros passados para o método
95         * @return mixed O resultado da chamada do método ou false se o código que o método não tiver permissão para tal
96         * @access public
97         */
98        public final function __call($methodName, $arguments)
99        {
100                if (!$this->workflowWatcherCheckSecurity())
101                        return false;
102
103                $method = new ReflectionMethod($this->protectedObject, $methodName);
104                return $method->invokeArgs($this->protectedObject, $arguments);
105        }
106
107        /**
108         * Implementação do método mágico "__set" que intercepta definições de atributos do objeto protegido
109         * @param string $name O nome do atributo ao qual está sendo atribuído um valor
110         * @param mixed $value O valor que será atribuído ao atributo do objeto
111         * @return void
112         * @access public
113         */
114        public final function __set($name, $value)
115        {
116                if (!$this->workflowWatcherCheckSecurity(1))
117                        return false;
118
119                $this->protectedObject->{$name} = $value;
120        }
121
122        /**
123         * Implementação do método mágico "__get" que intercepta leitura de atributos do objeto potegido
124         * @param string $name O nome do atributo que se está tentando acessar
125         * @return mixed O valor do atributo que se está acessando. Ou false, caso o acesso ao atributo seja negado
126         * @access public
127         */
128        public final function __get($name)
129        {
130                if (!$this->workflowWatcherCheckSecurity(1))
131                        return false;
132
133                return $this->protectedObject->{$name};
134        }
135}
136?>
Note: See TracBrowser for help on using the repository browser.