1<?php
2/* $Id: modulemanager.php,v 1.61 2003/12/03 17:39:50 k-fish Exp $ */
3$myEnv["module"] = "admin";
4$myEnv['stdsmenu'] = false;
5$myEnv["output"] = "html";
6
7include("../../config.inc.php");
8include(INCLUDEPATH . "container.inc.php");
9
10// adding file revision into global array
11revisionInit("\$Revision: 1.61 $", __FILE__);
12
13// =================================================
14//	              (de)activate entry
15// =================================================
16
17if (isset($_GET["active"])) {
18    queryRights2("root_modules_admin_modulemanager_modifygroups");
19
20	$active = (int) $_GET["active"];
21	$mod = $conn->QMagic($_GET["mod"]);
22	$sql="UPDATE mgw_modules SET active = $active, lu_user=".$_SESSION["MGW"]->userid.", lu_date=". $conn->DBTimeStamp(time()). " WHERE modulename=$mod AND module_type=3";
23	if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
24
25	// remove as def_module (use overview instead)
26	$sql="UPDATE mgw_config SET value_str='overview', lu_user=".$_SESSION["MGW"]->userid.", lu_date=". $conn->DBTimeStamp(time()). " WHERE configtagname='def_module' AND value_str=".$mod;
27	if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
28
29	// rebuild modules array
30	$_SESSION['MGW']->modules = getInstalledModules();
31}
32
33// create CSV backup of all tables the module uses
34if (isset($_GET["action"]) && $_GET["action"] == "getcsvtar"){
35    queryRights2("root_modules_admin_modulemanager_deletemodules");
36    $_GET['mod'] = str_replace(array(".","'","\"","\\","/"),"",$_GET['mod']);
37
38    $data = implode("",file(ROOTPATH."/modules/".$_GET['mod']."/definition2.xml"));
39    $parser = xml_parser_create();
40    xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
41    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
42    xml_parse_into_struct($parser,$data,$values,$tags);
43    xml_parser_free($parser);
44
45    include(INCLUDEPATH . "adodb/toexport.inc.php");
46    $tar = new tar();
47    foreach ($values as $value) {
48	if (isset($value["tag"]) && $value["tag"]=='table' && isset($value["attributes"])){
49	    $res = $conn->Execute('SELECT * FROM mgw_'.$value["attributes"]['name']);
50	    $tar->addData('mgw_'.$value["attributes"]['name'].'.csv',rs2csv($res));
51	}
52    }
53    $tar->__generateTar();
54
55    header('Content-Type: application/x-tar');
56    header('Content-Disposition: attachment; filename='.$_GET['mod'].'-csv-'.date('Y-m-d').'.tar');
57    header('Content-Length: '.strlen($tar->tar_file));
58    echo $tar->tar_file;
59    exit();
60}
61
62// create backup of all files in data_store
63if (isset($_GET["action"]) && $_GET["action"] == "getfiletar"){
64    queryRights2("root_modules_admin_modulemanager_deletemodules");
65    $_GET['mod'] = str_replace(array(".","'","\"","\\","/"),"",$_GET['mod']);
66
67    $tar = new tar();
68    chdir(ROOTPATH.'/data_cache');
69    $mdir = opendir(ROOTPATH.'/data_cache/'.$_GET['mod']);
70    while(($file = readdir($mdir)) !== false){
71	if($file != '.' && $file != '..' && $file != 'index.htm' && $file != 'index.html')
72	    $tar->addFile($_GET['mod'].'/'.$file);
73    }
74    $tar->__generateTar();
75
76    header('Content-Type: application/x-tar');
77    header('Content-Disposition: attachment; filename='.$_GET['mod'].'-files-'.date('Y-m-d').'.tar');
78    header('Content-Length: '.strlen($tar->tar_file));
79    echo $tar->tar_file;
80    exit();
81}
82
83// =================================================
84//	              delete module
85// =================================================
86if (isset($_GET["action"]) && $_GET["action"] == "delete"){
87    queryRights2("root_modules_admin_modulemanager_deletemodules");
88
89    $sql = "SELECT modulename, description, version, author, email FROM mgw_modules WHERE modulename=".$conn->QMagic($_GET["mod"]);
90    if(!$res = $conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
91    $row = $res->FetchRow();
92    $row['modname'] = Lang::getLanguageString($row['modulename']);
93
94    $smarty->assign('row', $row);
95    $smarty->display("modulemanager_delete.tpl");
96    exit();
97}
98
99if (isset($_POST["action"]) && $_POST["action"] == "delete" && isset($_POST['confirmation_yes'])){
100    queryRights2("root_modules_admin_modulemanager_deletemodules");
101    $_POST['mod'] = str_replace(array(".","'","\"","\\","/"),"",$_POST['mod']);
102
103    // remove data_cache and data_store
104    recDel(ROOTPATH.'/data_cache/'.$_POST['mod']);
105    @rmdir(ROOTPATH.'/data_cache/'.$_POST['mod']);
106    recDel(ROOTPATH.'/data_store/'.$_POST['mod']);
107    @rmdir(ROOTPATH.'/data_store/'.$_POST['mod']);
108
109    // delete rights entries
110    $sql = "DELETE FROM mgw_rights WHERE modulename=".$conn->QMagic($_POST["mod"]);
111    if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
112    $sql = "DELETE FROM mgw_rights2 WHERE id_string LIKE ".$conn->QMagic('root_modules_'.$_POST["mod"].'%');
113    if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
114
115    // delete config entries
116    $sql = "SELECT configtagname FROM mgw_configtags WHERE modulename=".$conn->QMagic($_POST["mod"]);
117    if(!$res = $conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
118    while ($row = $res->FetchRow()) {
119	  if (isset($row["configtagname"]) and $row["configtagname"]!="") {
120        $sql = "DELETE FROM mgw_config WHERE mgw_config.configtagname=".$conn->QMagic($row["configtagname"]);
121    if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
122	  }
123    }
124
125    $sql = "DELETE FROM mgw_configtags WHERE modulename=".$conn->QMagic($_POST["mod"]);
126    if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
127
128    // delete all tables
129    $data = implode("",file(ROOTPATH."/modules/".$_POST['mod']."/definition2.xml"));
130    $parser = xml_parser_create();
131    xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
132    xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
133    xml_parse_into_struct($parser,$data,$values,$tags);
134    xml_parser_free($parser);
135
136    $dict = NewDataDictionary($conn);
137    foreach ($values as $value) {
138	if (isset($value["tag"]) && $value["tag"]=='table' && isset($value["attributes"])){
139	    $sql = $dict->DropTableSQL('mgw_'.$value["attributes"]['name']);
140	    $conn->Execute($sql[0]);
141	}
142    }
143
144    // delete entry from mgw_modules
145    $sql = "DELETE FROM mgw_modules WHERE modulename=".$conn->QMagic($_POST["mod"])." AND module_type=3";
146    if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
147
148    // remove as def_module (use overview instead)
149    $sql="UPDATE mgw_config SET value_str='overview', lu_user=".$_SESSION["MGW"]->userid.", lu_date=". $conn->DBTimeStamp(time()). " WHERE configtagname='def_module' AND value_str=".$conn->QMagic($_POST["mod"]);
150    if(!$conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
151
152    // rebuild modules array
153    $_SESSION['MGW']->modules = getInstalledModules();
154
155	// redirect to module manager (for menu refresh)
156	redirect(ROOTURL."modules/admin/modulemanager.php?".SID);
157}
158
159// =================================================
160//	              List View
161// =================================================
162queryRights2("root_modules_admin_modulemanager_listmodules");
163
164$icons = getIconStrings();
165
166$sql = "SELECT module_type,modulename,version,author,email,description,active,secure FROM mgw_modules ORDER BY modulename";
167if(!$res = $conn->Execute($sql)) exit(showSQLerror($sql, $conn->ErrorMsg(), __LINE__, __FILE__));
168
169$modules = array();
170while($row = $res->FetchRow()){
171	$modules[$row["modulename"]] = "";
172
173	// create Action URLs
174	if($row['module_type']>2){
175	    $row["urls"] = "<a href=\"modulemanager.php?action=delete&mod=". $row["modulename"] ."&".SID."\" onclick=\"return check_delete()\" class=\"delete\">". $icons["delete"] . "</a>";
176	    $row["active"] = ($row["active"] == 1 ? '<a href="modulemanager.php?mod='.$row["modulename"].'&amp;active=0&amp;'.SID.'">'.Lang::getLanguageString("yes").'</a>' : '<a href="modulemanager.php?mod='.$row["modulename"].'&amp;active=1&amp;'.SID.'">'.Lang::getLanguageString("no").'</a>');
177	}
178	else{
179	    $row["urls"] = '';
180	    $row["active"] = ($row["active"] == 1 ? Lang::getLanguageString("yes") : Lang::getLanguageString("no"));
181	}
182
183	if (isset($_GET["upgrade"])) {
184	  @set_time_limit(0);
185
186	  $return = "";
187	  $server = "http://www.moregroupware.org/packages/";
188      if ($fp = @fopen($server.$row["modulename"]."/definition2.xml", 'rb')) {
189		while (!feof($fp)) {
190    	  $return .= fread($fp, 1024);
191    	}
192    	fclose($fp);
193
194		if ($return!="") {
195		  $data = $return;
196		  $data = substr($data,strpos($data,"<mgw>"));
197		  $parser = xml_parser_create();
198		  xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
199		  xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
200		  xml_parse_into_struct($parser,$data,$values,$tags);
201		  xml_parser_free($parser);
202
203		  $data = array();
204		  foreach ($values as $value) {
205		    if (isset($value["tag"]) and isset($value["value"])) $data[$value["tag"]] = $value["value"];
206		  }
207
208		  if (is_array($data) and isset($data["name"]) and isset($data["version"]) and $data["name"]==$row["modulename"] and (int)str_replace(".","",$row["version"])<(int)str_replace(".","",$data["version"])) {
209	    	$row["urls"] .= '&nbsp;<font style="color: #008000"><b>'.Lang::getLanguageString("update_available").'</b></font>';
210		  }
211		}
212      } else {
213	    $row["urls"] .= '&nbsp;<font class="delete">'.Lang::getLanguageString("error").'</font>';
214	  }
215	}
216
217    if ($_SESSION["MGW"]->modules[$row["modulename"]]["version_mtime"] != filemtime(ROOTPATH."/modules/".$row["modulename"]."/definition2.xml")) {
218	  $row["urls"] .= '&nbsp;<a class="delete" href="'.ROOTURL.'/modules/'.$row["modulename"].'/'.($row["base"]!=""?$row["base"]:"index.php").'?'.SID.'">'.Lang::getLanguageString("update").'</a>';
219	}
220
221	$row["modulename"] = Lang::getLanguageString($row["modulename"]);
222
223	if ($row["secure"]) $smarty->append("td",$row);
224	  else $smarty->append("td4",$row);
225}
226
227
228$attaches = array();
229$handle=opendir(ROOTPATH."/modules/");
230while ($file = readdir($handle)) {
231  $xml_def = ROOTPATH."/modules/".$file."/definition2.xml";
232  if ($file!="." and $file!=".." and $file!="CVS" and is_dir(ROOTPATH."/modules/".$file) and file_exists($xml_def)) {
233
234    if (!isset($modules[$file])) {
235		$data = get_definition_data_from_xml(ROOTPATH."/modules/".$file."/definition2.xml");
236
237		$row = array();
238		$space = "&nbsp;&nbsp;";
239		$row["modulename"] = Lang::getLanguageString($file);
240		$row["version"] = $data["version"][0];
241		$row["version_mtime"] = filemtime($xml_def);
242		$row["date"] = $data["date"][0];
243		$row["author"] = isset($data["author"])?$data["author"][0]:"";
244		$row["email"] = isset($data["email"])?$data["email"][0]:"";
245		$row["description"] = $data["description"][0];
246		$row["compatibility"] = $data["compatibility"][0];
247		$row["dependencies"] = "";
248		$row["module_type"] = $data["module_type"][0];
249		$row["active"] = Lang::getLanguageString("no");
250		$row["base"] = isset($data["base"][0])?$data["base"][0]:"";
251		$row["noicon"] = isset($data["noicon"][0])?$data["noicon"][0]:"";
252		$installlink = "<a href=\"".ROOTURL."modules/". $file ."/".($row["base"]!=""?$row["base"]:"index.php")."?&".SID."\" class=\"delete\">". Lang::getLanguageString("install") . "</a>";
253		$row["urls"] = $installlink;
254		if (isset($data["secure"][0]) and $data["secure"][0]=="true") $smarty->append("td2",$row);
255		  else $smarty->append("td3",$row);
256	}
257  }
258}
259closedir($handle);
260
261
262$smarty->display("modulemanager_list.tpl");
263?>
264