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

Last change on this file since 1244 was 1244, checked in by gogo, 5 years ago

xinha_to_js did not handle booleans correctly
ticket:1503

  • Property svn:keywords set to LastChangedDate LastChangedRevision LastChangedBy HeadURL Id
File size: 5.4 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_bool($var))
85    {
86      return $var ? 'true': 'false';
87    }
88 
89    if(is_array($var))
90    {
91      $useObject = false;
92      foreach(array_keys($var) as $k) {
93          if(!is_numeric($k)) $useObject = true;
94      }
95      $js = array();
96      foreach($var as $k => $v)
97      {
98        $i = "";
99        if($useObject) {
100          if(preg_match('#^[a-zA-Z]+[a-zA-Z0-9]*$#', $k)) {
101            $i .= "$k: ";
102          } else {
103            $i .= "'$k': ";
104          }
105        }
106        $i .= xinha_to_js($v, $tabs + 1);
107        $js[] = $i;
108      }
109      if($useObject) {
110          $ret = "{\n" . xinha_tabify(implode(",\n", $js), $tabs) . "\n}";
111      } else {
112          $ret = "[\n" . xinha_tabify(implode(",\n", $js), $tabs) . "\n]";
113      }
114      return $ret;
115    }
116 
117    return 'null';
118  }
119   
120  /** Like htmlspecialchars() except for javascript strings. */
121 
122  function xinha_js_encode($string)
123  {
124    static $strings = "\\,\",',%,&,<,>,{,},@,\n,\r";
125 
126    if(!is_array($strings))
127    {
128      $tr = array();
129      foreach(explode(',', $strings) as $chr)
130      {
131        $tr[$chr] = sprintf('\x%02X', ord($chr));
132      }
133      $strings = $tr;
134    }
135 
136    return strtr($string, $strings);
137  }
138       
139   
140  /** Used by plugins to get the config passed via
141  *   xinha_pass_to_backend()
142  *  returns either the structure given, or NULL
143  *  if none was passed or a security error was encountered.
144  */
145 
146  function xinha_read_passed_data()
147  {
148   if(isset($_REQUEST['backend_data']) && is_array($_REQUEST['backend_data']))
149   {
150     $bk = $_REQUEST['backend_data'];
151     session_name($bk['session_name']);
152     @session_start();
153     if(!isset($_SESSION[$bk['key_location']])) return NULL;
154     
155     if($bk['hash']         ===
156        function_exists('sha1') ?
157          sha1($_SESSION[$bk['key_location']] . $bk['data'])
158        : md5($_SESSION[$bk['key_location']] . $bk['data']))
159     {
160       return unserialize(ini_get('magic_quotes_gpc') ? stripslashes($bk['data']) : $bk['data']);
161     }
162   }
163   
164   return NULL;
165  }
166   
167  /** Used by plugins to get a query string that can be sent to the backend
168  * (or another part of the backend) to send the same data.
169  */
170 
171  function xinha_passed_data_querystring()
172  {
173   $qs = array();
174   if(isset($_REQUEST['backend_data']) && is_array($_REQUEST['backend_data']))
175   {
176     foreach($_REQUEST['backend_data'] as $k => $v)
177     {
178       $v =  ini_get('magic_quotes_gpc') ? stripslashes($v) : $v;
179       $qs[] = "backend_data[" . rawurlencode($k) . "]=" . rawurlencode($v);
180     }       
181   }
182   
183   $qs[] = session_name() . '=' . session_id();
184   return implode('&', $qs);
185  }
186   
187   
188  /** Just space-tab indent some text */
189  function xinha_tabify($text, $tabs)
190  {
191    if($text)
192    {
193      return str_repeat("  ", $tabs) . preg_replace('/\n(.)/', "\n" . str_repeat("  ", $tabs) . "\$1", $text);
194    }
195  }       
196
197  /** Return upload_max_filesize value from php.ini in kilobytes (function adapted from php.net)**/
198  function upload_max_filesize_kb()
199  {
200    $val = ini_get('upload_max_filesize');
201    $val = trim($val);
202    $last = strtolower($val{strlen($val)-1});
203    switch($last)
204    {
205      // The 'G' modifier is available since PHP 5.1.0
206      case 'g':
207        $val *= 1024;
208      case 'm':
209        $val *= 1024;
210   }
211   return $val;
212}
213?>
Note: See TracBrowser for help on using the repository browser.