Seite 1 von 1

[CON-405] Plugin Frontendusers -> Uhrzeit

Verfasst: So 17. Jul 2011, 11:04
von idea-tec
Ich habe ein komisches Verhalten entdeckt (Version 4.8.15) und frage hier nach ob das jemand bestätigen kann.

Man gibt im Backend einem Frontendbenutzer z.B. folgendes in "Gültig von" oder "Gültig bis" ein:
- 2011-06-16 23:59:59 oder 2011-12-31 23:59:59

Sendet man das Formular ab, wird gespeichert und das eingegebene Datum inkl. Uhrzeit wird angezeigt
Nun ruft man den Benutzer neu auf und stellt fest, dass man dieses angezeigt bekommt (steht so auch direkt nach dem Speichern in der DB!):
=> 2011-06-16 23:03:00 bzw. 2011-12-31 23:03:00

a.) Kann das jemand bestätigen?
b.) Hat jemand eine Idee woran das liegen kann, ich steh auf dem Schlauch

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: So 17. Jul 2011, 16:08
von Dodger77
Verschoben nach Bugs. Das ist nachvollziehbar und auch für mich nicht direkt erkennbar, wo das hakt.

Der Plugin-Code selbst ist ja übersichtlich, der FE-User-Plugin-Aufruf und das Speichern durch die FE-User-Klasse inkl GenericDB hat mir da auch erstmal nichts erhellendes gebracht.

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: Mo 18. Jul 2011, 09:23
von Oldperl
Kann ich erstmal nicht nachvollziehen. Könntet ihr bitte mal Angaben zu PHP- und MySQL-Versionen machen bei denen der Fehler Auftritt.
Und ist das bei der Neuanlage oder beim Bearbeiten des Benutzers?

Gruß aus Franken

Ortwin

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: Mo 18. Jul 2011, 09:56
von Dodger77
Bei mir ist das eine 4.8.14 auf MySQL 5.0.67, aufgetreten bei Bearbeitung eines Nutzers.

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: Mo 18. Jul 2011, 10:07
von Oldperl
Also bei mir sind das 2 Installationen ohne Beanstandung.
Datenbankserver-Version 5.1.41
Installierte PHP-Version 5.3.1
und
Datenbankserver-Version 5.1.33
Installierte PHP-Version 5.2.9
Bei Beiden kann ich den Fehler nicht nachvollziehen. Ich habe die Datumsangaben von Karsten per Copy&Paste eingefügt und sie bleiben nach dem Speichern wie sie waren.

Gruß aus Franken

Ortwin

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: Mo 18. Jul 2011, 10:14
von Dodger77
Ich habe es gerade auch nochmal in einer älteren Installation (4.8.10) getestet. Dort ist das auch nachvollziehbar (MySQL 5.1.41, PHP 5.3.2).

@Ortwin: und wenn du den Nutzer danach nochmal aufrufst steht das da wirklich noch richtig?

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: Mo 18. Jul 2011, 10:28
von Oldperl
@Ingo: Dann zeigt's hier auch den Fehler.

Ich schau mir das mal ein wenig genauer an.

Gruß aus Franken

Ortwin

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: Mo 18. Jul 2011, 11:00
von Oldperl
Könntet Ihr mal bitte in den Plugins jeweils die store-Funktion ändern. Dann sollte es funktionieren.

Code: Alles auswählen

function frontendusers_valid_from_store ($variables)
{
    global $feuser;
    
    $feuser->set("valid_from", $variables["valid_from"], false);
} 

Code: Alles auswählen

function frontendusers_valid_to_store ($variables)
{
    global $feuser;
    
    $feuser->set("valid_to", $variables["valid_to"], false);
} 
Zur Info:
Der 3. Parameter schaltet den festeingebauten _inFilter der GenericDB ab. Eventuell sollte man die Plugins noch mit einer Validitätsprüfung für DATE bzw. DATETIME versehen. Könnte man auch zentral in die Security-Klasse machen.

Gruß aus Franken

Ortwin

Re: Plugin Frontendusers -> Uhrzeit

Verfasst: Mo 18. Jul 2011, 11:22
von idea-tec
Lösung bestätigt, funktioniert

Re: [CON-405] Plugin Frontendusers -> Uhrzeit

Verfasst: Mi 20. Jul 2011, 17:37
von Oldperl
Soderle... :-)

