summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormkanat%bugzilla.org <>2007-10-19 15:07:28 +0200
committermkanat%bugzilla.org <>2007-10-19 15:07:28 +0200
commitdc4fc18fa7c860932fc8a30b52c828028369562e (patch)
tree4111a549cb69e4db8ebbed06342417256d75e3b9
parentf567c6d3e3d99e9ba5087a6abc663fe61e9d5985 (diff)
downloadbugzilla-dc4fc18fa7c860932fc8a30b52c828028369562e.tar.gz
bugzilla-dc4fc18fa7c860932fc8a30b52c828028369562e.tar.xz
Bug 396245: Allow the WebService to list the installed plugins and their versions
Patch By Max Kanat-Alexander <mkanat@bugzilla.org> r=ghendricks, a=mkanat
-rw-r--r--Bugzilla/Hook.pm35
-rwxr-xr-xBugzilla/WebService/Bugzilla.pm28
-rw-r--r--extensions/example/version.pl31
3 files changed, 93 insertions, 1 deletions
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</process>
subroutine to invoke any extension code if installed.
+There is a sample extension in F<extensions/example/> 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<HOOK_NAME> is run, Bugzilla will attempt to invoke any
@@ -96,6 +123,12 @@ These params are accessible through L<Bugzilla/hook_args>.
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<version.pl>.
+This file should return a version number when called with C<do>.
+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<plugins> B<EXPERIMENTAL>
+
+=over
+
+=item B<Description>
+
+Gets information about the plugins that are currently installed and enabled
+in this Bugzilla.
+
+=item B<Params> (none)
+
+=item B<Returns>
+
+A hash with a single item, C<plugins>. This points to a hash. I<That> hash
+contains the names of plugins as keys, and the versions of the plugin as
+values.
+
+=back
+
=item C<timezone> B<EXPERIMENTAL>
=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 <mkanat@bugzilla.org>
+
+# 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;