00001 <?php
00002
00008 class Tools_List extends oxAdminList
00009 {
00014 protected $_sThisTemplate = 'tools_list.tpl';
00015
00021 public function performsql()
00022 {
00023 $oAuthUser = oxNew( 'oxuser' );
00024 $oAuthUser->loadAdminUser();
00025 if ( $oAuthUser->oxuser__oxrights->value != "malladmin" ) {
00026 return;
00027 }
00028
00029 $sUpdateSQL = oxConfig::getParameter("updatesql");
00030 $sUpdateSQLFile = $this->_processFiles();
00031
00032 if ( $sUpdateSQLFile && strlen( $sUpdateSQLFile)>0) {
00033 if ( isset( $sUpdateSQL) && strlen( $sUpdateSQL))
00034 $sUpdateSQL .= ";\r\n".$sUpdateSQLFile;
00035 else
00036 $sUpdateSQL = $sUpdateSQLFile;
00037 }
00038
00039 $sUpdateSQL = trim(stripslashes($sUpdateSQL));
00040 $oStr = getStr();
00041 $iLen = $oStr->strlen($sUpdateSQL);
00042 if ( $this->_prepareSQL(trim(stripslashes($sUpdateSQL)), $iLen)) {
00043 $aQueries = $this->aSQLs;
00044 $this->_aViewData["aQueries"] = array();
00045 $aPassedQueries = array();
00046 $aQAffectedRows = array();
00047 $aQErrorMessages = array();
00048 $aQErrorNumbers = array();
00049
00050 if ( count( $aQueries) > 0) {
00051 $oDB = oxDb::getDb();
00052 $iQueriesCounter = 0;
00053 for ($i=0;$i<count( $aQueries);$i++) {
00054 $sUpdateSQL = $aQueries[$i];
00055 $sUpdateSQL = trim( $sUpdateSQL);
00056
00057 if ( strlen( $sUpdateSQL)>0) {
00058 $aPassedQueries[$iQueriesCounter] = nl2br( htmlentities($sUpdateSQL));
00059 if ( getStr()->strlen( $aPassedQueries[$iQueriesCounter]) > 200)
00060 $aPassedQueries[$iQueriesCounter] = $oStr->substr( $aPassedQueries[$iQueriesCounter], 0, 200)."...";
00061
00062 while ( $sUpdateSQL[ $oStr->strlen( $sUpdateSQL)-1] == ";") {
00063 $sUpdateSQL = $oStr->substr( $sUpdateSQL, 0, ( $oStr->strlen( $sUpdateSQL)-1));
00064 }
00065
00066 $oDB->execute( $sUpdateSQL);
00067
00068 $aQAffectedRows [$iQueriesCounter] = null;
00069 $aQErrorMessages[$iQueriesCounter] = null;
00070 $aQErrorNumbers [$iQueriesCounter] = null;
00071 if ( $iAffectedRows = $oDB->affected_Rows() !== false) {
00072 $aQAffectedRows[$iQueriesCounter] = $iAffectedRows;
00073 } else {
00074 $aQErrorMessages[$iQueriesCounter] = htmlentities($oDB->errorMsg());
00075 $aQErrorNumbers[$iQueriesCounter] = htmlentities($oDB->errorNo());
00076 }
00077 $iQueriesCounter++;
00078 }
00079 }
00080 }
00081 $this->_aViewData["aQueries"] = $aPassedQueries;
00082 $this->_aViewData["aAffectedRows"] = $aQAffectedRows;
00083 $this->_aViewData["aErrorMessages"] = $aQErrorMessages;
00084 $this->_aViewData["aErrorNumbers"] = $aQErrorNumbers;
00085 }
00086 $this->_iDefEdit = 1;
00087 }
00088
00093 protected function _processFiles()
00094 {
00095 if ( isset( $_FILES['myfile']['name'])) {
00096
00097 while (list($key, $value) = each($_FILES['myfile']['name'])) {
00098 $aSource = $_FILES['myfile']['tmp_name'];
00099 $sSource = $aSource[$key];
00100 $aFiletype = explode( "@", $key);
00101 $key = $aFiletype[1];
00102 $sType = $aFiletype[0];
00103 $value = strtolower( $value);
00104
00105 $aFilename = explode( ".", $value);
00106
00107
00108
00109 $aBadFiles = array("php", "jsp", "cgi", "cmf", "exe");
00110
00111 if (in_array($aFilename[1], $aBadFiles))
00112 die("We don't play this game, go away");
00113
00114
00115 if ( $sSource) {
00116 $rHandle = fopen( $sSource, "r");
00117 $sContents = fread( $rHandle, filesize ( $sSource));
00118 fclose( $rHandle);
00119
00120 return $sContents;
00121 }
00122 return;
00123 }
00124 }
00125 return;
00126 }
00127
00136 protected function _prepareSQL($sSQL, $iSQLlen)
00137 {
00138 $sChar = "";
00139 $sStrStart = "";
00140 $blString = false;
00141 $oStr = getStr();
00142
00143
00144 while ( preg_match("/^\-\-.*\n/", $sSQL))
00145 $sSQL = trim(preg_replace("/^\-\-.*\n/", "", $sSQL));
00146 while ( preg_match("/\n\-\-.*\n/", $sSQL))
00147 $sSQL = trim(preg_replace("/\n\-\-.*\n/", "\n", $sSQL));
00148
00149 for ( $iPos = 0; $iPos < $iSQLlen; ++$iPos) {
00150 $sChar = $sSQL[$iPos];
00151 if ( $blString) {
00152 while ( true) {
00153 $iPos = $oStr->strpos( $sSQL, $sStrStart, $iPos);
00154
00155 if (!$iPos) {
00156 $this->aSQLs[] = $sSQL;
00157 return true;
00158 } elseif ( $sStrStart == '`' || $sSQL[$iPos-1] != '\\') {
00159 $blString = false;
00160 $sStrStart = "";
00161 break;
00162 } else {
00163 $iNext = 2;
00164 $blBackslash = false;
00165 while ( $iPos-$iNext > 0 && $sSQL[$iPos-$iNext] == '\\') {
00166 $blBackslash = !$blBackslash;
00167 $iNext++;
00168 }
00169 if ( $blBackslash) {
00170 $blString = false;
00171 $sStrStart = "";
00172 break;
00173 } else
00174 $iPos++;
00175 }
00176 }
00177 } elseif ( $sChar == ";") {
00178 $this->aSQLs[] = $oStr->substr( $sSQL, 0, $iPos);
00179 $sSQL = ltrim( $oStr->substr( $sSQL, min( $iPos + 1, $iSQLlen)));
00180 $iSQLlen = $oStr->strlen( $sSQL);
00181 if ( $iSQLlen)
00182 $iPos = -1;
00183 else
00184 return true;
00185 } elseif ( ( $sChar == '"') || ( $sChar == '\'') || ( $sChar == '`')) {
00186 $blString = true;
00187 $sStrStart = $sChar;
00188 } elseif ( $sChar == "#" || ( $sChar == ' ' && $iPos > 1 && $sSQL[$iPos-2] . $sSQL[$iPos-1] == '--')) {
00189 $iCommStart = (( $sSQL[$iPos] == "#") ? $iPos : $iPos-2);
00190 $iCommEnd = ($oStr->strpos(' ' . $sSQL, "\012", $iPos+2))
00191 ? $oStr->strpos(' ' . $sSQL, "\012", $iPos+2)
00192 : $oStr->strpos(' ' . $sSQL, "\015", $iPos+2);
00193 if ( !$iCommEnd) {
00194 if ( $iCommStart > 0)
00195 $this->aSQLs[] = trim($oStr->substr($sSQL, 0, $iCommStart));
00196 return true;
00197 } else {
00198 $sSQL = $oStr->substr($sSQL, 0, $iCommStart).ltrim($oStr->substr($sSQL, $iCommEnd));
00199 $iSQLlen = $oStr->strlen($sSQL);
00200 $iPos--;
00201 }
00202 } elseif ( 32358 < 32270 && ($sChar == '!' && $iPos > 1 && $sSQL[$iPos-2] . $sSQL[$iPos-1] == '/*'))
00203 $sSQL[$iPos] = ' ';
00204 }
00205
00206 if (!empty($sSQL) && ereg("[^[:space:]]+", $sSQL)) {
00207 $this->aSQLs[] = $sSQL;
00208 }
00209 return true;
00210 }
00211 }