2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
12 $page_security = 'SA_CREATEMODULES';
14 include_once($path_to_root . "/includes/session.inc");
16 page(_("Install/Activate extensions"));
18 include_once($path_to_root . "/includes/date_functions.inc");
19 include_once($path_to_root . "/admin/db/company_db.inc");
20 include_once($path_to_root . "/admin/db/maintenance_db.inc");
21 include_once($path_to_root . "/includes/ui.inc");
23 simple_page_mode(true);
25 //---------------------------------------------------------------------------------------------
26 function update_extensions($extensions) {
27 global $db_connections;
29 if (!write_extensions($extensions)) {
30 display_notification(_("Cannot update system extensions list."));
34 // update per company files
35 $cnt = count($db_connections);
36 for($i = 0; $i < $cnt; $i++)
38 $newexts = $extensions;
39 // update 'active' status
40 $exts = get_company_extensions($i);
41 foreach ($exts as $key => $ext)
43 if (isset($newexts[$key]))
44 $newexts[$key]['active'] = $exts[$key]['active'];
46 if(!write_extensions($newexts, $i))
48 display_notification(sprintf(_("Cannot update extensions list for company '%s'."),
49 $db_connections[$i]['name']));
56 function check_data($id, $exts)
58 if ($_POST['name'] == "") {
59 display_error(_("Extension name cannot be empty."));
62 foreach($exts as $n =>$ext) {
63 if ($_POST['name'] == $ext['name'] && $id != $n) {
64 display_error(_("Extension name have to be unique."));
69 if ($_POST['title'] == "") {
70 display_error(_("Extension title cannot be empty."));
73 if ($_POST['path'] == "") {
74 display_error(_("Extension folder name cannot be empty."));
77 if ($id == -1 && !is_uploaded_file($_FILES['uploadfile']['tmp_name'])) {
78 display_error(_("You have to select plugin file to upload"));
84 //---------------------------------------------------------------------------------------------
86 function handle_submit()
88 global $path_to_root, $db_connections, $selected_id, $next_extension_id;
90 $extensions = get_company_extensions();
91 if (!check_data($selected_id, $extensions))
93 $id = $selected_id==-1 ? $next_extension_id : $selected_id;
95 if ($extensions[$id]['type'] != 'plugin') {
96 display_error(_('Module installation support is not implemented yet. You have to do it manually.'));
100 $extensions[$id]['tab'] = $_POST['tab'];
101 $extensions[$id]['name'] = $_POST['name'];
102 $extensions[$id]['path'] = $_POST['path'];
103 $extensions[$id]['title'] = $_POST['title'];
104 $extensions[$id]['active'] = $_POST['active'];
106 // Currently we support only plugin extensions here.
107 $extensions[$id]['type'] = 'plugin';
108 $directory = $path_to_root . "/modules/" . $_POST['path'];
109 if (!file_exists($directory))
113 if (is_uploaded_file($_FILES['uploadfile']['tmp_name']))
115 $extensions[$id]['filename'] = $_FILES['uploadfile']['name'];
116 $file1 = $_FILES['uploadfile']['tmp_name'];
117 $file2 = $directory . "/".$_FILES['uploadfile']['name'];
118 if (file_exists($file2))
120 move_uploaded_file($file1, $file2);
123 $extensions[$id]['filename'] = get_post('filename');
124 if (is_uploaded_file($_FILES['uploadfile2']['tmp_name']))
126 $file1 = $_FILES['uploadfile2']['tmp_name'];
127 $file2 = $directory . "/".$_FILES['uploadfile2']['name'];
128 if (file_exists($file2))
130 move_uploaded_file($file1, $file2);
131 $db_name = $_SESSION["wa_current_user"]->company;
132 db_import($file2, $db_connections[$db_name]);
135 if (is_uploaded_file($_FILES['uploadfile3']['tmp_name']))
137 $extensions[$id]['acc_file'] = $_FILES['uploadfile3']['name'];
138 $file1 = $_FILES['uploadfile3']['tmp_name'];
139 $file2 = $directory . "/".$_FILES['uploadfile3']['name'];
140 if (file_exists($file2))
142 move_uploaded_file($file1, $file2);
145 $extensions[$id]['acc_file'] = get_post('acc_file');
147 // security area guess for plugins
148 if ($extensions[$id]['type'] == 'plugin'){
149 $exttext = file_get_contents($path_to_root.'/modules/'
150 .$extensions[$id]['path'].'/'.$extensions[$id]['filename']);
152 if (preg_match('/.*\$page_security\s*=\s*[\'"]([^\'"]*)/', $exttext, $match)) {
153 $area = trim($match[1]);
155 $extensions[$id]['access'] = $area;
158 if ($selected_id == -1)
160 $next_extension_id++;
162 if (!update_extensions($extensions))
167 function handle_delete()
169 global $path_to_root, $db_connections, $selected_id;
171 $extensions = get_company_extensions();
174 $removed_ext = $extensions[$id];
176 unset($extensions[$id]);
177 $mods = array_values($extensions);
180 unset($extensions[$id]);
182 update_extensions($extensions);
184 $filename = $path_to_root
185 . ($extensions[$id]['type']=='plugin' ? "/modules/": '/')
186 . $extensions[$id]['path'];
188 if ($h = opendir($filename))
190 while (($file = readdir($h)) !== false)
192 if (is_file("$filename/$file"))
193 unlink("$filename/$file");
199 display_notification(_("Selected extension has been successfully deleted"));
203 //---------------------------------------------------------------------------------------------
205 function display_extensions()
207 global $table_style, $tabs;
209 start_table($table_style);
210 $th = array(_("Name"),_("Tab"), _("Link text"), _("Folder"), _("Filename"),
211 _("Access extensions"),"", "");
215 $mods = get_company_extensions();
216 $mods = array_natsort($mods, null, 'name');
218 foreach($mods as $i => $mod)
220 $is_mod = $mod['type'] == 'module';
221 alt_table_row_color($k);
222 label_cell($mod['name']);
223 label_cell( $is_mod ? $mod['title'] : $tabs[$mod['tab']]);
224 $ttl = access_string($mod['title']);
226 label_cell($mod['path']);
227 label_cell($mod['filename']);
228 label_cell(@$mod['acc_file']);
231 label_cell(''); // not implemented (yet)
235 edit_button_cell("Edit".$i, _("Edit"));
237 delete_button_cell("Delete".$i, _("Delete"));
238 submit_js_confirm('Delete'.$i, _('You are about to delete this extension\nDo you want to continue?'));
245 function company_extensions($id)
247 global $table_style, $tabs;
249 start_table($table_style);
251 $th = array(_("Name"),_("Tab"), _("Link text"), _("Active"));
253 // get all available extensions and display
254 // with current status stored in company directory.
256 $mods = get_company_extensions();
257 $exts = get_company_extensions($id);
258 foreach($mods as $key => $ins) {
259 foreach($exts as $ext)
260 if ($ext['name'] == $ins['name']) {
261 $mods[$key]['active'] = @$ext['active'];
265 $mods = array_natsort($mods, null, 'name');
268 foreach($mods as $i => $mod)
270 alt_table_row_color($k);
271 label_cell($mod['name']);
272 label_cell($mod['type'] == 'module' ? $mod['title'] : $tabs[$mod['tab']]);
273 $ttl = access_string($mod['title']);
275 check_cells(null, 'Active'.$i, @$mod['active'] ? 1:0,
276 false, false, "align='center'");
281 submit_center('Update', _('Update'), true, false, 'default');
284 //---------------------------------------------------------------------------------------------
286 function display_ext_edit($selected_id)
288 global $table_style2, $Mode;
291 $extensions = get_company_extensions();
293 start_table($table_style2);
295 if ($selected_id != -1 && $extensions[$selected_id]['type'] == 'plugin')
297 if ($Mode == 'Edit') {
298 $mod = $extensions[$selected_id];
299 $_POST['tab'] = $mod['tab'];
300 $_POST['name'] = $mod['name'];
301 $_POST['title'] = $mod['title'];
302 $_POST['path'] = $mod['path'];
303 $_POST['filename'] = $mod['filename'];
304 $_POST['acc_file'] = @$mod['acc_file'];
305 hidden('filename', $_POST['filename']);
306 hidden('acc_file', $_POST['acc_file']);
308 hidden('selected_id', $selected_id);
310 text_row_ex(_("Name"), 'name', 30);
311 text_row_ex(_("Folder"), 'path', 20);
313 tab_list_row(_("Menu Tab"), 'tab', null);
314 text_row_ex(_("Menu Link Text"), 'title', 30);
316 record_status_list_row(_("Default status"), 'active');
318 label_row(_("Module File"), "<input name='uploadfile' type='file'>");
319 label_row(_("Access Levels Extensions"), "<input name='uploadfile3' type='file'>");
320 label_row(_("SQL File"), "<input name='uploadfile2' type='file'>");
323 display_note(_("Select your module PHP file from your local harddisk."), 0, 1);
324 submit_add_or_update_center($selected_id == -1, '', 'both');
327 //---------------------------------------------------------------------------------------------
328 if ($Mode=='ADD_ITEM' || $Mode == 'UPDATE_ITEM') {
329 if(handle_submit()) {
330 if ($selected_id != -1)
331 display_notification(_("Extension data has been updated."));
333 display_notification(_("Extension has been installed."));
337 if ($Mode == 'Delete')
342 if (get_post('Update')) {
343 $exts = get_company_extensions();
344 foreach($exts as $i => $ext) {
345 $exts[$i]['active'] = check_value('Active'.$i);
347 write_extensions($exts, get_post('extset'));
348 if (get_post('extset') == user_company())
349 $installed_extensions = $exts;
350 display_notification(_('Current active extensions set has been saved.'));
353 if ($Mode == 'RESET')
359 //---------------------------------------------------------------------------------------------
361 if (list_updated('extset'))
362 $Ajax->activate('_page_body');
364 echo "<center>" . _('Extensions:') . " ";
365 extset_list('extset', null, true);
366 echo "</center><br>";
368 $set = get_post('extset', -1);
370 display_extensions();
372 display_ext_edit($selected_id);
374 company_extensions($set);
376 //---------------------------------------------------------------------------------------------