From dc4fc18fa7c860932fc8a30b52c828028369562e Mon Sep 17 00:00:00 2001 From: "mkanat%bugzilla.org" <> Date: Fri, 19 Oct 2007 13:07:28 +0000 Subject: Bug 396245: Allow the WebService to list the installed plugins and their versions Patch By Max Kanat-Alexander r=ghendricks, a=mkanat --- Bugzilla/Hook.pm | 35 ++++++++++++++++++++++++++++++++++- Bugzilla/WebService/Bugzilla.pm | 28 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) (limited to 'Bugzilla') diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm index 9d65fbe69..7c47b3f3f 100644 --- a/Bugzilla/Hook.pm +++ b/Bugzilla/Hook.pm @@ -41,6 +41,8 @@ sub process { # If there's malicious data here, we have much bigger issues to # worry about, so we can safely detaint them: trick_taint($extension); + # Skip CVS directories and any hidden files/dirs. + next if $extension =~ m{/CVS$} || $extension =~ m{/\.[^/]+$}; next if -e "$extension/disabled"; if (-e $extension.'/code/'.$name.'.pl') { Bugzilla->hook_args($args); @@ -53,7 +55,28 @@ sub process { Bugzilla->hook_args({}); } } - +} + +sub enabled_plugins { + my $extdir = bz_locations()->{'extensionsdir'}; + my @extensions = glob("$extdir/*"); + my %enabled; + foreach my $extension (@extensions) { + trick_taint($extension); + my $extname = $extension; + $extname =~ s{^\Q$extdir\E/}{}; + next if $extname eq 'CVS' || $extname =~ /^\./; + next if -e "$extension/disabled"; + # Allow extensions to load their own libraries. + local @INC = ("$extension/lib", @INC); + $enabled{$extname} = do("$extension/version.pl"); + ThrowCodeError('extension_invalid', + { errstr => $@, name => 'version', + extension => $extension }) if $@; + + } + + return \%enabled; } 1; @@ -78,6 +101,10 @@ hooks. When a piece of standard Bugzilla code wants to allow an extension to perform additional functions, it uses Bugzilla::Hook's L subroutine to invoke any extension code if installed. +There is a sample extension in F that demonstrates +most of the things described in this document, as well as many of the +hooks available. + =head2 How Hooks Work When a hook named C is run, Bugzilla will attempt to invoke any @@ -96,6 +123,12 @@ These params are accessible through L. That returns a hashref. Very frequently, if you want your hook to do anything, you have to modify these variables. +=head2 Versioning Extensions + +Every extension must have a file in its root called F. +This file should return a version number when called with C. +This represents the current version of this extension. + =head1 SUBROUTINES =over diff --git a/Bugzilla/WebService/Bugzilla.pm b/Bugzilla/WebService/Bugzilla.pm index 1eeeebddc..c6b0218cf 100755 --- a/Bugzilla/WebService/Bugzilla.pm +++ b/Bugzilla/WebService/Bugzilla.pm @@ -21,6 +21,7 @@ package Bugzilla::WebService::Bugzilla; use strict; use base qw(Bugzilla::WebService); use Bugzilla::Constants; +use Bugzilla::Hook; import SOAP::Data qw(type); use Time::Zone; @@ -29,6 +30,14 @@ sub version { return { version => type('string')->value(BUGZILLA_VERSION) }; } +sub plugins { + my $plugins = Bugzilla::Hook::enabled_plugins(); + foreach my $name (keys %$plugins) { + $plugins->{$name} = type('string')->value($plugins->{$name}); + } + return { plugins => $plugins }; +} + sub timezone { my $offset = tz_offset(); $offset = (($offset / 60) / 60) * 100; @@ -74,6 +83,25 @@ string. =back +=item C B + +=over + +=item B + +Gets information about the plugins that are currently installed and enabled +in this Bugzilla. + +=item B (none) + +=item B + +A hash with a single item, C. This points to a hash. I hash +contains the names of plugins as keys, and the versions of the plugin as +values. + +=back + =item C B =over -- cgit v1.2.3-24-g4f1b