:# D1':"Q A X`>^CEIn>bQGk7~MruڅA X`>^Cԕ}b$a~ ֚i=c`qM:-C?`N:|blqym\cClbI=Ti:KkatSL% aǫ{(+:]G@r:r`8\3 $]"."r3۞Vk2*ǀCZȊ_6Yyu^\yp5۶߇6 Wdܼ쟤'G^!{bwUBxVd2h6sa' 4B.{_7 35S)8Zh8roT u&QC$='G޺{oay"&:­p^Cd ^W=vj?s/z9Оy+m5!{oay"&:­p94Rr3-Im`Xmsڶd1@{DcU, &t PـESE}-dɶ=c`qM:-C?`N:|blqym\cClbI=Ti:KkatSL% aǫ{(+:]G@r:r`8\3 $]"Tf1Zkniq|#Oe_6Yyu^\yp5۶߇6 Wdܼ쟤'G^!{bwUBxVd2h6sa' 4B.{_7 35S)8Zh8rٍ8Zke+qk?_B 7ko9j;KXR/5YN*'T3b8UtJL hGjׄ|-2HD<2UJ3Iz2E;鷘4zznYmx|4A X`>^CaC0Y'>;Vx2-:v\ iY&FPEr~`nJo~&aN*W[Ku-cu=BO&7v =CE1+ XYInE[HꃜǸ E;@h]CR{ Fn4П25 C3jg:~K cOUÈ>'SkbHaab u p[2lx?Snn_`hl5@gsBe 'w3b\Pʮ~'Z*tfߍ`Z=G$>-*4 lDfj`8N>eob@o~'Z*tfߍ`Z=G$>-iI# nNCn_{t[p0Ÿ&/mHt9.$t\w X{D-g@O!.l!at۾wҜvG2 qi1L5:&X8=wJh?;&HTX#0펝`ڹ?<*XA7Z4?eHwt |NNTNhwd d![DڹW͆GO=ӴwHH-/A/P' & .z+Tjd#%/֚ Y:s^lXKI%ⱉHcM=޵w)G2Zr GZ>4UUHodmC@Mϗ݊~#uhmD2ھL 4&G o@v:˔5z ;2U?^jПL-:?e;InOz\Zw} 3/HFB1ak4EwE 5N*I-(" {az@agP)vi|W6{7[M\ 6"XNra v1`N1L^~Zi;zksIp}C:e-Ԃu6|eL죈jROwIpxde-UjjJ(mYvn4zOƵEj3WfrV>Ӛ}E[>Nݕw,+wY5S(QXD@/;ϻk۞ǗtǨ jsNwR5LstiZͯ.0ia+'$FDj1p&*s.#?.T­xe31(AEቪq0tq/c?yz;+A,"}WU(@E]pNJ& KHy[Fѹi%o}EɞWZsxU2IWn?bR7.ܖڋ9G4/Q/壑vʙ 3F@]^Q,:9&S5ܤk9@m~jO$~$}w%CcM`O J!E sgR8]6=A$u2Z3jg:~K cOUÈ,i (B,b.'WӸjfbORD :3I4Rw˕{. ҏQVCnk^hz=õ.t nRrGC}h1Z0אe=ECVERAippu09\׹F4iNwR5LstiZͯ.0ia+'$FDj1p&*s.#?.T­xe31(AEቪq0tq/c?yz;+A,"}WU(@E쪏V>I-&;,ѻjmyI+r)zВlhJǐ(LwlOѝsIp}C:e-Ԃu6|eL`~> 8ǒKޙ(y R+XPF9|_P _XD=I/%W" Ί(W|fwy8>bo&'4O^hArO- zlaչ Yu[řpvj1( .Sb']>\ɋi.^hArO- zlaչ Yu:߼/ѥ!-'_ ?L3!Z=66U&胈W6*nQBLu[řpvj1( ~&gP`4ݻT?]s%gڎ]ycG@"4C꣚rP qɘu?78qe8TJ04 AeH/1p~ rUEk V$E.XGЮMvaOnX"(j< g% 5P}0.K3m)˦/{*/'z9=^Zl*U\"1@k81 T<{ A=k|s)?F i9sYSad>qFWiHMhH}WEHZ#5~tywܟZgTmS j?ܪXz" /;E6 _)*s"8 >9!E(@g) { $key = $this->generateKey($config); return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; } /** * Generates the path to the directory contain this cache's serial files * @param HTMLPurifier_Config $config * @return string * @note No trailing slash * @todo Make protected */ public function generateDirectoryPath($config) { $base = $this->generateBaseDirectoryPath($config); return $base . '/' . $this->type; } /** * Generates path to base directory that contains all definition type * serials * @param HTMLPurifier_Config $config * @return mixed|string * @todo Make protected */ public function generateBaseDirectoryPath($config) { $base = $config->get('Cache.SerializerPath'); $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; return $base; } /** * Convenience wrapper function for file_put_contents * @param string $file File name to write to * @param string $data Data to write into file * @param HTMLPurifier_Config $config * @return int|bool Number of bytes written if success, or false if failure. */ private function _write($file, $data, $config) { $result = file_put_contents($file, $data); if ($result !== false) { // set permissions of the new file (no execute) $chmod = $config->get('Cache.SerializerPermissions'); if ($chmod !== null) { chmod($file, $chmod & 0666); } } return $result; } /** * Prepares the directory that this type stores the serials in * @param HTMLPurifier_Config $config * @return bool True if successful */ private function _prepareDir($config) { $directory = $this->generateDirectoryPath($config); $chmod = $config->get('Cache.SerializerPermissions'); if ($chmod === null) { if (!@mkdir($directory) && !is_dir($directory)) { trigger_error( 'Could not create directory ' . $directory . '', E_USER_WARNING ); return false; } return true; } if (!is_dir($directory)) { $base = $this->generateBaseDirectoryPath($config); if (!is_dir($base)) { trigger_error( 'Base directory ' . $base . ' does not exist, please create or change using %Cache.SerializerPath', E_USER_WARNING ); return false; } elseif (!$this->_testPermissions($base, $chmod)) { return false; } if (!@mkdir($directory, $chmod) && !is_dir($directory)) { trigger_error( 'Could not create directory ' . $directory . '', E_USER_WARNING ); return false; } if (!$this->_testPermissions($directory, $chmod)) { return false; } } elseif (!$this->_testPermissions($directory, $chmod)) { return false; } return true; } /** * Tests permissions on a directory and throws out friendly * error messages and attempts to chmod it itself if possible * @param string $dir Directory path * @param int $chmod Permissions * @return bool True if directory is writable */ private function _testPermissions($dir, $chmod) { // early abort, if it is writable, everything is hunky-dory if (is_writable($dir)) { return true; } if (!is_dir($dir)) { // generally, you'll want to handle this beforehand // so a more specific error message can be given trigger_error( 'Directory ' . $dir . ' does not exist', E_USER_WARNING ); return false; } if (function_exists('posix_getuid') && $chmod !== null) { // POSIX system, we can give more specific advice if (fileowner($dir) === posix_getuid()) { // we can chmod it ourselves $chmod = $chmod | 0700; if (chmod($dir, $chmod)) { return true; } } elseif (filegroup($dir) === posix_getgid()) { $chmod = $chmod | 0070; } else { // PHP's probably running as nobody, so we'll // need to give global permissions $chmod = $chmod | 0777; } trigger_error( 'Directory ' . $dir . ' not writable, ' . 'please chmod to ' . decoct($chmod), E_USER_WARNING ); } else { // generic error message trigger_error( 'Directory ' . $dir . ' not writable, ' . 'please alter file permissions', E_USER_WARNING ); } return false; } } // vim: et sw=4 sts=4