403Webshell
Server IP : 103.119.228.120  /  Your IP : 3.137.218.176
Web Server : Apache
System : Linux v8.techscape8.com 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64
User : nobody ( 99)
PHP Version : 5.6.40
Disable Function : shell_exec,symlink,system,exec,proc_get_status,proc_nice,proc_terminate,define_syslog_variables,syslog,openlog,closelog,escapeshellcmd,passthru,ocinum cols,ini_alter,leak,listen,chgrp,apache_note,apache_setenv,debugger_on,debugger_off,ftp_exec,dl,dll,myshellexec,proc_open,socket_bind,proc_close,escapeshellarg,parse_ini_filepopen,fpassthru,exec,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,proc_nice,proc_terminate,proc_get_status,proc_close,pfsockopen,leak,apache_child_terminate,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,dl,symlink,shell_exec,system,dl,passthru,escapeshellarg,escapeshellcmd,myshellexec,c99_buff_prepare,c99_sess_put,fpassthru,getdisfunc,fx29exec,fx29exec2,is_windows,disp_freespace,fx29sh_getupdate,fx29_buff_prepare,fx29_sess_put,fx29shexit,fx29fsearch,fx29ftpbrutecheck,fx29sh_tools,fx29sh_about,milw0rm,imagez,sh_name,myshellexec,checkproxyhost,dosyayicek,c99_buff_prepare,c99_sess_put,c99getsource,c99sh_getupdate,c99fsearch,c99shexit,view_perms,posix_getpwuid,posix_getgrgid,posix_kill,parse_perms,parsesort,view_perms_color,set_encoder_input,ls_setcheckboxall,ls_reverse_all,rsg_read,rsg_glob,selfURL,dispsecinfo,unix2DosTime,addFile,system,get_users,view_size,DirFiles,DirFilesWide,DirPrintHTMLHeaders,GetFilesTotal,GetTitles,GetTimeTotal,GetMatchesCount,GetFileMatchesCount,GetResultFiles,fs_copy_dir,fs_copy_obj,fs_move_dir,fs_move_obj,fs_rmdir,SearchText,getmicrotime
MySQL : ON |  cURL : ON |  WGET : ON |  Perl : ON |  Python : ON |  Sudo : ON |  Pkexec : ON
Directory :  /usr/local/ssl/local/ssl/local/share/perl5/HTTP/Daemon/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /usr/local/ssl/local/ssl/local/share/perl5/HTTP/Daemon/App.pm
package HTTP::Daemon::App;

use strict;
use warnings;

use version;our $VERSION = qv('0.0.9');

use HTTP::Daemon;
use HTTP::Daemon::SSL;
use HTTP::Response;
use Acme::Spork;
use Unix::PID;
use File::Spec;

use base 'Exporter';
our @EXPORT_OK = qw(run decode_basic_auth send_basic_auth_request);

sub send_basic_auth_request {
	my ($c, $realm)      = @_;
	$realm               = 'Restricted Area' if !$realm;
	my $auth_request_res = HTTP::Response->new(401, 'Unauthorized');
	$auth_request_res->header('WWW-Authenticate' => qq{Basic realm="$realm"});
	$auth_request_res->is_error(1);
    $auth_request_res->error_as_HTML(1);
	$c->send_response($auth_request_res);
}

sub decode_basic_auth {
	my ($auth) = @_;
	no warnings 'uninitialized';
    $auth = ( split /\s+/, $auth->header('Authorization') )[1] if ref $auth;
    require MIME::Base64;
    return split(/:/, MIME::Base64::decode( $auth ), 2);
}

