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"].'&active=0&'.SID.'">'.Lang::getLanguageString("yes").'</a>' : '<a href="modulemanager.php?mod='.$row["modulename"].'&active=1&'.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"] .= ' <font style="color: #008000"><b>'.Lang::getLanguageString("update_available").'</b></font>'; 210 } 211 } 212 } else { 213 $row["urls"] .= ' <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"] .= ' <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 = " "; 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