New static plugin hook registration has now been implemented. Looks to work with...
authorpdontthink <pdontthink@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 13 Oct 2006 17:29:53 +0000 (17:29 +0000)
committerpdontthink <pdontthink@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 13 Oct 2006 17:29:53 +0000 (17:29 +0000)
git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@11912 7612ce4b-ef26-0410-bec9-ea0150e637f0

config/conf.pl
functions/plugin.php
include/init.php

index 0a0a2539174a6fb39690d8156be60ff3462172a7..b314e1ff18ec20671b3a9570328849d46d542127 100755 (executable)
@@ -53,7 +53,7 @@ if ( -e "config.php" ) {
         print "The file \"config/config.php\" was found, but you don't\n";
         print "have rights to read it.\n";
         print "\n";
-        print "Press any key to continue";
+        print "Press enter to continue";
         $ctu = <STDIN>;
         exit;
     }
@@ -1529,12 +1529,12 @@ sub command_smtp_sitewide_userpass($) {
             }
         } else {
             print "Invalid input. You must set username used for SMTP authentication.\n";
-            print "Click any key to continue\n";
+            print "Click enter to continue\n";
             $tmp = <STDIN>;
         }
     } else {
         print "Invalid input\n";
-        print "Click any key to continue\n";
+        print "Click enter to continue\n";
         $tmp = <STDIN>;
     }
 }
