View | Details | Raw Unified | Return to bug 7804
Collapse All | Expand All

(-)a/C4/Auth.pm (-1 / +3 lines)
Lines 133-139 EOQ Link Here
133
sub get_template_and_user {
133
sub get_template_and_user {
134
    my $in       = shift;
134
    my $in       = shift;
135
    my $template =
135
    my $template =
136
      C4::Templates::gettemplate( $in->{'template_name'}, $in->{'type'}, $in->{'query'} );
136
      C4::Templates::gettemplate( $in->{'template_name'}, $in->{'type'}, $in->{'query'}, $in->{'is_plugin'} );
137
    my ( $user, $cookie, $sessionID, $flags );
137
    my ( $user, $cookie, $sessionID, $flags );
138
    if ( $in->{'template_name'} !~m/maintenance/ ) {
138
    if ( $in->{'template_name'} !~m/maintenance/ ) {
139
        ( $user, $cookie, $sessionID, $flags ) = checkauth(
139
        ( $user, $cookie, $sessionID, $flags ) = checkauth(
Lines 203-208 sub get_template_and_user { Link Here
203
            $template->param( CAN_user_serials          => 1 );
203
            $template->param( CAN_user_serials          => 1 );
204
            $template->param( CAN_user_reports          => 1 );
204
            $template->param( CAN_user_reports          => 1 );
205
            $template->param( CAN_user_staffaccess      => 1 );
205
            $template->param( CAN_user_staffaccess      => 1 );
206
            $template->param( CAN_user_plugins          => 1 );
206
            foreach my $module (keys %$all_perms) {
207
            foreach my $module (keys %$all_perms) {
207
                foreach my $subperm (keys %{ $all_perms->{$module} }) {
208
                foreach my $subperm (keys %{ $all_perms->{$module} }) {
208
                    $template->param( "CAN_user_${module}_${subperm}" => 1 );
209
                    $template->param( "CAN_user_${module}_${subperm}" => 1 );
Lines 364-369 sub get_template_and_user { Link Here
364
            OPACLocalCoverImages        => C4::Context->preference('OPACLocalCoverImages'),
365
            OPACLocalCoverImages        => C4::Context->preference('OPACLocalCoverImages'),
365
            AllowMultipleCovers         => C4::Context->preference('AllowMultipleCovers'),
366
            AllowMultipleCovers         => C4::Context->preference('AllowMultipleCovers'),
366
            EnableBorrowerFiles         => C4::Context->preference('EnableBorrowerFiles'),
367
            EnableBorrowerFiles         => C4::Context->preference('EnableBorrowerFiles'),
368
            UseKohaPlugins              => C4::Context->preference('UseKohaPlugins'),
367
        );
369
        );
368
    }
370
    }
369
    else {
371
    else {
(-)a/C4/Installer/PerlDependencies.pm (+40 lines)
Lines 634-639 our $PERL_DEPS = { Link Here
634
        'required' => '0',
634
        'required' => '0',
635
        'min_ver'  => '0.22',
635
        'min_ver'  => '0.22',
636
    },
636
    },
637
    'File::Temp' => {
638
        'usage'    => 'Plugins',
639
        'required' => '0',
640
        'min_ver'  => '0.22',
641
    },
642
    'File::Copy' => {
643
        'usage'    => 'Plugins',
644
        'required' => '0',
645
        'min_ver'  => '2.08',
646
    },
647
    'File::Path' => {
648
        'usage'    => 'Plugins',
649
        'required' => '0',
650
        'min_ver'  => '2.07',
651
    },
652
    'Archive::Extract' => {
653
        'usage'    => 'Plugins',
654
        'required' => '0',
655
        'min_ver'  => '0.60',
656
    },
657
    'Archive::Zip' => {
658
        'usage'    => 'Plugins',
659
        'required' => '0',
660
        'min_ver'  => '1.30',
661
    },
662
    'Module::Load::Conditional' => {
663
        'usage'    => 'Plugins',
664
        'required' => '0',
665
        'min_ver'  => '0.38',
666
    },
667
    'Module::Bundled::Files' => {
668
        'usage'    => 'Plugins',
669
        'required' => '0',
670
        'min_ver'  => '0.03',
671
    },
672
    'Module::Pluggable' => {
673
        'usage'    => 'Plugins',
674
        'required' => '0',
675
        'min_ver'  => '3.9',
676
    },
637
};
677
};
638
678
639
1;
679
1;
(-)a/C4/Templates.pm (-1 / +3 lines)
Lines 228-240 sub _get_template_file { Link Here
228
228
229
229
230
sub gettemplate {
230
sub gettemplate {
231
    my ( $tmplbase, $interface, $query ) = @_;
231
    my ( $tmplbase, $interface, $query, $is_plugin ) = @_;
232
    ($query) or warn "no query in gettemplate";
232
    ($query) or warn "no query in gettemplate";
233
    my $path = C4::Context->preference('intranet_includes') || 'includes';
233
    my $path = C4::Context->preference('intranet_includes') || 'includes';
234
    $tmplbase =~ s/\.tmpl$/.tt/;
234
    $tmplbase =~ s/\.tmpl$/.tt/;
235
    my ($htdocs, $theme, $lang, $filename)
235
    my ($htdocs, $theme, $lang, $filename)
236
       =  _get_template_file($tmplbase, $interface, $query);
236
       =  _get_template_file($tmplbase, $interface, $query);
237
    $filename = $tmplbase if ( $is_plugin );
237
    my $template = C4::Templates->new($interface, $filename, $tmplbase, $query);
238
    my $template = C4::Templates->new($interface, $filename, $tmplbase, $query);
239
238
# NOTE: Commenting these out rather than deleting them so that those who need
240
# NOTE: Commenting these out rather than deleting them so that those who need
239
# to know how we previously shimmed these directories will be able to understand.
241
# to know how we previously shimmed these directories will be able to understand.
240
#    my $is_intranet = $interface eq 'intranet';
242
#    my $is_intranet = $interface eq 'intranet';
(-)a/Koha/Plugins.pm (+89 lines)
Line 0 Link Here
1
package Koha::Plugins;
2
3
# Copyright 2012 Kyle Hall
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
22
use Module::Load::Conditional qw(can_load);
23
use Module::Pluggable search_path => ['Koha::Plugin'];
24
25
use C4::Context;
26
use C4::Output;
27
28
BEGIN {
29
    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") );
30
31
    push @INC, C4::Context->config("pluginsdir");
32
}
33
34
=head1 NAME
35
36
Koha::Plugins - Module for loading and managing plugins.
37
38
=cut
39
40
sub new {
41
    my ( $class, $args ) = @_;
42
43
    $args->{'pluginsdir'} = C4::Context->config("pluginsdir");
44
45
    return bless( $args, $class );
46
}
47
48
=item GetPlugins()
49
50
This will return a list of all the available plugins of the passed type.
51
52
Usage: my @plugins = C4::Plugins::GetPlugins( $method );
53
54
At the moment, the available types are 'report' and 'tool'.
55
=cut
56
57
sub GetPlugins {
58
    my $self   = shift;
59
    my $method = shift;
60
61
    my @plugin_classes = $self->plugins();
62
    my @plugins;
63
64
    foreach my $plugin_class (@plugin_classes) {
65
        if ( can_load( modules => { $plugin_class => undef } ) ) {
66
            my $plugin = $plugin_class->new();
67
68
            if ($method) {
69
                if ( $plugin->can($method) ) {
70
                    push( @plugins, $plugin );
71
                }
72
            } else {
73
                push( @plugins, $plugin );
74
            }
75
        }
76
    }
77
    return @plugins;
78
}
79
80
1;
81
__END__
82
83
=back
84
85
=head1 AUTHOR
86
87
Kyle M Hall <kyle.m.hall@gmail.com>
88
89
=cut
(-)a/Koha/Plugins/Base.pm (+194 lines)
Line 0 Link Here
1
package Koha::Plugins::Base;
2
3
# Copyright 2012 Kyle Hall
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
22
use Module::Pluggable require => 1;
23
24
use base qw{Module::Bundled::Files};
25
26
use Template;
27
28
use C4::Context;
29
use C4::Auth;
30
31
BEGIN {
32
    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") );
33
34
    push @INC, C4::Context->config("pluginsdir");
35
}
36
37
=head1 NAME
38
39
C4::Plugins::Base - Base Module for plugins
40
41
=cut
42
43
sub new {
44
    my ( $class, $args ) = @_;
45
46
    $args->{'class'} = $class;
47
    $args->{'template'} = Template->new( { ABSOLUTE => 1 } );
48
49
    my $self = bless( $args, $class );
50
51
    ## Run the installation method if it exists and hasn't been run before
52
    if ( $self->can('install') && !$self->retrieve_data('__INSTALLED__') ) {
53
        if ( $self->install() ) {
54
            $self->store_data( { '__INSTALLED__' => 1 } );
55
        } else {
56
            warn "Plugin $class failed during installation!";
57
        }
58
    }
59
60
    return $self;
61
}
62
63
=head2 store_data
64
65
set_data allows a plugin to store key value pairs in the database for future use.
66
67
usage: $self->set_data({ param1 => 'param1val', param2 => 'param2value' })
68
69
=cut
70
71
sub store_data {
72
    my ( $self, $data ) = @_;
73
74
    my $dbh = C4::Context->dbh;
75
    my $sql = "REPLACE INTO plugin_data SET plugin_class = ?, plugin_key = ?, plugin_value = ?";
76
    my $sth = $dbh->prepare($sql);
77
78
    foreach my $key ( keys %$data ) {
79
        $sth->execute( $self->{'class'}, $key, $data->{$key} );
80
    }
81
}
82
83
=head2 retrieve_data
84
85
retrieve_data allows a plugin to read the values that were previously saved with store_data
86
87
usage: my $value = $self->retrieve_data( $key );
88
89
=cut
90
91
sub retrieve_data {
92
    my ( $self, $key ) = @_;
93
94
    my $dbh = C4::Context->dbh;
95
    my $sql = "SELECT plugin_value FROM plugin_data WHERE plugin_class = ? AND plugin_key = ?";
96
    my $sth = $dbh->prepare($sql);
97
    $sth->execute( $self->{'class'}, $key );
98
    my $row = $sth->fetchrow_hashref();
99
100
    return $row->{'plugin_value'};
101
}
102
103
=head2 get_template
104
105
get_template returns a Template object. Eventually this will probably be calling
106
C4:Template, but at the moment, it does not.
107
108
=cut
109
110
sub get_template {
111
    my ( $self, $args ) = @_;
112
113
    #    my $template =
114
    #      C4::Templates->new( my $interface = 'intranet', my $filename = $self->mbf_path( $args->{'file'} ), my $tmplbase = '', my $query = $self->{'cgi'} );
115
116
    my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
117
        {   template_name   => $self->mbf_path( $args->{'file'} ),
118
            query           => $self->{'cgi'},
119
            type            => "intranet",
120
            authnotrequired => 1,
121
#           flagsrequired   => { tools => '*' },
122
            is_plugin       => 1,
123
        }
124
    );
125
126
    $template->param(
127
        CLASS       => $self->{'class'},
128
        METHOD      => $self->{'cgi'}->param('method'),
129
        PLUGIN_PATH => $self->get_plugin_http_path(),
130
    );
131
132
    return $template;
133
}
134
135
sub get_metadata {
136
    my ( $self, $args ) = @_;
137
138
    return $self->{'metadata'};
139
}
140
141
=head2 get_qualified_table_name
142
143
To avoid naming conflict, each plugins tables should use a fully qualified namespace.
144
To avoid hardcoding and make plugins more flexible, this method will return the proper
145
fully qualified table name.
146
147
usage: my $table = $self->get_qualified_table_name( 'myTable' );
148
149
=cut
150
151
sub get_qualified_table_name {
152
    my ( $self, $table_name ) = @_;
153
154
    return lc( join( '_', split( '::', $self->{'class'} ), $table_name ) );
155
}
156
157
=head2 get_plugin_http_path
158
159
To access a plugin's own resources ( images, js files, css files, etc... )
160
a plugin will need to know what path to use in the template files. This
161
method returns that path.
162
163
usage: my $path = $self->get_plugin_http_path();
164
165
=cut
166
167
sub get_plugin_http_path {
168
    my ($self) = @_;
169
170
    return "/plugin/" . join( '/', split( '::', $self->{'class'} ) );
171
}
172
173
=head2
174
175
   go_home is a quick redirect to the Koha plugins home page
176
177
=cut
178
179
sub go_home {
180
    my ( $self, $params ) = @_;
181
182
    print $self->{'cgi'}->redirect("/cgi-bin/koha/plugins/plugins-home.pl");
183
}
184
185
1;
186
__END__
187
188
=back
189
190
=head1 AUTHOR
191
192
Kyle M Hall <kyle.m.hall@gmail.com>
193
194
=cut
(-)a/Koha/Plugins/Handler.pm (+100 lines)
Line 0 Link Here
1
package Koha::Plugins::Handler;
2
3
# Copyright 2012 Kyle Hall
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use Modern::Perl;
21
22
use File::Path qw(remove_tree);
23
24
use Module::Load::Conditional qw(can_load);
25
26
use C4::Context;
27
28
BEGIN {
29
    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") );
30
31
    push @INC, C4::Context->config("pluginsdir");
32
}
33
34
=head1 NAME
35
36
C4::Plugins::Handler - Handler Module for running plugins
37
38
=head1 SYNOPSIS
39
40
  Koha::Plugins::Handler->run({ class => $class, method => $method, cgi => $cgi });
41
  $p->run();
42
43
=over 2
44
45
=cut
46
47
=item run
48
49
Runs a plugin
50
51
=cut
52
53
sub run {
54
    my ( $class, $args ) = @_;
55
    my $plugin_class  = $args->{'class'};
56
    my $plugin_method = $args->{'method'};
57
    my $cgi           = $args->{'cgi'};
58
59
    if ( can_load( modules => { $plugin_class => undef } ) ) {
60
        my $plugin = $plugin_class->new( { cgi => $cgi } );
61
        if ( $plugin->can($plugin_method) ) {
62
            $plugin->$plugin_method();
63
        } else {
64
            warn "Plugin does not have method $plugin_method";
65
        }
66
    } else {
67
        warn "Plugin $plugin_class cannot be loaded";
68
    }
69
}
70
71
=item delete
72
73
Deletes a plugin
74
75
=cut
76
77
sub delete {
78
    my ( $class, $args ) = @_;
79
    my $plugin_class = $args->{'class'};
80
    my $plugin_dir   = C4::Context->config("pluginsdir");
81
    my $plugin_path  = "$plugin_dir/" . join( '/', split( '::', $args->{'class'} ) );
82
83
    Koha::Plugins::Handler->run( { class => $plugin_class, method => 'uninstall' } );
84
85
    C4::Context->dbh->do( "DELETE FROM plugin_data WHERE plugin_class = ?", undef, ($plugin_class) );
86
87
    unlink("$plugin_path.pm");
88
    remove_tree($plugin_path);
89
}
90
91
1;
92
__END__
93
94
=back
95
96
=head1 AUTHOR
97
98
Kyle M Hall <kyle.m.hall@gmail.com>
99
100
=cut
(-)a/Makefile.PL (-1 / +9 lines)
Lines 230-235 Directory for Apache and Zebra logs produced by Koha. Link Here
230
230
231
Directory for backup files produced by Koha.
231
Directory for backup files produced by Koha.
232
232
233
=item PLUGINS_DIR
234
235
Directory for external Koha plugins.
236
233
=item PAZPAR2_CONF_DIR
237
=item PAZPAR2_CONF_DIR
234
238
235
Directory for PazPar2 configuration files.
239
Directory for PazPar2 configuration files.
Lines 309-314 my $target_map = { Link Here
309
  './skel/var/lib/koha/zebradb/biblios/register'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
313
  './skel/var/lib/koha/zebradb/biblios/register'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
310
  './skel/var/lib/koha/zebradb/biblios/shadow'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
314
  './skel/var/lib/koha/zebradb/biblios/shadow'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
311
  './skel/var/lib/koha/zebradb/biblios/tmp'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
315
  './skel/var/lib/koha/zebradb/biblios/tmp'  => { target => 'ZEBRA_DATA_DIR', trimdir => 6 },
316
  './skel/var/lib/koha/plugins' => { target => 'PLUGINS_DIR', trimdir => 6 },
312
  './sms'                       => 'INTRANET_CGI_DIR',
317
  './sms'                       => 'INTRANET_CGI_DIR',
313
  './suggestion'                => 'INTRANET_CGI_DIR',
318
  './suggestion'                => 'INTRANET_CGI_DIR',
314
  './svc'                       => 'INTRANET_CGI_DIR',
319
  './svc'                       => 'INTRANET_CGI_DIR',
Lines 1235-1240 sub get_target_directories { Link Here
1235
        $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'zebradb');
1240
        $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'zebradb');
1236
        $dirmap{'LOG_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'log');
1241
        $dirmap{'LOG_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'log');
1237
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1242
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1243
        $dirmap{'PLUGINS_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'koha', 'plugins');
1238
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1244
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1239
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1245
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1240
    } elsif ($mode eq 'dev') {
1246
    } elsif ($mode eq 'dev') {
Lines 1265-1270 sub get_target_directories { Link Here
1265
        $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'zebradb');
1271
        $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(@basedir, $package, 'var', 'lock', 'zebradb');
1266
        $dirmap{'LOG_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'log');
1272
        $dirmap{'LOG_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'log');
1267
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1273
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'spool');
1274
        $dirmap{'PLUGINS_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'plugins');
1268
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1275
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'lib', 'zebradb');
1269
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1276
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(@basedir, $package, 'var', 'run', 'zebradb');
1270
    } else {
1277
    } else {
Lines 1287-1292 sub get_target_directories { Link Here
1287
        $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'var', 'lock', $package, 'zebradb');
1294
        $dirmap{'ZEBRA_LOCK_DIR'} = File::Spec->catdir(File::Spec->rootdir(), 'var', 'lock', $package, 'zebradb');
1288
        $dirmap{'LOG_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'log', $package);
1295
        $dirmap{'LOG_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'log', $package);
1289
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'spool', $package);
1296
        $dirmap{'BACKUP_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'spool', $package);
1297
        $dirmap{'PLUGINS_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'lib', $package, 'plugins');
1290
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'lib', $package, 'zebradb');
1298
        $dirmap{'ZEBRA_DATA_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'lib', $package, 'zebradb');
1291
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'run', $package, 'zebradb');
1299
        $dirmap{'ZEBRA_RUN_DIR'} =  File::Spec->catdir(File::Spec->rootdir(), 'var', 'run', $package, 'zebradb');
1292
    }
1300
    }
Lines 1560-1566 make_upgrade_backup :: Link Here
1560
\t\$(NOECHO) umask 022; \$(MOD_BACKUP) \\
1568
\t\$(NOECHO) umask 022; \$(MOD_BACKUP) \\
1561
/;
1569
/;
1562
    foreach my $key (qw/KOHA_CONF_DIR INTRANET_TMPL_DIR INTRANET_WWW_DIR OPAC_TMPL_DIR OPAC_WWW_DIR
1570
    foreach my $key (qw/KOHA_CONF_DIR INTRANET_TMPL_DIR INTRANET_WWW_DIR OPAC_TMPL_DIR OPAC_WWW_DIR
1563
                     PAZPAR2_CONF_DIR ZEBRA_CONF_DIR/) {
1571
                     PAZPAR2_CONF_DIR ZEBRA_CONF_DIR PLUGINS_DIR/) {
1564
    	$upgrade .= "\t\t\$(KOHA_INST_$key) \$(KOHA_DEST_$key) \\\n"
1572
    	$upgrade .= "\t\t\$(KOHA_INST_$key) \$(KOHA_DEST_$key) \\\n"
1565
            unless ($config{'INSTALL_ZEBRA'} ne "yes" and $key =~ /ZEBRA/) or
1573
            unless ($config{'INSTALL_ZEBRA'} ne "yes" and $key =~ /ZEBRA/) or
1566
                   exists $skip_directories->{$key} or
1574
                   exists $skip_directories->{$key} or
(-)a/debian/templates/koha-conf-site.xml.in (+2 lines)
Lines 257-262 Link Here
257
 <biblioservershadow>1</biblioservershadow>
257
 <biblioservershadow>1</biblioservershadow>
258
 <authorityserver>authorities</authorityserver>
258
 <authorityserver>authorities</authorityserver>
259
 <authorityservershadow>1</authorityservershadow>
259
 <authorityservershadow>1</authorityservershadow>
260
 <pluginsdir>__PLUGINS_DIR__</pluginsdir>
261
 <enable_plugins>0</enable_plugins>
260
 <intranetdir>/usr/share/koha/intranet/cgi-bin</intranetdir>
262
 <intranetdir>/usr/share/koha/intranet/cgi-bin</intranetdir>
261
 <opacdir>/usr/share/koha/opac/cgi-bin/opac</opacdir>
263
 <opacdir>/usr/share/koha/opac/cgi-bin/opac</opacdir>
262
 <opachtdocs>/usr/share/koha/opac/htdocs/opac-tmpl</opachtdocs>
264
 <opachtdocs>/usr/share/koha/opac/htdocs/opac-tmpl</opachtdocs>
(-)a/etc/koha-conf.xml (+1 lines)
Lines 276-281 __PAZPAR2_TOGGLE_XML_POST__ Link Here
276
 <biblioservershadow>1</biblioservershadow>
276
 <biblioservershadow>1</biblioservershadow>
277
 <authorityserver>authorities</authorityserver>
277
 <authorityserver>authorities</authorityserver>
278
 <authorityservershadow>1</authorityservershadow>
278
 <authorityservershadow>1</authorityservershadow>
279
 <pluginsdir>__PLUGINS_DIR__</pluginsdir>
279
 <intranetdir>__INTRANET_CGI_DIR__</intranetdir>
280
 <intranetdir>__INTRANET_CGI_DIR__</intranetdir>
280
 <opacdir>__OPAC_CGI_DIR__/opac</opacdir>
281
 <opacdir>__OPAC_CGI_DIR__/opac</opacdir>
281
 <opachtdocs>__OPAC_TMPL_DIR__</opachtdocs>
282
 <opachtdocs>__OPAC_TMPL_DIR__</opachtdocs>
(-)a/etc/koha-httpd.conf (+1 lines)
Lines 105-110 Link Here
105
   ScriptAlias /cgi-bin/koha/ "__INTRANET_CGI_DIR__/"
105
   ScriptAlias /cgi-bin/koha/ "__INTRANET_CGI_DIR__/"
106
   ScriptAlias /index.html "__INTRANET_CGI_DIR__/mainpage.pl"
106
   ScriptAlias /index.html "__INTRANET_CGI_DIR__/mainpage.pl"
107
   ScriptAlias /search "__INTRANET_CGI_DIR__/search.pl"
107
   ScriptAlias /search "__INTRANET_CGI_DIR__/search.pl"
108
   Alias /plugin/ "__PLUGINS_DIR__/"
108
   ErrorLog __LOG_DIR__/koha-error_log
109
   ErrorLog __LOG_DIR__/koha-error_log
109
#  TransferLog __LOG_DIR__/koha-access.log
110
#  TransferLog __LOG_DIR__/koha-access.log
110
   SetEnv KOHA_CONF "__KOHA_CONF_DIR__/koha-conf.xml"
111
   SetEnv KOHA_CONF "__KOHA_CONF_DIR__/koha-conf.xml"
(-)a/installer/data/mysql/kohastructure.sql (+11 lines)
Lines 3056-3061 CREATE TABLE IF NOT EXISTS `borrower_modifications` ( Link Here
3056
  KEY `borrowernumber` (`borrowernumber`)
3056
  KEY `borrowernumber` (`borrowernumber`)
3057
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3057
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3058
3058
3059
--
3060
-- Table structure for table 'plugin_data'
3061
--
3062
3063
CREATE TABLE IF NOT EXISTS plugin_data (
3064
  plugin_class varchar(255) NOT NULL,
3065
  plugin_key varchar(255) NOT NULL,
3066
  plugin_value text,
3067
  PRIMARY KEY (plugin_class,plugin_key)
3068
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3069
3059
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
3070
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
3060
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
3071
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
3061
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
3072
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
(-)a/installer/data/mysql/sysprefs.sql (+1 lines)
Lines 406-408 INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES(' Link Here
406
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('NotesBlacklist','','List of notes fields that should not appear in the title notes/description separator of details',NULL,'free');
406
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('NotesBlacklist','','List of notes fields that should not appear in the title notes/description separator of details',NULL,'free');
407
INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('SCOUserCSS', '', NULL, 'Add CSS to be included in the SCO module in an embedded <style> tag.', 'free');
407
INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('SCOUserCSS', '', NULL, 'Add CSS to be included in the SCO module in an embedded <style> tag.', 'free');
408
INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('SCOUserJS', '', NULL, 'Define custom javascript for inclusion in the SCO module', 'free');
408
INSERT INTO systempreferences (variable,value,options,explanation,type) VALUES ('SCOUserJS', '', NULL, 'Define custom javascript for inclusion in the SCO module', 'free');
409
INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UseKohaPlugins','1','Enable or disable the ability to use Koha Plugins.','','YesNo');
(-)a/installer/data/mysql/updatedatabase.pl (+24 lines)
Lines 6339-6344 if ( CheckVersion($DBversion) ) { Link Here
6339
   SetVersion ($DBversion);
6339
   SetVersion ($DBversion);
6340
}
6340
}
6341
6341
6342
$DBversion = "3.11.00.XXX";
6343
if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
6344
    $dbh->do("INSERT INTO userflags (bit, flag, flagdesc, defaulton) VALUES ('19', 'plugins', 'Koha plugins', '0')");
6345
    $dbh->do("INSERT INTO permissions (module_bit, code, description) VALUES 
6346
              ('19', 'manage', 'Manage plugins ( install / uninstall )'), 
6347
              ('19', 'tool', 'Use tool plugins'), 
6348
              ('19', 'report', 'Use report plugins'),
6349
              ('19', 'configure', 'Configure plugins')
6350
            ");
6351
    $dbh->do("INSERT INTO systempreferences (variable,value,explanation,options,type) VALUES('UseKohaPlugins','1','Enable or disable the ability to use Koha Plugins.','','YesNo')");
6352
6353
    $dbh->do("
6354
        CREATE TABLE IF NOT EXISTS plugin_data (
6355
            plugin_class varchar(255) NOT NULL,
6356
            plugin_key varchar(255) NOT NULL,
6357
            plugin_value text,
6358
            PRIMARY KEY (plugin_class,plugin_key)
6359
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
6360
    ");  
6361
6362
    print "Upgrade to $DBversion done (Added plugin system.)\n";
6363
    SetVersion($DBversion);
6364
}
6365
6342
=head1 FUNCTIONS
6366
=head1 FUNCTIONS
6343
6367
6344
=head2 TableExists($table)
6368
=head2 TableExists($table)
(-)a/koha-tmpl/intranet-tmpl/prog/en/includes/header.inc (+3 lines)
Lines 34-39 Link Here
34
                            [% IF ( CAN_user_tools ) %]
34
                            [% IF ( CAN_user_tools ) %]
35
                            <li><a href="/cgi-bin/koha/tools/tools-home.pl">Tools</a></li>
35
                            <li><a href="/cgi-bin/koha/tools/tools-home.pl">Tools</a></li>
36
                            [% END %]
36
                            [% END %]
37
                            [% IF ( UseKohaPlugins && CAN_user_plugins ) %]
38
                            <li><a href="/cgi-bin/koha/plugins/plugins-home.pl">Plugins</a></li>
39
                            [% END %]
37
                            [% IF ( CAN_user_parameters ) %]
40
                            [% IF ( CAN_user_parameters ) %]
38
                            <li><a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a></li>
41
                            <li><a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a></li>
39
                            [% END %]
42
                            [% END %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/enhanced_content.pref (+7 lines)
Lines 300-302 Enhanced Content: Link Here
300
            - pref: HTML5MediaExtensions
300
            - pref: HTML5MediaExtensions
301
              class: multi
301
              class: multi
302
            - (separated with |).
302
            - (separated with |).
303
    Plugins:
304
        -
305
            - pref: UseKohaPlugins
306
              choices:
307
                  yes: Enable
308
                  no: "Don't enable"
309
            - the ability to use Koha Plugins. Note, the plugin system must also be enabled in the Koha configuration file to be fully enabled.
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/plugins/plugins-home.tt (+116 lines)
Line 0 Link Here
1
[% USE KohaDates %]
2
[% INCLUDE 'doc-head-open.inc' %]
3
<title>Koha &rsaquo; Tools &rsaquo; Plugins </title>
4
[% INCLUDE 'doc-head-close.inc' %]
5
[% INCLUDE 'calendar.inc' %]
6
</head>
7
8
<body>
9
[% INCLUDE 'header.inc' %]
10
[% INCLUDE 'circ-search.inc' %]
11
12
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a>
13
&rsaquo; Plugins
14
</div>
15
16
<div id="doc3" class="yui-t1">
17
    <div id="bd">
18
        <div id="yui-main">
19
            <div class="yui-b">
20
                <div class="details">
21
                    <h1>Plugins</h1>
22
23
                    [% UNLESS ( plugins ) %]
24
                        [% UNLESS ( method ) %]
25
                            <h3>No plugins installed</h3>
26
                        [% ELSE %]
27
                            [% IF method == 'tool' %]
28
                                <h3>No plugins that can be used as a tool are installed</h3>
29
                            [% ELSIF method == 'report' %]
30
                                <h3>No plugins that can create a report are installed</h3>
31
                            [% ELSE %]
32
                                <h3>Unknown plugin type <i>[% method %]</i>
33
                            [% END %]
34
                        [% END %]
35
                    [% ELSE %]
36
                        <table>
37
                            <tr>
38
                                <th>Name</th>
39
                                <th>&nbsp;</th>
40
                                <th>Description</th>
41
                                <th>Author</th>
42
                                <th>Plugin Version</th>
43
                                <th>Minimum Koha Version</th>
44
                                <th>Maximum Koha Version</th>
45
                                <th>Last Updated</th>
46
                                [% IF ( CAN_user_plugins_configure ) %]<th>Configure</th>[% END %]
47
                                [% IF ( CAN_user_plugins_manage ) %]<th>Uninstall</th>[% END %]
48
                            </tr>
49
50
                            [% FOREACH plugin IN plugins %]
51
                                <tr>
52
                                    <td><strong>[% plugin.metadata.name %]</strong></td>
53
                                    <td>
54
                                        [% IF ( CAN_user_plugins_report ) %]
55
                                            [% IF plugin.can('report') %]
56
                                                <p style="white-space:nowrap"><a href="/cgi-bin/koha/plugins/run.pl?class=[% plugin.class %]&method=report">Run report</a></p>
57
                                            [% END %]
58
                                        [% END %]
59
60
                                        [% IF ( CAN_user_plugins_tool ) %]
61
                                            [% IF plugin.can('tool') %]
62
                                                <p style="white-space:nowrap"><a href="/cgi-bin/koha/plugins/run.pl?class=[% plugin.class %]&method=tool">Run tool</a></p>
63
                                            [% END %]
64
                                        [% END %]
65
                                    </td>
66
                                    <td>
67
                                        [% plugin.metadata.description %]
68
69
                                        [% IF ( plugin.metadata.minimum_version && koha_version < plugin.metadata.minimum_version ) %]
70
                                            <div class="error">Warning: This report was written for a newer version of Koha. Run at your own risk.</div>
71
                                        [% END %]
72
73
                                        [% IF ( plugin.metadata.maximum_version && koha_version > plugin.metadata.maximum_version ) %]
74
                                            <div class="error">Warning: This report was written for an older version of Koha. Run at your own risk.</div>
75
                                        [% END %]
76
                                    </td>
77
                                    <td>[% plugin.metadata.author %]</td>
78
                                    <td>[% plugin.metadata.version %]</td>
79
                                    <td>[% plugin.metadata.minimum_version %]</td>
80
                                    <td>[% plugin.metadata.maximum_version %]</td>
81
                                    <td>[% plugin.metadata.date_updated | $KohaDates %]</td>
82
                                    [% IF ( CAN_user_plugins_configure ) %]
83
                                        <td>
84
                                            [% IF plugin.can('configure') %]
85
                                                <a href="/cgi-bin/koha/plugins/run.pl?class=[% plugin.class %]&method=configure">Configure</a>
86
                                            [% END %]
87
                                        </td>
88
                                    [% END %]
89
                                    [% IF ( CAN_user_plugins_manage ) %]
90
                                        <td>
91
                                            [% IF plugin.can('uninstall') %]
92
                                                <a href="/cgi-bin/koha/plugins/plugins-uninstall.pl?class=[% plugin.class %]" onclick="return confirm('Are you sure you want to uninstall the plugin [% plugin.metadata.name %]?')">Uninstall</a>
93
                                            [% END %]
94
                                        </td>
95
                                    [% END %]
96
                            [% END %]
97
                        </table>
98
                    [% END %]
99
                </div>
100
            </div>
101
        </div>
102
103
        <div class="yui-b noprint">
104
            <div id="navmenu">
105
                <ul id="navmenulist">
106
                    [% IF ( CAN_user_plugins_manage ) %]
107
                        <li><a href="plugins-upload.pl">Upload a plugin</a></li>
108
                    [% END %]
109
                </ul>
110
            </div>
111
        </div>
112
    </div>
113
</div>
114
115
116
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/plugins/plugins-upload.tt (+55 lines)
Line 0 Link Here
1
[% INCLUDE 'doc-head-open.inc' %]
2
<title>Koha &rsaquo; Tools &rsaquo; Plugins &rsaquo; Upload Plugin
3
 </title>
4
[% INCLUDE 'doc-head-close.inc' %]
5
[% INCLUDE 'calendar.inc' %]
6
</head>
7
8
<body>
9
[% INCLUDE 'header.inc' %]
10
[% INCLUDE 'circ-search.inc' %]
11
12
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a>
13
&rsaquo; <a href="/cgi-bin/koha/plugins/plugins-home.pl">Plugins</a>
14
&rsaquo; Upload Plugins
15
</div>
16
17
<div id="doc3" class="yui-t2">
18
    <div id="bd">
19
        <div id="yui-main">
20
    <div class="yui-b">
21
        <div class="yui-g">
22
            <div class="yui-u first">
23
                <h1>Upload Koha Plugin</h1>
24
                [% IF ( ERRORS ) %]
25
                <div class="dialog alert">
26
                    [% FOREACH ERROR IN ERRORS %]
27
                        [% IF ( ERROR.NOTKPZ ) %]<li><b>The upload file does not appear to be a kpz file.  The extention is not '.kpz'.</b></li>
28
                        [% ELSIF ( ERROR.NOWRITETEMP ) %]<li><b>This script is not able to create/write to the necessary temporary directory.</b></li>
29
                        [% ELSIF ( ERROR.EMPTYUPLOAD ) %]<li><b>The upload file appears to be empty.</b></li>
30
                        [% ELSIF ( ERROR.UZIPFAIL ) %]<li><b>[% ERROR.UZIPFAIL %] failed to unpack.<br />Please verify the integrity of the zip file and retry.</b></li>
31
                        [% ELSIF ( ERROR.NOWRITEPLUGINS ) %]<li><b>Cannot unpack file to the plugins directory.<br />Please verify that the Apache user can write to the plugins directory.</b></li>
32
                        [% ELSE %]<li><b>[% ERROR.CORERR %] An unknown error has occurred.<br />Please review the error log for more details.</b></li>[% END %]
33
                    [% END %]
34
                </div>
35
                [% END %]
36
                <form method="post" action="/cgi-bin/koha/plugins/plugins-upload.pl" enctype="multipart/form-data">
37
                    <fieldset class="brief">
38
                         <div class="hint"><b>NOTE:</b> Only KPZ file format is supported.</div>
39
                        <ol>
40
                            <li>
41
                                <label for="uploadfile">Select the file to upload: </label><input type="file" id="uploadfile" name="uploadfile" />
42
                            </li>
43
                        </ol>
44
                    </fieldset>
45
                    <fieldset class="action">
46
                        <input type="hidden" name="op" value="Upload" />
47
                        <input type="submit" value="Upload" class="submit" />
48
                    </fieldset>
49
                </form>
50
51
            </div>
52
        </div>
53
    </div>
54
</div>
55
[% INCLUDE 'intranet-bottom.inc' %]
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reports-home.tt (-1 / +10 lines)
Lines 35-41 Link Here
35
		<li><a href="/cgi-bin/koha/reports/issues_stats.pl">Circulation</a></li>
35
		<li><a href="/cgi-bin/koha/reports/issues_stats.pl">Circulation</a></li>
36
		<li><a href="/cgi-bin/koha/reports/serials_stats.pl">Serials</a></li>
36
		<li><a href="/cgi-bin/koha/reports/serials_stats.pl">Serials</a></li>
37
		<li><a href="/cgi-bin/koha/reports/reserves_stats.pl">Holds</a></li>
37
		<li><a href="/cgi-bin/koha/reports/reserves_stats.pl">Holds</a></li>
38
	</ul></div>
38
      </ul>
39
40
        [% IF UseKohaPlugins %]
41
        <h2>Report Plugins</h2>
42
        <ul>
43
                <li><a href="/cgi-bin/koha/plugins/plugins-home.pl?method=report">Report Plugins</a></li>
44
        </ul>
45
        [% END %]
46
47
    </div>
39
48
40
    <div class="yui-u"><h2>Top lists</h2>
49
    <div class="yui-u"><h2>Top lists</h2>
41
	<ul>
50
	<ul>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/tools-home.tt (+5 lines)
Lines 97-102 Link Here
97
    <dd>Quote editor for Quote-of-the-day feature in OPAC</dd>
97
    <dd>Quote editor for Quote-of-the-day feature in OPAC</dd>
98
    [% END %]
98
    [% END %]
99
99
100
    [% IF ( UseKohaPlugins && CAN_user_plugins_tool ) %]
101
    <dt><a href="/cgi-bin/koha/plugins/plugins-home.pl?method=tool">Tool Plugins</a></dt>
102
    <dd>Use tool plugins</dd>
103
    [% END %]
104
100
</dl>
105
</dl>
101
</div>
106
</div>
102
<div class="yui-u">
107
<div class="yui-u">
(-)a/plugins/plugins-home.pl (+57 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright 2010 Kyle M Hall <kyle.m.hall@gmail.com>
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use strict;
21
use warnings;
22
23
use CGI;
24
25
use Koha::Plugins;
26
use C4::Auth;
27
use C4::Output;
28
use C4::Dates;
29
use C4::Debug;
30
use C4::Context;
31
32
die("Koha plugins are disabled!")
33
  unless C4::Context->preference('UseKohaPlugins');
34
35
my $input  = new CGI;
36
my $method = $input->param('method');
37
38
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
39
    {   template_name   => "plugins/plugins-home.tmpl",
40
        query           => $input,
41
        type            => "intranet",
42
        authnotrequired => 0,
43
        flagsrequired   => { plugins => '*' },
44
        debug           => 1,
45
    }
46
);
47
48
$template->param(
49
    koha_version => C4::Context->preference("Version"),
50
    method       => $method,
51
);
52
53
my @plugins = Koha::Plugins->new()->GetPlugins($method);
54
55
$template->param( plugins => \@plugins );
56
57
output_html_with_http_headers( $input, $cookie, $template->output );
(-)a/plugins/plugins-uninstall.pl (+52 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
#
3
# This file is part of Koha.
4
#
5
# Koha is free software; you can redistribute it and/or modify it under the
6
# terms of the GNU General Public License as published by the Free Software
7
# Foundation; either version 2 of the License, or (at your option) any later
8
# version.
9
#
10
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License along
15
# with Koha; if not, write to the Free Software Foundation, Inc.,
16
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18
use strict;
19
use warnings;
20
21
use Archive::Extract;
22
use File::Temp;
23
use File::Copy;
24
use CGI;
25
26
use C4::Context;
27
use C4::Auth;
28
use C4::Output;
29
use C4::Members;
30
use C4::Debug;
31
use Koha::Plugins::Handler;
32
33
die("Koha plugins are disabled!")
34
  unless C4::Context->preference('UseKohaPlugins');
35
36
my $input = new CGI;
37
38
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
39
    {   template_name   => "plugins/plugins-upload.tmpl",
40
        query           => $input,
41
        type            => "intranet",
42
        authnotrequired => 0,
43
        flagsrequired   => { plugins => 'manage' },
44
        debug           => 1,
45
    }
46
);
47
48
my $class = $input->param('class');
49
50
Koha::Plugins::Handler->delete( { class => $class } );
51
52
print $input->redirect("/cgi-bin/koha/plugins/plugins-home.pl");
(-)a/plugins/plugins-upload.pl (+97 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
#
3
# This file is part of Koha.
4
#
5
# Koha is free software; you can redistribute it and/or modify it under the
6
# terms of the GNU General Public License as published by the Free Software
7
# Foundation; either version 2 of the License, or (at your option) any later
8
# version.
9
#
10
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License along
15
# with Koha; if not, write to the Free Software Foundation, Inc.,
16
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
18
use strict;
19
use warnings;
20
21
use Archive::Extract;
22
use File::Temp;
23
use File::Copy;
24
use CGI;
25
26
use C4::Context;
27
use C4::Auth;
28
use C4::Output;
29
use C4::Members;
30
use C4::Debug;
31
use Koha::Plugins;
32
33
die("Koha plugins are disabled!")
34
  unless C4::Context->preference('UseKohaPlugins');
35
36
my $input = new CGI;
37
38
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
39
    {   template_name   => "plugins/plugins-upload.tmpl",
40
        query           => $input,
41
        type            => "intranet",
42
        authnotrequired => 0,
43
        flagsrequired   => { plugins => 'manage' },
44
        debug           => 1,
45
    }
46
);
47
48
my $uploadfilename = $input->param('uploadfile');
49
my $uploadfile     = $input->upload('uploadfile');
50
my $op             = $input->param('op');
51
52
my ( $total, $handled, @counts, $tempfile, $tfh );
53
54
my %errors;
55
56
if ( ( $op eq 'Upload' ) && $uploadfile ) {
57
    my $plugins_dir = C4::Context->config("pluginsdir");
58
59
    my $dirname = File::Temp::tempdir( CLEANUP => 1 );
60
    $debug and warn "dirname = $dirname";
61
62
    my $filesuffix = $1 if $uploadfilename =~ m/(\..+)$/i;
63
    ( $tfh, $tempfile ) = File::Temp::tempfile( SUFFIX => $filesuffix, UNLINK => 1 );
64
65
    $debug and warn "tempfile = $tempfile";
66
67
    $errors{'NOTKPZ'} = 1 if ( $uploadfilename !~ /\.kpz$/i );
68
    $errors{'NOWRITETEMP'}    = 1 unless ( -w $dirname );
69
    $errors{'NOWRITEPLUGINS'} = 1 unless ( -w $plugins_dir );
70
    $errors{'EMPTYUPLOAD'}    = 1 unless ( length($uploadfile) > 0 );
71
72
    if (%errors) {
73
        $template->param( ERRORS => [ \%errors ] );
74
    } else {
75
        while (<$uploadfile>) {
76
            print $tfh $_;
77
        }
78
        close $tfh;
79
80
        my $ae = Archive::Extract->new( archive => $tempfile, type => 'zip' );
81
        unless ( $ae->extract( to => $plugins_dir ) ) {
82
            warn "ERROR: " . $ae->error;
83
            $errors{'UZIPFAIL'} = $uploadfilename;
84
            $template->param( ERRORS => [ \%errors ] );
85
            output_html_with_http_headers $input, $cookie, $template->output;
86
            exit;
87
        }
88
    }
89
} elsif ( ( $op eq 'Upload' ) && !$uploadfile ) {
90
    warn "Problem uploading file or no file uploaded.";
91
}
92
93
if ( $uploadfile && !%errors && !$template->param('ERRORS') ) {
94
    print $input->redirect("/cgi-bin/koha/plugins/plugins-home.pl");
95
} else {
96
    output_html_with_http_headers $input, $cookie, $template->output;
97
}
(-)a/plugins/run.pl (+50 lines)
Line 0 Link Here
1
#!/usr/bin/perl
2
3
# Copyright 2010 Kyle M Hall <kyle.m.hall@gmail.com>
4
#
5
# This file is part of Koha.
6
#
7
# Koha is free software; you can redistribute it and/or modify it under the
8
# terms of the GNU General Public License as published by the Free Software
9
# Foundation; either version 2 of the License, or (at your option) any later
10
# version.
11
#
12
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14
# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License along
17
# with Koha; if not, write to the Free Software Foundation, Inc.,
18
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
use strict;
21
use warnings;
22
23
use CGI;
24
25
use Koha::Plugins::Handler;
26
use C4::Auth;
27
use C4::Output;
28
use C4::Dates;
29
use C4::Debug;
30
use C4::Context;
31
32
die("Koha plugins are disabled!")
33
  unless C4::Context->preference('UseKohaPlugins');
34
35
my $cgi = new CGI;
36
37
my $class  = $cgi->param('class');
38
my $method = $cgi->param('method');
39
40
my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
41
    {   template_name   => "plugins/plugins-home.tmpl",
42
        query           => $cgi,
43
        type            => "intranet",
44
        authnotrequired => 0,
45
        flagsrequired   => { plugins => $method },
46
        debug           => 1,
47
    }
48
);
49
50
my $plugin = Koha::Plugins::Handler->run( { class => $class, method => $method, cgi => $cgi } );
(-)a/rewrite-config.PL (-1 / +2 lines)
Lines 43-49 guesses worked out by the script. Link Here
43
The following configuration keywords are available:
43
The following configuration keywords are available:
44
44
45
PREFIX,
45
PREFIX,
46
BASE_DIR, CGI_DIR, LOG_DIR, INSTALL_BASE,
46
BASE_DIR, CGI_DIR, LOG_DIR, PLUGINS_DIR, INSTALL_BASE,
47
DB_TYPE, DB_HOST, DB_PORT, DB_NAME, DB_PASS, DB_USER, WEBMASTER_EMAIL, WEBSERVER_DOMAIN,
47
DB_TYPE, DB_HOST, DB_PORT, DB_NAME, DB_PASS, DB_USER, WEBMASTER_EMAIL, WEBSERVER_DOMAIN,
48
WEBSERVER_HOST, WEBSERVER_IP, WEBSERVER_PORT, WEBSERVER_PORT_LIBRARIAN, ZEBRA_PASS, ZEBRA_USER
48
WEBSERVER_HOST, WEBSERVER_IP, WEBSERVER_PORT, WEBSERVER_PORT_LIBRARIAN, ZEBRA_PASS, ZEBRA_USER
49
49
Lines 82-87 $prefix = $ENV{'INSTALL_BASE'} || "/usr"; Link Here
82
%configuration = (
82
%configuration = (
83
  "__KOHA_INSTALLED_VERSION__" => "no_version_found",
83
  "__KOHA_INSTALLED_VERSION__" => "no_version_found",
84
  "__LOG_DIR__" => "/var/log",
84
  "__LOG_DIR__" => "/var/log",
85
  "__PLUGINS_DIR__" => "/var/lib/koha/plugins",
85
  "__DB_TYPE__" => "mysql",
86
  "__DB_TYPE__" => "mysql",
86
  "__DB_NAME__" => "koha",
87
  "__DB_NAME__" => "koha",
87
  "__DB_HOST__" => $myhost,
88
  "__DB_HOST__" => $myhost,
(-)a/skel/var/lib/koha/plugins/README (-1 / +1 lines)
Line 0 Link Here
0
- 
1
plugins dir

Return to bug 7804