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 ++++++++++++++++++++++++++++ extensions/example/version.pl | 31 +++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 extensions/example/version.pl 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 diff --git a/extensions/example/version.pl b/extensions/example/version.pl new file mode 100644 index 000000000..c1305f92f --- /dev/null +++ b/extensions/example/version.pl @@ -0,0 +1,31 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# The contents of this file are subject to the Mozilla Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/MPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is the Bugzilla Example WebService Plugin +# +# The Initial Developer of the Original Code is Everything Solved, Inc. +# Portions created by Everything Solved, Inc. are Copyright (C) 2007 +# Everything Solved, Inc. All Rights Reserved. +# +# Contributor(s): Max Kanat-Alexander + +# This script does some code to return a version number. However, +# most plugins will probably just want to return a raw string. +# To do that, the only contents of the file should be the string +# on a single line, like: +# +# '1.2.3'; + +use strict; +no warnings qw(void); # Avoid "useless use of a constant in void context" +use Bugzilla::Constants; +BUGZILLA_VERSION; -- cgit v1.2.3-24-g4f1b