sub run {
    my($daemons_hashref, $conf) = @_;  
    
    $conf              = {} if ref $conf ne 'CODE';
    $conf->{'pid_dir'} = File::Spec->catdir(qw(/ var run)) if !$conf->{'pid_dir'};
    $conf->{'pid_ext'} = '.pid' if !$conf->{'pid_ext'};
    $conf->{'self'}    = "perl $0" if !$conf->{'self'};
    
    my $additional = '';
    for my $opt (sort keys %{ $conf->{'opts'} }) {
        if($opt eq '--start' || $opt eq '--stop' || $opt eq '--restart') {
            delete $conf->{'opts'}{$opt};
            next;
        }
        $additional .= "|$opt";
    }

    $ARGV[0] = '--help' if !defined $ARGV[0]; # no uninit warnings and logical visual clue to coders of what will happen if its not specified...
    if($ARGV[0] eq '--restart') {
        system qq($conf->{'self'} --stop $$);
        sleep 1;
        system qq($conf->{'self'} --start);
        exit;	
    }
        
    if($ARGV[0] eq '--start') {
    	for my $daemon (sort keys %{ $daemons_hashref }) {
            next if ref $daemons_hashref->{$daemon}{'handler'} ne 'CODE';
    	    next if ref $daemons_hashref->{$daemon}{'daemon'} ne 'HASH';
    	    
            my $pidfile = File::Spec->catfile($conf->{'pid_dir'}, "$daemon$conf->{'pid_ext'}");
            
    	    my $objkt = $daemons_hashref->{$daemon}{'ssl'} 
    	                ? HTTP::Daemon::SSL->new( %{ $daemons_hashref->{$daemon}{'daemon'} } )
    	                : HTTP::Daemon->new( %{ $daemons_hashref->{$daemon}{'daemon'} } )
    	                ;
            if(!$objkt) {
                print "$daemon: $!\n";
    	        next;
            }

    	    print "Starting $daemons_hashref->{$daemon}{'label'}: <URL:" . $objkt->url . ">\n"
    	        if defined $daemons_hashref->{$daemon}{'label'};

    		my $http_pid = spork(
    		    sub {
    		        my($handler, $d, $name, $pidfile, $conf) = @_;
                    local $0 = $name;
                	while (my $c = $d->accept) {
                	    $conf->{'pre_fork'}->(@_) if ref $conf->{'pre_fork'} eq 'CODE';
                	    
	                    if(my $kid = fork()) {
		                    $c->can('get_cipher') ? $c->close('SSL_no_shutdown' => 1) : $c->close;
	                	    undef($c);
	                    }
	                    else {
	                        $conf->{'get_tmpfile'} = sub { return } if ref $conf->{'get_tmpfile'} ne 'CODE';
		               	    while (my $r = $c->get_request( $conf->{'get_tmpfile'}->( $conf ) )) {
                	            $handler->($d, $c, $r, $conf);
                            }
                            # $c->can('get_cipher') ? $c->close('SSL_no_shutdown' => 1) : $c->close;	
	                        # undef($c);
	                        exit 0;
                	    }
                	    
                	    $conf->{'pst_fork'}->(@_) if ref $conf->{'pst_fork'} eq 'CODE';
                	}
		        }, $daemons_hashref->{$daemon}{'handler'}, $objkt, $daemon, $pidfile, $conf,
    		);

    		Unix::PID->new()->pid_file_no_unlink($pidfile, $http_pid)
    		    or die "The PID in $pidfile is still running.";
    	}
    }
    elsif($ARGV[0] eq '--stop') {
    	for my $daemon (sort keys %{ $daemons_hashref }) {
    	    my $pidfile = File::Spec->catfile($conf->{'pid_dir'}, "$daemon$conf->{'pid_ext'}");

            my $uxp = Unix::PID->new();
    	    my $pid = $uxp->kill_pid_file($pidfile);

    	    if($pid == 1) {
    	        print "$daemon is not running\n";
    	    }
    	    elsif($pid eq '-1') {
                print "$daemon pidfile: $!\n";
            }
            else {
    	        print "$daemon ($pid) was stopped\n";
    	    }   

            print "\tCollecting $daemon children...\n";
            for my $kid ($uxp->get_pidof($daemon) ) {
	            next if defined $ARGV[1] && $kid eq $ARGV[1];
	            $uxp->kill( $kid ) or print "\t\tCould not kill $daemon child $kid: $!\n";
            }
    	}
    }
    elsif(exists $conf->{'opts'}{$ARGV[0]}) {
        $conf->{'opts'}->{$ARGV[0]}->(@_);
    }
    else {
    	print "Useage: $0 [--start|--stop||--restart$additional]\n";
    	print "$conf->{'help'}\n" if $conf->{'help'};
    }
}

