Changeset 1697

Show
Ignore:
Timestamp:
02/19/2008 08:37:23 PM (9 months ago)
Author:
driehle
Message:

added support for non-ascii passwords

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/admin/update.php

    r1688 r1697  
    44  define("JLOG_ADMIN", true); 
    55  define("JLOG_UPDATE", true); 
    6    
    7   // read prefered language from browser 
    8   $dir = opendir('..'.DIRECTORY_SEPARATOR.'lang'); 
     6  error_reporting(E_ALL ^ E_NOTICE); 
     7   
     8  /** 
     9   * Wir brauchen alle Konstanten aus settings.inc.php, können diese 
     10   * Datei aber nicht inkluden, weil dann ebenfalls prepenc.inc.php 
     11   * eingebunden wÃŒrde - dies darf aber im Update-Script nicht passieren 
     12   *  
     13   * Deshalb lesen wir die Konstanten auf etwas umstÀndlichere Weise 
     14   * von Hand aus der Datei aus 
     15   */ 
     16  $lines = file("..".DIRECTORY_SEPARATOR."personal".DIRECTORY_SEPARATOR."settings.inc.php"); 
     17  $password_hash = ''; 
     18  foreach($lines as $line) { 
     19    if(preg_match("/define\('(JLOG_[A-Z_]+)', ('[^']*'|true|false|\d+)\);/", $line, $result)) { 
     20      switch($result[2]) { 
     21        case 'true': 
     22          $value = true; 
     23          break; 
     24        case 'false': 
     25          $value = false; 
     26          break; 
     27        default: 
     28          if(is_numeric($result[2])) { 
     29            $value = (int) $result[2]; 
     30          } 
     31          else { 
     32            $value = stripslashes(substr($result[2], 1, -1)); 
     33          } 
     34          break; 
     35      } 
     36      define($result[1], $value); 
     37    } 
     38  } 
     39  define("JLOG_VERSION", '1.1.0'); 
     40  define("JLOG_DB_CONTENT", JLOG_DB_PREFIX."content"); 
     41  define("JLOG_DB_COMMENTS", JLOG_DB_PREFIX."comments"); 
     42  define("JLOG_DB_CATASSIGN", JLOG_DB_PREFIX."catassign"); 
     43  define("JLOG_DB_CATEGORIES", JLOG_DB_PREFIX."categories"); 
     44  define("JLOG_DB_ATTRIBUTES", JLOG_DB_PREFIX."attributes"); 
     45   
     46  /** 
     47   * Die Konstante JLOG_LANGUAGE wurde mit Jlog 1.1.0 neu eingefÃŒhrt, 
     48   * folglich wurde das Update-Script auf 1.1.0 bereits ausgefÃŒhrt, wenn 
     49   * diese Konstante existiert. 
     50   */ 
     51  if(defined('JLOG_LANGUAGE')) { 
     52    die('Das Update-Script kann nur einmal ausgefÃŒhrt werden.'); 
     53  } 
     54   
     55  /** 
     56   * Da wir prepenc.inc.php nicht inkluden können, mÃŒssen wir ein paar 
     57   * Teile davon hier manuell ausfÃŒhren, da sonst das Template-System 
     58   * nicht funktioniert. 
     59   */ 
     60  require(JLOG_BASEPATH.'scripts'.DIRECTORY_SEPARATOR.'version.inc.php'); 
     61  require_once(JLOG_BASEPATH.'lang'.DIRECTORY_SEPARATOR.'lang.inc.php'); 
     62  require_once(JLOG_BASEPATH.'lang'.DIRECTORY_SEPARATOR.'lang-admin.inc.php'); 
     63  require_once(JLOG_BASEPATH.'scripts'.DIRECTORY_SEPARATOR.'database.class.php');  
     64  require_once(JLOG_BASEPATH.'scripts'.DIRECTORY_SEPARATOR.'bbcode.php');  
     65  require_once(JLOG_BASEPATH.'scripts'.DIRECTORY_SEPARATOR.'general.func.php');  
     66  $connect = @mysql_connect(JLOG_DB_URL, JLOG_DB_USER, JLOG_DB_PWD); 
     67  if ($connect == FALSE) { 
     68    mail(JLOG_EMAIL, $l['admin']['e_db'], $l['admin']['e_db_is']."\n".mysql_error()); 
     69    die("<strong>".$l['db_error']."</strong><br />".$l['plz_try_again']."."); 
     70  } 
     71  @mysql_select_db( JLOG_DB ); 
     72  @mysql_query("SET NAMES utf8"); 
     73  @mysql_query("SET sql_mode=''"); 
     74   
     75  require_once(JLOG_BASEPATH.'scripts'.DIRECTORY_SEPARATOR.'categories.class.php'); 
     76  require_once(JLOG_BASEPATH.'scripts'.DIRECTORY_SEPARATOR.'jlogPlugins.class.php'); 
     77  $plugins = new JlogPluginManager(JLOG_BASEPATH.'plugins'.DIRECTORY_SEPARATOR); 
     78 
     79  // VerfÃŒgbare Sprachen auslesen 
     80  $dir = opendir(JLOG_BASEPATH.'lang'); 
    981  $languages = array(); 
    1082  while(($file = readdir($dir)) !== false) { 
     
    1385    $languages[] = $matches[1]; 
    1486  } 
    15   // define language if not already done 
    16   if(!defined('JLOG_LANGUAGE')) { 
    17     define('JLOG_LANGUAGE', 'de'); 
    18   } 
    19   error_reporting(E_ALL); 
    20    
    21   require('..'.DIRECTORY_SEPARATOR.'personal'.DIRECTORY_SEPARATOR.'settings.inc.php'); 
    22   require('..'.DIRECTORY_SEPARATOR.'scripts'.DIRECTORY_SEPARATOR.'version.inc.php'); 
    23    
    24    
     87   
     88   
     89  // Seitenaufbau 
    2590  $c['meta']['title'] = "Update"; 
    2691  $c['main'] = "<h2>Update von <var>1.0.2</var> auf <var>1.1.0</var></h2>"; 
     
    3499    foreach($languages as $lang) { 
    35100      $c['main'] .= "<option"; 
    36       if($lang == JLOG_LANGUAGE) $c['main'] .= " selected='selected'"; 
     101      if(isset($_POST['jlog_language']) AND $_POST['jlog_language'] == $lang) $c['main'] .= " selected='selected'"; 
    37102      $c['main'] .= ">$lang</option>"; 
    38103    } 
     
    43108          Sprachdateien zu installieren.<br /> 
    44109          <label><input type='radio' name='languagekeep' value='yes' /> Ja, alte Dateien behalten.</label> 
    45           <label><input type='radio' name='languagekeep' value='no' /> Nein, neue Dateien installieren.</label></p> 
     110          <label><input type='radio' name='languagekeep' value='no' checked='checked' /> Nein, neue Dateien installieren.</label></p> 
    46111       <p><input type='submit' name='update' value='Update starten' /></p> 
    47112       </form>"; 
     
    49114  else { 
    50115    /** 
    51      * Wir mÃŒssen an dieser Stelle das Administrator-Passwort prÃŒfen, wÃŒrde ich 
    52      * hierfÃŒr /personal/settings.inc.php einbinden, um die Konstante 
    53      * JLOG_ADMIN_PASSWORT zu erhalten, wÃŒrde mir gleichzeitig /scripts/prepend.inc.php  
    54      * eingebunden werden, was weiteren Code ausfÃŒhren wÃŒrde, welcher letztendlich 
    55      * eine Endlosschleife ergÀbe (Redirect auf dieses Script). 
    56      *  
    57      * Aus diesem Grund mÃŒssen wir es wohl etwas komplizierter machen und den 
    58      * Passwort-Hash von Hand auslesen, welcher ungefÀhr so aussieht: 
    59      *  
    60      * define('JLOG_ADMIN_PASSWORD', '3858f62230ac3c915f300c664312c63f'); 
    61      **/ 
    62     $lines = file(JLOG_BASEPATH."personal".DIRECTORY_SEPARATOR."settings.inc.php"); 
    63     $password_hash = ''; 
    64     foreach($lines as $line) { 
    65       if(preg_match("/'JLOG_ADMIN_PASSWORD', '([^']*)'/", $line, $result)) { 
    66         $password_hash = $result[1]; 
    67         break; 
    68       } 
    69     } 
    70      
    71     if(md5($_POST['password']) !== $password_hash) { 
     116     * Das alte Passwort ist anders kodiert (vorher ISO, jetzt UTF-8), deshalb 
     117     * testen wir verschiedene Varianten des Passwortes 
     118     */ 
     119    $pass1 = md5($_POST['password']);              # Idealfall 
     120    $pass2 = md5(utf8_decode($_POST['password'])); # wahrscheinlichster Fall, wenn Jlog 1.0.2 vorher installiert war 
     121    $pass3 = md5(utf8_encode($_POST['password'])); # sollte in der RealitÀt eigentlich nie in der Form vorkommen 
     122 
     123    /** 
     124     * Formulareingaben validieren 
     125     */ 
     126    if(JLOG_ADMIN_PASSWORD != $pass1 AND JLOG_ADMIN_PASSWORD != $pass2 AND JLOG_ADMIN_PASSWORD != $pass3) { 
    72127      $errors[] = 'Administrator-Passwort fehlerhaft!'; 
    73128    } 
    74     if(!in_array($_POST['languagekeep'], array('yes', 'no'))) { 
     129    if(!isset($_POST['languagekeep']) OR !in_array($_POST['languagekeep'], array('yes', 'no'))) { 
    75130      $errors[] = 'Bitte Auswahl treffen, ob Sie die alten Sprachdateien behalten möchten oder nicht.'; 
    76131    } 
     
    79134      require(JLOG_BASEPATH."scripts".DIRECTORY_SEPARATOR."settings.class.php"); 
    80135       
     136      // aktuelle Einstellungen aus Environment und User-Input auslesen 
    81137      $update = new Settings($l); 
    82138      $update->get_data(); 
    83139      $update->get_userdata(); 
     140       
     141      // alle Werte nach UTF-8 umkodieren 
     142      foreach($update->d as $key => $value) { 
     143        $update->d[$key] = utf8_encode($value); 
     144      } 
     145       
     146      // Passwort-Hash neu setzen, falls wegen neuer Kodierung nicht mehr korrekt 
     147      $update->d['jlog_admin_password'] = $pass1; 
     148       
     149      // Sprache speichern 
     150      $update->d['jlog_language'] = $_POST['jlog_language']; 
     151       
     152      // settings.inc.php neu schreiben 
    84153      $errors = $update->do_settings(); 
    85154       
    86155      if($_POST['languagekeep'] == 'yes') { 
    87         $f1 = @rename(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.OLD.inc.php"); 
    88         $f2 = @rename(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.OLD.inc.php"); 
     156        $file1 = @rename(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.MyLanguage.inc.php"); 
     157        $file2 = @rename(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.MyLanguage.inc.php"); 
    89158        // falls umbenennen scheitert, es mit kopieren und löschen probieren 
    90         if($f1 === false) { 
    91           @copy(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.OLD.inc.php"); 
    92           @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php"); 
     159        if($file1 === false) { 
     160          @copy(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.MyLanguage.inc.php"); 
     161          $file1 = @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php"); 
    93162        } 
    94         if($f2 === false) { 
    95           @copy(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.OLD.inc.php"); 
    96           @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php"); 
     163        if($file2 === false) { 
     164          @copy(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php", JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.MyLanguage.inc.php"); 
     165          $file2 = @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php"); 
    97166        } 
    98167      } 
    99168      else { 
    100         @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php"); 
    101         @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php"); 
    102       } 
    103        
     169        $file1 = @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang.inc.php"); 
     170        $file2 = @unlink(JLOG_BASEPATH."lang".DIRECTORY_SEPARATOR."lang-admin.inc.php"); 
     171      } 
     172      if($file1 === false) { 
     173        $errors[] = 'Die Datei <code>lang/lang.inc.php</code> konnte nicht gelöscht werden.'; 
     174      } 
     175      if($file2 === false) { 
     176        $errors[] = 'Die Datei <code>lang/lang-admin.inc.php</code> konnte nicht gelöscht werden.'; 
     177      } 
     178       
     179      /** 
     180       * Das Template von Jlog sollte als ISO abgespeichert sein bei Jlog 1.0.2, 
     181       * fÃŒr Jlog 1.1.0 muss es allerdings als UTF-8 abgespeichert werden, dies 
     182       * geschieht hier. 
     183       * Durch die Verwendung von file_get_contents() und file_put_contents() setzen 
     184       * wir PHP 
     185       */ 
     186      // Datei einlesen 
     187      $template = JLOG_BASEPATH."personal".DIRECTORY_SEPARATOR."template.tpl"; 
     188      $fh = fopen($template, "r+"); 
     189      if($fh !== false) { 
     190        flock($fh, LOCK_EX); 
     191        $content = fread($fh, filesize($template)); 
     192        // umkodieren 
     193        $content = utf8_encode($content); 
     194        // zurÃŒckschreiben 
     195        fseek($fh, 0); 
     196        ftruncate($fh, 0); 
     197        fwrite($fh, $content); 
     198        flock($fh, LOCK_UN); 
     199        fclose($fh); 
     200      } 
     201      else { 
     202        // Datei konnte nicht zum Schreiben geöffnet werden 
     203        $errors[] = 'Die Datei <code>personal/template.tpl</code> konnte nicht in UTF-8 Kodierung konvertiert werden.'; 
     204      } 
     205       
     206      // Fertig :-) 
    104207      require(JLOG_BASEPATH."scripts".DIRECTORY_SEPARATOR."update.php"); 
    105       $c['main'] .= "<p>Update erfolgreich, <a href='../'>Viel Spaß</a>!</p>"; 
     208       
     209      if(empty($errors)) { 
     210        $c['main'] .= "<p>Update erfolgreich, <a href='../'>Viel Spaß</a>!</p>"; 
     211      } 
     212      else { 
     213        $c['main'] .= '<p>Das Update wurde durchgefÃŒhrt, allerdings sind folgende Probleme aufgetreten:</p><ul>'; 
     214        foreach($errors as $error) { 
     215          $c['main'] .= '<li>'.htmlspecialchars($error).'</li>'; 
     216        } 
     217        $c['main'] .= '</ul><p>Sie können versuchen diese Schritte von Hand nachzuvollziehen. <a href="../">Zur Startseite</a></p>'; 
     218      } 
    106219    } 
    107220    else { 
    108       $c['main'] .= '<p>Fehler beim Update:</p><ul>'; 
     221      $c['main'] .= '<p>Fehler beim Update:</p><ul class="error">'; 
    109222      foreach($errors as $error) { 
    110223        $c['main'] .= '<li>'.htmlspecialchars($error).'</li>';