Beat: Plugin (Module dynamisch einbinden) - fertiger Code

Beitrag lesen

Ich habe noch andere Baustellen. Und die Plugin-API muss noch wachsen.

Hier mein etwas aufgeräumterer Zwischenstand.

  
sub user_plugin{  
    my $toparse = shift or return '';  
    my $plugin = '';  
    $toparse =~ /\[name:([A-Za-z]+)\]/ and $plugin = $1;  
    $plugin or return '<div class="warning">Plugin-Name nicht spezifiziert.</div>';  
    my @param = ();  
    $toparse =~ /\[param:([A-Za-z0-9_.,-]+)\]/ and @param = split /,/, $1;  
    my $content = '';  
    $toparse =~ /\[content:(.*?)\]/ and $content = $1;  
    # weitere Eigenschaften hier parsen.  
  
    # Evaluation liefert TRUE oder es werden Debugging Tests durchgeführt.  
    eval{  
        require( 'EHFPlugins/'.$plugin.'.pm' );  
        1;  
    } or do {  
        # informative Fehler-Hinweise für den CMS Betreiber.  
        my $file = $Path{cgidir} . "EHFPlugins/". $plugin .'.pm';  
        ( -e $file ) or return '<div class="warning">Plugin '.$plugin.'.pm konnte nicht gefunden werden.</div>';  
        ( -r $file ) or return '<div class="warning">Plugin '.$plugin.'.pm hat keine Leserechte.</div>';  
        return '<div class="warning">Plugin '.$plugin  
            . ' ('. $plugin .'.pm) konnte unerwartet nicht gestartet werden.<br>'  
            .$@.'</div>';  
    };  
    # process ist die ein und einzige öffentliche Methode, die alle Plugins anbieten müssen  
    my $method = $plugin . '::process';  
    # Ein erfolgreiches Plugn muss diese Werte überschreiben!  
    my ($error, $returncontent) = (1,'NO PLUGIN RETURN CONTENT. Try plugin with [param:usage]');  
    {  
        no strict 'refs';  
        eval{  
            ( $error, $returncontent ) = $method->( {  
                param      => \@param,  
                content    => $content,  
                userstatus => $User{status},  
            } );  
            1;  
        } or do {  
            return '<div class="warning">ERROR: Violation of Standards:<br>Plugin '  
            .$plugin. '.pm unterstützt die Funktion <em>process</em> nicht!<br>'.$@.'</div>';  
        };  
    }  
	  
    $error and return( NL.'<div class="plugin warning">' . $returncontent . '</div>'.NL );  
    return( NL.'<div class="plugin '.$plugin.'">' . $returncontent . '</div>'.NL );  
}  

So...
Jetzt muss ich mich dem Thema Privacy-Protection widmen.
Was darf ein Plugin wissen/tun?
Darf es zum Beispiel die COOKIE Sid auslesen?
Oder muss ich Mechanismen einführen, dass solche Plugins mit diesen Daten keinen Schindluder betreiben können?
Meine Meinung ist: Ja: Die Umgebung muss aufgeräumt werden.
Dies betrifft vor allem %ENV.
Statt dessen möchte ich den Plugins kontaminierte Information bereitstellen.

Ein Plugin für Zitatsammlungen kann für einen User mit Status Admin oder Subadmin zusätzlich zum Random-Zitat ein Formular-Textfeld zur eingabe eines neuen Zitats bereitstellen.
Formular-Daten müssten in dem Fall auch vom Hauptscript an das Plugin durchgereicht werden. Ich muss also auch eine eindeutige Formular-API für diesen Fall vorsehen.

mfg Beat

--
><o(((°>           ><o(((°>
   <°)))o><                     ><o(((°>o
Der Valigator leibt diese Fische