Nun hab ich die Lösung mal etwas ausgearbeitet und mit einer zusätzlichen Validitätsprüfung der Eingaben versehen. Dabei sind dann gleich mal noch 2 Methoden (Contenido_Security::isMySQLDate && Contenido_Security::isMySQLDateTime)für die Contenido_Security-Klasse entstanden.
Vielleicht könnte das ja mal Jemand so Einbauen und Testen, wenn's funktioniert kann es dann noch in den Core für's nächste Release. 8)

!Achtung!
Es werden Änderungen am Core vorgenommen, sollten diese Änderungen nicht ins SVN einfliessen so gehen sie bei einem späteren Update verloren. Achja, und für Schäden und... aber das kennt ja Jeder.

Also, folgende Änderungen bzw. Ergänzungen vornehmen.
  • In der Security-Klasse (contenido/classes/class.security.php) hinter der Methode isString() folgenden Code einfügen

    Code: Alles auswählen

    /**
         * Check: Is the variable formatted as MySQL DATE 'YYYY-MM-DD'
         * @static
         * 
         * @author Ortwin Pinke
         * @since Contenido 4.8.16
         * 
         * @param string $sVar given date/string
         * @param boolean $bCheckValid additional use of checkdate for validation
         * @return boolean true|false
         */
        public static function isMySQLDate($sVar, $bCheckValid = false) {
            $sVar = trim($sVar);
            $bFormatOk = preg_match("/^\d{4}-\d{2}-\d{2}$/", $sVar);
            if($bCheckValid && $bFormatOk) {
                $aDateParts = explode("-", $sVar);
                return checkdate($aDateParts[1], $aDateParts[2], $aDateParts[0]);
            } elseif($bFormatOk) {
                return true;
            }
            return false;
        }
        
        /**
         * Check: Is the variable formatted as MySQL DATETIME 'YYYY-MM-DD HH:MM:SS'
         * @static
         * 
         * @author Ortwin Pinke
         * @since Contenido 4.8.16
         * 
         * @param string $Var given datetime/string
         * @param boolean $bCheckValid additional use of checkdate for validation
         * @return boolean true|false 
         */
        public static function isMySQLDateTime($sVar, $bCheckValid = false) {
            $sVar = trim($sVar); 
            $bFormatOk = preg_match("/^\d{4}-\d{2}-\d{2} [0-2][0-3]:[0-5][0-9]:[0-5][0-9]$/", $sVar);
            if($bCheckValid && $bFormatOk) {
                $aDateTimeParts = explode(" ", $sVar);
                $aDateParts = explode("-", $aDateTimeParts[0]);
                return checkdate($aDateParts[1], $aDateParts[2], $aDateParts[0]);
            } elseif($bFormatOk) {
                return true;
            }
            return false;
        }
  • Im FEUser-Plugin valid_from (contenido/plugins/frontendusers/valid_from/valid_from.php) die Funktion frontendusers_valid_from_store() durch folgende ersetzen

    Code: Alles auswählen

    /**
     * check and store valid_from date/datetime
     * 
     * @global FrontendUser $feuser
     * @param array $variables 
     */
    function frontendusers_valid_from_store ($variables) {
        global $feuser;
     
        if(Contenido_Security::isMySQLDate($variables["valid_from"], true)
                || Contenido_Security::isMySQLDateTime($variables["valid_from"], true)
                || empty($variables["valid_from"])
                || $variables["valid_from"] == "0000-00-00") {
            
            $feuser->set("valid_from", $variables["valid_from"], false);
        }
    }
  • Im FEUser-Plugin valid_to (contenido/plugins/frontendusers/valid_to/valid_to.php) die Funktion frontendusers_valid_to_store() durch folgende ersetzen

    Code: Alles auswählen

    /**
     * check and store valid_to date/datetime
     *
     * @global FrontendUser $feuser
     * @param array $variables 
     */
    function frontendusers_valid_to_store ($variables) { 
        global $feuser;
        
        if(Contenido_Security::isMySQLDate($variables["valid_to"], true) 
                || Contenido_Security::isMySQLDateTime($variables["valid_to"], true) 
                || empty($variables["valid_to"])
                || $variables["valid_to"] == "0000-00-00") {
            
            $feuser->set("valid_to", $variables["valid_to"], false);
        }
    }
  • Fertisch :wink:
Gruß aus Franken

Ortwin