source: trunk/include/functions_metadata.inc.php @ 24968

Revision 24968, 5.4 KB checked in by plg, 6 years ago (diff)

merge r24967 from branch 2.5 to trunk

bug 2973 fixed: automatically use encoding windows-1252 instead of iso-8859-1
(unless we find utf-8 signs) on IPTC before converting to utf-8

  • Property svn:eol-style set to LF
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2013 Piwigo Team                  http://piwigo.org |
6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
8// +-----------------------------------------------------------------------+
9// | This program is free software; you can redistribute it and/or modify  |
10// | it under the terms of the GNU General Public License as published by  |
11// | the Free Software Foundation                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
23
24/**
25 * returns informations from IPTC metadata, mapping is done at the beginning
26 * of the function
27 *
28 * @param string $filename
29 * @return array
30 */
31function get_iptc_data($filename, $map)
32{
33  global $conf;
34 
35  $result = array();
36
37  $imginfo = array();
38  if (false == @getimagesize($filename, $imginfo) )
39  {
40    return $result;
41  }
42
43  if (isset($imginfo['APP13']))
44  {
45    $iptc = iptcparse($imginfo['APP13']);
46    if (is_array($iptc))
47    {
48      $rmap = array_flip($map);
49      foreach (array_keys($rmap) as $iptc_key)
50      {
51        if (isset($iptc[$iptc_key][0]))
52        {
53          if ($iptc_key == '2#025')
54          {
55            $value = implode(',',
56                             array_map('clean_iptc_value',$iptc[$iptc_key]));
57          }
58          else
59          {
60            $value = clean_iptc_value($iptc[$iptc_key][0]);
61          }
62
63          foreach (array_keys($map, $iptc_key) as $pwg_key)
64          {
65            $result[$pwg_key] = $value;
66
67            if (!$conf['allow_html_in_metadata'])
68            {
69              // in case the origin of the photo is unsecure (user upload), we
70              // remove HTML tags to avoid XSS (malicious execution of
71              // javascript)
72              $result[$pwg_key] = strip_tags($result[$pwg_key]);
73            }
74          }
75        }
76      }
77    }
78  }
79  return $result;
80}
81
82/**
83 * return a cleaned IPTC value
84 *
85 * @param string value
86 * @return string
87 */
88function clean_iptc_value($value)
89{
90  // strip leading zeros (weird Kodak Scanner software)
91  while ( isset($value[0]) and $value[0] == chr(0))
92  {
93    $value = substr($value, 1);
94  }
95  // remove binary nulls
96  $value = str_replace(chr(0x00), ' ', $value);
97
98  if ( preg_match('/[\x80-\xff]/', $value) )
99  {
100    // apparently mac uses some MacRoman crap encoding. I don't know
101    // how to detect it so a plugin should do the trick.
102    $value = trigger_event('clean_iptc_value', $value);
103    if ( ($qual = qualify_utf8($value)) != 0)
104    {// has non ascii chars
105      if ($qual>0)
106      {
107        $input_encoding = 'utf-8';
108      }
109      else
110      {
111        $input_encoding = 'iso-8859-1';
112        if (function_exists('iconv') or function_exists('mb_convert_encoding'))
113        {
114          // using windows-1252 because it supports additional characters
115          // such as "oe" in a single character (ligature). About the
116          // difference between Windows-1252 and ISO-8859-1: the characters
117          // 0x80-0x9F will not convert correctly. But these are control
118          // characters which are almost never used.
119          $input_encoding = 'windows-1252';
120        }
121      }
122     
123      $value = convert_charset($value, $input_encoding, get_pwg_charset());
124    }
125  }
126  return $value;
127}
128
129/**
130 * returns informations from EXIF metadata, mapping is done at the beginning
131 * of the function
132 *
133 * @param string $filename
134 * @return array
135 */
136function get_exif_data($filename, $map)
137{
138  global $conf;
139 
140  $result = array();
141
142  if (!function_exists('read_exif_data'))
143  {
144    die('Exif extension not available, admin should disable exif use');
145  }
146
147  // Read EXIF data
148  if ($exif = @read_exif_data($filename))
149  {
150    $exif = trigger_event('format_exif_data', $exif, $filename, $map );
151    foreach ($map as $key => $field)
152    {
153      if (strpos($field, ';') === false)
154      {
155        if (isset($exif[$field]))
156        {
157          $result[$key] = $exif[$field];
158        }
159      }
160      else
161      {
162        $tokens = explode(';', $field);
163        if (isset($exif[$tokens[0]][$tokens[1]]))
164        {
165          $result[$key] = $exif[$tokens[0]][$tokens[1]];
166        }
167      }
168    }
169  }
170
171  if (!$conf['allow_html_in_metadata'])
172  {
173    foreach ($result as $key => $value)
174    {
175      // in case the origin of the photo is unsecure (user upload), we remove
176      // HTML tags to avoid XSS (malicious execution of javascript)
177      $result[$key] = strip_tags($value);
178    }
179  }
180
181  return $result;
182}
183?>
Note: See TracBrowser for help on using the repository browser.