Author Topic: WB 2.12 r81 - Fehler in framework\class.wb.php ODER modules\wysiwyg\save.php  (Read 304 times)

Offline kuerbis42

  • Posts: 15
Hallo zusammen,

ich habe da einen Fehler gefunden, der genau dann auffällt, wenn man einen HTTPS - Link in eine WYSIWYG-Seite einbaut.

Die Funktion ReplaceAbsoluteMediaUrl in  framework\class.wb.php(Zeile 790ff)
wird vom Modul NEWS und WYSIWYG aufgerufen.


Quote
Suchen nach: ReplaceAbsoluteMedi aUrl
admin\settings\save.php(243): $value = $admin->ReplaceAbsoluteMedi aUrl($value);

framework\class.wb.php(791): * ReplaceAbsoluteMedi aUrl
framework\class.wb.php(797): public function ReplaceAbsoluteMedi aUrl( $sContent)

modules\news\save_post.php(128): $short = $admin->ReplaceAbsoluteMedi aUrl($short);
modules\news\save_post.php(129): $long  = $admin->ReplaceAbsoluteMedi aUrl($long);

modules\wysiwyg\save.php(66): $content = $admin->ReplaceAbsoluteMedi aUrl($content);
modules\wysiwyg\upgrade.php(38): $sContent = $admin->ReplaceAbsoluteMedi aUrl($aInstance['content']);
Es wurden 7 Vorkommen in 5 Datei(en) gefunden.

File:  framework\class.wb.php(Zeile 790ff)
Code: [Select]
  /**
   * ReplaceAbsoluteMediaUrl
   * @param string $sContent
   * @return string
   * @description Replace URLs which are pointing into MEDIA_DIRECTORY with an URL
   *              independend placeholder
   */
    public function ReplaceAbsoluteMediaUrl( $sContent)
    {
      if( ini_get( 'magic_quotes_gpc') == true) {
        $sContent = $this->strip_slashes( $sContent);
      }
      if( is_string( $sContent)) {
        $sRelUrl = preg_replace('/^https?:\/\/[^\/]+(.*)/is', '\1', WB_URL);
        $sDocumentRootUrl = str_replace($sRelUrl, '', WB_URL);
        $sMediaUrl = WB_URL.MEDIA_DIRECTORY.'/';
        $aSearchfor = [
            '@(<[^>]*=\s*")('.preg_quote($sMediaUrl).
            ')([^">]*".*>)@siU', '@(<[^>]*=\s*")('.preg_quote( WB_URL.'/').')([^">]*".*>)@siU',
            '/(<[^>]*?=\s*\")(\/+)([^\"]*?\"[^>]*?)/is',
            '/(<[^>]*=\s*")('.preg_quote($sMediaUrl, '/').')([^">]*".*>)/siU'
            ];
        $aReplacements = [ '$1{SYSVAR:AppUrl.MediaDir}$3', '$1{SYSVAR:AppUrl}$3','\1'.$sDocumentRootUrl.'/\3','$1{SYSVAR:MEDIA_REL}$3'];

        $sContent = preg_replace( $aSearchfor, $aReplacements, $sContent);
      }
      return $sContent;
    }


Was die Funktion richtig macht, ist folgendes:
Ersetze eine URL, die ins Mediaverzeichnis verweist, mit einem unabhängigen Platzhalter.
Das tut sie wie versprochen, nur leider führt das zu folgenden Fehlern innerhalb des WYSIWYG-Moduls:

1. Wenn man den Link (die Seite) nachträglich bearbeiten will, dann ist er (der Link) kaputt:
  Die Funktion macht aus  "https://meineseite.de/media/bild.jpg"
  das hier:  "https://meineseite.de/{SYSVAR:AppUrl.MediaDir}media/bild.jpg"
 und speichert dies dann in der Datenbank (Seiteninhalt).
Das ist zwar genau der Zweck der Funktion, ist aber beim nachträglichen Bearbeiten der Seite nicht hilfreich, weil der Wysiwyg-Editor "{SYSVAR:AppUrl.MediaDir}" nicht auflösen kann.

2. Der zweite Fehler ist dann in der Ausgabe, hier wird nämlich "{SYSVAR:AppUrl.MediaDir}" nicht in den richtigen Pfad umgesetzt.


