OSDN Git Service

sync the original code
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / libs / MEDIA.php
1 <?php\r
2 /*\r
3  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
4  * Copyright (C) 2002-2005 The Nucleus Group\r
5  *\r
6  * This program is free software; you can redistribute it and/or\r
7  * modify it under the terms of the GNU General Public License\r
8  * as published by the Free Software Foundation; either version 2\r
9  * of the License, or (at your option) any later version.\r
10  * (see nucleus/documentation/index.html#license for more info)\r
11  */\r
12 /**\r
13  * Media classes for nucleus\r
14  *\r
15  * @license http://nucleuscms.org/license.txt GNU General Public License\r
16  * @copyright Copyright (C) 2002-2005 The Nucleus Group\r
17  * @version $Id: MEDIA.php,v 1.4 2005-08-13 07:33:02 kimitake Exp $\r
18  * $NucleusJP: MEDIA.php,v 1.3 2005/03/12 06:19:05 kimitake Exp $\r
19  */\r
20 \r
21 \r
22 /**\r
23   * Represents the media objects for a certain member\r
24   */\r
25 class MEDIA {\r
26         \r
27         /**\r
28           * Gets the list of collections available to the currently logged\r
29           * in member \r
30           *\r
31           * @returns array of dirname => display name\r
32           */\r
33         function getCollectionList() {\r
34                 global $member, $DIR_MEDIA;\r
35                 \r
36                 $collections = array();\r
37                 \r
38                 // add private directory for member\r
39                 $collections[$member->getID()] = 'Private Collection';\r
40                 \r
41                 // add global collections\r
42                 if (!is_dir($DIR_MEDIA)) return $collections;\r
43                 \r
44                 $dirhandle = opendir($DIR_MEDIA);\r
45                 while ($dirname = readdir($dirhandle)) {\r
46                         // only add non-numeric (numeric=private) dirs\r
47                         if (@is_dir($DIR_MEDIA . $dirname) && ($dirname != '.') && ($dirname != '..') && ($dirname != 'CVS') && (!is_numeric($dirname)))  {\r
48                                 $collections[$dirname] = $dirname;\r
49                         }\r
50                 }\r
51                 closedir($dirhandle);\r
52                 \r
53                 return $collections;\r
54                 \r
55         }\r
56 \r
57         /**\r
58           * Returns an array of MEDIAOBJECT objects for a certain collection\r
59           *\r
60           * @param $collection\r
61           *             name of the collection\r
62           * @param $filter\r
63           *             filter on filename (defaults to none)     \r
64           */\r
65         function getMediaListByCollection($collection, $filter = '') {\r
66                 global $DIR_MEDIA;\r
67 \r
68                 $filelist = array();    \r
69                 \r
70                 // 1. go through all objects and add them to the filelist\r
71 \r
72                 $mediadir = $DIR_MEDIA . $collection . '/';\r
73                 \r
74                 // return if dir does not exist\r
75                 if (!is_dir($mediadir)) return $filelist;\r
76                 \r
77                 $dirhandle = opendir($mediadir);\r
78                 while ($filename = readdir($dirhandle)) {\r
79                         // only add files that match the filter\r
80                         if (!@is_dir($filename) && MEDIA::checkFilter($filename, $filter))\r
81                                 array_push($filelist, new MEDIAOBJECT($collection, $filename, filemtime($mediadir . $filename)));\r
82                 }\r
83                 closedir($dirhandle);\r
84 \r
85                 // sort array so newer files are shown first\r
86                 usort($filelist, 'sort_media');\r
87                 \r
88                 return $filelist;\r
89         }\r
90         \r
91         function checkFilter($strText, $strFilter) {\r
92                 if ($strFilter == '')\r
93                         return 1;\r
94                 else \r
95                         return is_integer(strpos(strtolower($strText), strtolower($strFilter)));\r
96         }\r
97 \r
98         /**\r
99           * checks if a collection exists with the given name, and if it's \r
100           * allowed for the currently logged in member to upload files to it\r
101           */ \r
102         function isValidCollection($collectionName) {\r
103                 global $member, $DIR_MEDIA;\r
104                 \r
105                 // private collections only accept uploads from their owners\r
106                 if (is_numeric($collectionName))\r
107                         return ($member->getID() == $collectionName);\r
108                         \r
109                 // other collections should exists and be writable\r
110                 $collectionDir = $DIR_MEDIA . $collectionName;\r
111                 return (@is_dir($collectionDir) || @is_writable($collectionDir));\r
112         }\r
113 \r
114         /**\r
115           * Adds an uploaded file to the media archive\r
116           *\r
117           * @param collection\r
118           *             collection\r
119           * @param uploadfile\r
120           *             the postFileInfo(..) array \r
121           * @param filename\r
122           *             the filename that should be used to save the file as\r
123           *             (date prefix should be already added here)\r
124           */\r
125         function addMediaObject($collection, $uploadfile, $filename) {\r
126                 global $DIR_MEDIA;\r
127                 \r
128                 // don't allow uploads to unknown or forbidden collections\r
129                 if (!MEDIA::isValidCollection($collection))\r
130                         return _ERROR_DISALLOWED;\r
131 \r
132                 // check dir permissions (try to create dir if it does not exist)\r
133                 $mediadir = $DIR_MEDIA . $collection;\r
134 \r
135                 // try to create new private media directories if needed\r
136                 if (!@is_dir($mediadir) && is_numeric($collection)) {\r
137                         $oldumask = umask(0000);\r
138                         if (!@mkdir($mediadir, 0777))\r
139                                 return _ERROR_BADPERMISSIONS;\r
140                         umask($oldumask);                               \r
141                 } \r
142                 \r
143                 // if dir still not exists, the action is disallowed\r
144                 if (!@is_dir($mediadir))\r
145                         return _ERROR_DISALLOWED;\r
146                 \r
147                 if (!is_writeable($mediadir))\r
148                         return _ERROR_BADPERMISSIONS;\r
149                         \r
150                 // add trailing slash (don't add it earlier since it causes mkdir to fail on some systems)\r
151                 $mediadir .= '/';\r
152                         \r
153                 if (file_exists($mediadir . $filename))\r
154                         return _ERROR_UPLOADDUPLICATE;\r
155 \r
156                 // move file to directory\r
157                 if (is_uploaded_file($uploadfile)) {\r
158                         if (!@move_uploaded_file($uploadfile, $mediadir . $filename))\r
159                                 return _ERROR_UPLOADMOVEP;\r
160                 } else {\r
161                         if (!copy($uploadfile, $mediadir . $filename))\r
162                                 return _ERROR_UPLOADCOPY ;\r
163                 }\r
164                 \r
165                 // chmod uploaded file\r
166                 $oldumask = umask(0000);\r
167                 @chmod($mediadir . $filename, 0644); \r
168                 umask($oldumask);               \r
169                 \r
170                 return '';\r
171         \r
172         }\r
173         \r
174         /**\r
175          * Adds an uploaded file to the media dir. \r
176          *\r
177          * @param $collection\r
178          *              collection to use\r
179          * @param $filename\r
180          *              the filename that should be used to save the file as\r
181          *              (date prefix should be already added here)\r
182          * @param &$data\r
183          *              File data (binary)\r
184          *\r
185          * NOTE: does not check if $collection is valid.\r
186          */\r
187         function addMediaObjectRaw($collection, $filename, &$data) {\r
188                 global $DIR_MEDIA;\r
189                 \r
190                 // check dir permissions (try to create dir if it does not exist)\r
191                 $mediadir = $DIR_MEDIA . $collection;\r
192 \r
193                 // try to create new private media directories if needed\r
194                 if (!@is_dir($mediadir) && is_numeric($collection)) {\r
195                         $oldumask = umask(0000);\r
196                         if (!@mkdir($mediadir, 0777))\r
197                                 return _ERROR_BADPERMISSIONS;\r
198                         umask($oldumask);                               \r
199                 } \r
200                 \r
201                 // if dir still not exists, the action is disallowed\r
202                 if (!@is_dir($mediadir))\r
203                         return _ERROR_DISALLOWED;\r
204                 \r
205                 if (!is_writeable($mediadir))\r
206                         return _ERROR_BADPERMISSIONS;\r
207                         \r
208                 // add trailing slash (don't add it earlier since it causes mkdir to fail on some systems)\r
209                 $mediadir .= '/';\r
210                         \r
211                 if (file_exists($mediadir . $filename))\r
212                         return _ERROR_UPLOADDUPLICATE;\r
213 \r
214                 // create file\r
215                 $fh = @fopen($mediadir . $filename, 'wb');\r
216                 if (!$fh) \r
217                         return _ERROR_UPLOADFAILED;\r
218                 $ok = @fwrite($fh, $data);\r
219                 @fclose($fh);\r
220                 if (!$ok)\r
221                         return _ERROR_UPLOADFAILED;\r
222                 \r
223                 // chmod uploaded file\r
224                 $oldumask = umask(0000);\r
225                 @chmod($mediadir . $filename, 0644); \r
226                 umask($oldumask);               \r
227                 \r
228                 return '';\r
229         \r
230         }\r
231 \r
232 }\r
233 \r
234 /**\r
235   * Represents the characteristics of one single media-object\r
236   *\r
237   * Description of properties:\r
238   *  - filename: filename, without paths\r
239   *  - timestamp: last modification (unix timestamp)\r
240   *  - collection: collection to which the file belongs (can also be a owner ID, for private collections)\r
241   *  - private: true if the media belongs to a private member collection\r
242   */\r
243 class MEDIAOBJECT {\r
244 \r
245         var $private;\r
246         var $collection;\r
247         var $filename;\r
248         var $timestamp;\r
249 \r
250         function MEDIAOBJECT($collection, $filename, $timestamp) {\r
251                 $this->private = is_numeric($collection);\r
252                 $this->collection = $collection;\r
253                 $this->filename = $filename;\r
254                 $this->timestamp = $timestamp;\r
255         }\r
256         \r
257 }\r
258 \r
259 /**\r
260   * User-defined sort method to sort an array of MEDIAOBJECTS\r
261   */\r
262 function sort_media($a, $b) {\r
263     if ($a->timestamp == $b->timestamp) return 0;\r
264     return ($a->timestamp > $b->timestamp) ? -1 : 1;\r
265 }\r
266 \r
267 ?>\r