File_HtAccess
[ class tree: File_HtAccess ] [ index: File_HtAccess ] [ all elements ]

Source for file HtAccess.php

Documentation is available at HtAccess.php

  1. <?php
  2. /* vim: set ts=4 sw=4: */
  3.  
  4. /*
  5. +-----------------------------------------------------------------------+
  6. | Copyright (c) 2002-2006 Mika Tuupola                                  |
  7. | All rights reserved.                                                  |
  8. |                                                                       |
  9. | Redistribution and use in source and binary forms, with or without    |
  10. | modification, are permitted provided that the following conditions    |
  11. | are met:                                                              |
  12. |                                                                       |
  13. | o Redistributions of source code must retain the above copyright      |
  14. |   notice, this list of conditions and the following disclaimer.       |
  15. | o Redistributions in binary form must reproduce the above copyright   |
  16. |   notice, this list of conditions and the following disclaimer in the |
  17. |   documentation and/or other materials provided with the distribution.|
  18. |                                                                       |
  19. | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
  20. | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
  21. | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
  22. | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
  23. | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
  24. | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
  25. | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
  26. | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
  27. | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
  28. | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
  29. | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
  30. |                                                                       |
  31. +-----------------------------------------------------------------------+
  32. | Author: Mika Tuupola <tuupola@appelsiini.net>                         |
  33. +-----------------------------------------------------------------------+
  34. */
  35.  
  36. /* $Id: HtAccess.php,v 1.16 2006/12/07 09:27:38 tuupola Exp $ */
  37.  
  38. require_once 'PEAR.php' ;
  39.  
  40. /**
  41. * Class for manipulating .htaccess files
  42. *
  43. * A class which provided common methods to manipulate Apache / NCSA
  44. * style .htaccess files.
  45. *
  46. * Example 1 (modifying existing file):
  47. *
  48. * $h = new File_HtAccess('.htaccess');
  49. * $h->load();
  50. * $h->setRequire('valid-user');
  51. * $h->save();
  52. *
  53. * Example 2 (modifying existing file):
  54. *
  55. * $h = new File_HtAccess('.htaccess');
  56. * $h->load();
  57. * $h->addRequire('newuser');
  58. * $h->save();
  59. *
  60. * Example 3 (creating a new file):
  61. *
  62. * $params['authname']      = 'Private';
  63. * $params['authtype']      = 'Basic';
  64. * $params['authuserfile']  = '/path/to/.htpasswd';
  65. * $params['authgroupfile'] = '/path/to/.htgroup';
  66. * $params['require']       = array('group', 'admins');
  67. *
  68. * $h = new File_HtAccess('/path/to/.htaccess', $params);
  69. * $h->save();
  70. *
  71. @author  Mika Tuupola <tuupola@appelsiini.net>
  72. @access  public
  73. @version 1.0.0
  74. @package File_HtAccess
  75. @category File
  76. */
  77.  
  78. class File_HtAccess {
  79.  
  80.     var $file;
  81.     var $authname;
  82.     var $authtype;
  83.     var $authuserfile;
  84.     var $authgroupfile;
  85.     var $authdigestfile;
  86.     var $authdigestgroupfile;
  87.     var $require    = array();
  88.     var $additional = array();
  89.  
  90.     /**
  91.     * Constructor
  92.     *
  93.     * @access public
  94.     * @param  string $file 
  95.     * @param  array  $params 
  96.     * @return object File_HtAccess 
  97.     */
  98.        
  99.     function File_HtAccess($file='.htaccess'$params=''{
  100.  
  101.         $this->file = $file;
  102.         $this->setProperties($params);
  103.  
  104.     }
  105.     
  106.     /**
  107.     * Load the given .htaccess file
  108.     *
  109.     * @access public
  110.     * @return mixed   true on success, PEAR_Error on failure
  111.     */
  112.  
  113.     function load({
  114.  
  115.         $retval = true;
  116.         
  117.         $fd @fopen($this->getFile()'r');
  118.         if ($fd{
  119.             while ($buffer fgets($fd4096)) {
  120.                 $buffer trim($buffer);
  121.                 if ($buffer{
  122.                     $data split(' '$buffer2);
  123.                     if (preg_match('/AuthName/i'$data[0])) {
  124.                        $this->setAuthName($data[1]);
  125.  
  126.                     elseif (preg_match('/AuthType/i'$data[0])) {
  127.                        $this->setAuthType($data[1]);                
  128.                     
  129.                     elseif (preg_match('/AuthUserFile/i'$data[0])) {
  130.                        $this->setAuthUserFile($data[1]);            
  131.                            
  132.                     elseif (preg_match('/AuthGroupFile/i'$data[0])) {
  133.                        $this->setAuthGroupFile($data[1]);
  134.  
  135.                     elseif (preg_match('/AuthDigestFile/i'$data[0])) {
  136.                        $this->setAuthDigestFile($data[1]);
  137.  
  138.                     elseif (preg_match('/AuthDigestGroupFile/i'$data[0])) {
  139.                        $this->setAuthDigestGroupFile($data[1]);
  140.  
  141.                     elseif (preg_match('/Require/i'$buffer)) {
  142.                        $require split(' '$data[1]);
  143.                        $this->addRequire($require);
  144.                     elseif (trim($buffer)) {
  145.                        $this->addAdditional($buffer);
  146.                     }
  147.                 }
  148.             }
  149.             fclose($fd);
  150.  
  151.         else {
  152.             $retval = PEAR::raiseError('Could not open ' $this->getFile(
  153.                                        ' for reading.');
  154.         }
  155.  
  156.         return($retval);
  157.  
  158.     }
  159.  
  160.     /**
  161.     * Set class properties
  162.     *
  163.     * @access public
  164.     * @param  array  $params 
  165.     */
  166.  
  167.     function setProperties($params{
  168.         if (is_array($params)) {
  169.             foreach ($params as $key => $value{
  170.                 $method 'set' $key;
  171.                 $this->$method($value);
  172.             }
  173.         }
  174.     }
  175.     
  176.     /**
  177.     * Set the value of authname property
  178.     * 
  179.     * @access public
  180.     * @param  string $name 
  181.     */
  182.  
  183.     function setAuthName($name='Restricted'{
  184.         $this->authname = $name;
  185.     }
  186.  
  187.     /**
  188.     * Set the value of authtype propery
  189.     *
  190.     * @access public
  191.     * @param  string $type 
  192.     */
  193.  
  194.     function setAuthType($type='Basic'{
  195.         $this->authtype = $type;
  196.     }
  197.  
  198.     /**
  199.     * Set the value of authuserfile propery
  200.     *
  201.     * @access public
  202.     * @param  string $file 
  203.     */
  204.  
  205.     function setAuthUserFile($file=''{
  206.         $this->authuserfile = $file;
  207.     }
  208.  
  209.     /**
  210.     * Set the value of authgroupfile property
  211.     *
  212.     * @access public
  213.     * @param  string $file 
  214.     */
  215.  
  216.     function setAuthGroupFile($file=''{
  217.         $this->authgroupfile = $file;
  218.     }
  219.  
  220.     /**
  221.     * Set the value of authdigestfile property
  222.     *
  223.     * @access public
  224.     * @param  string $file 
  225.     */
  226.  
  227.     function setAuthDigestFile($file=''{
  228.         $this->authdigestfile = $file;
  229.     }
  230.  
  231.     /**
  232.     * Set the value of authdigestgroupfile property
  233.     *
  234.     * @access public
  235.     * @param  string $file 
  236.     */
  237.  
  238.     function setAuthDigestGroupFile($file=''{
  239.         $this->authdigestgroupfile = $file;
  240.     }
  241.  
  242.     /**
  243.     * Set the value of require property
  244.     *
  245.     * Parameter can be given as an array or string. If given as a string
  246.     * the value will be exploded in to an array by using space as a
  247.     * separator.
  248.     *
  249.     * @access public
  250.     * @param  mixed $require 
  251.     */
  252.  
  253.     function setRequire($require=''{
  254.         if (is_array($require)) {
  255.             $this->require = $require;
  256.         else {
  257.             $this->require = explode(' '$require);
  258.         }
  259.     }
  260.  
  261.     /**
  262.     * Add a value to require property
  263.     *
  264.     * @access public
  265.     * @param  string $require 
  266.     */
  267.     function addRequire($require{
  268.         if (is_array($require)) {
  269.             $merge array_merge($this->getRequire()$require);
  270.             $merge array_unique($merge);
  271.             $merge array_merge($merge);
  272.             $this->setRequire($merge);
  273.         else {
  274.             $this->require[$require;
  275.         }
  276.  
  277.     }
  278.  
  279.     /**
  280.     * Delete a value from require property
  281.     *
  282.     * @access public
  283.     * @param  string $require 
  284.     */
  285.     function delRequire($require{
  286.         $pos array_search($require$this->require);
  287.         unset($this->require[$pos]);
  288.     }
  289.  
  290.     /**
  291.     * Set the value of additional property
  292.     *
  293.     * Additional property is used for all the extra things in .htaccess
  294.     * file which don't have specific accessor method for them.
  295.     *
  296.     * @access public
  297.     * @param  array  $additional 
  298.     */
  299.  
  300.     function setAdditional($additional=''{
  301.         $this->additional = (array)$additional;
  302.     }
  303.  
  304.     /**
  305.     * Add a value to additional property
  306.     *
  307.     * @access public
  308.     * @param  string $additional 
  309.     */
  310.  
  311.     function addAdditional($additional=''{
  312.         $this->additional[$additional;
  313.     }
  314.     
  315.     /**
  316.     * Set the value of file property
  317.     *
  318.     * @access public
  319.     * @param  file   $file 
  320.     */
  321.  
  322.     function setFile($file{
  323.         $this->file = $file;
  324.     }
  325.     
  326.     /**
  327.     * Get the value of authname property
  328.     *
  329.     * @access public
  330.     * @return string 
  331.     */
  332.  
  333.     function getAuthName({
  334.         return($this->authname);
  335.     }
  336.  
  337.     /**
  338.     * Get the value of authtype property
  339.     *
  340.     * @access public
  341.     * @return string 
  342.     */
  343.  
  344.     function getAuthType({
  345.         return($this->authtype);
  346.     }
  347.     
  348.     /**
  349.     * Get the value of authuserfile property
  350.     *
  351.     * @access public
  352.     * @return string 
  353.     */
  354.  
  355.     function getAuthUserFile({
  356.         return($this->authuserfile);
  357.     }
  358.  
  359.     /**
  360.     * Get the value of authgroupfile property
  361.     *
  362.     * @access public
  363.     * @return string 
  364.     */
  365.  
  366.  
  367.     function getAuthGroupFile({
  368.         return($this->authgroupfile);
  369.     }
  370.  
  371.     /**
  372.     * Get the value of authdigestfile property
  373.     *
  374.     * @access public
  375.     * @return string 
  376.     */
  377.  
  378.     function getAuthDigestFile({
  379.         return($this->authdigestfile);
  380.     }
  381.  
  382.     /**
  383.     * Get the value of authdigestgroupfile property
  384.     *
  385.     * @access public
  386.     * @return string 
  387.     */
  388.  
  389.     function getAuthDigestGroupFile({
  390.         return($this->authdigestgroupfile);
  391.     }
  392.  
  393.     /**
  394.     * Get the value(s) of require property
  395.     *
  396.     * @access public
  397.     * @param  string $type whether to return an array or string
  398.     * @return mixed  string or array, defaults to an array
  399.     */
  400.  
  401.     function getRequire($type=''{
  402.         $retval $this->require;
  403.  
  404.         if ($type == 'string'{
  405.             $retval implode($retval' ');
  406.         }
  407.         return($retval);
  408.     }
  409.  
  410.     /**
  411.     * Get the value(s) of additional property
  412.     *
  413.     * @access public
  414.     * @param  string $type whether to return an array or string
  415.     * @return mixed  string or array, defaults to an array
  416.     */
  417.  
  418.     function getAdditional($type=''{
  419.         $retval $this->additional;
  420.  
  421.         if ($type == 'string'{
  422.             $retval implode($retval"\n");
  423.         }
  424.         return($retval);
  425.     }
  426.  
  427.     /**
  428.     * Get the value of file property
  429.     *
  430.     * @access public
  431.     * @return string 
  432.     */
  433.  
  434.     function getFile({
  435.         return($this->file);
  436.     }
  437.  
  438.     /**
  439.     * Save the .htaccess file
  440.     *
  441.     * @access public
  442.     * @return mixed      true on success, PEAR_Error on failure
  443.     * @see    PEAR_Error
  444.     */
  445.  
  446.     function save({
  447.  
  448.         $retval = true;
  449.  
  450.         $str  $this->getContent();
  451.         
  452.         $fd @fopen($this->getFile()'w');
  453.         if ($fd{
  454.             fwrite($fd$strstrlen($str));
  455.         else {
  456.             $retval = PEAR::raiseError('Could not open ' $this->getFile(
  457.                                        ' for writing.');
  458.  
  459.         }
  460.  
  461.         return($retval);
  462.         
  463.     }
  464.  
  465.     /**
  466.     * Returns the .htaccess File content
  467.     *
  468.     * @access public
  469.     * @return string 
  470.     */
  471.  
  472.     function getContent({
  473.  
  474.         $retval  '';
  475.         
  476.         if ($this->getAuthName()) {
  477.             $retval .= 'AuthName '     $this->getAuthName("\n";
  478.         }
  479.         if ($this->getAuthType()) {
  480.             $retval .= 'AuthType '     $this->getAuthType("\n";
  481.         }
  482.         if ('basic' == strtolower($this->getAuthType())) {
  483.             $retval .= 'AuthUserFile ' $this->getAuthUserFile("\n";
  484.             if (trim($this->getAuthGroupFile())) {
  485.                 $retval .= 'AuthGroupFile ' $this->getAuthGroupFile("\n";   
  486.             }
  487.         elseif ('digest' == strtolower($this->getAuthType())) {
  488.             $retval .= 'AuthDigestFile ' $this->getAuthDigestFile("\n";
  489.             if (trim($this->getAuthDigestGroupFile())) {
  490.                 $retval .= 'AuthDigestGroupFile ' $this->getAuthDigestGroupFile("\n";   
  491.             }
  492.         }
  493.         if (trim($this->getRequire('string'))) {
  494.             $retval .= 'Require ' $this->getRequire('string'"\n";
  495.         }
  496.         $retval .= $this->getAdditional('string'"\n";
  497.         
  498.         return($retval);
  499.     }
  500.  
  501. }
  502.  
  503. ?>

Documentation generated on Mon, 11 Mar 2019 14:49:14 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.