source: trunk/contrib/php-xinha.php @ 925

Last change on this file since 925 was 925, checked in by gogo, 12 years ago

Allow return of PHP array from xinha_pass_to_php_backend

  • Property svn:keywords set to LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
File size: 5.3 KB
Line 
1<?php
2  /** Write the appropriate xinha_config directives to pass data to a PHP (Plugin) backend file.
3   *
4   *  ImageManager Example:
5   *  The following would be placed in step 3 of your configuration (see the NewbieGuide
6   *  (http://xinha.python-hosting.com/wiki/NewbieGuide)
7   *
8   * <script language="javascript">
9   *  with (xinha_config.ImageManager)
10   *  {
11   *    <?php
12   *      xinha_pass_to_php_backend
13   *      (       
14   *        array
15   *        (
16   *         'images_dir' => '/home/your/directory',
17   *         'images_url' => '/directory'
18   *        )
19   *      )
20   *    ?>
21   *  }
22   *  </script>
23   *
24   */
25     
26  function xinha_pass_to_php_backend($Data, $KeyLocation = 'Xinha:BackendKey', $ReturnPHP = FALSE)
27  {
28   
29    $bk = array();
30    $bk['data']       = serialize($Data);
31   
32    @session_start();
33    if(!isset($_SESSION[$KeyLocation]))
34    {
35      $_SESSION[$KeyLocation] = uniqid('Key_');
36    }
37   
38    $bk['session_name'] = session_name();     
39    $bk['key_location'] = $KeyLocation;     
40    $bk['hash']         =
41      function_exists('sha1') ?
42        sha1($_SESSION[$KeyLocation] . $bk['data'])
43      : md5($_SESSION[$KeyLocation] . $bk['data']);
44     
45     
46    // The data will be passed via a postback to the
47    // backend, we want to make sure these are going to come
48    // out from the PHP as an array like $bk above, so
49    // we need to adjust the keys.
50    $backend_data = array();
51    foreach($bk as $k => $v)
52    {
53      $backend_data["backend_data[$k]"] = $v;
54    }
55   
56    // The session_start() above may have been after data was sent, so cookies
57    // wouldn't have worked.
58    $backend_data[session_name()] = session_id();
59   
60    if($ReturnPHP)
61    {     
62      return array('backend_data' => $backend_data);     
63    }
64    else
65    {     
66      echo 'backend_data = ' . xinha_to_js($backend_data) . "; \n"; 
67    }               
68  } 
69   
70  /** Convert PHP data structure to Javascript */
71 
72  function xinha_to_js($var, $tabs = 0)
73  {
74    if(is_numeric($var))
75    {
76      return $var;
77    }
78 
79    if(is_string($var))
80    {
81      return "'" . xinha_js_encode($var) . "'";
82    }
83 
84    if(is_array($var))
85    {
86      $useObject = false;
87      foreach(array_keys($var) as $k) {
88          if(!is_numeric($k)) $useObject = true;
89      }
90      $js = array();
91      foreach($var as $k => $v)
92      {
93        $i = "";
94        if($useObject) {
95          if(preg_match('#^[a-zA-Z]+[a-zA-Z0-9]*$#', $k)) {
96            $i .= "$k: ";
97          } else {
98            $i .= "'$k': ";
99          }
100        }
101        $i .= xinha_to_js($v, $tabs + 1);
102        $js[] = $i;
103      }
104      if($useObject) {
105          $ret = "{\n" . xinha_tabify(implode(",\n", $js), $tabs) . "\n}";
106      } else {
107          $ret = "[\n" . xinha_tabify(implode(",\n", $js), $tabs) . "\n]";
108      }
109      return $ret;
110    }
111 
112    return 'null';
113  }
114   
115  /** Like htmlspecialchars() except for javascript strings. */
116 
117  function xinha_js_encode($string)
118  {
119    static $strings = "\\,\",',%,&,<,>,{,},@,\n,\r";
120 
121    if(!is_array($strings))
122    {
123      $tr = array();
124      foreach(explode(',', $strings) as $chr)
125      {
126        $tr[$chr] = sprintf('\x%02X', ord($chr));
127      }
128      $strings = $tr;
129    }
130 
131    return strtr($string, $strings);
132  }
133       
134   
135  /** Used by plugins to get the config passed via
136  *   xinha_pass_to_backend()
137  *  returns either the structure given, or NULL
138  *  if none was passed or a security error was encountered.
139  */
140 
141  function xinha_read_passed_data()
142  {
143   if(isset($_REQUEST['backend_data']) && is_array($_REQUEST['backend_data']))
144   {
145     $bk = $_REQUEST['backend_data'];
146     session_name($bk['session_name']);
147     @session_start();
148     if(!isset($_SESSION[$bk['key_location']])) return NULL;
149     
150     if($bk['hash']         ===
151        function_exists('sha1') ?
152          sha1($_SESSION[$bk['key_location']] . $bk['data'])
153        : md5($_SESSION[$bk['key_location']] . $bk['data']))
154     {
155       return unserialize(ini_get('magic_quotes_gpc') ? stripslashes($bk['data']) : $bk['data']);
156     }
157   }
158   
159   return NULL;
160  }
161   
162  /** Used by plugins to get a query string that can be sent to the backend
163  * (or another part of the backend) to send the same data.
164  */
165 
166  function xinha_passed_data_querystring()
167  {
168   $qs = array();
169   if(isset($_REQUEST['backend_data']) && is_array($_REQUEST['backend_data']))
170   {
171     foreach($_REQUEST['backend_data'] as $k => $v)
172     {
173       $v =  ini_get('magic_quotes_gpc') ? stripslashes($v) : $v;
174       $qs[] = "backend_data[" . rawurlencode($k) . "]=" . rawurlencode($v);
175     }       
176   }
177   
178   $qs[] = session_name() . '=' . session_id();
179   return implode('&', $qs);
180  }
181   
182   
183  /** Just space-tab indent some text */
184  function xinha_tabify($text, $tabs)
185  {
186    if($text)
187    {
188      return str_repeat("  ", $tabs) . preg_replace('/\n(.)/', "\n" . str_repeat("  ", $tabs) . "\$1", $text);
189    }
190  }       
191
192  /** Return upload_max_filesize value from php.ini in kilobytes (function adapted from php.net)**/
193  function upload_max_filesize_kb()
194  {
195    $val = ini_get('upload_max_filesize');
196    $val = trim($val);
197    $last = strtolower($val{strlen($val)-1});
198    switch($last)
199    {
200      // The 'G' modifier is available since PHP 5.1.0
201      case 'g':
202        $val *= 1024;
203      case 'm':
204        $val *= 1024;
205   }
206   return $val;
207}
208?>
Note: See TracBrowser for help on using the repository browser.