Dieses Verhalten tritt nur bei HTTPs - Links auf (siehe dazu erstes preg_replace() ), dort wird nur nach https-Links gesucht. (Soll das so sein?)

Wie es mit den Seiten bei NEWS ist, habe ich jetzt nicht geprüft - vielleicht ist das Verhalten dort ja erwünscht - im WYSIWYG (meiner erachtens nach) nicht.

Gruss, Kuerbis42

Offline jacobi22

  • Posts: 5199
  • Gender: Male
  • Support also via PM or EMail
    • Jacobi22
was steht denn als WB_URL in deiner config.php?

http://meineseite.de oder https://meineseite.de?
Probleme sind da, um sie zu lösen, nicht, um nach Ausreden zu suchen.

Offline kuerbis42

  • Posts: 15
Quote
define('WB_URL', 'https://bXXXX.de'); // no trailing slash or backslash!!

Die Funktions macht ja prinzipiell was sie soll, nur soll sie das an der Stelle im WYSIWYG? Der Wert {SYSVAR:AppUrl.MediaDir} wird ja in die DB geschrieben (also in den Seiteninhalt).

aber wo Du das gerade schreibst, vllt. liegt es daran:
Quote
<?php
/*
 *** auto generated config file for 2.12.0
 *** WebsiteBaker 2.12.0
 *** created at 2018-05-29 02:55:20 UTC
 */
// define('DEBUG', false);
define('DB_TYPE', 'mysqli');
define('DB_HOST', 'localhost');
define('DB_PORT', '3306');
define('DB_NAME', 'bXXXXYYYYYY');
define('DB_USERNAME', 'SDJFGHJSDHSJDH');
define('DB_PASSWORD', 'YYXYXYXYYXY');
define('DB_CHARSET', 'utf8_unicode_ci');
define('TABLE_PREFIX', 'wb_');

define('WB_URL', 'https://bXXXXX.de'); // no trailing slash or backslash!!
define('ADMIN_DIRECTORY', 'admin'); // no leading/trailing slash or backslash!! A simple directory name only!!

require_once __DIR__.'/framework/initialize.php';
// --- end of file ----------------------------------

Ich sehe da kein
define('MEDIA_DIRECTORY', 'media');
Das wir zwar bei Nicht-existens gesetzt (-> admin\settings\index.php(66) ), aber die Konstante MEDIA_DIRECTORY wird ja auch noch an anderer Stelle benötigt.

« Last Edit: August 25, 2018, 01:07:50 PM by kuerbis42 »

Offline dbs

  • Betatester
  • **
  • Posts: 7549
  • Gender: Male
  • tioz4ever
    • WebsiteBaker - jQuery-Plugins - Module - Droplets - Tests
Ist mir auch schon paar mal untergekommen, dass im Wysiwyg eine BildAdresse plötzlich zu /mediabilder/ führt statt zu /media/bilder/

Offline kuerbis42

  • Posts: 15
Wo ich da gerade so "rumsuche":

Code: [Select]
<?php
/**
 * doFilterReplaceSysvar
 * @param string to modify
 * @return string
 * Convert the {SYSVAR:xxxx} Placeholders into their real value
 */
   
function doFilterSysvarMedia($sContent) {
      return 
doFilterReplaceSysvar($sContent);
    }

   function 
doFilterReplaceSysvar($sContent) {
        
$aReg = array (
            
'AppUrl' => WB_URL.'/',
            
'MediaDir' => trim(MEDIA_DIRECTORY'/').'/',
            
'MEDIA_REL' => WB_URL.'/'.trim(MEDIA_DIRECTORY'/')
        );
        
$aSearches = array();
        
$aReplacements = array();
        
// search for all SYSVARs
        
if (preg_match_all('/\{SYSVAR\:([^\}]+)\}/sU'$sContent$aMatches)) {
            
$aMatches array_unique($aMatches[1], SORT_STRING);
            foreach (
$aMatches as $sMatch) {
                
$sTmp '';
                
$aTmp preg_split('/\./'$sMatch);
                foreach (
$aTmp as $sSysvar) {
                    if (!isset(
$aReg[$sSysvar])) {
                        
$sTmp '';
                        break;
                    }
                    
$sTmp .= $aReg[$sSysvar];
                }
                if (
$sTmp) {
                    
$aSearches[] = '{SYSVAR:'.$sMatch.'}';
                    
$aReplacements[] = $sTmp;
                }
            }
            
$sContent str_replace($aSearches$aReplacements$sContent);
        }
      return 
$sContent;
   }

