Add import feature
[ldapsaisie.git] / public_html / includes / class / class.LSimport.php
1 <?php
2 /*******************************************************************************
3  * Copyright (C) 2007 Easter-eggs
4  * http://ldapsaisie.labs.libre-entreprise.org
5  *
6  * Author: See AUTHORS file in top-level directory.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 ******************************************************************************/
22
23 LSsession::loadLSclass('LSioFormat');
24
25 /**
26  * Manage Import LSldapObject
27  *
28  * @author Benjamin Renard <brenard@easter-eggs.com>
29  */
30 class LSimport {
31
32   /**
33    * Check if the form was posted by check POST data
34    *
35    * @author Benjamin Renard <brenard@easter-eggs.com>
36    *
37    * @retval boolean true if the form was posted, false otherwise
38    */
39   function isSubmit() {
40     if (isset($_POST['validate']) && ($_POST['validate']=='LSimport'))
41       return true;
42     return;
43   }
44
45
46   /**
47    * Retrieve the post file
48    *
49    * @retval mixed The path of the temporary file, false on error
50    */
51   function getPostFile() {
52     if (is_uploaded_file($_FILES['importfile']['tmp_name'])) {
53       $fp = fopen($_FILES['importfile']['tmp_name'], "r");
54       $buf = fread($fp, filesize($_FILES['importfile']['tmp_name']));
55       fclose($fp);
56       $tmp_file = LS_TMP_DIR.'importfile'.'_'.rand().'.tmp';
57       if (move_uploaded_file($_FILES['importfile']['tmp_name'],$tmp_file)) {
58         LSsession :: addTmpFile($buf,$tmp_file);
59       }
60       return $tmp_file;
61     }
62     return false;
63   }
64
65   /**
66    * Retreive POST data
67    *
68    * This method retrieve and format POST data.
69    *
70    * The POST data are return as an array containing :
71    *  - LSobject : The LSobject type if this import
72    *  - ioFormat : The IOformat name choose by user
73    *  - justTry : Boolean defining wether the user has chosen to enable
74    *              just try mode (no modification)
75    *  - updateIfExists : Boolean defining wether the user has chosen to
76    *                     allow update on existing object.
77    *  - importfile : The path of the temporary file to import
78    *
79    * @author Benjamin Renard <brenard@easter-eggs.com>
80    *
81    * @retval mixed Array of POST data, false on error
82    */
83   function getPostData() {
84     if (isset($_REQUEST['LSobject']) && isset($_POST['ioFormat'])) {
85       $file=self::getPostFile();
86       if ($file) {
87         return array (
88           'LSobject' => $_REQUEST['LSobject'],
89           'ioFormat' => $_POST['ioFormat'],
90           'justTry' => ($_POST['justTry']=='yes'),
91           'updateIfExists' => ($_POST['updateIfExists']=='yes'),
92           'importfile' => $file
93         );
94       }
95     }
96     return False;
97   }
98
99   /**
100    * Import objects form POST data
101    *
102    * This method retreive, validate and import POST data.
103    *
104    * If import could start, the return value is an array :
105    *
106    *
107    *   array (
108    *     'imported' => array (
109    *       '[object1 dn]' => '[object1 display name]',
110    *       '[object2 dn]' => '[object2 display name]',
111    *       [...]
112    *     ),
113    *     'updated' => array (
114    *       '[object3 dn]' => '[object3 display name]',
115    *       '[object4 dn]' => '[object4 display name]',
116    *       [...]
117    *     ),
118    *     'errors' => array (
119    *       array (
120    *         'data' =>  array ([object data as read from source file]),
121    *         'errors' => array (
122    *           'globals' => array (
123    *             // Global error of this object importation that not
124    *             // concerning only one attribute)
125    *           ),
126    *           'attrs' => array (
127    *             '[attr1]' => array (
128    *               '[error 1]',
129    *               '[error 2]',
130    *               [...]
131    *             )
132    *           )
133    *         )
134    *       ),
135    *       [...]
136    *     )
137    *   )
138    *
139    * @author Benjamin Renard <brenard@easter-eggs.com>
140    *
141    * @retval boolean Array of the import result, false on error
142    */
143   function importFromPostData() {
144     // Get data from $_POST
145     $data=self::getPostData();
146     if (is_array($data)) {
147       LSdebug($data,1);
148       // Load LSobject
149       if (!isset($data['LSobject']) || LSsession::loadLSobject($data['LSobject'])) {
150         $LSobject=$data['LSobject'];
151         // Validate ioFormat
152         $object = new $LSobject();
153         if($object -> isValidIOformat($data['ioFormat'])) {
154           // Create LSioFormat object
155           $ioFormat = new LSioFormat($LSobject,$data['ioFormat']);
156           if ($ioFormat -> ready()) {
157             // Load data in LSioFormat object
158             if ($ioFormat -> loadFile($data['importfile'])) {
159               LSdebug('file loaded');
160               $return=array(
161                 'imported' => array(),
162                 'updated' => array(),
163               );
164               // Retreive object from ioFormat
165               $objectsData=$ioFormat -> getAll();
166               $objectsInError=array();
167               LSdebug($objectsData);
168               // Browse inputed objects
169               foreach($objectsData as $objData) {
170                 $globalErrors=array();
171                 // Instanciate an LSobject
172                 $object = new $LSobject();
173                 // Instanciate a creation LSform
174                 $form = $object -> getForm('create');
175                 // Set form data from inputed data
176                 if ($form -> setPostData($objData,true)) {
177                   // Validate form
178                   if ($form -> validate()) {
179                     // Validate data (just validate)
180                     if ($object -> updateData('create',True)) {
181                       LSdebug('Data is correct, retreive object DN');
182                       $dn = $object -> getDn();
183                       if ($dn) {
184                         // Check if object already exists
185                         $entry=LSldap::getLdapEntry($dn);
186                         if ($entry===False) {
187                           LSdebug('New object, perform creation');
188                           if ($data['justTry'] || $object -> updateData('create')) {
189                             LSdebug('Object '.$object -> getDn().' imported');
190                             $return['imported'][$object -> getDn()]=$object -> getDisplayName();
191                             continue;
192                           }
193                           else {
194                             LSdebug('Failed to updateData on : '.print_r($objData,True));
195                             $globalErrors[]=_('Error creating object on LDAP server.');
196                           }
197                         }
198                         // This object already exist, check 'updateIfExists' mode
199                         elseif ($data['updateIfExists']) {
200                           LSdebug('Object exist, perform update');
201
202                           // Restart import in update mode
203
204                           // Instanciate a new LSobject and load data from it's DN
205                           $object = new $LSobject();
206                           if ($object -> loadData($dn)) {
207                             // Instanciate a modify form
208                             $form = $object -> getForm('modify');
209                             // Set form data from inputed data
210                             if ($form -> setPostData($objData,true)) {
211                               // Validate form
212                               if ($form -> validate()) {
213                                 // Update data on LDAP server
214                                 if ($data['justTry'] || $object -> updateData('modify')) {
215                                   LSdebug('Object '.$object -> getDn().' updated');
216                                   $return['updated'][$object -> getDn()]=$object -> getDisplayName();
217                                   continue;
218                                 }
219                                 else {
220                                   LSdebug('Failed to updateData (modify) on : '.print_r($objData,True));
221                                   $globalErrors[]=_('Error updating object on LDAP server.');
222                                 }
223                               }
224                               else {
225                                 LSdebug('Failed to validate update form on : '.print_r($objData,True));
226                                 LSdebug('Form errors : '.print_r($form->getErrors(),True));
227                                 $globalErrors[]=_('Error validating update form.');
228                               }
229                             }
230                             else {
231                               LSdebug('Failed to setPostData on update form : '.print_r($objData,True));
232                               $globalErrors[]=_('Failed to set post data on update form.');
233                             }
234                           }
235                           else {
236                             LSdebug('Failed to load data of '.$dn);
237                             $globalErrors[]=getFData(_("Failed to load existing object %{dn} from LDAP server. Can't update object."));
238                           }
239                         }
240                         else {
241                           LSdebug('Object '.$dn.' already exist');
242                           $globalErrors[]=getFData(_('An object already exist on LDAP server with DN %{dn}.'),$dn);
243                         }
244                       }
245                       else {
246                         $globalErrors[]=_('Failed to generate DN for this object.');
247                       }
248                     }
249                     else {
250                       $globalErrors[]=_('Failed to validate object data.');
251                     }
252                   }
253                   else {
254                     LSdebug('Failed to validate form on : '.print_r($objData,True));
255                     LSdebug('Form errors : '.print_r($form->getErrors(),True));
256                     $globalErrors[]=_('Error validating creation form.');
257                   }
258                 }
259                 else {
260                   LSdebug('Failed to setPostData on : '.print_r($objData,True));
261                   $globalErrors[]=_('Failed to set post data on creation form.');
262                 }
263                 $objectsInError[]=array(
264                   'data' => $objData,
265                   'errors' => array (
266                     'globals' => $globalErrors,
267                     'attrs' => $form->getErrors()
268                   )
269                 );
270               }
271               $return['errors']=$objectsInError;
272               return $return;
273             }
274           }
275           else {
276             LSerror :: addErrorCode('LSimport_04');
277           }
278         }
279         else {
280           LSerror :: addErrorCode('LSimport_03',$data['ioFormat']);
281         }
282       }
283       else {
284         LSerror :: addErrorCode('LSimport_02');
285       }
286     }
287     else {
288       LSerror :: addErrorCode('LSimport_01');
289     }
290     return False;
291   }
292 }
293
294
295 /*
296  * LSimport_implodeValues template function
297  *
298  * This function permit to implode field values during 
299  * template processing. This function take as parameters
300  * (in $params) :
301  * - $values : the field's values to implode
302  *
303  * @param[in] $params The template function parameters
304  * @param[in] $template Smarty object
305  *
306  * @retval void
307  **/ 
308 function LSimport_implodeValues($params, $template) {
309   extract($params);
310
311   if (isset($values) && is_array($values)) {
312     echo implode(',',$values);
313   }
314 }
315 LStemplate :: registerFunction('LSimport_implodeValues','LSimport_implodeValues');
316
317
318 LSerror :: defineError('LSimport_01',
319 _("LSimport : Post data not found or not completed.")
320 );
321 LSerror :: defineError('LSimport_02',
322 _("LSimport : object type invalid.")
323 );
324 LSerror :: defineError('LSimport_03',
325 _("LSimport : input/output format %{format} invalid.")
326 );
327 LSerror :: defineError('LSimport_04',
328 _("LSimport : Fail to initialize input/output driver")
329 );
330
331
332
333 ?>