1;

__END__

=head1 NAME

HTTP::Daemon::App - Create 2 or 3 line, fully functional (SSL) HTTP server(s)

=head1 SYNOPSIS

    use HTTP::Daemon::App;
    use MyServers::Foo;
    HTTP::Daemon::App::run($MyServers::Foo::daemons, $MyServers::Foo::config);

=head1 DESCRIPTION

You can describe one or more HTTP daemons in a simple hash and *instantly* 
have a [--start|--stop|--restart] capable daemon that can optionally be SSL aware.

Its also easy to add command line options and has integrated help. 

=head2 EXPORT

Each function can be exported but nothing is by default.

=head1 FUNCTIONS

=head2 run

Takes 2 arguments, both hashrefs. The first describes tha daemons to run, the second is for config.

=head3 daemon hashref

Hopefully these are self descriptive, this example does two daemons SSL and non-SSL:

    {
        'thingy-ssl' => {
            'label'   => 'HTTPS Thingy',
            'ssl'     => 1, # true: HTTP::Daemon::SSL, false: HTTP::Daemon
            'daemon'  => {
                # arguments HTTP::Daemon[::SSL]->new()
                'LocalPort' => 4279,
            },
            'handler' => sub {
                my($d, $c, $r, $conf_hr) = @_; # $d, $c, $r from HTTP::Daemon
                # handle request
            },
        },
        'thingy' => {
            'label'   => 'HTTP Thingy',
            'ssl'     => 0, # true: HTTP::Daemon::SSL, false: HTTP::Daemon
            'daemon'  => {
                # arguments HTTP::Daemon[::SSL]->new()
                'LocalPort' => 4278,
            },
            'handler' => sub {
                my($d, $c, $r, $conf_hr) = @_; # $d, $c, $r from HTTP::Daemon
                # handle request
            },
        },
    },

=head3 config hashref

    {
        'pre_fork' => '', # set to a code ref it gets called before it forks the child process,  its args are ($handler, $d, $name, $pidfile, $conf)
        'pst_fork' => '', # same as pre_fork but run after the fork is done
        'pid_dir' => '/var/run/', # default shown
        'pid_ext' => '.pid', # default shown
        'verbose' => 0, # example of your custom option that can be used by your handlers and set via 'opts' like below
        # 'lang'    => 'Locale::Maketext::Utils handle', not used yet
        'help'    => '', # default shown, this is added to the useage output.
        'opts'    => {
            # default {}, cannot use --stop, --start, or --restart, automagically added to useage line
            '--version'  => sub { print "$0 v1.0\n" },
            '--verbose' => sub { my($daemons_hashref, $conf) = @_;$conf->{'verbose'} = 1; },
        },
        'self' => "perl $0", # default shown, command used to call --stop & --start on --restart
    }

=head2 decode_basic_auth

Given the encoded basic auth passed by the browser 
(or given the "$r" object from HTTP::Daemon, the 'Authorization' header's value) 
this will return the username an password.

    my ($auth_user, $auth_pass) = decode_basic_auth( $encoded_basic_auth_from_browser );
    my($user, $encpass, $uid, $gid, $homedir) = (getpwnam($auth_user))[0, 1, 2, 3, 7];
    
    if($auth_user && $encpass eq crypt($auth_pass, $encpass) && $user eq $auth_user) {
        ... # continue on as authenticated user

=head2 send_basic_auth_request

Takes two arguments: the "$c" object from HTTP::Request, the realm's name (has lame default if not specified)

It does a 401 that incites the client's authentication challenge (E.g. a browser's drop down login box)

        ... # continue on as authenticated user
	}
	else {
	    HTTP::Daemon::App::send_basic_auth_request($c, 'Vault of secrets');
	}

=head1 SEE ALSO

L<HTTP::Daemon>

=head1 AUTHOR

Daniel Muey, L<http://drmuey.com/cpan_contact.pl>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2006 by Daniel Muey

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.

=cut

Youez - 2016 - github.com/yon3zu
LinuXploit