# Module of TWiki Enterprise Collaboration Platform, http://TWiki.org/ # # Copyright (C) 1999-2018 Peter Thoeny, peter[at]thoeny.org # and TWiki Contributors. All Rights Reserved. TWiki Contributors # are listed in the AUTHORS file in the root of this distribution. # NOTE: Please extend that file, not this notice. # # This module is based/inspired on Catalyst framework. Refer to # http://search.cpan.org/~mramberg/Catalyst-Runtime-5.7010/lib/Catalyst.pm # for credits and liscence details. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 3 # of the License, or (at your option) any later version. For # more details read LICENSE in the root of this distribution. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # As per the GPL, removal of this notice is prohibited. =begin twiki ---+!! package TWiki::Engine::CLI Class that implements CGI scripts functionality when called from command line or cron job Refer to TWiki::Engine documentation for explanation about methos below. =cut package TWiki::Engine::CLI; use strict; use base 'TWiki::Engine'; use TWiki::Request; use TWiki::Request::Upload; use TWiki::Response; sub run { my $this = shift; my @args = @ARGV; # Copy, so original @ARGV doesn't get modified while ( scalar @args ) { my $arg = shift @args; if ( $arg =~ /^-?([A-Za-z0-9_]+)(?:=(.*))?$/o ) { my $name = $1; my $arg = TWiki::Sandbox::untaintUnchecked( defined $2 ? $2 : (shift @args) ); if ( $name eq 'user' ) { $this->{user} = $arg; } elsif ( $name eq 'method' ) { $this->{method} = $arg; } else { push @{ $this->{plist} }, $name unless exists $this->{params}->{$name}; push @{ $this->{params}->{$name} }, $arg; } } else { $this->{path_info} = TWiki::Sandbox::untaintUnchecked($arg); } } my $req = $this->prepare; if ( UNIVERSAL::isa($req, 'TWiki::Request') ) { my $res = TWiki::UI::handleRequest($req); $this->finalize( $res, $req ); } } sub prepareConnection { my ( $this, $req ) = @_; $req->remoteAddress('127.0.0.1'); } sub prepareQueryParameters { my ( $this, $req ) = @_; foreach my $name ( @{ $this->{plist} } ) { $req->param( -name => $name, -value => $this->{params}->{$name} ); } delete $this->{plist}; delete $this->{params}; } sub prepareHeaders { my ( $this, $req ) = @_; if ( defined $this->{user} ) { $req->remoteUser( $this->{user} ); delete $this->{user}; } else { $req->remoteUser( $TWiki::cfg{SuperAdminGroup} ); } if ( defined $this->{method} ) { $req->request_method( $this->{method} ); delete $this->{method}; } else { $req->request_method( 'GET' ); } } sub preparePath { my ( $this, $req ) = @_; $req->action( $ENV{TWIKI_ACTION} ); delete $ENV{TWIKI_ACTION}; if ( exists $this->{path_info} ) { $req->pathInfo( $this->{path_info} ); delete $this->{path_info}; } } sub prepareCookies { } sub finalizeHeaders { } sub write { my ( $this, $buffer ) = @_; print $buffer; } 1;