@@ -2081,7 +2081,7 @@ sub command215 {
         print "Deleting folders will bypass the trash folder and be immediately deleted\n\n";
         print "If this is not the correct value for your server,\n";
         print "please use option D on the Main Menu to configure your server correctly.\n\n";
-        print "Press any key to continue...\n";
+        print "Press enter to continue...\n";
         $new_delete = <STDIN>;
         $delete_folder = 'true';
     } else {
@@ -4581,6 +4581,9 @@ sub save_data {
         close CF;
 
         print "Data saved in config.php\n";
+
+        build_plugin_hook_array();
+
     } else {
         print "Error saving config.php: $!\n";
     }
@@ -4986,7 +4989,7 @@ sub check_imap_folder($) {
     if ($folder_name =~ /[\x80-\xFFFF]/) {
         print "Folder name contains 8bit characters. Configuration utility requires\n";
         print "UTF7-IMAP encoded folder names.\n";
-        print "Press any key to continue...";
+        print "Press enter to continue...";
         my $tmp = <STDIN>;
         return 0;
     } elsif ($folder_name =~ /[&\*\%]/) {
@@ -5011,3 +5014,192 @@ sub quote_single($) {
     $string =~ s/\'/\\'/g;
     return $string;
 }
+
+# parses the setup.php files for all activated plugins and
+# builds static plugin hooks array so we don't have to load
+# ALL plugins are runtime and build the hook array on every
+# page request
+#
+# hook array is saved in config/plugin_hooks.php
+#
+# Note the $verbose variable at the top of this routine
+# can be set to zero to quiet it down.
+#
+# NOTE/FIXME: we aren't necessarily interested in writing
+#             a full-blown PHP parsing engine, so plenty
+#             of assumptions are included herein about the
+#             coding of the plugin setup files, and things
+#             like commented out curly braces or other 
+#             such oddities can break this in a bad way.
+#
+sub build_plugin_hook_array() {
+
+    $verbose = 1;
+
+    if ($verbose) {
+        print "\n\n";
+    }
+
+    if ( open( HOOKFILE, ">plugin_hooks.php" ) ) {
+        print HOOKFILE "<?php\n";
+        print HOOKFILE "\n";
+
+        print HOOKFILE "/**\n";
+        print HOOKFILE " * SquirrelMail Plugin Hook Registration File\n";
+        print HOOKFILE " * Auto-generated using the configure script, conf.pl\n";
+        print HOOKFILE " */\n";
+        print HOOKFILE "\n";
+        print HOOKFILE "global \$squirrelmail_plugin_hooks;\n";
+        print HOOKFILE "\n";
+
+PLUGIN: for ( $ct = 0 ; $ct <= $#plugins ; $ct++ ) {
+
+        if ($verbose) {
+            print "Activating plugin \"" . $plugins[$ct] . "\"...\n";
+        }
+
+        $setup_file = '../plugins/' . $plugins[$ct] . '/setup.php';
+        if ( -e "$setup_file" ) {
+            # Make sure that file is readable
+            if (! -r "$setup_file") {
+                print "\n";
+                print "WARNING:\n";
+                print "The file \"$setup_file\" was found, but you don't\n";
+                print "have rights to read it.  The plugin \"";
+                print $plugins[$ct] . "\" will not be activated until you fix this.\n";
+                print "\nPress enter to continue";
+                $ctu = <STDIN>;
+                print "\n";
+                next;
+            }
+            open( FILE, "$setup_file" );
+            $inside_init_fxn = 0;
+            $brace_count = 0;
+            while ( $line = <FILE> ) {
+
+                # throw away lines until we get to target function
+                #
+                if (!$inside_init_fxn 
+                 && $line !~ /^\s*function\s*squirrelmail_plugin_init_/i) {
+                    next;
+                } 
+                $inside_init_fxn = 1;
+
+
+                # throw away lines that are not exactly one "brace set" deep
+                #
+                if ($brace_count > 1) { 
+                    next;
+                } 
+
+
+                # count open braces
+                #
+                if ($line =~ /{/) {
+                    $brace_count++;
+                } 
+
+
+                # count close braces
+                #
+                if ($line =~ /}/) {
+                    $brace_count--;
+
+                    # leaving <plugin>_init() function...
+                    if ($brace_count == 0) {
+                        close(FILE);
+                        next PLUGIN;
+                    }
+
+                } 
+
+
+                # also not interested in lines that are not
+                # hook registration points
+                #
+                if ($line !~ /^\s*\$squirrelmail_plugin_hooks/i) {
+                    next;
+                } 
+
+
+                # if $line does not have an ending semicolon,
+                # we need to recursively read in subsequent 
+                # lines until we find one
+                while ( $line !~ /;\s*$/ ) {
+                    $line =~ s/[\n\r]\s*$//;
+                    $line .= <FILE>;
+                }
+
+
+                $line =~ s/^\s+//;
+                $line =~ s/^\$//;
+                $var = $line;
+
+                $var =~ s/=/EQUALS/;
+                if ( $var =~ /^([a-z])/i ) {
+                    @options = split ( /\s*EQUALS\s*/, $var );
+                    $options[1] =~ s/[\n\r]//g;
+                    $options[1] =~ s/[\'\"];\s*$//;
+                    $options[1] =~ s/;$//;
+                    $options[1] =~ s/^[\'\"]//;
+                    # de-escape escaped strings
+                    $options[1] =~ s/\\'/'/g;
+                    $options[1] =~ s/\\\\/\\/g;
+
+                    if ( $options[0] =~ /^squirrelmail_plugin_hooks\s*\[\s*['"]([a-z0-9._-]+)['"]\s*\]\s*\[\s*['"]([0-9a-z._-]+)['"]\s*\]/i ) {
+                        $hook_name = $1;
+                        $hooked_plugin_name = $2;
+# FIXME: what to do with this?  shouldn't ever be necessary, but...
+if ($hooked_plugin_name ne $plugins[$ct]) {
+    print "ummmm, plugin is tring to hook in under different name....  what do we do with this???\n";
+}
+
+#FIXME: do we want to count the number of hook registrations for each plugin and warn if a plugin doesn't have any?
+                        # hook registration has been found!
+                        if ($verbose) {
+                            print "   registering on hook \"" . $hook_name . "\"\n";
+                        }
+                        $line =~ s/ {2,}/ /g;
+                        print HOOKFILE "\$$line";
+
+                    }
+
+                }
+
+            }
+            close(FILE);
+
+        } else {
+            print "\n";
+            print "WARNING:\n";
+            print "The file \"$setup_file\" was not found.\n";
+            print "The plugin \"" . $plugins[$ct];
+            print "\" will not be activated until you fix this.\n";
+            print "\nPress enter to continue";
+            $ctu = <STDIN>;
+            print "\n";
+            next;
+        }
+
+    }
+
+    print HOOKFILE "\n\n";
+    close(HOOKFILE);
+#    if ($verbose) {
+        print "\nDone activating plugins; registration data saved in plugin_hooks.php\n\n";
+#    }
+
+    } else {
+
+        print "\n";
+        print "WARNING:\n";
+        print "The file \"plugin_hooks.php\" was not able to be written to.\n";
+        print "No plugins will be activated until you fix this.\n";
+        print "\nPress enter to continue";
+        $ctu = <STDIN>;
+        print "\n";
+
+    }
+
+}
+
index 342d2ac428c156d442b2f61f9f6273cc0ee9f605..2d1528ac45e52c544baf63a7cee480aae9fd0d85 100644 (file)
 function use_plugin ($name) {
     if (file_exists(SM_PATH . "plugins/$name/setup.php")) {
         include_once(SM_PATH . "plugins/$name/setup.php");
-        $function = "squirrelmail_plugin_init_$name";
-        if (function_exists($function)) {
-            $function();
-        }
+
+        /**
+          * As of SM 1.5.2, plugin hook registration is statically
+          * accomplished using the configuration utility (config/conf.pl).
+          * And this code is deprecated (but let's keep it until 
+          * the new registration system is proven).
+          *
+          */
+        //$function = "squirrelmail_plugin_init_$name";
+        //if (function_exists($function)) {
+        //    $function();
+        //}
     }
 }
 
@@ -40,7 +48,8 @@ function do_hook ($name) {
 
     if (isset($squirrelmail_plugin_hooks[$name])
           && is_array($squirrelmail_plugin_hooks[$name])) {
-        foreach ($squirrelmail_plugin_hooks[$name] as $function) {
+        foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) {
+            use_plugin($plugin_name);
             /* Add something to set correct gettext domain for plugin. */
             if (function_exists($function)) {
                 $function($data);
@@ -73,7 +82,8 @@ function filter_hook_function($name,$parm=NULL) {
 
     if (isset($squirrelmail_plugin_hooks[$name])
           && is_array($squirrelmail_plugin_hooks[$name])) {
-        foreach ($squirrelmail_plugin_hooks[$name] as $function) {
+        foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) {
+            use_plugin($plugin_name);
             /* Add something to set correct gettext domain for plugin. */
             if (function_exists($function)) {
                 $parm = $function($parm);
@@ -102,7 +112,8 @@ function do_hook_function($name,$parm=NULL) {
 
     if (isset($squirrelmail_plugin_hooks[$name])
           && is_array($squirrelmail_plugin_hooks[$name])) {
-        foreach ($squirrelmail_plugin_hooks[$name] as $function) {
+        foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) {
+            use_plugin($plugin_name);
             /* Add something to set correct gettext domain for plugin. */
             if (function_exists($function)) {
                 $ret = $function($parm);
@@ -146,7 +157,8 @@ function concat_hook_function($name,$parm=NULL) {
 
     if (isset($squirrelmail_plugin_hooks[$name])
           && is_array($squirrelmail_plugin_hooks[$name])) {
-        foreach ($squirrelmail_plugin_hooks[$name] as $function) {
+        foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) {
+            use_plugin($plugin_name);
             /* Add something to set correct gettext domain for plugin. */
             if (function_exists($function)) {
                 $plugin_ret = $function($parm);
@@ -188,7 +200,8 @@ function boolean_hook_function($name,$parm=NULL,$priority=0,$tie=false) {
 
         /* Loop over the plugins that registered the hook */
         $currentHookName = $name;
-        foreach ($squirrelmail_plugin_hooks[$name] as $function) {
+        foreach ($squirrelmail_plugin_hooks[$name] as $plugin_name => $function) {
+            use_plugin($plugin_name);
             if (function_exists($function)) {
                 $ret = $function($parm);
                 if ($ret) {
index 1db44003f37effc3c89ba5f2f0ed382209a2eb96..6a0d70e1b362bbc3abb883e0243c26fe0201f385 100644 (file)
@@ -268,20 +268,13 @@ if (file_exists(SM_PATH . 'plugins/compatibility/functions.php'))
     include_once(SM_PATH . 'plugins/compatibility/functions.php');
 $squirrelmail_plugin_hooks = array();
 
-/* On init, register all plugins configured for use. */
-if (isset($plugins) && is_array($plugins)) {
-    // turn on output buffering in order to prevent output of new lines
-    ob_start();
-    foreach ($plugins as $name) {
-        use_plugin($name);
-    }
-    // get output and remove whitespace
-    $output = trim(ob_get_contents());
-    ob_end_clean();
-    // if plugins output more than newlines and spacing, stop script execution.
-    if (!empty($output)) {
-        die($output);
-    }
+/**
+ * On init, we no longer need to load all plugin setup files. 
+ * Now, we load the statically generated hook registrations here
+ * and let the hook calls include only the plugins needed.
+ */
+if (file_exists(SM_PATH . 'config/plugin_hooks.php')) {
+    include_once(SM_PATH . 'config/plugin_hooks.php');
 }
 
 /**