From 2661e933da2bef66a7c4410862b4dcec5e226965 Mon Sep 17 00:00:00 2001 From: franzz Date: Sat, 19 Oct 2013 23:11:24 +0200 Subject: [PATCH] Converted to UTF-8 --- .htaccess | 1 + config.php | 245 ++++++++++++++++++++++++++--------------------- inc/rss.php | 2 +- index.php | 20 ++-- masks/index.html | 3 +- readme | 23 +++++ 6 files changed, 166 insertions(+), 128 deletions(-) create mode 100644 readme diff --git a/.htaccess b/.htaccess index 9114643..622a726 100644 --- a/.htaccess +++ b/.htaccess @@ -1,3 +1,4 @@ +AddDefaultCharset UTF-8 Options +FollowSymlinks RewriteEngine on diff --git a/config.php b/config.php index b843025..9cd7e55 100755 --- a/config.php +++ b/config.php @@ -331,18 +331,27 @@ class Databap extends PhpObject function __construct($oClassManagement) { parent::__construct(); + $this->oClassManagement = $oClassManagement; //Browser <> PHP <> MySql synchronization date_default_timezone_set(Settings::TIMEZONE); - //header('Content-Type: text/html; charset=utf-8'); + ini_set('default_charset', Settings::TEXT_ENC); + header('Content-Type: text/html; charset='.Settings::TEXT_ENC); + mb_internal_encoding(Settings::TEXT_ENC); + mb_http_output(Settings::TEXT_ENC); + mb_http_input(Settings::TEXT_ENC); + mb_language('uni'); + mb_regex_encoding(Settings::TEXT_ENC); - $this->oMySql = new MySqlManager(); + //Passing settings down to mySQL + $this->oMySql = new MySqlManager(Settings::DB_SERVER, Settings::DB_LOGIN, Settings::DB_PASS, Settings::DB_NAME, Settings::SQL_ENC); if($this->oMySql->sDbState == MySqlManager::DB_NO_DATA) $this->install(); + + //Init other variables $this->oProcedure = new Procedure($this->oMySql); $this->setUserId(0); $this->sLanguage = self::LANG_FR; $this->oSearchEngine = new SearchEngine($this->oMySql); - $this->oClassManagement = $oClassManagement; } private function install() @@ -387,6 +396,7 @@ class Databap extends PhpObject public function getPage($sPage, $asVars) { $oPage = new Mask('index'); + $oPage->setTag('text_enc', Settings::TEXT_ENC); $oPage->setTag('first_page', $sPage); $oPage->setTag('index_link', $asVars['serv_name']); $oPage->setTag('line_break', "Global databap constants\n"); @@ -453,7 +463,7 @@ class Databap extends PhpObject $oFeed = new Feed($asDesc); //Building items - switch(strtolower($sCat)) + switch(mb_strtolower($sCat)) { case '9gag': $sRegEx = '^(https?://|www\\.)(.*)9gag\\.com'; @@ -546,13 +556,13 @@ class Databap extends PhpObject //Title & link case 'font-color-normal': $asArticleInfo['title'] = ucfirst(trim($oLink->nodeValue)); - $asArticleInfo['title'] = substr($asArticleInfo['title'], -1)=='.'?substr($asArticleInfo['title'], 0, -1):$asArticleInfo['title']; + $asArticleInfo['title'] = mb_substr($asArticleInfo['title'], -1)=='.'?mb_substr($asArticleInfo['title'], 0, -1):$asArticleInfo['title']; $asArticleInfo['link'] = $oLink->getAttribute('href'); - $asArticleInfo['date'] = substr(str_replace(array($sSAPBlogUrl.'/', '/'), array('', '-'), $asArticleInfo['link']), 0, 10); + $asArticleInfo['date'] = mb_substr(str_replace(array($sSAPBlogUrl.'/', '/'), array('', '-'), $asArticleInfo['link']), 0, 10); break; //Author case 'jiveTT-hover-user jive-username-link': - $asNames = array_filter(explode(' ', ucwords(trim($oLink->nodeValue)))); + $asNames = array_filter(explode(' ', ToolBox::mb_ucwords(trim($oLink->nodeValue)))); $asArticleInfo['first_name'] = array_shift($asNames); $asArticleInfo['last_name'] = implode('-', $asNames); $asArticleInfo['email'] = $sSAPDomain.$oLink->getAttribute('href'); @@ -612,14 +622,14 @@ class Databap extends PhpObject public function addUser($sFirstName, $sLastName, $sCompany, $sEmail='', $iClearance=self::CLEARANCE_MEMBER) { - $sFirstName = strtolower($sFirstName); - $sLastName = strtolower($sLastName); - $sCompany = strtolower($sCompany); - $sEmail = strtolower($sEmail); + $sFirstName = mb_strtolower($sFirstName); + $sLastName = mb_strtolower($sLastName); + $sCompany = mb_strtolower($sCompany); + $sEmail = mb_strtolower($sEmail); //Checking company existency in company table $sCompanyTextCol = MySqlManager::getText(MySqlManager::COMP_TABLE); - $iCompanyId = $this->oMySql->selectInsert(MySqlManager::COMP_TABLE, array($sCompanyTextCol=>strtolower($sCompany), 'logo'=>self::DEFAULT_COMPANY_LOGO), array($sCompanyTextCol)); + $iCompanyId = $this->oMySql->selectInsert(MySqlManager::COMP_TABLE, array($sCompanyTextCol=>mb_strtolower($sCompany), 'logo'=>self::DEFAULT_COMPANY_LOGO), array($sCompanyTextCol)); $asInfo = array('first_name'=>$sFirstName, 'last_name'=>$sLastName, @@ -970,7 +980,7 @@ class Databap extends PhpObject $asSelect = "*"; } - $asCode = $this->oMySql->selectRow(MySqlManager::CODE_TABLE, $iCodeId, $asSelect); + $asCode = $this->oMySql->selectRow(MySqlManager::CODE_TABLE, $iCodeId, $asSelect);$this->addError($asCode); $asCode['description'] = self::getDescriptionFormat($asCode['description']); $asCode['timestamp'] = strtotime($asCode['led']); $asCode['led'] = self::getDateFormat($asCode['led']); @@ -1447,31 +1457,31 @@ class Databap extends PhpObject { $sMessage = htmlspecialchars($sMessage); $sType = self::MESSAGE_USER; - if(substr($sMessage, 0, 1) == '/') + if(mb_substr($sMessage, 0, 1) == '/') { - if(substr($sMessage, 0, 4) == '/me ') + if(mb_substr($sMessage, 0, 4) == '/me ') { $sType = self::MESSAGE_ACTION; - $sMessage = substr($sMessage, 3); + $sMessage = mb_substr($sMessage, 3); } - elseif(substr($sMessage, 0, 6) == '/slap ') + elseif(mb_substr($sMessage, 0, 6) == '/slap ') { $sType = self::MESSAGE_ACTION; - $sMessage = ' fout une grosse tarte à '.substr($sMessage, 5); + $sMessage = ' fout une grosse tarte à '.mb_substr($sMessage, 5); } - elseif(substr($sMessage, 0, 4) == '/bs ') + elseif(mb_substr($sMessage, 0, 4) == '/bs ') { $sType = self::MESSAGE_ACTION; - $sMessage = ' bitch-slaps '.substr($sMessage, 3); + $sMessage = ' bitch-slaps '.mb_substr($sMessage, 3); } - elseif(substr($sMessage, 0, 6) == '/kick ') + elseif(mb_substr($sMessage, 0, 6) == '/kick ') { $sType = self::MESSAGE_ACTION; - $sMessage = ' met un coup de pied au cul de '.substr($sMessage, 5); + $sMessage = ' met un coup de pied au cul de '.mb_substr($sMessage, 5); } - elseif(substr($sMessage, 0, 6) == '/nick ' && strlen($sMessage)>6) + elseif(mb_substr($sMessage, 0, 6) == '/nick ' && mb_strlen($sMessage)>6) { - $sNewNick = $this->getNickNameFormat(substr($sMessage, 5)); + $sNewNick = $this->getNickNameFormat(mb_substr($sMessage, 5)); $sOldNick = $this->getNickNameFormat($this->getChatNickNames($this->getUserId())); //changing Nickname @@ -1482,9 +1492,9 @@ class Databap extends PhpObject $sChanName = self::ALL_CHAN_TEXT; $sMessage = $sOldNick.' a changé son pseudo en '.$sNewNick; } - elseif(substr($sMessage, 0, 9) == '/mission ' && strlen($sMessage)>9) + elseif(mb_substr($sMessage, 0, 9) == '/mission ' && mb_strlen($sMessage)>9) { - $sNewStatus = substr($sMessage, 9); + $sNewStatus = mb_substr($sMessage, 9); $sNewFormatStatus = $this->getDescriptionFormat($sNewStatus); //changing Nickname @@ -1495,13 +1505,13 @@ class Databap extends PhpObject $sChanName = self::ALL_CHAN_TEXT; $sMessage = 'est sur une nouvelle mission : '.$sNewFormatStatus; } - elseif(substr($sMessage, 0, 6) == '/mail ' && strlen($sMessage)>6) + elseif(mb_substr($sMessage, 0, 6) == '/mail ' && mb_strlen($sMessage)>6) { $sImagePattern = '/\/mail (?P\w+) (?P.*)/'; preg_match($sImagePattern, $sMessage, $asMatches); //Looking for user Id - $asContraints = array( 'LOWER(`'.MySqlManager::getText(MySqlManager::OPT_TABLE).'`)'=>strtolower($asMatches['nickname']), + $asContraints = array( 'LOWER(`'.MySqlManager::getText(MySqlManager::OPT_TABLE).'`)'=>mb_strtolower($asMatches['nickname']), MySqlManager::getId(MySqlManager::OPTNAME_TABLE)=>self::OPT_NICKNAME); $iUserIdTo = $this->oMySql->selectValue(MySqlManager::OPT_TABLE, MySqlManager::getId(MySqlManager::USER_TABLE), $asContraints); @@ -1530,22 +1540,22 @@ class Databap extends PhpObject } $sType = self::MESSAGE_ACTION; } - elseif(substr($sMessage, 0, 5) == '/mean') + elseif(mb_substr($sMessage, 0, 5) == '/mean') { $sPageContent = file_get_contents('http://www.randominsults.net/'); $sStartText = ''; $sEndText = ''; - $iStartPos = strpos($sPageContent, $sStartText); - $iEndPos = strpos($sPageContent, $sEndText); + $iStartPos = mb_strpos($sPageContent, $sStartText); + $iEndPos = mb_strpos($sPageContent, $sEndText); - $sMessage = substr($sPageContent, $iStartPos + strlen($sStartText), $iEndPos - $iStartPos); + $sMessage = mb_substr($sPageContent, $iStartPos + mb_strlen($sStartText), $iEndPos - $iStartPos); } - elseif(substr($sMessage, 0, 5) == '/like') + elseif(mb_substr($sMessage, 0, 5) == '/like') { $sType = self::MESSAGE_ACTION; $sMessage = ' plussoie'; } - elseif(substr($sMessage, 0, 4) == '/now') + elseif(mb_substr($sMessage, 0, 4) == '/now') { $sType = self::MESSAGE_ACTION; $asWeekDays = array('lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'); @@ -1553,15 +1563,15 @@ class Databap extends PhpObject $sMessage = ' a demandé l\'heure. Pour sa gouverne, il est exactement '.date(self::TIME_FORMAT). ', le '.$asWeekDays[date('N')-1].' '.date('j').' '.$asMonths[date('n')-1].' '.date('Y').' (semaine '.date('W').')'; } - elseif($sMessage == '/channels' || substr($sMessage, 0, 5) == '/list' || $sMessage == '/chans') + elseif($sMessage == '/channels' || mb_substr($sMessage, 0, 5) == '/list' || $sMessage == '/chans') { //Always at least one channel open (the one the message is sent from) $sMessage = ' a demandé les chans disponibles. Pour sa gouverne, les chans ayant des membres connectés sont #'.MySqlManager::implodeAll($this->getActiveChannels(), ' (', ', #', '', ')'); $sType = self::MESSAGE_ACTION; } - elseif(substr($sMessage, 0, 5) == '/img ' && strlen($sMessage)>5) + elseif(mb_substr($sMessage, 0, 5) == '/img ' && mb_strlen($sMessage)>5) { - $sUrl = trim(substr($sMessage, 4)); + $sUrl = trim(mb_substr($sMessage, 4)); $asResult = $this->downloadToTmp($sUrl); if($asResult['error']=='') { @@ -1569,18 +1579,18 @@ class Databap extends PhpObject $sType = self::MESSAGE_IMG; } } - elseif(substr($sMessage, 0, 6) == '/9gag ' && strlen($sMessage)>6) + elseif(mb_substr($sMessage, 0, 6) == '/9gag ' && mb_strlen($sMessage)>6) { - $sMessage = $this->getJsonMessage($this->get9gagPost(trim(substr($sMessage, 6)))); + $sMessage = $this->getJsonMessage($this->get9gagPost(trim(mb_substr($sMessage, 6)))); $sType = self::MESSAGE_9GAG; } - elseif(substr($sMessage, 0, 7) == '/reboot' && $this->getUserClearance()==self::CLEARANCE_ADMIN) + elseif(mb_substr($sMessage, 0, 7) == '/reboot' && $this->getUserClearance()==self::CLEARANCE_ADMIN) { $sMessage = 'L\'administrateur a demandé un reboot. Votre page va se rafraichir automatiquement dans '.self::REBOOT_DELAY.' secondes.'; $sType = self::MESSAGE_REBOOT; } } - elseif(substr($sMessage, 0, 1) == '@' && strpos($sMessage, ' ')>1) + elseif(mb_substr($sMessage, 0, 1) == '@' && mb_strpos($sMessage, ' ')>1) { $sType = self::MESSAGE_PRIVATE; } @@ -1596,7 +1606,7 @@ class Databap extends PhpObject private function downloadToTmp($sUrl) { $sFileInfo = pathinfo($sUrl); - $sImageExt = strtolower($sFileInfo['extension']); + $sImageExt = mb_strtolower($sFileInfo['extension']); $sFilePath = self::DOC_TMP_FOLDER.uniqid().'.'.$sImageExt; return ToolBox::createThumbnail($sUrl, self::CHAT_IMG_MAX_WIDTH, self::CHAT_IMG_MAX_HEIGHT, $sFilePath); } @@ -1685,7 +1695,7 @@ class Databap extends PhpObject ksort($asSqlMessages); //Sort out messages for Json Export - $iPrefixLen = strlen(self::JSON_PREFIX); + $iPrefixLen = mb_strlen(self::JSON_PREFIX); $asMessages = array('messages'=>array(), 'last_message_id'=>0); foreach($asSqlMessages as $iMessageId=>$asMessageInfo) { @@ -1728,9 +1738,9 @@ class Databap extends PhpObject } //Json message - if(substr($asMessages['messages'][$iMessageId]['message'], 0, $iPrefixLen) == self::JSON_PREFIX) + if(mb_substr($asMessages['messages'][$iMessageId]['message'], 0, $iPrefixLen) == self::JSON_PREFIX) { - $asMessages['messages'][$iMessageId]['message'] = json_decode(substr($asMessages['messages'][$iMessageId]['message'], $iPrefixLen)); + $asMessages['messages'][$iMessageId]['message'] = json_decode(mb_substr($asMessages['messages'][$iMessageId]['message'], $iPrefixLen)); } else //Normal message { @@ -1743,7 +1753,7 @@ class Databap extends PhpObject $asPatterns = '/(^|\s)#(\w*[^\s]+\w*)/'; $asLinks = '\1#\2'; $asMessages['messages'][$iMessageId]['message'] = preg_replace($asPatterns, $asLinks, $asMessages['messages'][$iMessageId]['message']); - } + } } //Set last message Id (if new messages since $iFirstMsgId) @@ -1936,7 +1946,7 @@ class Databap extends PhpObject return ' - + Databap • @@ -2067,8 +2077,8 @@ class Databap extends PhpObject //login using form if($sName!='' && $sCompany!='') { - $asNames = explode(' ', strtolower($sName)); - $sCompany = strtolower($sCompany); + $asNames = explode(' ', mb_strtolower($sName)); + $sCompany = mb_strtolower($sCompany); //Get Company's Id $iCompanyId = $this->oMySql->selectValue(MySqlManager::COMP_TABLE, $sCompanyTableId, array($sCompanyTableText=>$sCompany)); @@ -2091,7 +2101,7 @@ class Databap extends PhpObject $iUserId = $asUserInfo[$sUserTableId]; //Check pass reset necessity - $bResetPass = (substr($asUserInfo['led'], 0, 10) != date(Databap::DATE_SQL_FORMAT)); + $bResetPass = (mb_substr($asUserInfo['led'], 0, 10) != date(Databap::DATE_SQL_FORMAT)); } //Login using Token (limited access) elseif($sAction==self::EXT_ACCESS && $sToken!='') @@ -2114,14 +2124,14 @@ class Databap extends PhpObject public function checkToken($sKey) { - $iUserId = strstr($sKey, '_', true); - $sToken = substr($sKey, strlen($iUserId)+1); - return (strlen($sToken)==self::TOKEN_LENGTH && $this->generateToken($iUserId)==$sToken && $this->checkValue(MySqlManager::USER_TABLE, $iUserId))?$iUserId:0; + $iUserId = mb_strstr($sKey, '_', true); + $sToken = mb_substr($sKey, mb_strlen($iUserId)+1); + return (mb_strlen($sToken)==self::TOKEN_LENGTH && $this->generateToken($iUserId)==$sToken && $this->checkValue(MySqlManager::USER_TABLE, $iUserId))?$iUserId:0; } public function resetNecessary($iUserId) { - $sLed = substr($this->oMySql->selectValue(MySqlManager::USER_TABLE, 'led', $iUserId), 0, 10); + $sLed = mb_substr($this->oMySql->selectValue(MySqlManager::USER_TABLE, 'led', $iUserId), 0, 10); return $sLed != date(Databap::DATE_SQL_FORMAT); } @@ -2190,7 +2200,7 @@ class Databap extends PhpObject return self::encryptPassword( $_SERVER['HTTP_USER_AGENT']. $_SERVER['REMOTE_ADDR']. $_SERVER['REQUEST_TIME']. - strstr(microtime(), ' ', true). + mb_strstr(microtime(), ' ', true). $_SERVER['SERVER_SIGNATURE']. $_SERVER['SERVER_ADMIN']); } @@ -2198,16 +2208,16 @@ class Databap extends PhpObject private static function encryptPassword($sPass) { $sRandomText = 'F_RA-1H"2{bvj)5f?0sd3r#fP,K]U|w}hGiN@(sZ.sDe!7*x/:Mq+&'; - for($iIndex=0; $iIndex < strlen($sPass); $iIndex++) + for($iIndex=0; $iIndex < mb_strlen($sPass); $iIndex++) { - $sPass[$iIndex] = $sRandomText[$iIndex%strlen($sRandomText)] ^ $sPass[$iIndex]; + $sPass[$iIndex] = $sRandomText[$iIndex%mb_strlen($sRandomText)] ^ $sPass[$iIndex]; } return md5($sPass); } public static function getChanSafeName($sChanName) { - $sChanSafeName = preg_replace('/[^a-z0-9]/', '_', strtolower($sChanName)); + $sChanSafeName = preg_replace('/[^a-z0-9]/', '_', mb_strtolower($sChanName)); //Sort PM chans $asPm = self::isPmChan($sChanSafeName); @@ -2284,7 +2294,7 @@ class Databap extends PhpObject public static function getCompanyFormat($sCompany) { - return ucwords($sCompany); + return ToolBox::mb_ucwords($sCompany); } public static function getDescriptionFormat($sDescription) @@ -2292,13 +2302,9 @@ class Databap extends PhpObject return ucfirst($sDescription); } - public static function jsonExport($asData, $bConvert=false) + public static function jsonExport($asData) { header('Content-type: application/json'); - if($bConvert) - { - $asData = ToolBox::cleanData($asData, 'utf8_encode'); - } return self::jsonConvert($asData); } @@ -2319,7 +2325,7 @@ class Databap extends PhpObject public static function toBytes($str) { $val = trim($str); - $last = strtolower($str[strlen($str)-1]); + $last = mb_strtolower($str[mb_strlen($str)-1]); switch($last) { case 'g': $val *= 1024; case 'm': $val *= 1024; @@ -2699,7 +2705,7 @@ class SearchEngine extends PhpObject break; } $sWords = implode(self::KEYWORDS_SEPARATOR, $asWords); - $sWords = strtolower(str_replace("\n", self::KEYWORDS_SEPARATOR, $sWords)); + $sWords = mb_strtolower(str_replace("\n", self::KEYWORDS_SEPARATOR, $sWords)); //TODO Fix char encoding $sWords = preg_replace('/(\W+)/', self::KEYWORDS_SEPARATOR, $sWords); //remove all non-word characters @@ -2884,7 +2890,7 @@ class SearchEngine extends PhpObject private function checkSearchedWords($sWord) { - return (strlen($sWord) >= 2); + return (mb_strlen($sWord) >= 2); } } @@ -3063,7 +3069,7 @@ class Reader } //Enlarge line - if(strpos($sLine, $sServName) !== false) + if(mb_strpos($sLine, $sServName) !== false) { $sLiClass .= ' bigline'; } @@ -3098,11 +3104,11 @@ class Reader //Core Words foreach($this->getWords('wCore') as $sCoreWord) { - $sCoreWord = strtolower($sCoreWord); + $sCoreWord = mb_strtolower($sCoreWord); $sPattern = '/>(([^<]*)([^\w&<]{1})|.{0})('.$sCoreWord.')([\W])/'; $sCode = preg_replace($sPattern, '>$1$4$5', $sCode); } - //$sCoreWords = str_replace(' ', '\ ', implode('|', array_map('strtolower', $this->getWords('wCore')))); + //$sCoreWords = str_replace(' ', '\ ', implode('|', array_map('mb_strtolower', $this->getWords('wCore')))); //$sPattern = '/>(([^<]*)([^\w<]{1})|.{0})('.$sCoreWords.')(?=[\W])/U'; //$sCode = preg_replace($sPattern, '>$1$4', $sCode); @@ -3114,7 +3120,7 @@ class Reader $sPattern = '/>([^<]*)\\'.$sOpWord.'/'; $sCode = preg_replace($sPattern, '>$1'.$sOpWord.'', $sCode); } - //$sPattern = '/>([^<]*)['.implode(array_map('strtolower', ($this->getWords('cOperator')))).']/'; + //$sPattern = '/>([^<]*)['.implode(array_map('mb_strtolower', ($this->getWords('cOperator')))).']/'; //echo $sPattern; //$sCode = preg_replace($sPattern, '>$1$2$3', $sCode); @@ -3128,12 +3134,12 @@ class Reader private static function getFirstWord($sText) { - return strstr(str_replace('.', ' ', trim($sText)), ' ', true); + return mb_strstr(str_replace('.', ' ', trim($sText)), ' ', true); } private static function getFirstChar($sText) { - return substr(str_replace('.', ' ', trim($sText)), 0, 1); + return mb_substr(str_replace('.', ' ', trim($sText)), 0, 1); } private function addColor(&$sText, $sWord, $sClassColor) @@ -3148,7 +3154,7 @@ class Reader public static function convText2Html($sCode) { - return htmlspecialchars(strtolower($sCode), ENT_QUOTES); + return htmlspecialchars(mb_strtolower($sCode), ENT_QUOTES); } public function getColoredCode() @@ -3237,7 +3243,7 @@ class Mask extends PhpObject { $iStartPos = $this->getPartStartPos($sPartName); $iEndPos = $this->getPartEndPos($sPartName); - $sPart = substr($this->sMask, $iStartPos, $iEndPos-$iStartPos); + $sPart = mb_substr($this->sMask, $iStartPos, $iEndPos-$iStartPos); $sExtendedPart = $this->getPartPattern($sPartName, self::START_TAG).$sPart. $this->getPartPattern($sPartName, self::END_TAG); $this->sMask = str_replace($sExtendedPart, $this->getPartTagPattern($sPartName), $this->sMask); return $sPart; @@ -3246,13 +3252,13 @@ class Mask extends PhpObject private function getPartStartPos($sPartName) { $sPartStartPattern = $this->getPartPattern($sPartName, self::START_TAG); - return strpos($this->sMask, $sPartStartPattern) + strlen($sPartStartPattern); + return mb_strpos($this->sMask, $sPartStartPattern) + mb_strlen($sPartStartPattern); } private function getPartEndPos($sPartName) { $sPartEndPattern = $this->getPartPattern($sPartName, self::END_TAG); - return strpos($this->sMask, $sPartEndPattern); + return mb_strpos($this->sMask, $sPartEndPattern); } private function getPartPattern($sPartName, $sAction) @@ -3373,7 +3379,7 @@ class fileUploader function __construct($sFolderPath, $asAllowedExtensions = array()/*, $sizeLimit = 10485760*/) { $this->sFolderPath = $sFolderPath; - $this->asAllowedExtensions = array_map("strtolower", $asAllowedExtensions); + $this->asAllowedExtensions = array_map("mb_strtolower", $asAllowedExtensions); //$this->iSizeLimit = $sizeLimit; //$this->checkServerSettings(); $this->iSizeLimit = Databap::getMaxSize(); @@ -3409,7 +3415,7 @@ class fileUploader private function toBytes($str) { $val = trim($str); - $last = strtolower($str[strlen($str)-1]); + $last = mb_strtolower($str[mb_strlen($str)-1]); switch($last) { case 'g': $val *= 1024; case 'm': $val *= 1024; @@ -3480,7 +3486,7 @@ class fileUploader } $asPathInfo = pathinfo($this->getName()); - $sExt = strtolower($asPathInfo['extension']); + $sExt = mb_strtolower($asPathInfo['extension']); $sExt = ($sExt=='jpg')?'jpeg':$sExt; if($this->asAllowedExtensions && !in_array($sExt, $this->asAllowedExtensions)) { @@ -3523,10 +3529,6 @@ class fileUploader */ class MySqlManager extends PhpObject { - const DB_SERVER = Settings::DB_SERVER; - const DB_LOGIN = Settings::DB_LOGIN; - const DB_PASS = Settings::DB_PASS; - const DB_NAME = Settings::DB_NAME; const DB_NO_CONN = 'ERR_1'; const DB_NO_DATA = 'ERR_2'; const ID_TAG = 'id_'; @@ -3555,16 +3557,19 @@ class MySqlManager extends PhpObject public $sDbState; private $oConnection; + private $sDatabase; //TODO Variable ? private $bTrace; - public function __construct() + public function __construct($sDbServer, $sLogin, $sPass, $sDatabase, $sEncoding) { parent::__construct(); + $this->sDatabase = $sDatabase; //$this->oConnection = mysql_connect(self::DB_SERVER, self::DB_LOGIN, self::DB_PASS); - $this->oConnection = new mysqli(self::DB_SERVER, self::DB_LOGIN, self::DB_PASS); + $this->oConnection = new mysqli($sDbServer, $sLogin,$sPass); + $this->syncPhpParams($sEncoding); /* - $dsn = 'mysql:dbname=databap;host=127.0.0.1'; + $dsn = 'mysql:dbname='.$this->sDatabase.';host='.self::DB_SERVER; try {$dbh = new PDO($dsn, self::DB_LOGIN, self::DB_PASS);} catch (PDOException $e) {$this->addError('Connexion échouée : ' . $e->getMessage());} */ @@ -3579,14 +3584,30 @@ class MySqlManager extends PhpObject } else { - //if(!mysql_select_db(self::DB_NAME, $this->oConnection)) - if(!$this->oConnection->select_db(self::DB_NAME)) + //if(!mysql_select_db($this->sDatabase, $this->oConnection)) + if(!$this->oConnection->select_db($this->sDatabase)) { $this->addError('bug selecting database. Installing...'); $this->sDbState = self::DB_NO_DATA; } } } + + private function syncPhpParams($sEncoding) + { + //Characters encoding + $this->oConnection->set_charset($sEncoding); //SET NAMES + + //Time zone + $oNow = new DateTime(); + $iMins = $oNow->getOffset() / 60; + $iSign = ($iMins < 0)?-1:1; + $iMins = abs($iMins); + $iHours = floor($iMins / 60); + $iMins -= $iHours * 60; + $sOffset = sprintf('%+d:%02d', $iHours*$iSign, $iMins); + $this->setQuery("SET time_zone='{$sOffset}';"); + } public function __destruct() { @@ -3608,7 +3629,7 @@ class MySqlManager extends PhpObject $asTables = array(); foreach($asConstants as $sConstant=>$sConstantValue) { - if(strpos($sConstant, $sTableTag)!==false && strpos($sConstant, $sTableTag)==(strlen($sConstant) - strlen($sTableTag))) + if(mb_strpos($sConstant, $sTableTag)!==false && mb_strpos($sConstant, $sTableTag)==(mb_strlen($sConstant) - mb_strlen($sTableTag))) { $asTables[] = $sConstantValue; } @@ -3619,10 +3640,10 @@ class MySqlManager extends PhpObject public function install() { //Create Database - $this->setQuery("DROP DATABASE IF EXISTS ".self::DB_NAME); - $this->setQuery("CREATE DATABASE ".self::DB_NAME); - //mysql_select_db(self::DB_NAME, $this->oConnection); - $this->oConnection->select_db(self::DB_NAME); + $this->setQuery("DROP DATABASE IF EXISTS ".$this->sDatabase); + $this->setQuery("CREATE DATABASE ".$this->sDatabase." DEFAULT CHARACTER SET ".Settings::SQL_ENC." DEFAULT COLLATE ".Settings::SQL_ENC."_general_ci"); + //mysql_select_db($this->sDatabase, $this->oConnection); + $this->oConnection->select_db($this->sDatabase); //Create tables @array_walk($this->getInstallQueries(), array($this, 'setQuery')); @@ -3752,8 +3773,8 @@ class MySqlManager extends PhpObject public static function getText($sTableName, $bFull=false) { - $sColumnName = substr(str_replace('`', '', $sTableName), 0, -1); - $sColumnName = substr($sColumnName, -2)=='ie'?substr($sColumnName, 0, -2).'y':$sColumnName; + $sColumnName = mb_substr(str_replace('`', '', $sTableName), 0, -1); + $sColumnName = mb_substr($sColumnName, -2)=='ie'?mb_substr($sColumnName, 0, -2).'y':$sColumnName; return $bFull?self::getFullColumnName($sTableName, $sColumnName):$sColumnName; } @@ -4354,7 +4375,7 @@ class ToolBox //Add Server Name $sServerName = array_key_exists('SERVER_NAME', $_SERVER)?$_SERVER['SERVER_NAME']:$_SERVER['PWD']; $sAppPath = 'http://'.str_replace('http://', '', $sServerName.dirname($_SERVER['SCRIPT_NAME'])); - $_GET['serv_name'] = $sAppPath.(substr($sAppPath, -1)!='/'?'/':''); + $_GET['serv_name'] = $sAppPath.(mb_substr($sAppPath, -1)!='/'?'/':''); } public static function array_map_encapsulate($oData, $sChar) @@ -4372,24 +4393,24 @@ class ToolBox public static function capitalizeWords($acText, $sCharList = '') { - // Use ucwords if no delimiters are given + // Use ToolBox::mb_ucwords if no delimiters are given if($sCharList=='') { - return ucwords($acText); + return ToolBox::mb_ucwords($acText); } // Go through all characters $capitalizeNext = true; - $max = strlen($acText); + $max = mb_strlen($acText); for ($i = 0; $i < $max; $i++) { - if(strpos($sCharList, $acText[$i]) !== false) + if(mb_strpos($sCharList, $acText[$i]) !== false) { $capitalizeNext = true; } elseif($capitalizeNext) { $capitalizeNext = false; - $acText[$i] = strtoupper($acText[$i]); + $acText[$i] = mb_strtoupper($acText[$i]); } } @@ -4438,13 +4459,13 @@ class ToolBox //Look up the extension to choose the image creator //TODO use MIME types $sInInfo = pathinfo($sInPath); - $sInName = strtolower($sInInfo['basename']); - $sImageExt = strtolower($sInInfo['extension']); + $sInName = mb_strtolower($sInInfo['basename']); + $sImageExt = mb_strtolower($sInInfo['extension']); $sImageExt = ($sImageExt=='jpg')?'jpeg':$sImageExt; //New Destination folder if($sOutPath=='') $sOutPath = $sInPath; - elseif(substr($sOutPath, -1)=='/') $sOutPath .= $sInName; + elseif(mb_substr($sOutPath, -1)=='/') $sOutPath .= $sInName; //New sizes if(in_array($sImageExt, Databap::$UPLOAD_IMG_EXTS)) @@ -4502,13 +4523,15 @@ class ToolBox return (preg_match('/^.{1}/us', $sText, $ar) == 1); } - /** - * Only works with ISO-8859-1 and UTF-8 encoding - */ - public static function strlen($sText) + function mb_ucwords($sText) { - if(utf8_compliant($sText)) return strlen(utf8_decode($sText)); - else return strlen($sText); + return mb_convert_case($sText, MB_CASE_TITLE, "UTF-8"); + } + + function file_get_contents_utf8($oFile) + { + $sContent = file_get_contents($oFile); + return mb_convert_encoding($sContent, 'UTF-8', mb_detect_encoding($sContent, 'UTF-8, ISO-8859-1', true)); } } diff --git a/inc/rss.php b/inc/rss.php index 86a36cb..1b93b09 100644 --- a/inc/rss.php +++ b/inc/rss.php @@ -71,7 +71,7 @@ class Feed extends PhpObject { $sItems = implode("\n", array_map(array($this, 'buildItem'), $asSortedItems)); //Global Feed - $sFeed = ''; + $sFeed = ''; $sFeed .= self::getHtml(self::getHtml($sRssFeedHeader.$sItems, 'channel'), 'rss', '', '', array('version'=>'2.0', 'xmlns:atom'=>'http://www.w3.org/2005/Atom')); return $sFeed; diff --git a/index.php b/index.php index f5b91c4..47fde5e 100644 --- a/index.php +++ b/index.php @@ -171,31 +171,23 @@ if($bUserOk && $sAction!=Databap::EXT_ACCESS) case 'fix_encoding': /** * Procedure (from ISO-8859-1, aka Latin-1) - * - Rss.php : switch ISO <-> UTF : $sFeed = ''; - * - .htaccess : ajout UTF-8 par défaut : AddDefaultCharset UTF-8 (+check syntax) - * - config.php : Ajouter dans le constructor de Databap : - * - ini_set('default_charset', 'UTF-8'); - * - header('Content-Type: text/html; charset=utf-8'); - * - config.php : changer tous les ISO en UTF : - * - --> - * - config.php : Enlever la conversion en UTF8 de jsonExport() - * - config.php : Ajouter $this->oConnection->set_charset('utf8'); dans le constructeur de MySqlManager - * - replace strlen with ToolBox::strlen() --> check the so called mb_* functions * - Re-encode all tables from database using utf8_encode() - * - Replace all
with - * - Alter database and change database generation script in MySqlManager : + * - Alter database and change database generation script in MySqlManager : + * - ALTER DATABASE databap CHARACTER SET utf8 COLLATE utf8_general_ci; + * - (ALTER TABLE tablename CHARACTER SET utf8 COLLATE utf8_general_ci;) * - CREATE DATABASE `my_db` CHARACTER SET = utf8 COLLATE = utf8_general_ci; - * - CREATE TABLE `my_table` ([TABLE spec]) CHARACTER SET = utf8 COLLATE = utf8_general_ci; + * - (CREATE TABLE `my_table` ([TABLE spec]) CHARACTER SET = utf8 COLLATE = utf8_general_ci;) * - Convert existing database : * - mysqldump --default_character_set=latin1 -u root -p my_db > my_db.sql * - iconv -f iso-8859-1 -t utf8 my_db.sql > my_db-utf8.sql * - sed s/latin1/utf8/ < my_db-utf8.sql > my_db-utf8-final.sql * - CREATE DATABASE `my_db` CHARACTER SET = utf8 COLLATE = utf8_general_ci; * - mysql -u root -p my_db < my_db-utf8-final.sql - * - Switch your editor to UTF-8 (search 'encoding' in Eclipse preferences) * - check http://webcollab.sourceforge.net/unicode.html * - add mb_* function : sudo apt-get install php-mbstring --> check http://allseeing-i.com/How-to-setup-your-PHP-site-to-use-UTF8 + * - replace strlen with ToolBox::strlen() --> check the so called mb_* functions */ + $sResult = $oDatabap->fixEncoding(); break; } } diff --git a/masks/index.html b/masks/index.html index e1a8312..4519c95 100755 --- a/masks/index.html +++ b/masks/index.html @@ -1,8 +1,7 @@ - - + diff --git a/readme b/readme new file mode 100644 index 0000000..bfb74a9 --- /dev/null +++ b/readme @@ -0,0 +1,23 @@ +Hi there! + +To install, kindly follow this procedure: +1. Add apache module rewrite (a2enmod rewrite on debian) +2. Add php-curl, php-gd and php-mbstring packages to PHP (if not already built in) +3. Create a settings.php in databap root folder : + + + +4. You're good to go ! Check users SQL table for default admin user \ No newline at end of file