Das ist die Funktion, die aus {SYSVAR:AppUrl.MediaDir} wieder den Pfad machen soll.
Aber ich  finde nirgends einen passenden Aufruf dazu (nur Definitionen):

Quote
Suchen nach: doFilterReplaceSysv ar
modules\output_filter\filters\filterReplaceSysvar.php(3): * doFilterReplaceSysv ar
modules\output_filter\filters\filterReplaceSysvar.php(9): return doFilterReplaceSysv ar($sContent);
modules\output_filter\filters\filterReplaceSysvar.php(12): function doFilterReplaceSysv ar($sContent) {
Es wurden 3 Vorkommen in 1 Datei(en) gefunden.

Suchen nach: doFilterSysvarMedia
modules\output_filter\filters\filterReplaceSysvar.php(8 ): function doFilterSysvarMedia($sContent) {
Es wurden 1 Vorkommen in 1 Datei(en) gefunden.

Und vielleicht ist es das hier   (reguläre Ausdrück sind NICHT meine Stärke)
und sollte die richtige Ersetzung sollte folgende sein:

Convert the {SYSVAR:xxxx} für

SYSVAR:AppUrl   und SYSVAR:MediaDIR

NICHT aber für  SYSVAR:AppUrl.MediaDIR - so steht es ja in framework\class.wb.php(Zeile 790ff)
« Last Edit: August 25, 2018, 01:27:54 PM by kuerbis42 »

Offline Luisehahne

  • WebsiteBaker Org e.V.
  • **
  • Posts: 4156
  • Gender: Male
    • Webdesign und Entwicklung WebsiteBaker
 Dein letzter Post ist der Filter fürs frontend, dieser wird automatisch eingebunden. Wir bleiben am Ball.

Dietmar
Immer nur von der Zukunft reden, die Gegenwart vergessen und auf die Vergangenheit schimpfen
Neues Unwort: Schnappatmung

Offline jacobi22

  • Posts: 5199
  • Gender: Male
  • Support also via PM or EMail
    • Jacobi22
SYSVAR:AppUrl ist die in der config.php eingetragene WB_URL
SYSVAR:MediaDIR ist das in der settings-Tabelle eingetragene media-Verzeichnis, der reine Verzeichnisname, default ist media

Quote
Ich sehe da kein
define('MEDIA_DIRECTORY', 'media');
ein kleiner Denkfehler.... würde es an dieser Stelle, in deiner config.php stehen, wäre es nicht mehr dynamisch änderbar. Darum steht dieser Wert in den WB-Optionen, wird beim Start von WB ausgelesen und global gesetzt

Zurück zum Eingangsthread
Code: [Select]
1. Wenn man den Link (die Seite) nachträglich bearbeiten will, dann ist er (der Link) kaputt:
  Die Funktion macht aus  "https://meineseite.de/media/bild.jpg"
  das hier:  "https://meineseite.de/{SYSVAR:AppUrl.MediaDir}media/bild.jpg"

Das System setzt voraus, das die Pfade, die dort z.b. als Bilderpfade oder interne Links eingefügt wurden, durch Plugins des Editors eingefügt wurden. Für diesen Fall ist abgesichert, das diese Pfade auch korrekt sind und der WB_URL bzw der WB_URL + Media-Verzeichnis entsprechen.
Ein interner Filter, der immer im Hintergrund läuft, sorgt dafür, das alle Platzhalter aus der Datenbank mit dem Muster SYSVAR:AppUrl.MediaDir automatisch ersetzt werden, so das im Quelltext einer Wysiwyg-Section der richtige Pfad steht, z.b. eben http://www.meine_seite.de/media/bild1.jpg
wobei das blau markierte die WB_URL aus der config.php ist, das grün markierte das Media-Verzeichnis.

Beim Speichern arbeitet dann die Funktion ReplaceAbsoluteMedi aUrl und ersetzt genau diese Kombination aus WB_URL und Media-Verzeichnis mit dem Platzhalter {SYSVAR:AppUrl.MediaDir}

Ändert nun jemand diesen Pfad, z.b. im Quelltext des Wysiwyg-Editors, stimmt der Pfad nicht mehr mit der Kombination WB_URL + Media-Ordner überein. Abhängig davon, was wie wo geändert wurde, kommen dann natürlich auch mal komische Sachen heraus.
Wenn du mitteilst, was wo geändert wurde, läßt sich das auch gut erklären, was wo warum passiert. Darum bitte mal dein Beispiel vom Eingangsthread mit etwas mehr Details
Probleme sind da, um sie zu lösen, nicht, um nach Ausreden zu suchen.

Offline dbs

  • Betatester
  • **
  • Posts: 7549
  • Gender: Male
  • tioz4ever
    • WebsiteBaker - jQuery-Plugins - Module - Droplets - Tests
Mir passiert das nur, wenn ich zB ein Bild per eigener CK-Vorlage reinlade.
Also mit relativer URL src="/media/bildplatzhalter.jpg".
Der Editor macht beim Speichern daraus src="https://meine-domain.de/mediabildplatzhalter.jpg"
« Last Edit: August 25, 2018, 02:15:23 PM by dbs »

Offline jacobi22

  • Posts: 5199
  • Gender: Male
  • Support also via PM or EMail
    • Jacobi22
WB (und die allermeisten CMS) arbeitet intern immer mit absoluten URL's, die dann über verschiedene Methoden wie z.b. ein Filter, bei Bedarf in relative URL's umgewandelt werden.
Wird im Content irgendwo ein relativer Pfad entdeckt, wird der Filter versuchen, aus diesem eine absolute URL zu machen.
Ich nehme nun an, du schreibst die WB_URL selbst vor deinen relativen Pfad?? Dann käme einmal der automatisch gesetzte Platzhalter und dazu das von dir geschriebene zusammen und entspräche somit nicht mehr der Buchstabenkombinati on WB_URL + Media-Verzeichnis. Ergebnis ist dann solch Kombination https://meineseite.de/{SYSVAR:AppUrl.MediaDir}media/bild.jpg, die aber beim erneuten Einlesen auch wieder nicht ersetzt werden kann.
Probleme sind da, um sie zu lösen, nicht, um nach Ausreden zu suchen.

Offline dbs

  • Betatester
  • **
  • Posts: 7549
  • Gender: Male
  • tioz4ever
    • WebsiteBaker - jQuery-Plugins - Module - Droplets - Tests
Geändert wird es fast korrekt wie ich eins drüber schrieb.
Dietmar hat nun im Output Filter 1.2.0.4 den Filter "filterReplaceSysvar .php" um einen Slash am Ende erweitert.
Vielleicht hilfts dem TO auch, dann kommts in die nächste Version, dehalb hiermal zum Testen rangehangen.

Aber das hat wohl nichts mit Problem des TO zu tun. Bei mir ansosnten keinerlei Probleme mit HTTPS-Links.

Stimmt die URL im Editor nicht mit der in der config.php überein, wird kein Platzhalter in die DB geschrieben, sondern bleibt unverändert.
« Last Edit: August 25, 2018, 04:01:52 PM by dbs »

Offline kuerbis42

  • Posts: 15
@jacobi22

Quote
Das System setzt voraus, das die Pfade, die dort z.b. als Bilderpfade oder interne Links eingefügt wurden, durch Plugins des Editors eingefügt wurden. Für diesen Fall ist abgesichert, das diese Pfade auch korrekt sind und der WB_URL bzw der WB_URL + Media-Verzeichnis entsprechen.
Ein interner Filter, der immer im Hintergrund läuft, sorgt dafür, das alle Platzhalter aus der Datenbank mit dem Muster SYSVAR:AppUrl.MediaDir automatisch ersetzt werden, so das im Quelltext einer Wysiwyg-Section der richtige Pfad steht, z.b. eben http://www.meine_seite.de/media/bild1.jpg
wobei das blau markierte die WB_URL aus der config.php ist, das grün markierte das Media-Verzeichnis.

Ja, ich verstehe was Du meinst, aber ich habe "nichts" gemacht - wie der Anwender jetzt sagen würde.

Also, was ich gemacht habe ist eigentlich nichts ungewöhnliches:
-> Neue Seite mit Std. WYSIWYG.
-> Überschrift.
-> Link-Text >> Link-Text markiert >> WSB-Mützen-Link-Symbol >> aus dem Medien-Verzeichnis das Bild ausgewählt >> [OK]

Seite speichern.
Seite testweise aufgerufen um den Link zu prüfen: BUMMS-> https://meineseite.de/{SYSVAR:AppUrl.MediaDir}media/bild.jpg >> Link existiert nicht.

Also kein Gefummel in den HTML-Sourcen o.ä.

Weil ich die Seite aber schnell benötigt habe, das Ganze einfach mal mit HTTP:// (anstatt HTTPS://) und dann funktionierte der Link (der dann ja auch lautete: http://meineseite.de/media/bild.jpg


Gut, dann habe ich mir mal die Sourcen angesehen - und bin auf die oben benannten Dinge gestossen.


Um es aber nochmal für mich (und vllt. andere) klar zu stellen.

Die vorgehensweise von WSB ist also:
WYSIWYG - Seite erstellen.
-> Seite speichern -> das Backend übersetzt alle URL und Pfadangaben in Variable der Form: {SYSVAR:AppUrl} und {SYSVAR:AppUrl.MediaDir}
In der DB -> Table Wysiwyg steht dann nicht "<img src='http:/www.domain.tld/mediapfad/datei.jpg'>", sondern "<img src="{SYSVAR:AppUrl}{SYSVAR:AppUrl.MediaDir}/datei.jpg">

Wenn WYSIWYG den Inhalt zum Bearbeiten der Seite wieder "abholt", dann ersetzt WSB im Hintergrund {SYSVAR:AppUrl}{SYSVAR:AppUrl.MediaDir} wieder in die (derzeit aktruelle) URL und Pfad und man editiert wieder.

So weit, so richtig?


PS: ich wollte zu Testzwecken gerade eine ganz neue WSB Installation durch führen, leider bekomme ich sofort folgende Fehler:

Error: [450] unable to write 'install presets' into table 'settings'

und unter Step 1  Please check the following requirements are met before continuing...
Please note: PHP Session Support may appear disabled if your browser does not support cookies.

Hier wundert mit "... table 'settings'" - müsste ja nach Standarteinstellung en "... table 'wb_settings'" heissen

und der 2. Punkt ist eine irreführende Fehlermeldung. Cookies sind an und es handelt sich um FireFox....


Offline kuerbis42

  • Posts: 15
PS: ich wollte zu Testzwecken gerade eine ganz neue WSB Installation durch führen, leider bekomme ich sofort folgende Fehler:

Error: [450] unable to write 'install presets' into table 'settings'

und unter Step 1  Please check the following requirements are met before continuing...
Please note: PHP Session Support may appear disabled if your browser does not support cookies.

Hier wundert mit "... table 'settings'" - müsste ja nach Standarteinstellung en "... table 'wb_settings'" heissen

und der 2. Punkt ist eine irreführende Fehlermeldung. Cookies sind an und es handelt sich um FireFox....

OK, gefunden: Ich habe unter "Seitentitel" ein ' eingegeben, das wird nicht abgefangen und verursacht den Fehler.

Also müsste bei der Installation noch auf "verbotene" Zeichen untersucht oder escaped werden.

Offline kuerbis42

  • Posts: 15
So, auch das noch.

Nachdem ich die Testseite installiert habe und es ausprobiert habe, funktionierte es wie gewollt: in der DB stehen die relativen Variablen:


<p>bilder  <a href="{SYSVAR:AppUrl.MediaDir}datei.jpg">hier</a> link</p>

Beim Wiederöffenen mit dem WYSIWYG-Modul wurde es korrekt wieder in die URL zurückverwandelt - also ein Verhalten wie beschreiben, bestellt und alles schick.

ABER -
und gleich zweifel ich an mir selbst - auf meiner Hauptseite das Ganze auch nochmal ausprobiert - weil ich wissen wollte, was in der DB steht. Und nun geht's auch dort.

Das muß ich doch nicht mehr verstehen, oder?

Auf jeden Fall scheint es ziemlich filigran zu sein.

Ich weiß nicht, ob wir diesen Thread jetzt schliessen, weil es geht, oder ob hier noch diskutiert wird, wie man dieses Verhalten überprüfen kann.


Trotzdem: Dank an alle für die Unterstützung.

Offline jacobi22

  • Posts: 5199
  • Gender: Male
  • Support also via PM or EMail
    • Jacobi22
Quote
Wenn WYSIWYG den Inhalt zum Bearbeiten der Seite wieder "abholt", dann ersetzt WSB im Hintergrund {SYSVAR:AppUrl}{SYSVAR:AppUrl.MediaDir} wieder in die (derzeit aktruelle) URL und Pfad und man editiert wieder.

So weit, so richtig?

nicht ganz
{SYSVAR:AppUrl.MediaDir} ist bereits der komplette Pfad, es wird also nicht "doppelt ersetzt ->
{SYSVAR:AppUrl}{SYSVAR:AppUrl.MediaDir}, sondern nur einmal   :wink:

Zum Fehler bei der Installation:
Quote
OK, gefunden: Ich habe unter "Seitentitel" ein ' eingegeben, das wird nicht abgefangen und verursacht den Fehler.

Also müsste bei der Installation noch auf "verbotene" Zeichen untersucht oder escaped werden.

Sicherlich eine wichtige Information für Tester und Entwickler  (Y)
Probleme sind da, um sie zu lösen, nicht, um nach Ausreden zu suchen.

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 2976
  • Gender: Female
Error: [450] unable to write 'install presets' into table 'settings'

und unter Step 1  Please check the following requirements are met before continuing...
Please note: PHP Session Support may appear disabled if your browser does not support cookies.

Hier wundert mit "... table 'settings'" - müsste ja nach Standarteinstellung en "... table 'wb_settings'" heissen
zu 1.:  ist noch ein kleiner Bug im Installer. Es fehlen noch die escapeString() Funktionen beim Schreiben der Tabellen. Dadurch führt das ' zu Fehlern in den SQL-Statements.

zu 2.: die Fehlermeldung bedeutet, dass eine oder mehrere der Möglichkeiten bestehen: a. der Browser hat Probleme mit den Cookies;  b. in der Serverseitigen php.ini  ist der SessionSupport deaktiviert oder aber c.  PHP kann die Session nicht auf die Festplatte schreiben (Schreibrechte, volle Platte etc..).

zu 3.: Intern wird oft nur der eigentliche Tabellenname ohne den individuellen Präfix benutzt. Gelegentlich wird das halt auch nach außen sichtbar.
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf ihnen Hirn vom Himmel !

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 2976
  • Gender: Female
Wo ich da gerade so "rumsuche":

Code: [Select]
<?php
/**
 * doFilterReplaceSysvar
 * @param string to modify
 * @return string
 * Convert the {SYSVAR:xxxx} Placeholders into their real value
 */
   
function doFilterSysvarMedia($sContent) {
   }

Das ist die Funktion, die aus {SYSVAR:AppUrl.MediaDir} wieder den Pfad machen soll.
Aber ich  finde nirgends einen passenden Aufruf dazu (nur Definitionen):
Das 'output_filter' Modul ist ein bereits weitgehend dynamisches Teil. Daher wirst Du da auch keine hard-gecodeten Filteraufrufe finden.
Der eigentliche Aufruf erfolgt ganz am Ende der http://domain.tl/index.php durch Aufruf der /modules/output_filter/index.php.
Hier wird dann die Liste der abzuarbeitenden Filter zusammengestellt und an die OutputFilterAPI übergeben. Diese API sorgt dafür, dass die einzelnen Filter in der angegebenen Reihenfolge abgearbeitet werden.
Die modify.php des WYSIWYG-Modules benutzt ebenfalls diese API (ca. Zeile 47), um beim Einlesen aus der DB die Platzhalter zu ersetzen.

Manuela
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf ihnen Hirn vom Himmel !